Skip to content

Method: copy()

1: package maschine;
2:
3: import auftraege.ProduktionsAuftrag;
4: import auftraege.auftragsBildungsParameter.BeilagenArten;
5: import auftraege.auftragsBildungsParameter.dokumentenKlassenVariablen.Beilagenart;
6: import util.exceptions.BeilagenAnzahlOutOfBoundsException;
7:
8: import java.util.Arrays;
9: import java.util.Collections;
10: import java.util.HashSet;
11: import java.util.List;
12: import java.util.Map;
13: import java.util.Set;
14: import java.util.stream.Collectors;
15: import java.util.stream.IntStream;
16: import java.util.stream.Stream;
17:
18: /**
19: * Beinhaltet ein Set von Beilagenarten, welches eine obere Grenze besitzt.
20: */
21: public class BegrenzteBeilagenArten {
22:         public static final BegrenzteBeilagenArten EMPTY = new BegrenzteBeilagenArten(Collections.unmodifiableSet(new HashSet<>()), 0);
23:
24:         private final Set<Beilagenart> beilagenarten;
25:         private final int begrenzung;
26:
27:         /**
28:          * @return begrenzung der Beilagenarten.
29:          */
30:         public int getBegrenzung() {
31:                 return this.begrenzung;
32:         }
33:
34:         /**
35:          * @param beilagenarten
36:          *                 zu beinhaltendene Beilagenarten.
37:          * @param begrenzung
38:          *                 obere Begrenzung des Sets von Beilagenarten.
39:          */
40:         public BegrenzteBeilagenArten(final Set<Beilagenart> beilagenarten, final int begrenzung) {
41:                 this.beilagenarten = beilagenarten;
42:                 this.begrenzung = begrenzung;
43:         }
44:
45:         /**
46:          * Fügt neue Beilagenarten dem {@link BegrenzteBeilagenArten}-Objekt hinzu, falls damit die Begrenzung nicht überschritten wird.
47:          *
48:          * @param neueBeilagenArten
49:          *                 hinzuzufügende neue Beilagenarten.
50:          */
51:         public void addBeilagen(final Beilagenart... neueBeilagenArten) {
52:                 if (Stream.concat(this.beilagenarten.stream(), Arrays.stream(neueBeilagenArten)).distinct().count() <= this.begrenzung) {
53:                         this.beilagenarten.addAll(Arrays.asList(neueBeilagenArten));
54:                 } else {
55:                         throw new BeilagenAnzahlOutOfBoundsException();
56:                 }
57:         }
58:
59:         /**
60:          * Erstellt eine Kopie des des Parameters.
61:          *
62:          * @return neues {@link BegrenzteBeilagenArten}-Objekt mit derselben Begrenzung und Inhalten wie die des Parameters.
63:          */
64:         public BegrenzteBeilagenArten copy() {
65:                 return new BegrenzteBeilagenArten(new HashSet<>(this.beilagenarten), this.begrenzung);
66:         }
67:
68:         /**
69:          * passt this an, sodass alle Elemente eines Produktionsauftrags in this enthalten sind. sollte die Begrenzung überschritten werden, so wird die minimale
70:          * Anzahl von Elementen aus this entfernt, welche nicht für den auftrag benötigt werden.
71:          *
72:          * @param auftrag
73:          *                 Beilagenarten dieses Objektes werden dem Set der {@link BegrenzteBeilagenArten} hinzugefügt.
74:          *
75:          * @throws BeilagenAnzahlOutOfBoundsException
76:          *                 wenn es nicht möglich ist, dass dieses Begrenzte-Beilagenobjekt Platz für        alle BeilagenArten des
77:          *                 Produktionsauftrags besitzt.
78:          */
79:         public void manageNecessaryChangesToFitBeilagenArten(final ProduktionsAuftrag auftrag) throws BeilagenAnzahlOutOfBoundsException {
80:                 //TODO folgender haufen code ist teilweise in BeilagenArten kopiert - hier sollte man das einfach aufrufen
81:                 final Set<Beilagenart> toBeAdded = auftrag.getBeilagenArten().getBeilagenarten();
82:                 final Map<Boolean, List<Beilagenart>> bereitsVorhandeneElementeInAuftrag = toBeAdded.stream().collect(Collectors.partitioningBy(this
83:                                 .beilagenarten::contains));
84:                 final Map<Boolean, List<Beilagenart>> bereitsVorhandeneElementeInThis = this.beilagenarten.stream().collect(Collectors.partitioningBy(toBeAdded::contains));
85:
86:                 final int idk = (bereitsVorhandeneElementeInAuftrag.get(false).size() + this.beilagenarten.size()) - this.begrenzung;
87:                 final int elementsNoetigZuEntfernen = idk < 0 ? 0 : idk;
88:
89:                 if ((this.beilagenarten.size() + bereitsVorhandeneElementeInAuftrag.get(false).size()) - elementsNoetigZuEntfernen > this.begrenzung) {
90:                         throw new BeilagenAnzahlOutOfBoundsException(
91:                                         "In diesem BegrenzteBeilagenArtenObjekt ist nicht genügend Platz für diesen Produktionsauftrag " + auftrag);
92:                 }
93:
94:                 //entfernen von überflüssigen beilagenarten.
95:                 IntStream.range(0, elementsNoetigZuEntfernen).forEach(i -> this.beilagenarten.remove(bereitsVorhandeneElementeInThis.get(false).get(i)));
96:                 //hinzufügen der neuen benötigten beilagenarten.
97:                 this.beilagenarten.addAll(bereitsVorhandeneElementeInAuftrag.get(false));
98:         }
99:
100:         /**
101:          * @return prüft, ob die Begrenzung 0 ist und somit das Set nicht verändert werden kann.
102:          */
103:         public boolean isNotEditable() {
104:                 return this.begrenzung == 0;
105:         }
106:
107:         /**
108:          * Berechnet die Anzahl der UmbauArbeiten einer Beilagenkonfiguration zu einer anderen unter der Berücksichtigung einer Begrenzung.
109:          *
110:          * @param that
111:          *                 zu vergleichende BeilagenArten
112:          *
113:          * @return Anzahl der Umrüstvorgänge (aus this zu entfernende Beilagen + Anzahl der aus that hinzuzufügenden Beilagen)
114:          */
115:         int calculateUmruestvorgaengeZuNeuerBeilagenArt(final BeilagenArten that) {
116:                 return BeilagenArten.createMitErlaubten(this.beilagenarten).calculateUmruestvorgaengeZuNeuerBeilagenArt(that, this.begrenzung);
117:         }
118: }