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