Skip to content

Method: handle(ErstelleAbstraktionstypKommandoMitResultat)

1: package schnittstelle;
2:
3: import ablaeufe.meta.Prozesstyp;
4: import maschine.Maschine;
5: import mensch.Mitarbeiter;
6: import mensch.Produktionsrolle;
7: import mensch.Qualifikation;
8: import mensch.faehigkeit.MitarbeiterFaehigkeit;
9: import mensch.faehigkeit.MitarbeiterFaehigkeitenManager;
10: import persist.Persistierer;
11: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleAbstraktionstypKommandoMitResultat;
12: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleAlternativetypKommandoMitResultat;
13: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleEndeaktivitaetstypKommandoMitResultat;
14: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleStandardaktivitaetstypKommandoMitResultat;
15: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleStartaktivitaetstypKommandoMitResultat;
16: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleSynchronisationstypKommandoMitResultat;
17: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleVerteilungstypKommandoMitResultat;
18: import schnittstelle.ablaeufeKommandos.ErstelleKommandos.ErstelleZusammengesetzterProzesstypKommandoMitResultat;
19: import schnittstelle.kommandoArchitektur.Kommando;
20: import schnittstelle.kommandoArchitektur.KommandoVisitor;
21: import schnittstelle.maschinenKommandos.ErstelleMaschineKommandoMitResultat;
22: import schnittstelle.mitarbeiterKommandos.ErstelleMitarbeiterFaehigkeitKommando;
23: import schnittstelle.mitarbeiterKommandos.ErstelleMitarbeiterKommandoMitResultat;
24: import schnittstelle.mitarbeiterKommandos.ErstelleProduktionsrolleKommandoMitResultat;
25: import schnittstelle.mitarbeiterKommandos.ErstelleQualifikationKommandoMitResultat;
26: import schnittstelle.mitarbeiterKommandos.FuegeFaehigkeitZuProduktionsrolleHinzuKommando;
27: import schnittstelle.mitarbeiterKommandos.FuegeProduktionsrolleZuMitarbeiterHinzuKommando;
28: import schnittstelle.mitarbeiterKommandos.FuegeQualifikationZuMitarbeiterHinzuKommando;
29: import util.exceptions.PPSException;
30: import util.exceptions.SitzungsException;
31:
32: import java.io.File;
33: import java.io.IOException;
34: import java.util.ArrayList;
35: import java.util.Collection;
36: import java.util.List;
37:
38: /**
39: * Verwaltet alle Kommandos und realisiert den Zustand der laufenden Anwendung.
40: */
41: public final class Sitzung {
42:         
43:         private static Sitzung instance;
44:         /**
45:          * Das {@link MitarbeiterFaehigkeitenManager}-Semi-Singleton-Objekt, welches halb von der {@link Sitzung} und halb
46:          * vom {@link MitarbeiterFaehigkeitenManager} selbst verwaltet wird. <br>
47:          * siehe hierzu den Kommentar zu {@link MitarbeiterFaehigkeitenManager#getInstance()}
48:          */
49:         private MitarbeiterFaehigkeitenManager mitarbeiterFaehigkeitenManager;
50:         private int id;
51:         
52:         /**
53:          * Liste mit allen erstellten Kommandos.
54:          */
55:         private final transient List<Kommando> erstellteKommandos;
56:         
57:         private final Collection<Maschine> maschinen;
58:         private final Collection<MitarbeiterFaehigkeit> mitarbeiterFaehigkeiten;
59:         private final Collection<Qualifikation> qualifikationen;
60:         private final Collection<Mitarbeiter> mitarbeiter;
61:         private final Collection<Produktionsrolle> produktionsrollen;
62:         
63:         /**
64:          * Alle Bestandteile von Prozesstypen werden in diese Collection hinzugefügt. In Zukunft könnte man sich auch
65:          * überlegen nur Zusammengesetzte Prozesse zu speichern, da diese alle ihre Prozessbestandteile kennen.
66:          */
67:         private final Collection<Prozesstyp> prozesse;
68:         
69:         private Sitzung() {
70:                 this.erstellteKommandos = new ArrayList<>();
71:                 this.id = 0;
72:                 this.maschinen = new ArrayList<>();
73:                 this.mitarbeiterFaehigkeiten = new ArrayList<>();
74:                 this.qualifikationen = new ArrayList<>();
75:                 this.mitarbeiter = new ArrayList<>();
76:                 this.produktionsrollen = new ArrayList<>();
77:                 this.prozesse = new ArrayList<>();
78:         }
79:         
80:         /**
81:          * @return Liefert die Singleton-Instanz des Sitzung-Objektes.
82:          */
83:         public static synchronized Sitzung getInstance() {
84:                 if (null == Sitzung.instance) {
85: Sitzung.instance = new Sitzung();
86:                 }
87:                 return Sitzung.instance;
88:         }
89:         
90:         /**
91:          * @return Liefert einen 'einmalig' vorkommenden int.
92:          */
93:         public int getUniqueId() {
94:                 return this.id++;
95:         }
96:         
97:         /**
98:          * Fügt ein Kommando der Liste von Kommandos hinzu.
99:          *
100:          * @param kommando
101:          * zu speicherndes Kommando.
102:          */
103:         public void addKommando(final Kommando kommando) {
104:                 this.getErstellteKommandos().add(kommando);
105:         }
106:         
107:         /**
108:          * Prüft, ob ein Kommando in der aktuellen Sitzung enthalten ist.
109:          *
110:          * @param kommando
111:          * zu prüfendes Kommando.
112:          * @return true, wennn {@code kommando} in der aktuellen Sitzung enthalten ist.
113:          */
114:         public boolean contains(final Kommando kommando) {
115:                 return this.getErstellteKommandos().contains(kommando);
116:         }
117:         
118:         /**
119:          * Speichert die aktuelle Sitzung zum künftigen laden beim nächsten Start.
120:          *
121:          * @param speicherort
122:          * Ort, an welchem die XML-Datei der Sitzung gespeichert werden soll.
123:          * @throws IOException
124:          * wenn ein Fehler beim schreiben der Datei auftritt.
125:          */
126:         public void speichereSitzung(final File speicherort) throws IOException {
127:                 Persistierer.persistiere(this, speicherort);
128:         }
129:         
130:         /**
131:          * Läd und erstellt eine Sitzung aus einem XML-Dokument, wenn es noch keine Instanz einer Sitzung gibt. Führt alle
132:          * zuvor ausgeführten Kommandos erneut aus.
133:          *
134:          * @param speicherort
135:          * Speicherort, an welchem sich die XML-Datei zur aktuellen Sitzung befinden soll.
136:          * @return Die Instanz der gerade geladenen Sitzung.
137:          * @throws SitzungsException
138:          * Fliegt, wenn bereits eine Instanz der Sitzung existiert.
139:          */
140:         public static synchronized Sitzung ladeSitzung(final File speicherort) throws SitzungsException {
141:                 // TODO Art: unidentified; wie möchte man das Handling haben, falls es schon eine Instanz der Sitzung gibt? Man könnte auch die
142:                 // alte überschreiben oder die
143:                 // Kommandos zu ladendenden Sitzung hier hinten mit anfügen.. Einmal Diskutieren bitte (:
144:                 if (Sitzung.instance != null) {
145:                         throw new SitzungsException("Es existiert bereits eine Sitzung!");
146:                 }
147:                 // TODO Art: unidentified; gibt es ne Möglichkeit einen check zu machen, dass die zu ladende XML-Datei die richtige ist?
148: Sitzung.instance = (Sitzung) Persistierer.lade(speicherort);
149:                 
150:                 return Sitzung.instance;
151:         }
152:         
153:         /**
154:          * TODO Art: unidentified; ENTFERNEN!! Wird nur für Testfälle benötigt und sollte ansonsten nie Aufgerufen werden. Löscht die aktuelle
155:          * Sitzung.
156:          */
157:         public static void loescheSitzung() {
158: Sitzung.instance = null;
159:         }
160:         
161:         /**
162:          * Sollte eigentlich nicht genutzt werden - gibt es der Einfachkeit halber für Testfälle.
163:          *
164:          * Üblicher Getter für das Attribut erstellteKommandos.
165:          *
166:          * @return liefert erstellteKommandos.
167:          */
168:         List<Kommando> getErstellteKommandos() {
169:                 return this.erstellteKommandos;
170:         }
171:         
172:         /**
173:          * @return liefert die Liste der erstellten Mitarbeiter.
174:          */
175:         public Collection<Mitarbeiter> getErstellteMitarbeiter() {
176:                 return this.mitarbeiter;
177:         }
178:         
179:         /**
180:          * @return liefert die Liste der erstellten Maschinen.
181:          */
182:         public Collection<Maschine> getErstellteMaschinen() {
183:                 return this.maschinen;
184:         }
185:         
186:         /**
187:          * @return liefert die Liste der erstellen Mitarbeiterfähigkeiten.
188:          */
189:         public Collection<MitarbeiterFaehigkeit> getErstellteMitarbeiterFaehigkeiten() {
190:                 return this.mitarbeiterFaehigkeiten;
191:         }
192:         
193:         /**
194:          * Benachrichtigt das Sitzungsobjekt, dass ein Kommando ausgeführt wurde.<br>
195:          * Daraufhin wird das Kommando visitiert und ggf. werden Felder des Sitzungsobjekt entsprechend aktualisiert.<br>
196:          * Falls es sich beispielsweise um ein Kommando handelt, welches einen Mitarbeiter erstellt, wird dieser der
197:          * Mitarbeiterliste hinzugefügt, welche von dem Sitzungsobjekt verwaltet wird.<br>
198:          * <br>
199:          * Falls bei der Ausführung des Kommandos eine Exception aufgetreten ist, wird das Resultat natürlich nicht in das
200:          * Sitzungsobjekt eingepflegt, da es kein Resultat gibt. TODO Art: unidentified; Wie genau dieser Fall zu behandeln ist, sollte noch
201:          * diskutiert werden.
202:          *
203:          * @param kommando
204:          * Kommando, welches ausgeführt wurde.
205:          */
206:         public void notifyKommandoAusgefuehrt(final Kommando kommando) {
207:                 try {
208:                         kommando.accept(new KommandoVisitorImplementierung());
209:                 } catch (final PPSException e) {
210:                         e.printStackTrace(); // TODO Art: unidentified; das ist nicht so schön...
211:                 }
212:         }
213:         
214:         /**
215:          * innere KommandVisitorImplementierung für die Übersichtlichkeit.<br>
216:          * Wird von {@link Sitzung#notifyKommandoAusgefuehrt(Kommando)} aufgerufen.<br>
217:          * existiert, da checkstlye sonst meckert.
218:          */
219:         private final class KommandoVisitorImplementierung implements KommandoVisitor {
220:                 @Override
221:                 public void handle(
222:                                 final ErstelleZusammengesetzterProzesstypKommandoMitResultat erstelleZusammengesetzterProzesstypKommando) {
223:                         Sitzung.this.prozesse.add(erstelleZusammengesetzterProzesstypKommando.getResultat());
224:                 }
225:                 
226:                 @Override
227:                 public void handle(final ErstelleAbstraktionstypKommandoMitResultat erstelleAbstraktionstypKommando) {
228:                         Sitzung.this.prozesse.add(erstelleAbstraktionstypKommando.getResultat());
229:                 }
230:                 
231:                 @Override
232:                 public void handle(final ErstelleAlternativetypKommandoMitResultat erstelleAlternativetypKommando) {
233:                         Sitzung.this.prozesse.add(erstelleAlternativetypKommando.getResultat());
234:                 }
235:                 
236:                 @Override
237:                 public void handle(final ErstelleEndeaktivitaetstypKommandoMitResultat erstelleEndeaktivitaetstypKommando) {
238:                         Sitzung.this.prozesse.add(erstelleEndeaktivitaetstypKommando.getResultat());
239:                 }
240:                 
241:                 @Override
242:                 public void handle(final ErstelleStandardaktivitaetstypKommandoMitResultat erstelleStandardaktivitaetstypKommando) {
243:                         Sitzung.this.prozesse.add(erstelleStandardaktivitaetstypKommando.getResultat());
244:                 }
245:                 
246:                 @Override
247:                 public void handle(final ErstelleStartaktivitaetstypKommandoMitResultat erstelleStartaktivitaetstypKommando) {
248:                         Sitzung.this.prozesse.add(erstelleStartaktivitaetstypKommando.getResultat());
249:                 }
250:                 
251:                 @Override
252:                 public void handle(final ErstelleSynchronisationstypKommandoMitResultat erstelleSynchronisationstypKommando) {
253:                         Sitzung.this.prozesse.add(erstelleSynchronisationstypKommando.getResultat());
254:                 }
255:                 
256:                 @Override
257:                 public void handle(final ErstelleVerteilungstypKommandoMitResultat erstelleVerteilungstypKommando) {
258:                         Sitzung.this.prozesse.add(erstelleVerteilungstypKommando.getResultat());
259:                 }
260:                 
261:                 @Override
262:                 public void handle(
263:                                 final FuegeQualifikationZuMitarbeiterHinzuKommando fuegeQualifikationZuMitarbeiterHinzuKommando) {
264:                         // hier geschieht nichts, da sowohl die Qualifikationen, als auch die Mitarbeiter in der Sitzung verwaltet
265:                         // werden.
266:                         // Es müssen keine Änderungen am Sitzungsobjekt vorgenommen werden.
267:                 }
268:                 
269:                 @Override
270:                 public void handle(final ErstelleMaschineKommandoMitResultat erstelleMaschineKommando) {
271:                         Sitzung.this.maschinen.add(erstelleMaschineKommando.getResultat());
272:                 }
273:                 
274:                 @Override
275:                 public void handle(final ErstelleMitarbeiterFaehigkeitKommando erstelleMitarbeiterFaehigkeitKommando)
276:                                 throws PPSException {
277:                         Sitzung.this.mitarbeiterFaehigkeiten.add(erstelleMitarbeiterFaehigkeitKommando.getResultat());
278:                 }
279:                 
280:                 @Override
281:                 public void handle(final ErstelleMitarbeiterKommandoMitResultat erstelleMitarbeiterKommando) {
282:                         Sitzung.this.mitarbeiter.add(erstelleMitarbeiterKommando.getResultat());
283:                 }
284:                 
285:                 @Override
286:                 public void handle(final ErstelleProduktionsrolleKommandoMitResultat erstelleProduktionsrolleKommando) {
287:                         // TODO Art: Feature request; es gibt bis jetzt glaube ich noch keinen Testfall, der das Erstellen von Produktionsrollen über
288:                         // Kommandos testet.
289:                         Sitzung.this.produktionsrollen.add(erstelleProduktionsrolleKommando.getResultat());
290:                 }
291:                 
292:                 @Override
293:                 public void handle(final ErstelleQualifikationKommandoMitResultat erstelleQualifikationKommando) {
294:                         Sitzung.this.qualifikationen.add(erstelleQualifikationKommando.getResultat());
295:                 }
296:                 
297:                 @Override
298:                 public void handle(
299:                                 final FuegeFaehigkeitZuProduktionsrolleHinzuKommando fuegeFaehigkeitZuProduktionsrolleHinzuKommando) {
300:                         // TODO Art: Feature request; es gibt bis jtzt glaube ich noch keinen Testfall, der das Hinzufügen von Fähigkeiten zu
301:                         // Produktionsrollen via Kommandos testet.
302:                         
303:                         // hier geschieht nichts, da sowohl die Fähigkeiten, als auch die Produktionsrollen in der Sitzung verwaltet
304:                         // werden.
305:                         // Es müssen keine Änderungen am Sitzungsobjekt vorgenommen werden.
306:                 }
307:                 
308:                 @Override
309:                 public void handle(
310:                                 final FuegeProduktionsrolleZuMitarbeiterHinzuKommando fuegeProduktionsrolleZuMitarbeiterHinzuKommando) {
311:                         // hier geschieht nichts, da sowohl die Produktionsrollen, als auch die Mitarbeiter in der Sitzung verwaltet
312:                         // werden.
313:                         // Es müssen keine Änderungen am Sitzungsobjekt vorgenommen werden.
314:                 }
315:         }
316:         
317:         /**
318:          * @return liefert den Mitarbeiterfähigkeitenmanager
319:          */
320:         public MitarbeiterFaehigkeitenManager getMitarbeiterFaehigkeitenManager() {
321:                 return this.mitarbeiterFaehigkeitenManager;
322:         }
323:         
324:         /**
325:          * gibt der Sitzung einen Mitarbeiterfähigkeitenmanager. Kann nur dann aufgerufen werden, wenn dieser zuvor null
326:          * war.
327:          *
328:          * @param neuerMitarbeiterFaehigkeitenManager
329:          * neuer MitarbeiterFähigkeitenManager.
330:          */
331:         public void provideMitarbeiterFaehigkeitenManager(
332:                         final MitarbeiterFaehigkeitenManager neuerMitarbeiterFaehigkeitenManager) {
333:                 if (this.mitarbeiterFaehigkeitenManager != null) {
334:                         throw new Error("darf nur aufgerufen werden, wenn die Instanz zuvor nicht belegt ist.");
335:                 }
336:                 this.mitarbeiterFaehigkeitenManager = neuerMitarbeiterFaehigkeitenManager;
337:         }
338: }