Skip to contentMethod: handle(MenschBelegungEintrag)
      1: package zeit;
2: 
3: import zeit.eintraege.KalenderEintrag;
4: import zeit.eintraege.KalenderEintragGenerell;
5: import zeit.eintraege.KalenderEintragTyp;
6: import zeit.eintraege.KalenderEintragVisitor;
7: import zeit.eintraege.MaschinenBelegungEintrag;
8: import zeit.eintraege.MenschBelegungEintrag;
9: 
10: import java.time.LocalDate;
11: import java.time.LocalDateTime;
12: import java.time.temporal.ChronoUnit;
13: import java.util.Collection;
14: import java.util.HashSet;
15: import java.util.Optional;
16: import java.util.Set;
17: 
18: /**
19:  * Ein Kalender für Maschinen.
20:  * Maschinen sind standardmäßig von 0-24h verfügbar und können Kalendereinträge vom Typ
21:  * {@link KalenderEintragTyp Wartung} und {@link KalenderEintragTyp Belegt} enthalten.
22:  * Darüberhinaus kann dieser Kalender keine {@link MenschBelegungEintrag MenschBelegungEinträge} enthalten.
23:  */
24: public class MaschinenKalender extends Kalender {
25: 
26:     private static final KalenderEintragTyp DEFAULT_TYP = KalenderEintragTyp.VERFUEGBAR;
27:     private static final Collection<KalenderEintragTyp> ERLAUBTE_TYPEN = new HashSet<>();
28: 
29:     static {
30:         MaschinenKalender.ERLAUBTE_TYPEN.add(KalenderEintragTyp.WARTUNG);
31:         MaschinenKalender.ERLAUBTE_TYPEN.add(KalenderEintragTyp.BELEGT);
32:     }
33: 
34:     @Override
35:     protected void pruefeKalenderEintrag(final KalenderEintrag eintrag) {
36:         if (!MaschinenKalender.ERLAUBTE_TYPEN.contains(eintrag.getTyp())) {
37:             throw new KalenderEintragNichtErlaubtException(String.format("Der Typ %s ist nicht erlaubt für Maschinenkalender", eintrag));
38:         }
39:         if (eintrag.accept(new KalenderEintragVisitor<Boolean>() {
40:             @Override
41:             public Boolean handle(final MaschinenBelegungEintrag maschinenBelegungEintrag) {
42:                 return false;
43:             }
44: 
45:             @Override
46:             public Boolean handle(final MenschBelegungEintrag menschBelegungEintrag) {
47:                 return true;
48:             }
49: 
50:             @Override
51:             public Boolean handle(final KalenderEintragGenerell kalenderEintragGenerell) {
52:                 return false;
53:             }
54: 
55:         })) {
56:             throw new KalenderEintragNichtErlaubtException("Der übergebene MenschBelegungsEintrag kann einem Maschinenkalender nicht hinzugefügt werden!");
57:         }
58:     }
59: 
60:     @Override
61:     protected Optional<KalenderEintrag> createDefaultEintragZuTag(final LocalDate tag) {
62:         return Optional.of(KalenderEintragGenerell.createWholeDay(tag, MaschinenKalender.DEFAULT_TYP));
63:     }
64: 
65:     @Override
66:     public long getArbeitszeit(final LocalDate tag, final ChronoUnit einheit) {
67:         final LocalDateTime fixedDate = LocalDateTime.now();
68:         final long zeitFuerEinenTagInEinheit = einheit.between(fixedDate, fixedDate.plusDays(1));
69:         return zeitFuerEinenTagInEinheit - this.getEintraegeZuTag(tag).stream()
70:                 .filter(kalenderEintrag -> kalenderEintrag.getTyp() == KalenderEintragTyp.WARTUNG)
71:                 .mapToLong(kalenderEintrag -> einheit.between(kalenderEintrag.getVon(), kalenderEintrag.getBis()))
72:                 .sum();
73:     }
74: 
75:     /**
76:      * @return alle {@link MaschinenBelegungEintrag MaschinenBelegungEinträge},
77:      * die in diesem Kalender enthalten sind.
78:      */
79:     public Set<MaschinenBelegungEintrag> getBelegungen() {
80:         final Set<MaschinenBelegungEintrag> result = new HashSet<>();
81:         for (final Set<KalenderEintrag> eintraege : this.getEintraege().values()) {
82:             for (final KalenderEintrag eintrag : eintraege) {
83:                 eintrag.accept(new KalenderEintragVisitor<Void>() {
84:                     @Override
85:                     public Void handle(final MaschinenBelegungEintrag maschinenBelegungEintrag) {
86:                         result.add(maschinenBelegungEintrag);
87:                         return null;
88:                     }
89: 
90:                     @Override
91:                     public Void handle(final MenschBelegungEintrag menschBelegungEintrag) {
92:                         // Nothing to do here
93:                         return null;
94:                     }
95: 
96:                     @Override
97:                     public Void handle(final KalenderEintragGenerell kalenderEintragGenerell) {
98:                         // Nothing to do here
99:                         return null;
100:                     }
101:                 });
102:             }
103:         }
104:         return result;
105:     }
106: }