1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.cache.cachekey;
35
36 import info.magnolia.cms.core.AggregationState;
37 import info.magnolia.cms.security.MgnlUserManager;
38 import info.magnolia.cms.security.User;
39 import info.magnolia.context.MgnlContext;
40
41 import java.io.Serializable;
42 import java.util.ArrayList;
43 import java.util.Collections;
44 import java.util.List;
45 import java.util.Locale;
46 import java.util.Map;
47 import java.util.SortedMap;
48 import java.util.TreeMap;
49
50 import javax.servlet.http.HttpServletRequest;
51
52 import org.apache.commons.lang3.StringUtils;
53
54
55
56
57 public class DefaultCacheKeyGenerator implements CacheKeyGenerator<DefaultCacheKey> {
58
59 private boolean useRequestParameters = true;
60 private boolean useRequestUri = true;
61 private boolean useRequestMethod = true;
62 private boolean useRequestGetSecure = true;
63 private boolean useRequestServerName = true;
64
65 private boolean useUserName = true;
66 private boolean useLocale = true;
67 private boolean useChannel = true;
68
69 @Override
70 public DefaultCacheKey generateKey(final AggregationState aggregationState) {
71
72 final String uri = useRequestUri ? aggregationState.getOriginalURI() : null;
73
74
75 final String serverName;
76 final Map<String, String> params;
77 final boolean isSecure;
78 final String method;
79 if (MgnlContext.isWebContext()) {
80 HttpServletRequest request = MgnlContext.getWebContext().getRequest();
81 params = useRequestParameters ? getParametersFromRequest(request) : null;
82 serverName = useRequestServerName ? request.getServerName() : null;
83 isSecure = useRequestGetSecure ? request.isSecure() : false;
84 method = useRequestMethod ? request.getMethod().toLowerCase() : null;
85 } else {
86 serverName = null;
87 params = null;
88 isSecure = false;
89 method = null;
90 }
91
92
93 final Locale locale = useLocale ? aggregationState.getLocale() : null;
94 final String localeStr = locale == null ? null : locale.toString();
95
96 final SortedMap<String, Serializable> additionalAttributes = new TreeMap<>();
97 final String userName = MgnlContext.getUser().getName();
98 if (useUserName && !MgnlUserManager.ANONYMOUS_USER.equals(userName)) {
99 additionalAttributes.put(User.class.getName(), userName);
100 }
101 final String channel = useChannel ? aggregationState.getChannel().getName() : null;
102
103 return this.createKey(aggregationState, uri, serverName, localeStr, channel, method, params, isSecure, additionalAttributes);
104 }
105
106 protected DefaultCacheKey createKey(final AggregationState aggregationState, String uri, String serverName, String locale, String channel, String method,
107 Map<String, String> params, Boolean isSecure, SortedMap<String, Serializable> additionalAttributes) {
108
109 return new DefaultCacheKey(
110 uri,
111 serverName,
112 locale,
113 channel,
114 method,
115 params == null ? null : Collections.unmodifiableMap(params),
116 isSecure,
117 additionalAttributes == null ? null : Collections.unmodifiableMap(additionalAttributes)
118 );
119 }
120
121
122
123
124
125 private Map<String, String> getParametersFromRequest(HttpServletRequest request) {
126 Map<String, String> map = new TreeMap<String, String>();
127 for (Object obj : request.getParameterMap().entrySet()) {
128 Map.Entry<String, String[]> entry = (Map.Entry) obj;
129 String[] values = entry.getValue();
130 List<String> newValues = new ArrayList<String>();
131 for (String val : values) {
132 String str = val.replace(";", ";;");
133 newValues.add(str);
134 }
135 String value = StringUtils.join(newValues, ";");
136 map.put(entry.getKey(), value);
137 }
138 return map;
139 }
140
141 public boolean isUseLocale() {
142 return useLocale;
143 }
144
145 public void setUseLocale(boolean useLocale) {
146 this.useLocale = useLocale;
147 }
148
149 public boolean isUseRequestMethod() {
150 return useRequestMethod;
151 }
152
153 public void setUseRequestMethod(boolean useRequestMethod) {
154 this.useRequestMethod = useRequestMethod;
155 }
156
157 public boolean isUseRequestParameters() {
158 return useRequestParameters;
159 }
160
161 public void setUseRequestParameters(boolean useRequestParameters) {
162 this.useRequestParameters = useRequestParameters;
163 }
164
165 public boolean isUseRequestUri() {
166 return useRequestUri;
167 }
168
169 public void setUseRequestUri(boolean useRequestUri) {
170 this.useRequestUri = useRequestUri;
171 }
172
173 public boolean isUseRequestGetSecure() {
174 return useRequestGetSecure;
175 }
176
177 public void setUseRequestGetSecure(boolean useRequestGetSecure) {
178 this.useRequestGetSecure = useRequestGetSecure;
179 }
180
181 public boolean isUseRequestServerName() {
182 return useRequestServerName;
183 }
184
185 public void setUseRequestServerName(boolean useRequestServerName) {
186 this.useRequestServerName = useRequestServerName;
187 }
188
189 public boolean isUseUserName() {
190 return useUserName;
191 }
192
193 public void setUseUserName(boolean useUserName) {
194 this.useUserName = useUserName;
195 }
196 }