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.cms.core;
35
36 import info.magnolia.cms.beans.runtime.File;
37 import info.magnolia.cms.util.SelectorUtil;
38 import info.magnolia.context.MgnlContext;
39
40 import java.io.UnsupportedEncodingException;
41 import java.net.URLDecoder;
42 import java.util.Locale;
43
44 import javax.jcr.Node;
45
46 import org.apache.commons.lang3.StringUtils;
47
48
49
50
51 public class AggregationState {
52 private String characterEncoding;
53 private String originalURI;
54 private String originalURL;
55 private String originalBrowserURI;
56 private String originalBrowserURL;
57 private String currentURI;
58 private String queryString;
59 private String extension;
60 private File file;
61 private String handle;
62 private Node mainContentNode;
63 private Node currentContentNode;
64 private String repository;
65 private String selector;
66 private String[] selectors = new String[0];
67 private String templateName;
68 private Locale locale;
69 private boolean isPreviewMode;
70 private Channel channel = new Channel();
71
72 public void setOriginalURI(String originalURI) {
73 final String strippedURI = stripContextPathIfExists(originalURI);
74 if (this.originalURI != null && !this.originalURI.equals(strippedURI)) {
75 throw new IllegalStateException("Original URI can only be set once ! Existing value is \"" + this.originalURI + "\", tried to replace it with \"" + strippedURI + "\"");
76 }
77 this.originalURI = strippedURI;
78 }
79
80 public void setOriginalBrowserURI(String originalBrowserURI) {
81 final String strippedURI = stripContextPathIfExists(originalBrowserURI);
82 if (this.originalBrowserURI != null && !this.originalBrowserURI.equals(strippedURI)) {
83 throw new IllegalStateException("Original URI can only be set once ! Existing value is \"" + this.originalURI + "\", tried to replace it with \"" + strippedURI + "\"");
84 }
85 this.originalBrowserURI = strippedURI;
86 }
87
88 public void setCurrentURI(String currentURI) {
89
90
91
92 if (currentURI != null && !currentURI.equals(getCurrentURI())) {
93 this.currentURI = stripContextPathIfExists(currentURI);
94 }
95 }
96
97 public void setQueryString(String queryString) {
98 this.queryString = queryString;
99 }
100
101
102
103
104 public String getQueryString() {
105 return queryString;
106 }
107
108
109
110
111
112 public String getCurrentURI() {
113 return currentURI;
114 }
115
116 public String getCharacterEncoding() {
117 if (characterEncoding == null) {
118 throw new IllegalStateException("Character encoding hasn't been setup in AggregationState yet !");
119 }
120 return characterEncoding;
121 }
122
123
124
125
126
127
128
129
130 public String getOriginalURI() {
131 return originalURI;
132 }
133
134 public String getOriginalURL() {
135 return originalURL;
136 }
137
138 public void setOriginalURL(String originalURL) {
139 this.originalURL = originalURL;
140 }
141
142 public String getOriginalBrowserURI() {
143 return originalBrowserURI;
144 }
145
146 public String getOriginalBrowserURL() {
147 return originalBrowserURL;
148 }
149
150 public void setOriginalBrowserURL(String originalBrowserURL) {
151 this.originalBrowserURL = originalBrowserURL;
152 }
153
154 public void setCharacterEncoding(String characterEncoding) {
155 this.characterEncoding = characterEncoding;
156 }
157
158 public String getExtension() {
159 return extension;
160 }
161
162 public void setExtension(String extension) {
163 this.extension = extension;
164 }
165
166 public File getFile() {
167 return file;
168 }
169
170 public void setFile(File file) {
171 this.file = file;
172 }
173
174 public String getHandle() {
175 return handle;
176 }
177
178 public void setHandle(String handle) {
179 this.handle = handle;
180 }
181
182 public Node getMainContentNode() {
183 return mainContentNode;
184 }
185
186 public void setMainContentNode(final Node mainContentNode) {
187 this.mainContentNode = mainContentNode;
188 }
189
190 public Node getCurrentContentNode() {
191 return currentContentNode;
192 }
193
194 public void setCurrentContentNode(final Node currentContentNode) {
195 this.currentContentNode = currentContentNode;
196 }
197
198 public String getRepository() {
199 return repository;
200 }
201
202 public void setRepository(String repository) {
203 this.repository = repository;
204 }
205
206
207
208
209
210
211
212
213
214 public String getSelector() {
215 return selector;
216 }
217
218
219
220
221
222 public void setSelector(String selector) {
223 try {
224 this.selector = URLDecoder.decode(selector, getCharacterEncoding());
225 } catch (UnsupportedEncodingException e) {
226 this.selector = selector;
227 }
228
229
230 for (String sel : selectors) {
231 final String[] splitSelector = sel.split("=");
232 if (splitSelector.length == 2) {
233 MgnlContext.removeAttribute(splitSelector[0]);
234 }
235 }
236
237 if (StringUtils.isNotEmpty(selector)) {
238 selectors = this.selector.split(SelectorUtil.SELECTOR_DELIMITER);
239 } else {
240 selectors = new String[0];
241 }
242
243 for (String sel : selectors) {
244 final String[] splitSelector = sel.split("=");
245 if (splitSelector.length == 2) {
246 MgnlContext.setAttribute(splitSelector[0], splitSelector[1]);
247 }
248 }
249 }
250
251 public String getTemplateName() {
252 return templateName;
253 }
254
255 public void setTemplateName(String templateName) {
256 this.templateName = templateName;
257 }
258
259
260
261
262
263
264 public Locale getLocale() {
265 if (locale == null) {
266 return MgnlContext.getLocale();
267 }
268
269 return locale;
270 }
271
272
273
274
275 public void setLocale(Locale locale) {
276 this.locale = locale;
277 }
278
279 public boolean isPreviewMode() {
280 return isPreviewMode;
281 }
282
283 public void setPreviewMode(boolean previewMode) {
284 isPreviewMode = previewMode;
285 }
286
287 public Channel getChannel() {
288 return channel;
289 }
290
291 public void setChannel(Channel channel) {
292 this.channel = channel;
293 }
294
295
296
297
298
299
300
301 protected String stripContextPathIfExists(String uri) {
302
303 String contextPath = MgnlContext.getContextPath();
304 if (uri != null && uri.startsWith(contextPath + "/")) {
305 return StringUtils.removeStart(uri, contextPath);
306 }
307 return uri;
308 }
309
310
311
312
313 public void resetURIs() {
314 this.originalURI = null;
315 this.originalURL = null;
316 this.originalBrowserURI = null;
317 this.originalBrowserURL = null;
318 this.currentURI = null;
319 }
320
321
322
323
324
325
326
327
328 public String[] getSelectors() {
329 return selectors;
330 }
331 }