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