Skip to contentMethod: lambda$ermittleFehlendeBelegungen$0(Maschine, ErmittelteBelegungen, MaschinenBelegungEintrag)
      1: package simulation.SimulationsHelper;
2: 
3: import maschine.Maschine;
4: import rollenbelegung.ErmittelteBelegungen;
5: import rollenbelegung.MaschinenBelegung;
6: import rollenbelegung.MitarbeiterBelegung;
7: import util.Pair;
8: import zeit.eintraege.MaschinenBelegungEintrag;
9: import zeit.eintraege.MenschBelegungEintrag;
10: 
11: import java.util.ArrayList;
12: import java.util.Collection;
13: import java.util.Map;
14: import java.util.stream.Collectors;
15: 
16: /**
17:  * Helperklasse, welche überprüft ob es zu jedem {@link MaschinenBelegungEintrag} einen passenden {@link MenschBelegungEintrag} gibt und vice versa.
18:  * Alle Einträge bei denen dies nicht der Fall ist, werden ermittelt.
19:  */
20: public final class BelegungsHelper {
21: 
22:     private BelegungsHelper() {
23:                 // nur über create Methode erstellbar
24:     }
25: 
26:     /**
27:      * @return den erstellten Helper.
28:      */
29:     public static BelegungsHelper create() {
30:         return new BelegungsHelper();
31:     }
32: 
33:     /**
34:      *
35:      * @param ermittelteBelegungen Belegungen der Maschinen und Mitarbeiter
36:      * @return Einträge, zu dem es keinen passenden jeweils anderen Eintrag gibt.
37:      */
38:     public Pair<Collection<MaschinenBelegungEintrag>, Collection<MenschBelegungEintrag>> ermittleFehlendeBelegungen(
39:             final ErmittelteBelegungen ermittelteBelegungen) {
40:         final Collection<MaschinenBelegungEintrag> maschinenBelegungen = new ArrayList<>();
41:         for (final Maschine maschine : ermittelteBelegungen.getMaschinenbelegungen().keySet()) {
42:             maschinenBelegungen.addAll(ermittelteBelegungen.getMaschinenbelegungen().get(maschine).getBelegung().stream()
43:•                    .filter(maschinenBelegungEintrag -> !this.hatPassendeMitarbeiterBelegung(maschine,
44:                             maschinenBelegungEintrag,
45:                             ermittelteBelegungen.getMitarbeiterbelegungen().values()))
46:                     .collect(Collectors.toSet()));
47:         }
48: 
49:         final Collection<MenschBelegungEintrag> mitarbeiterBelegungen =
50:                 ermittelteBelegungen.getMitarbeiterbelegungen().values().stream()
51:                         .flatMap(mitarbeiterBelegung -> mitarbeiterBelegung.getBelegung().stream())
52:                         .filter(menschBelegungEintrag -> !this.hatPassendeMaschinenBelegung(menschBelegungEintrag,
53:                                 ermittelteBelegungen.getMaschinenbelegungen()))
54:                         .collect(Collectors.toSet());
55: 
56:         return Pair.create(maschinenBelegungen, mitarbeiterBelegungen);
57:     }
58: 
59:     private boolean hatPassendeMitarbeiterBelegung(final Maschine maschine,
60:                                            final MaschinenBelegungEintrag maschinenBelegungEintrag,
61:                                            final Collection<MitarbeiterBelegung> mitarbeiterbelegungen) {
62:         return mitarbeiterbelegungen.stream()
63:                 .flatMap(mitarbeiterBelegung -> mitarbeiterBelegung.getBelegung().stream())
64:                 .anyMatch(menschBelegungEintrag ->
65:                         menschBelegungEintrag.getMaschineDieBedientWird().equals(maschine)
66:                                 && menschBelegungEintrag.gleicherZeitraumUndProduktionsauftrag(maschinenBelegungEintrag));
67:     }
68: 
69:     private boolean hatPassendeMaschinenBelegung(final MenschBelegungEintrag menschBelegungEintrag,
70:                                          final Map<Maschine, MaschinenBelegung> maschinenbelegungen) {
71:         for (final Map.Entry<Maschine, MaschinenBelegung> maschineUndBelegungen : maschinenbelegungen.entrySet()) {
72:             if (maschineUndBelegungen.getKey().equals(menschBelegungEintrag.getMaschineDieBedientWird())) {
73:                 final boolean matches = maschineUndBelegungen.getValue().getBelegung().stream()
74:                         .anyMatch(maschinenBelegungEintrag -> maschinenBelegungEintrag.gleicherZeitraumUndProduktionsauftrag(menschBelegungEintrag));
75:                 if (matches) {
76:                     return true;
77:                 }
78:             }
79:         }
80:         return false;
81:     }
82: }