1 /*
2
3 dsh-codegen Source code generation suite.
4 Copyright (c) 2004-2013 held jointly by the individual authors.
5
6 This library is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 3 of the License, or (at
9 your option) any later version.
10
11 This library is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with this library; if not, write to the Free Software Foundation,
18 Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
19
20 > http://www.fsf.org/licensing/licenses/lgpl.html
21 > http://www.opensource.org/licenses/lgpl-license.php
22
23 */
24 package org.dishevelled.codegen;
25
26 import java.util.Set;
27 import java.util.LinkedHashSet;
28 import java.util.Collections;
29
30 /**
31 * A description of the attributes and associations for a class.
32 *
33 * @author Michael Heuer
34 */
35 public final class ClassDescription
36 {
37 /** License for this class description. */
38 private String license;
39
40 /** Package name for this class description. */
41 private String packageName;
42
43 /** Lowercase name for this class description. */
44 private String lower;
45
46 /** Mixed-case name for this class description. */
47 private String mixed;
48
49 /** Uppercase name for this class description. */
50 private String upper;
51
52 /** Author for this class description. */
53 private String author;
54
55 /** Version for this class description. */
56 private String version;
57
58 /** Description for this class description. */
59 private String description;
60
61 /** Set of classes this class description specializes. */
62 private final Set<ClassDescription> specializes;
63
64 /** Set of interfaces this class description realizes. */
65 private final Set<InterfaceDescription> realizes;
66
67 /** Set of attributes for this class description. */
68 private final Set<Attribute> attributes;
69
70 /** Set of associations for this class description. */
71 private final Set<Association> associations;
72
73
74 /**
75 * Create a new class description with the specified package name
76 * and name.
77 *
78 * @param packageName package name for this class description
79 * @param name name of this class description
80 */
81 public ClassDescription(final String packageName, final String name)
82 {
83 this.packageName = packageName;
84 this.lower = CodegenUtils.makeLowercase(name);
85 this.mixed = CodegenUtils.makeMixedCase(name);
86 this.upper = CodegenUtils.makeUppercase(name);
87 this.description = CodegenUtils.makeSentenceCaseDescription(name);
88 this.author = " codegen";
89 this.version = "$" + "Revision$ $" + "Date$"; // split to prevent svn expansion
90 this.specializes = new LinkedHashSet<ClassDescription>();
91 this.realizes = new LinkedHashSet<InterfaceDescription>();
92 this.attributes = new LinkedHashSet<Attribute>();
93 this.associations = new LinkedHashSet<Association>();
94 }
95
96 /**
97 * Create a new class description with the specified package name
98 * and name.
99 *
100 * @param license license for this class description
101 * @param packageName package name for this class description
102 * @param name name of this class description
103 */
104 public ClassDescription(final String license, final String packageName, final String name)
105 {
106 this.license = license;
107 this.packageName = packageName;
108 this.lower = CodegenUtils.makeLowercase(name);
109 this.mixed = CodegenUtils.makeMixedCase(name);
110 this.upper = CodegenUtils.makeUppercase(name);
111 this.description = CodegenUtils.makeSentenceCaseDescription(name);
112 this.author = " codegen";
113 this.version = "$" + "Revision$ $" + "Date$"; // split to prevent svn expansion
114 this.specializes = new LinkedHashSet<ClassDescription>();
115 this.realizes = new LinkedHashSet<InterfaceDescription>();
116 this.attributes = new LinkedHashSet<Attribute>();
117 this.associations = new LinkedHashSet<Association>();
118 }
119
120 /**
121 * Create a new class description from the specified parameters.
122 *
123 * @param packageName package name for this class description
124 * @param name name of this class description
125 * @param author author for this class description
126 * @param version version for this class description
127 * @param description description for this class description
128 */
129 public ClassDescription(final String packageName, final String name,
130 final String author, final String version, final String description)
131 {
132 this.packageName = packageName;
133 this.lower = CodegenUtils.makeLowercase(name);
134 this.mixed = CodegenUtils.makeMixedCase(name);
135 this.upper = CodegenUtils.makeUppercase(name);
136 this.author = author;
137 this.version = version;
138 this.description = description;
139 this.specializes = new LinkedHashSet<ClassDescription>();
140 this.realizes = new LinkedHashSet<InterfaceDescription>();
141 this.attributes = new LinkedHashSet<Attribute>();
142 this.associations = new LinkedHashSet<Association>();
143 }
144
145 /**
146 * Create a new class description from the specified parameters.
147 *
148 * @param packageName package name for this class description
149 * @param lower lowercase name for this class description
150 * @param mixed mixed-case name for this class description
151 * @param upper uppercase name for this class description
152 * @param author author for this class description
153 * @param version version for this class description
154 * @param description description for this class description
155 */
156 public ClassDescription(final String packageName, final String lower, final String mixed, final String upper,
157 final String author, final String version, final String description)
158 {
159 this.packageName = packageName;
160 this.lower = lower;
161 this.mixed = mixed;
162 this.upper = upper;
163 this.author = author;
164 this.version = version;
165 this.description = description;
166 this.specializes = new LinkedHashSet<ClassDescription>();
167 this.realizes = new LinkedHashSet<InterfaceDescription>();
168 this.attributes = new LinkedHashSet<Attribute>();
169 this.associations = new LinkedHashSet<Association>();
170 }
171
172 /**
173 * Create a new class description from the specified parameters.
174 *
175 * <p>The classes this class description specializes in <code>specializes</code> are copied defensively
176 * into this class.</p>
177 *
178 * <p>The interfaces this class description realizes in <code>realizes</code> are copied defensively
179 * into this class.</p>
180 *
181 * <p>The attributes in <code>attributes</code> are copied defensively
182 * into this class.</p>
183 *
184 * <p>The associations in <code>associations</code> are copied defensively
185 * into this class.</p>
186 *
187 * @param packageName package name for this class description
188 * @param lower lowercase name for this class description
189 * @param mixed mixed-case name for this class description
190 * @param upper uppercase name for this class description
191 * @param author author for this class description
192 * @param version version for this class description
193 * @param description description for this class description
194 * @param specializes set of classes this class description specializes, must not be null
195 * @param realizes set of interfaces this class description realizes, must not be null
196 * @param attributes set of attributes, must not be null
197 * @param associations set of associations, must not be null
198 */
199 public ClassDescription(final String packageName,
200 final String lower,
201 final String mixed,
202 final String upper,
203 final String author,
204 final String version,
205 final String description,
206 final Set<ClassDescription> specializes,
207 final Set<InterfaceDescription> realizes,
208 final Set<Attribute> attributes,
209 final Set<Association> associations)
210 {
211
212 this.packageName = packageName;
213 this.lower = lower;
214 this.mixed = mixed;
215 this.upper = upper;
216 this.author = author;
217 this.version = version;
218 this.description = description;
219
220 this.specializes = new LinkedHashSet<ClassDescription>(specializes.size());
221 this.specializes.addAll(specializes);
222
223 this.realizes = new LinkedHashSet<InterfaceDescription>(realizes.size());
224 this.realizes.addAll(realizes);
225
226 this.attributes = new LinkedHashSet<Attribute>(attributes.size());
227 this.attributes.addAll(attributes);
228
229 this.associations = new LinkedHashSet<Association>(associations.size());
230 this.associations.addAll(associations);
231 }
232
233
234 /**
235 * Return the license for this class description.
236 *
237 * @return the license for this class description
238 */
239 public String getLicense()
240 {
241 return license;
242 }
243
244 /**
245 * Return the package name for this class description.
246 *
247 * @return the package name for this class description
248 */
249 public String getPackageName()
250 {
251 return packageName;
252 }
253
254 /**
255 * Return the lowercase name for this class description.
256 *
257 * @return the lowercase name for this class description
258 */
259 public String getLower()
260 {
261 return lower;
262 }
263
264 /**
265 * Return the mixed-case name for this class description.
266 *
267 * @return the mixed-case name for this class description
268 */
269 public String getMixed()
270 {
271 return mixed;
272 }
273
274 /**
275 * Return the uppercase name for this class description.
276 *
277 * @return the uppercase name for this class description
278 */
279 public String getUpper()
280 {
281 return upper;
282 }
283
284 /**
285 * Return the author for this class description.
286 *
287 * @return the author for this class description
288 */
289 public String getAuthor()
290 {
291 return author;
292 }
293
294 /**
295 * Return the version for this class description.
296 *
297 * @return the version for this class description
298 */
299 public String getVersion()
300 {
301 return version;
302 }
303
304 /**
305 * Return the description for this class description.
306 *
307 * @return the description for this class description
308 */
309 public String getDescription()
310 {
311 return description;
312 }
313
314 /**
315 * Return an unmodifiable set of classes this class description specializes.
316 *
317 * @return an unmodifiable set of classes this class description specializes
318 */
319 public Set<ClassDescription> getSpecializes()
320 {
321 return Collections.unmodifiableSet(specializes);
322 }
323
324 /**
325 * Add the specified class description to the set of classes this class description
326 * specializes. Return <code>true</code> if the set of classes this class description
327 * specializes changed as a result of this call.
328 *
329 * @param specializes class description to add, must not be null
330 * @return <code>true</code> if the set of classes this class description specializes
331 * changed as a result of this call
332 */
333 public boolean addSpecializes(final ClassDescription specializes)
334 {
335 if (specializes == null)
336 {
337 throw new IllegalArgumentException("specializes must not be null");
338 }
339
340 boolean rv = this.specializes.add(specializes);
341
342 if (rv)
343 {
344 for (Attribute a : specializes.getAttributes())
345 {
346 addAttribute(a);
347 }
348 for (Association a : specializes.getAssociations())
349 {
350 addAssociation(a);
351 }
352 }
353 return rv;
354 }
355
356 /**
357 * Add the specified class description to the set of classes this class description
358 * specializes. Return <code>true</code> if the set of classes this class description
359 * specializes changed as a result of this call.
360 *
361 * @param specializes class description to add, must not be null
362 * @return <code>true</code> if the set of classes this class description specializes
363 * changed as a result of this call
364 */
365 public boolean specializes(final ClassDescription specializes)
366 {
367 return addSpecializes(specializes);
368 }
369
370 /**
371 * Return an unmodifiable set of interfaces this class description realizes.
372 *
373 * @return an unmodifiable set of interfaces this class description realizes
374 */
375 public Set<InterfaceDescription> getRealizes()
376 {
377 return Collections.unmodifiableSet(realizes);
378 }
379
380 /**
381 * Add the specified interface description to the set of interfaces this class
382 * description realizes. Return <code>true</code> if the set of interfaces this
383 * class description realizes changed as a result of this call.
384 *
385 * @param realizes interface description to add, must not be null
386 * @return <code>true</code> if the set of interfaces this class description realizes
387 * changed as a result of this call
388 */
389 public boolean addRealizes(final InterfaceDescription realizes)
390 {
391 if (realizes == null)
392 {
393 throw new IllegalArgumentException("realizes must not be null");
394 }
395 boolean rv = this.realizes.add(realizes);
396
397 if (rv)
398 {
399 for (Attribute a : realizes.getAttributes())
400 {
401 addAttribute(a);
402 }
403 for (Association a : realizes.getAssociations())
404 {
405 addAssociation(a);
406 }
407 }
408 return rv;
409 }
410
411 /**
412 * Add the specified interface description to the set of interfaces this class
413 * description realizes. Return <code>true</code> if the set of interfaces this
414 * class description realizes changed as a result of this call.
415 *
416 * @param realizes interface description to add, must not be null
417 * @return <code>true</code> if the set of interfaces this class description realizes
418 * changed as a result of this call
419 */
420 public boolean realizes(final InterfaceDescription realizes)
421 {
422 return addRealizes(realizes);
423 }
424
425 /**
426 * Return an unmodifiable set of attributes for this class description.
427 *
428 * @return an unmodifiable set of attributes for this class description
429 */
430 public Set<Attribute> getAttributes()
431 {
432 return Collections.unmodifiableSet(attributes);
433 }
434
435 /**
436 * Add the specified attribute to the set of attributes
437 * for this class description. Return <code>true</code> if the set
438 * of attributes changed as a result of this call.
439 *
440 * @param attribute attribute to add, must not be null
441 * @return <code>true</code> if the set of attributes
442 * changed as a result of this call
443 */
444 public boolean addAttribute(final Attribute attribute)
445 {
446 if (attribute == null)
447 {
448 throw new IllegalArgumentException("attribute must not be null");
449 }
450 return attributes.add(attribute);
451 }
452
453 /**
454 * Add the specified attribute to the set of attributes
455 * for this class description. Return <code>true</code> if the set
456 * of attributes changed as a result of this call.
457 *
458 * @param attribute attribute to add, must not be null
459 * @return <code>true</code> if the set of attributes
460 * changed as a result of this call
461 */
462 public boolean attribute(final Attribute attribute)
463 {
464 return addAttribute(attribute);
465 }
466
467 /**
468 * Add a new attribute to the set of attributes for this
469 * class description with the specified name, role name,
470 * and cardinality. The cardinality must be one of <b>Cardinality.ZeroToOne</b>
471 * or <b>Cardinality.StrictlyOne</b>. Return <code>true</code> if
472 * the set of attributes changed as a result of this call.
473 *
474 * @param name attribute name
475 * @param roleName role name
476 * @param cardinality cardinality, must not be null and must be
477 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
478 * @return <code>true</code> if the set of attributes
479 * changed as a result of this call
480 */
481 public boolean attribute(final String name, final String roleName, final Cardinality cardinality)
482 {
483 Attribute a = new Attribute(name, roleName, cardinality);
484 return addAttribute(a);
485 }
486
487 /**
488 * Add a new attribute to the set of attributes for this
489 * class description with the specified name, role name,
490 * cardinality, and bound flag. The cardinality must be one of <b>Cardinality.ZeroToOne</b>
491 * or <b>Cardinality.StrictlyOne</b>. Return <code>true</code> if
492 * the set of attributes changed as a result of this call.
493 *
494 * @param name attribute name
495 * @param roleName role name
496 * @param cardinality cardinality, must not be null and must be
497 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
498 * @param bound true if the attribute is to be a "bound" attribute
499 * @return <code>true</code> if the set of attributes
500 * changed as a result of this call
501 */
502 public boolean attribute(final String name, final String roleName,
503 final Cardinality cardinality, final boolean bound)
504 {
505 Attribute a = new Attribute(name, roleName, cardinality, bound);
506 return addAttribute(a);
507 }
508
509 /**
510 * Add a new attribute to the set of attributes for this
511 * class description with the specified parameters.
512 * Return <code>true</code> if the set of attributes changed as
513 * a result of this call.
514 *
515 * @param name attribute name
516 * @param roleName role name
517 * @param cardinality cardinality, must not be null
518 * @param indexed true if the collection should be indexed
519 * @param unique true if the collection should not allow duplicate elements
520 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
521 * @param sorted true if the collection should iterate over elements in ascending element order,
522 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
523 * provided at creation time
524 * @return <code>true</code> if the set of attributes
525 * changed as a result of this call
526 */
527 public boolean attribute(final String name, final String roleName, final Cardinality cardinality,
528 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
529 {
530 Attribute a = new Attribute(name, roleName, cardinality, indexed, unique, ordered, sorted);
531 return addAttribute(a);
532 }
533
534 /**
535 * Add a new attribute to the set of attributes for this
536 * class description with the specified parameters.
537 * Return <code>true</code> if the set of attributes changed as
538 * a result of this call.
539 *
540 * @param name attribute name
541 * @param roleName role name
542 * @param cardinality cardinality, must not be null
543 * @param bound true if the attribute is to be a "bound" attribute
544 * @param indexed true if the collection should be indexed
545 * @param unique true if the collection should not allow duplicate elements
546 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
547 * @param sorted true if the collection should iterate over elements in ascending element order,
548 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
549 * provided at creation time
550 * @return <code>true</code> if the set of attributes
551 * changed as a result of this call
552 */
553 public boolean attribute(final String name, final String roleName, final Cardinality cardinality,
554 final boolean bound,
555 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
556 {
557 Attribute a = new Attribute(name, roleName, cardinality, bound, indexed, unique, ordered, sorted);
558 return addAttribute(a);
559 }
560
561 /**
562 * Return an unmodifiable set of associations for this class description.
563 *
564 * @return an unmodifiable set of associations for this class description
565 */
566 public Set<Association> getAssociations()
567 {
568 return Collections.unmodifiableSet(associations);
569 }
570
571 /**
572 * Add the specified association to the set of associations
573 * for this class description. Return <code>true</code> if the set
574 * of associations changed as a result of this call.
575 *
576 * @param association association to add, must not be null
577 * @return <code>true</code> if the set of associations
578 * changed as a result of this call
579 */
580 public boolean addAssociation(final Association association)
581 {
582 if (association == null)
583 {
584 throw new IllegalArgumentException("association must not be null");
585 }
586 return associations.add(association);
587 }
588
589 /**
590 * Add the specified association to the set of associations
591 * for this class description. Return <code>true</code> if the set
592 * of associations changed as a result of this call.
593 *
594 * @param association association to add, must not be null
595 * @return <code>true</code> if the set of associations
596 * changed as a result of this call
597 */
598 public boolean associate(final Association association)
599 {
600 return addAssociation(association);
601 }
602
603 /**
604 * Add a new association to the set of associations for this
605 * class description to the specified class with the
606 * specified cardinality. The assocation's role name will be
607 * the same as the class' name. The cardinality must be one of
608 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
609 * Return <code>true</code> if the set of associations changed as a result of
610 * this call.
611 *
612 * @param cd class description, must not be null
613 * @param cardinality cardinality, must not be null and must be
614 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
615 * @return <code>true</code> if the set of associations
616 * changed as a result of this call
617 */
618 public boolean associate(final ClassDescription cd, final Cardinality cardinality)
619 {
620 Association a = new Association(cd, cd.getUpper(), cardinality);
621 return addAssociation(a);
622 }
623
624 /**
625 * Add a new association to the set of associations for this
626 * class description to the specified class with the
627 * specified cardinality and bound flag. The assocation's role name will be
628 * the same as the class' name. The cardinality must be one of
629 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
630 * Return <code>true</code> if the set of associations changed as a result of
631 * this call.
632 *
633 * @param cd class description, must not be null
634 * @param cardinality cardinality, must not be null and must be
635 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
636 * @param bound true if the association is to be a "bound" association
637 * @return <code>true</code> if the set of associations
638 * changed as a result of this call
639 */
640 public boolean associate(final ClassDescription cd, final Cardinality cardinality, final boolean bound)
641 {
642 Association a = new Association(cd, cd.getUpper(), cardinality, bound);
643 return addAssociation(a);
644 }
645
646 /**
647 * Add a new association to the set of attributes for this
648 * class description to the specified class with the
649 * specified role name and cardinality. The cardinality must be one of
650 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
651 * Return <code>true</code> if the set of associations changed as a result of
652 * this call.
653 *
654 * @param cd class description, must not be null
655 * @param roleName role name
656 * @param cardinality cardinality, must not be null and must be
657 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
658 * @return <code>true</code> if the set of associations
659 * changed as a result of this call
660 */
661 public boolean associate(final ClassDescription cd, final String roleName, final Cardinality cardinality)
662 {
663 Association a = new Association(cd, roleName, cardinality);
664 return addAssociation(a);
665 }
666
667 /**
668 * Add a new association to the set of attributes for this
669 * class description to the specified class with the
670 * specified role name, cardinality, and bound flag. The cardinality must be one of
671 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
672 * Return <code>true</code> if the set of associations changed as a result of
673 * this call.
674 *
675 * @param cd class description, must not be null
676 * @param roleName role name
677 * @param cardinality cardinality, must not be null and must be
678 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
679 * @param bound true if the association is to be a "bound" association
680 * @return <code>true</code> if the set of associations
681 * changed as a result of this call
682 */
683 public boolean associate(final ClassDescription cd, final String roleName,
684 final Cardinality cardinality, final boolean bound)
685 {
686 Association a = new Association(cd, roleName, cardinality, bound);
687 return addAssociation(a);
688 }
689
690 /**
691 * Add a new association to the set of associations for this
692 * class description to the specified class with the specified
693 * parameters. The association's role name will be the same as
694 * the class' name.
695 *
696 * @param cd class description, must not be null
697 * @param cardinality cardinality, must not be null
698 * @param indexed true if the collection should be indexed
699 * @param unique true if the collection should not allow duplicate elements
700 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
701 * @param sorted true if the collection should iterate over elements in ascending element order,
702 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
703 * provided at creation time
704 * @return <code>true</code> if the set of associations
705 * changed as a result of this call
706 */
707 public boolean associate(final ClassDescription cd, final Cardinality cardinality,
708 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
709 {
710 Association a = new Association(cd, cd.getUpper(), cardinality, indexed, unique, ordered, sorted);
711 return addAssociation(a);
712 }
713
714 /**
715 * Add a new association to the set of associations for this
716 * class description to the specified class with the specified
717 * parameters. The association's role name will be the same as
718 * the class' name.
719 *
720 * @param cd class description, must not be null
721 * @param cardinality cardinality, must not be null
722 * @param bound true if the assocation is to be a "bound" association
723 * @param indexed true if the collection should be indexed
724 * @param unique true if the collection should not allow duplicate elements
725 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
726 * @param sorted true if the collection should iterate over elements in ascending element order,
727 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
728 * provided at creation time
729 * @return <code>true</code> if the set of associations
730 * changed as a result of this call
731 */
732 public boolean associate(final ClassDescription cd, final Cardinality cardinality, final boolean bound,
733 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
734 {
735 Association a = new Association(cd, cd.getUpper(), cardinality, bound, indexed, unique, ordered, sorted);
736 return addAssociation(a);
737 }
738
739 /**
740 * Add a new association to the set of associations for this
741 * class description to the specified class with the specified
742 * parameters.
743 *
744 * @param cd class description, must not be null
745 * @param roleName role name
746 * @param cardinality cardinality, must not be null
747 * @param indexed true if the collection should be indexed
748 * @param unique true if the collection should not allow duplicate elements
749 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
750 * @param sorted true if the collection should iterate over elements in ascending element order,
751 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
752 * provided at creation time
753 * @return <code>true</code> if the set of associations
754 * changed as a result of this call
755 */
756 public boolean associate(final ClassDescription cd, final String roleName, final Cardinality cardinality,
757 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
758 {
759 Association a = new Association(cd, roleName, cardinality, indexed, unique, ordered, sorted);
760 return addAssociation(a);
761 }
762
763 /**
764 * Add a new association to the set of associations for this
765 * class description to the specified class with the specified
766 * parameters.
767 *
768 * @param cd class description, must not be null
769 * @param roleName role name
770 * @param cardinality cardinality, must not be null
771 * @param bound true if the association is to be a "bound" association
772 * @param indexed true if the collection should be indexed
773 * @param unique true if the collection should not allow duplicate elements
774 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
775 * @param sorted true if the collection should iterate over elements in ascending element order,
776 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
777 * provided at creation time
778 * @return <code>true</code> if the set of associations
779 * changed as a result of this call
780 */
781 public boolean associate(final ClassDescription cd, final String roleName, final Cardinality cardinality,
782 final boolean bound,
783 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
784 {
785 Association a = new Association(cd, roleName, cardinality, bound, indexed, unique, ordered, sorted);
786 return addAssociation(a);
787 }
788
789 /**
790 * Add a new association to the set of associations for this
791 * class description to the specified interface with the
792 * specified cardinality. The assocation's role name will be
793 * the same as the interface's name. The cardinality must be one of
794 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
795 * Return <code>true</code> if the set of associations changed as a result of
796 * this call.
797 *
798 * @param id interface description, must not be null
799 * @param cardinality cardinality, must not be null and must be
800 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
801 * @return <code>true</code> if the set of associations
802 * changed as a result of this call
803 */
804 public boolean associate(final InterfaceDescription id, final Cardinality cardinality)
805 {
806 Association a = new Association(id, id.getUpper(), cardinality);
807 return addAssociation(a);
808 }
809
810 /**
811 * Add a new association to the set of associations for this
812 * class description to the specified interface with the
813 * specified cardinality and bound flag. The assocation's role name will be
814 * the same as the interface's name. The cardinality must be one of
815 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
816 * Return <code>true</code> if the set of associations changed as a result of
817 * this call.
818 *
819 * @param id interface description, must not be null
820 * @param cardinality cardinality, must not be null and must be
821 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
822 * @param bound true if the assocation is to be a "bound" association
823 * @return <code>true</code> if the set of associations
824 * changed as a result of this call
825 */
826 public boolean associate(final InterfaceDescription id, final Cardinality cardinality, final boolean bound)
827 {
828 Association a = new Association(id, id.getUpper(), cardinality, bound);
829 return addAssociation(a);
830 }
831
832 /**
833 * Add a new association to the set of attributes for this
834 * class description to the specified interface with the
835 * specified role name and cardinality. The cardinality must be one of
836 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
837 * Return <code>true</code> if the set of associations changed as a result of
838 * this call.
839 *
840 * @param id interface description, must not be null
841 * @param roleName role name
842 * @param cardinality cardinality, must not be null and must be
843 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
844 * @return <code>true</code> if the set of associations
845 * changed as a result of this call
846 */
847 public boolean associate(final InterfaceDescription id, final String roleName, final Cardinality cardinality)
848 {
849 Association a = new Association(id, roleName, cardinality);
850 return addAssociation(a);
851 }
852
853 /**
854 * Add a new association to the set of attributes for this
855 * class description to the specified interface with the
856 * specified role name, cardinality, and bound flag. The cardinality must be one of
857 * <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>.
858 * Return <code>true</code> if the set of associations changed as a result of
859 * this call.
860 *
861 * @param id interface description, must not be null
862 * @param roleName role name
863 * @param cardinality cardinality, must not be null and must be
864 * one of <b>Cardinality.ZeroToOne</b> or <b>Cardinality.StrictlyOne</b>
865 * @param bound true if the association is to be a "bound" association
866 * @return <code>true</code> if the set of associations
867 * changed as a result of this call
868 */
869 public boolean associate(final InterfaceDescription id, final String roleName,
870 final Cardinality cardinality, final boolean bound)
871 {
872 Association a = new Association(id, roleName, cardinality, bound);
873 return addAssociation(a);
874 }
875
876 /**
877 * Add a new association to the set of associations for this
878 * class description to the specified interface with the specified
879 * parameters. The association's role name will be the same as
880 * the interface's name.
881 *
882 * @param id interface description, must not be null
883 * @param cardinality cardinality, must not be null
884 * @param indexed true if the collection should be indexed
885 * @param unique true if the collection should not allow duplicate elements
886 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
887 * @param sorted true if the collection should iterate over elements in ascending element order,
888 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
889 * provided at creation time
890 * @return <code>true</code> if the set of associations
891 * changed as a result of this call
892 */
893 public boolean associate(final InterfaceDescription id, final Cardinality cardinality,
894 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
895 {
896 Association a = new Association(id, id.getUpper(), cardinality, indexed, unique, ordered, sorted);
897 return addAssociation(a);
898 }
899
900 /**
901 * Add a new association to the set of associations for this
902 * class description to the specified interface with the specified
903 * parameters. The association's role name will be the same as
904 * the interface's name.
905 *
906 * @param id interface description, must not be null
907 * @param cardinality cardinality, must not be null
908 * @param bound true if the association is to be a "bound" association
909 * @param indexed true if the collection should be indexed
910 * @param unique true if the collection should not allow duplicate elements
911 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
912 * @param sorted true if the collection should iterate over elements in ascending element order,
913 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
914 * provided at creation time
915 * @return <code>true</code> if the set of associations
916 * changed as a result of this call
917 */
918 public boolean associate(final InterfaceDescription id, final Cardinality cardinality, final boolean bound,
919 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
920 {
921 Association a = new Association(id, id.getUpper(), cardinality, bound, indexed, unique, ordered, sorted);
922 return addAssociation(a);
923 }
924
925 /**
926 * Add a new association to the set of associations for this
927 * class description to the specified interface with the specified
928 * parameters.
929 *
930 * @param id interface description, must not be null
931 * @param roleName role name
932 * @param cardinality cardinality, must not be null
933 * @param indexed true if the collection should be indexed
934 * @param unique true if the collection should not allow duplicate elements
935 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
936 * @param sorted true if the collection should iterate over elements in ascending element order,
937 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
938 * provided at creation time
939 * @return <code>true</code> if the set of associations
940 * changed as a result of this call
941 */
942 public boolean associate(final InterfaceDescription id, final String roleName, final Cardinality cardinality,
943 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
944 {
945 Association a = new Association(id, roleName, cardinality, indexed, unique, ordered, sorted);
946 return addAssociation(a);
947 }
948
949 /**
950 * Add a new association to the set of associations for this
951 * class description to the specified interface with the specified
952 * parameters.
953 *
954 * @param id interface description, must not be null
955 * @param roleName role name
956 * @param cardinality cardinality, must not be null
957 * @param bound true if the association is to be a "bound" association
958 * @param indexed true if the collection should be indexed
959 * @param unique true if the collection should not allow duplicate elements
960 * @param ordered true if the collection should iterate over elements in <i>insertion-order</i>
961 * @param sorted true if the collection should iterate over elements in ascending element order,
962 * sorted according to the <i>natural ordering</i> of its elements (see Comparable), or by a Comparator
963 * provided at creation time
964 * @return <code>true</code> if the set of associations
965 * changed as a result of this call
966 */
967 public boolean associate(final InterfaceDescription id, final String roleName, final Cardinality cardinality,
968 final boolean bound,
969 final boolean indexed, final boolean unique, final boolean ordered, final boolean sorted)
970 {
971 Association a = new Association(id, roleName, cardinality, bound, indexed, unique, ordered, sorted);
972 return addAssociation(a);
973 }
974 }