1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.jcr;
25
26 import java.util.Collections;
27 import java.util.HashMap;
28 import java.util.Map;
29 import java.util.Set;
30 import javax.jcr.nodetype.NodeDefinition;
31 import javax.jcr.nodetype.NodeType;
32 import net.jcip.annotations.Immutable;
33 import org.modeshape.graph.ExecutionContext;
34 import org.modeshape.graph.property.Name;
35
36
37
38
39 @Immutable
40 class JcrNodeDefinition extends JcrItemDefinition implements NodeDefinition {
41
42
43 private final boolean allowsSameNameSiblings;
44
45
46
47
48
49 private final Name defaultPrimaryTypeName;
50
51
52 private Map<Name, JcrNodeType> requiredPrimaryTypesByName;
53
54 private JcrNodeType[] requiredPrimaryTypes;
55
56 private Name[] requiredPrimaryTypeNames;
57
58
59 private NodeDefinitionId id;
60
61
62 private final RepositoryNodeTypeManager nodeTypeManager;
63
64 JcrNodeDefinition( ExecutionContext context,
65 JcrNodeType declaringNodeType,
66 Name name,
67 int onParentVersion,
68 boolean autoCreated,
69 boolean mandatory,
70 boolean protectedItem,
71 boolean allowsSameNameSiblings,
72 Name defaultPrimaryTypeName,
73 Name[] requiredPrimaryTypeNames ) {
74 this(context, null, declaringNodeType, name, onParentVersion, autoCreated, mandatory, protectedItem,
75 allowsSameNameSiblings, defaultPrimaryTypeName, requiredPrimaryTypeNames);
76 }
77
78 JcrNodeDefinition( ExecutionContext context,
79 RepositoryNodeTypeManager nodeTypeManager,
80 JcrNodeType declaringNodeType,
81 Name name,
82 int onParentVersion,
83 boolean autoCreated,
84 boolean mandatory,
85 boolean protectedItem,
86 boolean allowsSameNameSiblings,
87 Name defaultPrimaryTypeName,
88 Name[] requiredPrimaryTypeNames ) {
89 super(context, declaringNodeType, name, onParentVersion, autoCreated, mandatory, protectedItem);
90 this.nodeTypeManager = nodeTypeManager;
91 this.allowsSameNameSiblings = allowsSameNameSiblings;
92 this.defaultPrimaryTypeName = defaultPrimaryTypeName;
93 this.requiredPrimaryTypes = new JcrNodeType[requiredPrimaryTypeNames.length];
94 this.requiredPrimaryTypeNames = requiredPrimaryTypeNames;
95 }
96
97
98
99
100
101
102
103
104
105 private void ensureRequiredPrimaryTypesLoaded() {
106 if (requiredPrimaryTypesByName != null) return;
107 this.requiredPrimaryTypes = new JcrNodeType[requiredPrimaryTypeNames.length];
108 for (int i = 0; i != requiredPrimaryTypeNames.length; ++i) {
109 this.requiredPrimaryTypes[i] = nodeTypeManager.getNodeType(requiredPrimaryTypeNames[i]);
110 }
111 Map<Name, JcrNodeType> requiredPrimaryTypesByName = new HashMap<Name, JcrNodeType>();
112 for (JcrNodeType requiredPrimaryType : requiredPrimaryTypes) {
113 requiredPrimaryTypesByName.put(requiredPrimaryType.getInternalName(), requiredPrimaryType);
114 }
115 this.requiredPrimaryTypesByName = Collections.unmodifiableMap(requiredPrimaryTypesByName);
116
117 }
118
119
120
121
122
123
124 public NodeDefinitionId getId() {
125 if (id == null) {
126
127 id = new NodeDefinitionId(this.declaringNodeType.getInternalName(), this.name, this.requiredPrimaryTypeNames);
128 }
129 return id;
130 }
131
132
133
134
135
136
137 public boolean allowsSameNameSiblings() {
138 return allowsSameNameSiblings;
139 }
140
141
142
143
144 final Name defaultPrimaryTypeName() {
145 return defaultPrimaryTypeName;
146 }
147
148
149
150
151
152
153 public NodeType getDefaultPrimaryType() {
154
155 if (defaultPrimaryTypeName == null) {
156 return null;
157 }
158
159 return nodeTypeManager.getNodeType(defaultPrimaryTypeName);
160 }
161
162
163
164
165
166
167 public NodeType[] getRequiredPrimaryTypes() {
168 ensureRequiredPrimaryTypesLoaded();
169
170 NodeType[] result = new NodeType[requiredPrimaryTypes.length];
171 for (int i = 0; i != requiredPrimaryTypes.length; ++i) {
172 result[i] = requiredPrimaryTypes[i];
173 }
174 return result;
175 }
176
177
178
179
180
181
182
183 Name[] requiredPrimaryTypeNames() {
184 return this.requiredPrimaryTypeNames;
185 }
186
187
188
189
190
191
192 Set<Name> getRequiredPrimaryTypeNames() {
193 ensureRequiredPrimaryTypesLoaded();
194 return requiredPrimaryTypesByName.keySet();
195 }
196
197
198
199
200
201
202
203
204
205
206 final boolean allowsChildWithType( JcrNodeType childPrimaryType ) {
207 if (childPrimaryType == null) {
208
209 if (defaultPrimaryTypeName != null) {
210 return true;
211 }
212 return false;
213 }
214 ensureRequiredPrimaryTypesLoaded();
215
216 for (Name requiredPrimaryTypeName : requiredPrimaryTypesByName.keySet()) {
217 if (!childPrimaryType.isNodeType(requiredPrimaryTypeName)) return false;
218 }
219 return true;
220 }
221
222
223
224
225
226
227
228
229
230 JcrNodeDefinition with( JcrNodeType declaringNodeType ) {
231 return new JcrNodeDefinition(this.context, declaringNodeType.nodeTypeManager(), declaringNodeType, name,
232 getOnParentVersion(), isAutoCreated(), isMandatory(), isProtected(),
233 allowsSameNameSiblings(), defaultPrimaryTypeName, requiredPrimaryTypeNames);
234 }
235
236 JcrNodeDefinition with( ExecutionContext context ) {
237 return new JcrNodeDefinition(context, this.nodeTypeManager, this.declaringNodeType, name, getOnParentVersion(),
238 isAutoCreated(), isMandatory(), isProtected(), allowsSameNameSiblings(),
239 defaultPrimaryTypeName, requiredPrimaryTypeNames);
240 }
241
242 JcrNodeDefinition with( RepositoryNodeTypeManager nodeTypeManager ) {
243 return new JcrNodeDefinition(this.context, nodeTypeManager, this.declaringNodeType, name, getOnParentVersion(),
244 isAutoCreated(), isMandatory(), isProtected(), allowsSameNameSiblings(),
245 defaultPrimaryTypeName, requiredPrimaryTypeNames);
246 }
247
248 @Override
249 public int hashCode() {
250 return getId().toString().hashCode();
251 }
252
253 @Override
254 public boolean equals( Object obj ) {
255 if (this == obj) return true;
256 if (obj == null) return false;
257 if (getClass() != obj.getClass()) return false;
258 JcrNodeDefinition other = (JcrNodeDefinition)obj;
259 if (id == null) {
260 if (other.id != null) return false;
261 } else if (!id.equals(other.id)) return false;
262 return true;
263 }
264
265
266
267
268
269
270 @Override
271 public String toString() {
272 return getId().toString();
273 }
274 }