Skip to contentMethod: AtomarerProzess()
      1: package ablaeufe.operation;
2: 
3: import ablaeufe.meta.AtomarerProzesstyp;
4: import ablaeufe.meta.Porttyp;
5: 
6: import java.util.Optional;
7: 
8: /**
9:  * Ein atomarer Prozess ist eine simple Zusammensetzung von Aktivitäten und Ports.
10:  */
11: public abstract class AtomarerProzess extends Prozess {
12: 
13:     /**
14:      * Konstruktor.
15:      */
16:     protected AtomarerProzess() {
17:     }
18: 
19:     @Override
20:     public abstract AtomarerProzesstyp getTyp();
21: 
22:     /**
23:      * Verbindet den this prozess mit dem übergebenen prozess über einen Port, wenn dies möglich ist.
24:      * Ist dies nicht möglich, wird eine {@link KonsistenzVerletztException} mit entsprechender Message ausgelöst.
25:      * @param prozess Prozess welcher mit dem this prozess verbunden werden soll.
26:      */
27:     public void connectTo(final AtomarerProzess prozess) {
28:         final Port verbindungsport = this.erstelleVerbindungsport(prozess);
29:         this.addOutport(verbindungsport);
30:         prozess.addInport(verbindungsport);
31:     }
32: 
33:     private Port erstelleVerbindungsport(final AtomarerProzess prozess) {
34:         final Optional<Porttyp> verbindungsporttyp = this.getTyp().getOutporttypen().stream()
35:                 .filter(porttyp -> this.outporttypIstInporttypDesAnderenProzesses(prozess, porttyp))
36:                 .filter(porttyp -> !this.outporttypIstBereitsTypisiert(prozess, porttyp))
37:                 .findFirst();
38:         if (verbindungsporttyp.isPresent()) {
39:             return Port.create(verbindungsporttyp.get());
40:         }
41:         throw new KonsistenzVerletztException("Die beiden Prozesse können nicht miteinander verbunden werden!"
42:                 + "Auf der Metaebene existiert kein Porttyp, welcher gleichzeitig Outporttyp des einen Prozesses und"
43:                 + " Inporttyp des anderen Prozesse ist. Oder alle gemeinsamen Porttypen sind bereits durch Ports typisiert und somit belegt!");
44:     }
45: 
46:     private boolean outporttypIstInporttypDesAnderenProzesses(final AtomarerProzess prozess, final Porttyp porttyp) {
47:         return prozess.getTyp().getInporttypen().contains(porttyp);
48:     }
49: 
50:     private boolean outporttypIstBereitsTypisiert(final AtomarerProzess prozess, final Porttyp outporttyp) {
51:         final boolean alsOutportTypisiert = this.getOutports().stream()
52:                 .anyMatch(port -> port.getTyp().equals(outporttyp));
53:         // Diese Prüfung ist evtl. überflüssig, wenn korrekte Prozesse aufgebaut werden.
54:         final boolean alsInportBeimAnderenProzessTypisiert = prozess.getInports().stream()
55:                 .anyMatch(port -> port.getTyp().equals(outporttyp));
56:         return alsOutportTypisiert && alsInportBeimAnderenProzessTypisiert;
57:     }
58: }