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.jcr.util;
35
36 import info.magnolia.context.MgnlContext;
37
38 import java.util.Calendar;
39
40 import javax.jcr.Node;
41 import javax.jcr.RepositoryException;
42
43 import org.apache.commons.lang.StringUtils;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47
48
49
50 public class NodeTypes {
51
52 private static final Logger log = LoggerFactory.getLogger(NodeTypes.class);
53
54
55 public static final String MGNL_PREFIX = "mgnl:";
56
57
58 public static final String JCR_PREFIX = "jcr:";
59
60
61 public static final String REP_PREFIX = "rep:";
62
63
64 private static final String BY = "By";
65
66
67
68
69 public static class LastModified {
70 public static final String NAME = MGNL_PREFIX + "lastModified";
71 public static final String LAST_MODIFIED = NAME;
72 public static final String LAST_MODIFIED_BY = LAST_MODIFIED + BY;
73
74
75
76
77
78 public static Calendar getLastModified(Node node) throws RepositoryException {
79 return node.hasProperty(LAST_MODIFIED) ? node.getProperty(LAST_MODIFIED).getDate() : Created.getCreated(node);
80 }
81
82
83
84
85
86 public static String getLastModifiedBy(Node node) throws RepositoryException {
87 return node.hasProperty(LAST_MODIFIED_BY) ? node.getProperty(LAST_MODIFIED_BY).getString() : Created.getCreatedBy(node);
88 }
89
90
91
92
93
94
95
96 public static void update(Node node) throws RepositoryException {
97 update(node, getCurrentUserName(), getCurrentCalendar());
98 }
99
100
101
102
103
104
105
106 public static void update(Node node, String userName, Calendar lastModified) throws RepositoryException {
107 checkNodeType(node, LastModified.NAME, LAST_MODIFIED, LAST_MODIFIED_BY);
108 node.setProperty(LAST_MODIFIED, lastModified);
109 node.setProperty(LAST_MODIFIED_BY, userName);
110 }
111
112 }
113
114
115
116
117 public static class Activatable {
118 public static final String NAME = MGNL_PREFIX + "activatable";
119 public static final String LAST_ACTIVATED = MGNL_PREFIX + "lastActivated";
120 public static final String LAST_ACTIVATED_BY = LAST_ACTIVATED + BY;
121 public static final String ACTIVATION_STATUS = MGNL_PREFIX + "activationStatus";
122
123 public static final int ACTIVATION_STATUS_NOT_ACTIVATED = 0;
124
125 public static final int ACTIVATION_STATUS_MODIFIED = 1;
126
127 public static final int ACTIVATION_STATUS_ACTIVATED = 2;
128
129
130
131
132
133
134
135
136
137 public static int getActivationStatus(Node node) throws RepositoryException {
138
139 if (!isActivated(node)) {
140
141 return ACTIVATION_STATUS_NOT_ACTIVATED;
142 }
143
144 Calendar lastModified = LastModified.getLastModified(node);
145 Calendar lastActivated = getLastActivated(node);
146
147 if (lastModified != null && lastModified.after(lastActivated)) {
148
149 return ACTIVATION_STATUS_MODIFIED;
150 }
151
152
153 return ACTIVATION_STATUS_ACTIVATED;
154 }
155
156
157
158
159 public static boolean isActivated(Node node) throws RepositoryException {
160 return node.hasProperty(ACTIVATION_STATUS) && node.getProperty(ACTIVATION_STATUS).getBoolean();
161 }
162
163
164
165
166 public static Calendar getLastActivated(Node node) throws RepositoryException {
167 return node.hasProperty(LAST_ACTIVATED) ? node.getProperty(LAST_ACTIVATED).getDate() : null;
168 }
169
170
171
172
173 public static String getLastActivatedBy(Node node) throws RepositoryException {
174 return node.hasProperty(LAST_ACTIVATED_BY) ? node.getProperty(LAST_ACTIVATED_BY).getString() : null;
175 }
176
177
178
179
180 public static void update(Node node, String userName, boolean isActivated) throws RepositoryException {
181 checkNodeType(node, Activatable.NAME, LAST_ACTIVATED, LAST_ACTIVATED_BY, ACTIVATION_STATUS);
182 node.setProperty(LAST_ACTIVATED, getCurrentCalendar());
183 node.setProperty(LAST_ACTIVATED_BY, userName);
184 node.setProperty(ACTIVATION_STATUS, isActivated);
185 }
186
187 }
188
189
190
191
192 public static class Created {
193 public static final String NAME = MGNL_PREFIX + "created";
194 public static final String CREATED = NAME;
195 public static final String CREATED_BY = CREATED + BY;
196
197
198
199
200 public static Calendar getCreated(Node node) throws RepositoryException {
201 return node.hasProperty(CREATED) ? node.getProperty(CREATED).getDate() : null;
202 }
203
204
205
206
207 public static String getCreatedBy(Node node) throws RepositoryException {
208 return node.hasProperty(CREATED_BY) ? node.getProperty(CREATED_BY).getString() : null;
209 }
210
211
212
213
214
215 public static void set(Node node) throws RepositoryException {
216 set(node, getCurrentUserName(), getCurrentCalendar());
217 }
218
219
220
221
222
223
224 static void set(Node node, String userName, Calendar created) throws RepositoryException {
225 checkNodeType(node, NAME, CREATED, CREATED_BY);
226 node.setProperty(CREATED, created);
227 node.setProperty(CREATED_BY, userName);
228
229 LastModified.update(node, userName, created);
230 }
231 }
232
233
234
235
236 public static class Renderable {
237 public static final String NAME = MGNL_PREFIX + "renderable";
238 public static final String TEMPLATE = MGNL_PREFIX + "template";
239
240
241
242
243
244 public static String getTemplate(Node node) throws RepositoryException {
245 return node.hasProperty(TEMPLATE) ? node.getProperty(TEMPLATE).getString() : null;
246 }
247
248
249
250
251 public static void set(Node node, String template) throws RepositoryException {
252 checkNodeType(node, NAME, TEMPLATE);
253 node.setProperty(TEMPLATE, template);
254 }
255 }
256
257
258
259
260 public static class Deleted {
261 public static final String NAME = MGNL_PREFIX + "deleted";
262 public static final String DELETED = NAME;
263 public static final String DELETED_BY = DELETED + BY;
264 public static final String COMMENT = MGNL_PREFIX + "comment";
265
266
267
268
269 public static Calendar getDeleted(Node node) throws RepositoryException {
270 return node.hasProperty(DELETED) ? node.getProperty(DELETED).getDate() : null;
271 }
272
273
274
275
276 public static String getDeletedBy(Node node) throws RepositoryException {
277 return node.hasProperty(DELETED_BY) ? node.getProperty(DELETED_BY).getString() : null;
278 }
279
280
281
282
283 public static String getComment(Node node) throws RepositoryException {
284 return node.hasProperty(COMMENT) ? node.getProperty(COMMENT).getString() : null;
285 }
286
287 public static void set(Node node, String comment) throws RepositoryException {
288 checkNodeType(node, NAME, DELETED, DELETED_BY, COMMENT);
289 node.setProperty(DELETED, getCurrentCalendar());
290 node.setProperty(DELETED_BY, getCurrentUserName());
291 node.setProperty(COMMENT, comment);
292 }
293 }
294
295
296
297
298 public static class Versionable {
299 public static final String NAME = MGNL_PREFIX + "versionable";
300 public static final String COMMENT = Deleted.COMMENT;
301
302
303
304
305 public static String getComment(Node node) throws RepositoryException {
306 return node.hasProperty(COMMENT) ? node.getProperty(COMMENT).getString() : null;
307 }
308
309
310
311
312 public static void set(Node node, String comment) throws RepositoryException{
313 checkNodeType(node, NAME, COMMENT);
314 node.setProperty(COMMENT, comment);
315 }
316 }
317
318
319
320
321 public static class Folder {
322 public static final String NAME = MGNL_PREFIX + "folder";
323 }
324
325
326
327
328 public static class Resource {
329 public static final String NAME = MGNL_PREFIX + "resource";
330 }
331
332
333
334
335 public static class Content {
336 public static final String NAME = MGNL_PREFIX + "content";
337 }
338
339
340
341
342 public static class ContentNode {
343 public static final String NAME = MGNL_PREFIX + "contentNode";
344 }
345
346
347
348
349 public static class NodeData {
350 public static final String NAME = MGNL_PREFIX + "nodeData";
351 }
352
353
354
355
356 public static class Page {
357 public static final String NAME = MGNL_PREFIX + "page";
358 }
359
360
361
362
363 public static class Area {
364 public static final String NAME = MGNL_PREFIX + "area";
365 }
366
367
368
369
370 public static class Component {
371 public static final String NAME = MGNL_PREFIX + "component";
372 }
373
374
375
376
377 public static class User {
378 public static final String NAME = MGNL_PREFIX + "user";
379 }
380
381
382
383
384 public static class Role {
385 public static final String NAME = MGNL_PREFIX + "role";
386 }
387
388
389
390
391 public static class Group {
392 public static final String NAME = MGNL_PREFIX + "group";
393 }
394
395
396
397
398 public static class System {
399 public static final String NAME = MGNL_PREFIX + "reserve";
400 }
401
402
403
404
405
406
407 public static class MetaData {
408 public static final String NAME = MGNL_PREFIX + "metaData";
409 }
410
411 protected static String getCurrentUserName() {
412 return MgnlContext.getUser() == null ? "not available" : MgnlContext.getUser().getName();
413 }
414
415 protected static Calendar getCurrentCalendar() {
416 return Calendar.getInstance();
417 }
418
419 public static void checkNodeType(Node node, String nodeType, String... propertyNames) throws RepositoryException {
420 if (!node.isNodeType(nodeType)) {
421 log.warn("Trying to set property/ies '" + StringUtils.join(propertyNames, ", ") + "' although the node '" + node.getPath() + "' with PrimaryType '" + node.getPrimaryNodeType().getName() + "' is not of type '" + nodeType + "'!");
422 }
423 }
424 }