Skip to content

Method: baueRest()

1: package produktionsauftrag;
2:
3: import auftraege.Dokumentenklasse;
4: import auftraege.ServiceLevelAgreement;
5: import auftraege.auftragsBildungsParameter.abstraction.DokumentenklassenVariable;
6: import auftraege.auftragsBildungsParameter.dokumentenKlassenVariablen.BlattAnzahl;
7: import auftraege.auftragsBildungsParameter.dokumentenKlassenVariablen.Id;
8: import util.ClassObjectMap;
9: import util.exceptions.SollteNichtPassierenException;
10:
11: import java.time.LocalDateTime;
12: import java.util.Optional;
13:
14: /**
15: * Hilfsklasse zum Bauen von Dokumentenklassen.
16: */
17: class DokumentenklasseBuilder {
18:
19:         private final LocalDateTime eingangszeitpunkt;
20:         private final ClassObjectMap<DokumentenklassenVariable> variablen;
21:         private int bereitsEingeplanteBlaetter = 0;
22:
23:         /**
24:          * Konstruktor der Klasse. Erstellt einen Dokumentenklassenbuilder, welcher genau der Dokumentenklasse <i>k</i> entspricht.
25:          *
26:          * @param k Dokumentenklasse, zu welcher ein Dokumentenklassenbuilder erstellt werden soll.
27:          */
28:         DokumentenklasseBuilder(final Dokumentenklasse k) {
29:                 this.variablen = k.getVariablen();
30:                 this.eingangszeitpunkt = k.getEingangsZeitpunkt();
31:         }
32:
33:         /**
34:          * @param faktor prozentualer Faktor, wie viele Blätter dieses Dokumentenklassenbuilders in die neue Dokumentenklasse einfließen soll.
35:          * @return neue Dokumentenklasse basierend auf allen Variablen, welche sich in diesem DokumentenklassenBuilder befinden.
36:          */
37:         Dokumentenklasse baue(final double faktor) {
38:                 //TODO Art: Work in Progress; Faktor auch in die Sendungsanzahl pusten und in Fraction ummodeln
39:
40:                 final ClassObjectMap<DokumentenklassenVariable> variablenCopy = this.variablen.copy();
41:                 final int eingeplanteBlaetter = (int) (this.variablen.get(BlattAnzahl.class)
42:                                 .orElseThrow(() -> new SollteNichtPassierenException("Die Blattanzahl IST da!"))
43:                                 .intValue() * faktor);
44:                 variablenCopy.put(BlattAnzahl.create(eingeplanteBlaetter));
45:                 this.setBereitsEingeplanteBlaetter(eingeplanteBlaetter);
46:                 return new Dokumentenklasse(variablenCopy, this.eingangszeitpunkt);
47:         }
48:
49:         /**
50:          * @return neue Dokumentenklasse mit den restlichen Blättern, welche noch nicht verarbeitet wurden.
51:          */
52:         Dokumentenklasse baueRest() {
53:                 return this.baue(this.getRestlicheBlaetter() / (double) this.getAnzahlBlaetter());
54:         }
55:
56:         /**
57:          * @return Anzahl der Blätter, welche noch nicht eingeplant wurde.
58:          */
59:         int getRestlicheBlaetter() {
60:                 return this.getAnzahlBlaetter() - this.getBereitsEingeplanteBlaetter();
61:         }
62:
63:         /**
64:          * @return Anzahl der Blätter, welche bereits eingeplant wurden.
65:          */
66:         int getBereitsEingeplanteBlaetter() {
67:                 return this.bereitsEingeplanteBlaetter;
68:         }
69:
70:         /**
71:          * @param bereitsEingeplanteBlaetter setzt den Parameter {@linkplain DokumentenklasseBuilder#getBereitsEingeplanteBlaetter()}.
72:          */
73:         void setBereitsEingeplanteBlaetter(final Integer bereitsEingeplanteBlaetter) {
74:                 this.bereitsEingeplanteBlaetter = bereitsEingeplanteBlaetter;
75:         }
76:
77:         /**
78:          * @return Anzahl der Blätter, welche in dem {@linkplain DokumentenklasseBuilder} vorhanden ist. wird nicht geändert. Hierfür existieren die Operationen {@link
79:          * DokumentenklasseBuilder#getBereitsEingeplanteBlaetter()} sowie {@linkplain DokumentenklasseBuilder#getRestlicheBlaetter()}
80:          */
81:         int getAnzahlBlaetter() {
82:                 return this.variablen.get(BlattAnzahl.class).map(BlattAnzahl::intValue).orElse(0);
83:         }
84:
85:         /**
86:          * @return liefert den SLA des {@link DokumentenklasseBuilder}s. Sollte in den Variablen kein {@link ServiceLevelAgreement} vorhanden sein, so wird ein maximales SLA
87:          * zurückgegeben.
88:          */
89:         public ServiceLevelAgreement getSla() {
90:                 return this.variablen.get(ServiceLevelAgreement.class).orElse(ServiceLevelAgreement.MAX_VALUE);
91:         }
92:
93:         /**
94:          * @return liefert die {@link ClassObjectMap<DokumentenklassenVariable>} des {@link DokumentenklasseBuilder}s.
95:          */
96:         ClassObjectMap<DokumentenklassenVariable> getVariablen() {
97:                 return this.variablen;
98:         }
99:
100:         /**
101:          * Liefert ein {@link Optional} der Klasse T.
102:          *
103:          * @param clazz Klasse, zu welcher ein Objekt aus dem {@link DokumentenklasseBuilder} geholt werden soll.
104:          * @param <T> extends {@link DokumentenklassenVariable}
105:          * @return Optional, welches ein Objekt der Klasse {@code clazz} enthalten kann.
106:          */
107:         public <T extends DokumentenklassenVariable> Optional<T> getVariable(final Class<T> clazz) {
108:                 return this.variablen.get(clazz);
109:         }
110:
111:
112:         @Override
113:         public String toString() {
114:                 return "DokumentenklassenBuilder{" + this.variablen.get(Id.class).map(Object::toString).orElse(this.variablen.toString()) + '}';
115:
116:         }
117:
118:         /**
119:          * @return Eingangszeitpunkt des {@link DokumentenklasseBuilder DokumentenklassenBuilders}.
120:          */
121:         public LocalDateTime getEingangszeitpunkt() {
122:                 return this.eingangszeitpunkt;
123:         }
124: }