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.web.jcr.rest.client.domain;
25
26 import java.util.Map;
27 import java.util.Set;
28 import javax.jcr.version.OnParentVersionAction;
29 import net.jcip.annotations.Immutable;
30
31
32
33
34 @Immutable
35 public class ChildNodeDefinition extends ItemDefinition implements javax.jcr.nodetype.NodeDefinition {
36
37 private final Id id;
38 private final String defaultPrimaryTypeName;
39
40 public ChildNodeDefinition( String declaringNodeTypeName,
41 String name,
42 Set<String> requiredTypes,
43 boolean isAutoCreated,
44 boolean isMandatory,
45 boolean isProtected,
46 boolean allowsSameNameSiblings,
47 int onParentVersion,
48 String defaultPrimaryTypeName,
49 Map<String, NodeType> nodeTypes ) {
50 super(declaringNodeTypeName, isAutoCreated, isMandatory, isProtected, onParentVersion, nodeTypes);
51 this.id = new Id(name, allowsSameNameSiblings, requiredTypes);
52 this.defaultPrimaryTypeName = defaultPrimaryTypeName;
53 }
54
55
56
57
58 protected Id id() {
59 return id;
60 }
61
62
63
64
65
66
67 @Override
68 public String getName() {
69 return id.name;
70 }
71
72
73
74
75
76
77 @Override
78 public boolean allowsSameNameSiblings() {
79 return id.isMultiple;
80 }
81
82
83
84
85
86
87 @Override
88 public String[] getRequiredPrimaryTypeNames() {
89 return toArray(id.requiredTypes);
90 }
91
92
93
94
95
96
97 @Override
98 public NodeType getDefaultPrimaryType() {
99 return nodeType(getDefaultPrimaryTypeName());
100 }
101
102
103
104
105
106
107 @Override
108 public String getDefaultPrimaryTypeName() {
109 return defaultPrimaryTypeName;
110 }
111
112
113
114
115
116
117 @Override
118 public javax.jcr.nodetype.NodeType[] getRequiredPrimaryTypes() {
119 return nodeTypes(id.requiredTypes, nodeTypes());
120 }
121
122
123
124
125
126
127 @Override
128 public int hashCode() {
129 return id.hashCode();
130 }
131
132
133
134
135
136
137 @Override
138 public boolean equals( Object obj ) {
139 if (obj == this) return true;
140 if (obj instanceof ChildNodeDefinition) {
141 ChildNodeDefinition that = (ChildNodeDefinition)obj;
142 return this.id.equals(that.id);
143 }
144 return false;
145 }
146
147
148
149
150
151
152 @Override
153 public String toString() {
154 StringBuilder sb = new StringBuilder();
155 sb.append(" + ");
156 sb.append(id.name);
157 if (getRequiredPrimaryTypeNames().length != 0) {
158 sb.append(" (");
159 boolean first = true;
160 for (String typeName : getRequiredPrimaryTypeNames()) {
161 if (typeName == null) continue;
162 if (first) first = false;
163 else sb.append(',');
164 sb.append(typeName);
165 }
166 sb.append(')');
167 }
168 if (getDefaultPrimaryTypeName() != null) {
169 sb.append(" = ").append(getDefaultPrimaryTypeName());
170 }
171 if (isAutoCreated()) sb.append(" autocreated");
172 if (isMandatory()) sb.append(" mandatory");
173 if (allowsSameNameSiblings()) sb.append(" sns");
174 if (isProtected()) sb.append(" protected");
175 sb.append(' ').append(OnParentVersionAction.nameFromValue(getOnParentVersion()));
176 return sb.toString();
177 }
178
179 protected static class Id {
180 protected final String name;
181 protected final boolean isMultiple;
182 protected final Set<String> requiredTypes;
183
184 protected Id( String name,
185 boolean isMultiple,
186 Set<String> requiredTypes ) {
187 this.name = name;
188 this.isMultiple = isMultiple;
189 this.requiredTypes = requiredTypes;
190 assert this.name != null;
191 assert this.requiredTypes != null;
192 }
193
194
195
196
197
198
199 @Override
200 public int hashCode() {
201 return name.hashCode();
202 }
203
204
205
206
207
208
209 @Override
210 public boolean equals( Object obj ) {
211 if (obj == this) return true;
212 if (obj instanceof Id) {
213 Id that = (Id)obj;
214 if (this.isMultiple != that.isMultiple) return false;
215 if (!this.requiredTypes.equals(that.requiredTypes)) return false;
216 if (!this.name.equals(that.name)) return false;
217 return true;
218 }
219 return false;
220 }
221
222
223
224
225
226
227 @Override
228 public String toString() {
229 StringBuilder sb = new StringBuilder(name);
230 sb.append('(');
231 boolean first = true;
232 for (String requiredType : requiredTypes) {
233 if (first) first = false;
234 else sb.append(',');
235 sb.append(requiredType);
236 }
237 sb.append(')');
238 sb.append(isMultiple ? '*' : '1');
239 return sb.toString();
240 }
241 }
242
243 }