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
35
36
37
38
39
40
41
42
43
44
45
46 package org.exolab.castor.xml.schema;
47
48 import java.util.Enumeration;
49
50 import org.exolab.castor.xml.ValidationException;
51
52
53
54
55
56
57 public class Group extends Particle implements ContentModelGroup, Referable {
58
59 private static final long serialVersionUID = 3133443973681261845L;
60
61
62
63
64 private ContentModelGroup _contentModel = null;
65
66
67
68
69 private String _name = null;
70
71
72
73
74 private Order _order = Order.sequence;
75
76
77
78
79 private String _id = null;
80
81
82
83
84
85 private boolean _isModelGroupDefinition = false;
86
87
88
89
90 private Structure _parent = null;
91
92
93
94
95 public Group() {
96 this(null);
97 }
98
99
100
101
102
103 public Group(final String name) {
104 super();
105 this._name = name;
106 _contentModel = new ContentModelGroupImpl();
107 }
108
109
110
111
112
113
114 public void addWildcard(final Wildcard wildcard) throws SchemaException {
115 if (wildcard.isAttributeWildcard()) {
116 throw new SchemaException("only <any> should be add in a group.");
117 }
118 _contentModel.addWildcard(wildcard);
119 }
120
121
122
123
124
125
126 public boolean removeWildcard(final Wildcard wildcard) {
127 if (wildcard == null) {
128 return false;
129 }
130 return _contentModel.removeWildcard(wildcard);
131 }
132
133
134
135
136
137
138 public ContentModelGroup getContentModelGroup() {
139 return _contentModel;
140 }
141
142
143
144
145
146 public String getId() {
147 return _id;
148 }
149
150
151
152
153
154 public String getName() {
155 return _name;
156 }
157
158
159
160
161
162 public Order getOrder() {
163
164
165
166
167
168
169
170 if (_contentModel.getParticleCount() == 1) {
171 Particle particle = _contentModel.getParticle(0);
172 if (particle.getStructureType() == Structure.GROUP) {
173 if ((getMinOccurs() == 1) && (getMaxOccurs() == 1)) {
174 return ((Group) particle).getOrder();
175 }
176 }
177 }
178 return this._order;
179 }
180
181
182
183
184
185
186
187
188 public Structure getParent() {
189 return _parent;
190 }
191
192
193
194
195
196
197
198 public void setIsModelGroupDefinition(final boolean isModelGroupDefinition) {
199 _isModelGroupDefinition = isModelGroupDefinition;
200 }
201
202
203
204
205
206
207
208
209
210
211 public boolean isModelGroupDefinition() {
212 return _isModelGroupDefinition;
213 }
214
215
216
217
218
219
220
221 public String getReferenceId() {
222 if (_name != null) {
223 return "group:" + _name;
224 }
225 return null;
226 }
227
228
229
230
231
232 public void setName(final String name) {
233 this._name = name;
234 }
235
236
237
238
239
240 public void setId(final String id) {
241 _id = id;
242 }
243
244
245
246
247
248 public void setOrder(final Order order) {
249 if (order == null) {
250 this._order = Order.all;
251 } else {
252 this._order = order;
253 }
254 }
255
256
257
258
259
260
261
262
263
264
265 public void addElementDecl(final ElementDecl elementDecl)
266 throws SchemaException {
267 _contentModel.addElementDecl(elementDecl);
268
269 elementDecl.setParent(this);
270 }
271
272
273
274
275
276
277 public boolean removeElementDecl(final ElementDecl element) {
278 return _contentModel.removeElementDecl(element);
279 }
280
281
282
283
284
285
286 public void addGroup(final Group group) throws SchemaException {
287 _contentModel.addGroup(group);
288
289
290 group.setParent(this);
291
292 }
293
294
295
296
297
298
299 public boolean removeGroup(final Group group){
300 boolean result = _contentModel.removeGroup(group);
301 group.setParent(null);
302 return result;
303 }
304
305
306
307
308
309
310 public void addGroup(final ModelGroup group) throws SchemaException {
311 _contentModel.addGroup(group);
312
313
314 group.setParent(this);
315 }
316
317
318
319
320
321
322 public boolean removeGroup(final ModelGroup group) {
323 boolean result = _contentModel.removeGroup(group);
324 group.setParent(null);
325 return result;
326 }
327
328
329
330
331
332 public Enumeration<Annotated> enumerate() {
333
334
335
336 if (_contentModel.getParticleCount() == 1) {
337 Particle particle = _contentModel.getParticle(0);
338 if (particle.getStructureType() == Structure.GROUP) {
339 Group temp = (Group) particle;
340 if (((getMinOccurs() == 1) && (getMaxOccurs() == 1))
341 && ((temp.getMinOccurs() == 1) && (temp.getMaxOccurs() == 1))) {
342 return temp.enumerate();
343 }
344 }
345 }
346 return _contentModel.enumerate();
347 }
348
349
350
351
352
353
354 public ElementDecl getElementDecl(final String name) {
355 return _contentModel.getElementDecl(name);
356 }
357
358
359
360
361
362 public Particle getParticle(final int index) {
363
364
365 if (_contentModel.getParticleCount() == 1) {
366 Particle particle = _contentModel.getParticle(0);
367 if (particle.getStructureType() == Structure.GROUP) {
368 if ((getMinOccurs() == 1) && (getMaxOccurs() == 1)) {
369 return ((Group) particle).getParticle(index);
370 }
371 }
372 }
373 return _contentModel.getParticle(index);
374 }
375
376
377
378
379
380
381 public int getParticleCount() {
382
383
384 if (_contentModel.getParticleCount() == 1) {
385 Particle particle = _contentModel.getParticle(0);
386 if (particle.getStructureType() == Structure.GROUP) {
387 if ((getMinOccurs() == 1) && (getMaxOccurs() == 1)) {
388 return ((Group) particle).getParticleCount();
389 }
390 }
391 }
392 return _contentModel.getParticleCount();
393 }
394
395
396
397
398
399
400
401
402
403
404 public short getStructureType() {
405 return Structure.GROUP;
406 }
407
408
409
410
411
412
413
414 public boolean hasAny() {
415 boolean result = false;
416 Enumeration<Structure> enumeration = _contentModel.enumerate();
417 while (enumeration.hasMoreElements() && !result) {
418 Structure struct = enumeration.nextElement();
419 switch (struct.getStructureType()) {
420 case Structure.ELEMENT:
421 break;
422 case Structure.GROUP:
423 case Structure.MODELGROUP:
424 result = ((Group) struct).hasAny();
425 break;
426 case Structure.WILDCARD:
427 result = true;
428 break;
429 default:
430 break;
431 }
432 }
433 return result;
434 }
435
436
437
438
439
440
441
442 public void validate() throws ValidationException {
443 if (_order == Order.all) {
444 if (getMaxOccurs() != 1) {
445 String err = "Wrong maxOccurs value for a <all>:" + getMaxOccurs();
446 err += "\n1 is the only possible value.";
447 throw new ValidationException(err);
448 }
449 if (getMinOccurs() > 1) {
450 String err = "Wrong minOccurs value for a <all>:" + getMinOccurs();
451 err += "\n0 or 1 are the only possible values.";
452 throw new ValidationException(err);
453 }
454 }
455 Enumeration<Structure> enumeration = _contentModel.enumerate();
456 while (enumeration.hasMoreElements()) {
457 enumeration.nextElement().validate();
458 }
459 }
460
461
462
463
464
465
466 protected void setParent(final Structure parent) {
467 if (parent != null) {
468 switch (parent.getStructureType()) {
469 case Structure.COMPLEX_TYPE:
470 case Structure.GROUP:
471 case Structure.MODELGROUP:
472 case Structure.SCHEMA:
473 break;
474 default:
475 String error = "Invalid parent for group";
476 throw new IllegalArgumentException(error);
477 }
478 }
479 _parent = parent;
480 }
481
482
483
484
485
486 public boolean isEmptiable() {
487 if (getMinOccurs() == 0) {
488 return true;
489 }
490
491 boolean result = false;
492 switch (this.getOrder()) {
493 case choice:
494 {
495 result = false;
496 Enumeration<Annotated> enumerate = this.enumerate();
497 while (enumerate.hasMoreElements()) {
498 Particle p = (Particle) enumerate.nextElement();
499 if (p.isEmptiable()) {
500 result = true;
501 break;
502 }
503 }
504 }
505 break;
506
507 case all:
508 case sequence:
509 {
510 result = true;
511 Enumeration<Annotated> enumerate = this.enumerate();
512 while (enumerate.hasMoreElements()) {
513 Particle p = (Particle) enumerate.nextElement();
514 if (!p.isEmptiable()) {
515 result = false;
516 break;
517 }
518 }
519 }
520 break;
521 }
522 return result;
523
524 }
525
526 }