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