This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
v070:language [2018/10/08 14:39] djnemeth [Action code] |
v070:language [2018/10/08 16:15] (current) djnemeth [Collections] |
||
---|---|---|---|
Line 243: | Line 243: | ||
</code> | </code> | ||
- | Naturally, you can also concretize type parameter ''T'' in the definition to obtain a non-generic collection type. Defining custom collections is not possible in //XtxtUML// yet. See section [[v070:language#Action code]] for usage examples. | + | Naturally, you can also concretize type parameter ''T'' in the definition to obtain a non-generic collection type. Defining custom collections is not possible in //XtxtUML// yet. See section [[v070:language#Collection operations]] for usage examples. |
==== Model enums ==== | ==== Model enums ==== | ||
Line 649: | Line 649: | ||
A obj3 = create A(p1, ..., pn) as "name3"; | A obj3 = create A(p1, ..., pn) as "name3"; | ||
A obj4 = new A(p1, ..., pn) as "name4"; | A obj4 = new A(p1, ..., pn) as "name4"; | ||
+ | // names appear in logs | ||
</code> | </code> | ||
Line 655: | Line 655: | ||
// JtxtUML: | // JtxtUML: | ||
// With parameters p1, ..., pn. | // With parameters p1, ..., pn. | ||
- | A obj = Action.create(A.class, p1, ..., pn); | + | A obj1 = Action.create(A.class, p1, ..., pn); |
+ | A obj2 = Action.createWithName(A.class, "name2", p1, ..., pn); | ||
+ | // names appear in logs | ||
</code> | </code> | ||
Line 674: | Line 676: | ||
<code> | <code> | ||
// XtxtUML: | // XtxtUML: | ||
- | link(AB.a, instanceOfA, AB.b, instanceOfB); | ||
+ | // Explicit version: | ||
link instanceOfA as AB.a, instanceOfB as AB.b via AB; | link instanceOfA as AB.a, instanceOfB as AB.b via AB; | ||
- | // as is optional and can be ommited if association ends can be infered. | + | |
+ | // Short version: | ||
link instanceOfA, instanceOfB via AB; | link instanceOfA, instanceOfB via AB; | ||
+ | // 'as' parts are optional and can be omitted | ||
+ | // if matching ends are inferrable. | ||
// In case of the following association definition: | // In case of the following association definition: | ||
Line 693: | Line 698: | ||
// In case of the following association definition: | // In case of the following association definition: | ||
class AB extends Association { | class AB extends Association { | ||
- | class a extends Some<A> {} | + | class a extends End<OneToAny<A>> {} |
- | class b extends Some<B> {} | + | class b extends End<OneToAny<B>> {} |
} | } | ||
</code> | </code> | ||
Line 702: | Line 707: | ||
<code> | <code> | ||
// XtxtUML: | // XtxtUML: | ||
+ | // Explicit version: | ||
unlink instanceOfA as AB.a, instanceOfB as AB.b via AB; | unlink instanceOfA as AB.a, instanceOfB as AB.b via AB; | ||
- | // Or | + | |
+ | // Short version: | ||
unlink instanceOfA, instanceOfB via AB; | unlink instanceOfA, instanceOfB via AB; | ||
+ | // 'as' parts are optional and can be omitted | ||
+ | // if matching ends are inferrable. | ||
</code> | </code> | ||
Line 716: | Line 725: | ||
<code> | <code> | ||
// XtxtUML: | // XtxtUML: | ||
- | Collection<B> all = instanceOfA->(AB.b); // the parentheses after -> are mandatory | + | OneToAny<B> all = instanceOfA->(AB.b); // the parentheses after -> are mandatory |
- | B obj = all.selectAny(); | + | B obj = all.one(); |
</code> | </code> | ||
<code java> | <code java> | ||
// JtxtUML: | // JtxtUML: | ||
- | Collection<B> all = instanceOfA.assoc(AB.b.class); | + | OneToAny<B> all = instanceOfA.assoc(AB.b.class); |
- | B obj = all.selectAny(); | + | B obj = all.one(); |
</code> | </code> | ||
- | Note: even in //XtxtUML//, the ''selectAny()'' call can be performed directly on the navigation expression: | + | Note: even in //XtxtUML//, the ''one()'' call can be performed directly on the navigation expression: |
<code> | <code> | ||
// XtxtUML: | // XtxtUML: | ||
- | B obj = instanceOfA->(AB.b).selectAny(); | + | B obj = instanceOfA->(AB.b).one(); |
+ | </code> | ||
+ | |||
+ | === Collection operations === | ||
+ | |||
+ | <code> | ||
+ | // XtxtUML: | ||
+ | B b1 = create B(); | ||
+ | B b2 = create B(); | ||
+ | |||
+ | Any<B> bs = collect(b1, b2); | ||
+ | bs.one(); // b1 or b2, bs is not ordered | ||
+ | |||
+ | Any<B> bs2 = bs.add(create B()); | ||
+ | bs2.size(); // 3 | ||
+ | bs.size(); // 2, txtUML collections are immutable | ||
+ | |||
+ | OrderedAny<B> obs = collectIn(OrderedAny, b1, b2); | ||
+ | obs.one(); // b1, obs is ordered | ||
+ | |||
+ | bs = obs.^as(Any); // 'as' has to be escaped | ||
+ | // target type is less restrictive, no problem | ||
+ | |||
+ | UniqueAny<B> ubs = collectIn(UniqueAny, b1, b1); | ||
+ | ubs.size(); // 1, ubs is unique | ||
+ | |||
+ | // Runtime error examples: | ||
+ | // - multiplicity violation | ||
+ | // - calling one() on empty collection | ||
+ | // - unordered -> ordered conversion | ||
+ | // - non-unique -> unique conversion | ||
+ | </code> | ||
+ | |||
+ | <code java> | ||
+ | // JtxtUML: | ||
+ | B b1 = Action.create(B.class); | ||
+ | B b2 = Action.create(B.class); | ||
+ | |||
+ | Any<B> bs = Action.collect(b1, b2); | ||
+ | bs.one(); // b1 or b2, bs is not ordered | ||
+ | |||
+ | Any<B> bs2 = bs.add(Action.create(B.class)); | ||
+ | bs2.size(); // 3 | ||
+ | bs.size(); // 2, txtUML collections are immutable | ||
+ | |||
+ | OrderedAny<B> obs = Action.collectIn(OrderedAny.class, b1, b2); | ||
+ | obs.one(); // b1, obs is ordered | ||
+ | |||
+ | bs = obs.as(Any.class); | ||
+ | // target type is less restrictive, no problem | ||
+ | |||
+ | UniqueAny<B> ubs = Action.collectIn(UniqueAny.class, b1, b1); | ||
+ | ubs.size(); // 1, ubs is unique | ||
+ | |||
+ | // Runtime error examples: | ||
+ | // - multiplicity violation | ||
+ | // - calling one() on empty collection | ||
+ | // - unordered -> ordered conversion | ||
+ | // - non-unique -> unique conversion | ||
</code> | </code> | ||
Line 737: | Line 804: | ||
<code> | <code> | ||
// XtxtUML: | // XtxtUML: | ||
- | connect aObj->(A.P), bObj->(B.Q) via CAB; | + | Explicit version: |
- | connect aObj->(A.P) as CAB.e, bObj->(B.Q) via CAB; | + | connect instanceOfA->(A.P) as CAB.e, instanceOfB->(B.Q) as CAB.f via CAB; |
- | connect aObj->(A.P), bObj->(B.Q) as CAB.f via CAB; | + | |
- | connect aObj->(A.P) as CAB.e, bObj->(B.Q) as CAB.f via CAB; | + | |
- | //In case of the following connector | + | Short version: |
+ | connect instanceOfA->(A.P), instanceOfB->(B.Q) via CAB; | ||
+ | // 'as' parts are optional and can be omitted | ||
+ | // if matching ends are inferrable. | ||
+ | |||
+ | // In case of the following connector definition: | ||
connector CAB { | connector CAB { | ||
- | CA.a->A.P e; | + | CA.a->A.P e; |
- | CB.b->B.Q f; | + | CB.b->B.Q f; |
} | } | ||
</code> | </code> | ||
Line 753: | Line 823: | ||
Action.connect(CA.e.class, aObj.port(A.P.class), | Action.connect(CA.e.class, aObj.port(A.P.class), | ||
CB.f.class, bObj.port(B.Q.class)); | CB.f.class, bObj.port(B.Q.class)); | ||
+ | |||
+ | // In case of the following connector definition: | ||
+ | class CAB extends Connector { | ||
+ | class e extends One<CA.a, A.P>; | ||
+ | class f extends One<CB.b, B.Q>; | ||
+ | } | ||
</code> | </code> | ||
Line 795: | Line 871: | ||
// XtxtUML: | // XtxtUML: | ||
log "message"; | log "message"; | ||
- | log-error "Error message"; | + | log-error "error message"; |
</code> | </code> | ||
Line 801: | Line 877: | ||
// JtxtUML: | // JtxtUML: | ||
Action.log("message"); | Action.log("message"); | ||
- | Action.logError("Error message"); | + | Action.logError("error message"); |
</code> | </code> | ||