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.ui.datasource.jcr;
35
36 import static info.magnolia.ui.framework.ContextProperty.log;
37
38 import info.magnolia.context.Context;
39 import info.magnolia.jcr.decoration.AbstractContentDecorator;
40 import info.magnolia.jcr.util.NodeTypes;
41
42 import javax.inject.Inject;
43 import javax.inject.Provider;
44 import javax.jcr.InvalidItemStateException;
45 import javax.jcr.Item;
46 import javax.jcr.Node;
47 import javax.jcr.Property;
48 import javax.jcr.RepositoryException;
49 import javax.jcr.Session;
50 import javax.jcr.nodetype.NodeType;
51
52
53
54
55 public class JcrSessionManager extends AbstractContentDecorator {
56
57 private static final String TMP_DELETED = "mgnl:tmpDeleted";
58 static final String TMP_DELETED_NODE = TMP_DELETED + "$Node";
59 static final String TMP_DELETED_PROPERTY = TMP_DELETED + "$Property";
60
61 private final Provider<Context> contextProvider;
62 private final JcrDatasourceDefinition datasourceDefinition;
63
64 @Inject
65 public JcrSessionManager(Provider<Context> contextProvider, JcrDatasourceDefinition datasourceDefinition) {
66 this.contextProvider = contextProvider;
67 this.datasourceDefinition = datasourceDefinition;
68 }
69
70 @Override
71 public boolean isMultipleWrapEnabled() {
72 return false;
73 }
74
75 @Override
76 public JcrSessionWrapper wrapSession(Session session) {
77 return new JcrSessionWrapper(session, this);
78 }
79
80 @Override
81 public JcrNodeWrapper wrapNode(Node node) {
82 return new JcrNodeWrapper(node, this);
83 }
84
85 @Override
86 public boolean evaluateNode(Node node) {
87 try {
88 NodeType primaryNodeType = node.getPrimaryNodeType();
89 return node.getPath().equals("/") || super.evaluateNode(node) &&
90 !node.getName().equals(TMP_DELETED_NODE) &&
91 (datasourceDefinition.getAllowedNodeTypes().isEmpty() || datasourceDefinition.getAllowedNodeTypes().stream().anyMatch(primaryNodeType::isNodeType));
92 } catch (RepositoryException e) {
93 log.error(e.getMessage(), e);
94 return false;
95 }
96 }
97
98 @Override
99 public JcrPropertyWrapper wrapProperty(Property property) {
100 return new JcrPropertyWrapper(property, this);
101 }
102
103 @Override
104 public boolean evaluateProperty(Property property) {
105 try {
106 String propertyName = property.getName();
107 return super.evaluateProperty(property) &&
108 !propertyName.equals(TMP_DELETED_PROPERTY) &&
109 datasourceDefinition.isIncludeProperties() &&
110 !propertyName.startsWith(NodeTypes.MGNL_PREFIX) &&
111 !propertyName.startsWith(NodeTypes.JCR_PREFIX);
112 } catch (RepositoryException e) {
113 log.error(e.getMessage(), e);
114 return false;
115 }
116 }
117
118 public JcrSessionWrapper getJCRSession() throws RepositoryException {
119 Session session = contextProvider.get().getJCRSession(datasourceDefinition.getWorkspace());
120 return wrapSession(session);
121 }
122
123 public Item wrapItem(Item item) {
124 return item instanceof Node ? wrapNode((Node) item) : wrapProperty((Property) item);
125 }
126
127 boolean exists(Item item) throws RepositoryException {
128 try {
129 item.getName();
130 return true;
131 } catch (InvalidItemStateException e) {
132 return false;
133 }
134 }
135 }