-
Notifications
You must be signed in to change notification settings - Fork 0
3.1 Time Management
Sie werden im Zuge dieser Übung folgende Pattern implementieren:
- Singleton
- Observer
- Command
Es soll eine Kommandozeilenapplikation entstehen, mit der die Arbeitszeit von verschiedenen Benutzern in verschiedenen Projekten aufgezeichnet werden kann. Die Anwendung bietet eine interaktive Konsole, auf der Kommandos eingegeben werden können.
Folgende Kommandos sollen zur Verfügung stehen:
-
adduser
username
Legt einen neuen User an. Benutzernamen sind eindeutig und dürfen nur aus Kleinbuchstaben bestehen. -
addproject
#project-tag
[description
]
Legt ein neues Project mit dem Tagproject-tag
an. Project-Tags müssen immer mit einer Raute gekennzeichnet werden. Ein Project-Tag muss eindeutig sein und darf nur aus Kleinbuchstaben bestehen. Die Beschreibung des Projektes ist optional. -
addtime [
username
] [#project-tag
]duration
description
Bucht die angegebene Zeitduration
für den Benutzerusername
auf das Projekt mit Tagproject-tag
.duration
gibt die zu buchende Zeit in Minuten und als Ganzzahl an. Der Benutzername und der Projekt-Tag sind optional und werden, falls nicht angegeben, vom letzten addtime Command übernommen. Falls das Projekt oder der Benutzer beim Absetzen eines addtime Commands noch nicht existieren, soll ein Fehler ausgegeben werden. -
undo
Kehrt das letzte Kommando um, falls möglich. Undo selbst wird nicht in der History gespeichert. -
redo
Führt das letzte, rückgängig gemachte Kommando wieder aus, falls vorhanden. Redo selbst wird nicht in der History gespeichert. -
help
Zeigt eine Liste aller verfügbaren Kommandos mit einer Beschreibung an. (zB Parameter) Hint: Orientieren Sie sich an bekannten Unix-Tools bzgl. der Formatierung und Informationen. (zB Git) -
stats
username
Zeigt die Summe aller Zeitbuchungen des aktuellen Tages eines Users in Minuten auf der Console an.
Verwenden Sie das Singleton-Pattern um Daten zu speichern/halten. zB User, Projekte, Zeitbuchungen, Kommando-Historie.
Verwenden Sie das Command-Pattern um die einzelnen Kommandos umzusetzen.
Mithilfe des Observer-Patterns sollen 2 Usecases umgesetzt werden:
Wenn die Arbeitszeit eines Users 8h pro Tag überschreitet, soll folgende Meldung auf der Konsole erscheinen:
"Achtung! Arbeitszeit von User XX um Y Minuten überschritten."
Sobald ein neuer User angelegt wird, soll auch ein Observer erzeugt werden, der alle Zeitbuchungen dieses Users in einer Datei protokolliert. Natürlich müssen die Zeitbuchungen auch im Speicher gehalten werden (siehe stats Kommando).
Jede Zeitbuchung soll in folgendem Format in die Datei geschrieben werden:
"timestamp
#project-tag
duration
description
".
- Der
timestamp
soll dem ISO8601-Format entsprechen. zB 2007-12-24T18:21Z - Die
duration
soll in Minuten abgespeichert werden. - Der
project-tag
soll mit der Raute abgespeichert werden.
- Das File-Handle sollte nur so lange wie nötig "offen" bleiben.
- Der Name des Files entspricht dem
username
. - Jede Zeile darf nur einen Datensatz beinhalten.
- Sobald eine Zeile einmal in die Datei geschrieben wurde, darf diese Zeile nicht mehr verändert werden, daher ist nur das Hinzufügen von neuen Zeilen möglich.
Da eine bereits protokollierte Zeile niemals verändert werden darf, soll im Falle eines Undo
s für ein addtime
Kommando DIESELBE Zeile nocheinmal protokolliert werden, allerdings diesmal mit einem -
am Beginn.
Damit die Übung erfolgreich automatisiert getestet werden kann, müssen Sie folgende Annotationen/Attribute in Ihrem Projekt verwenden:
Folgende Patterns müssen dadurch gekennzeichnet werden:
- Singleton:
- durch das Kennzeichnen der jeweiligen Klasse mit
Singleton
.
- durch das Kennzeichnen der jeweiligen Klasse mit
- Observer:
- durch das Kennzeichnen der jeweiligen Klasse mit
Observer
.
- durch das Kennzeichnen der jeweiligen Klasse mit
- Command:
- durch das Kennzeichnen der Invoker Klasse mit
Invoker
. - die Methode im Invoker, welche Kommandos ausführen kann, muss mit
InvokeCommand
gekennzeichnet sein.
- durch das Kennzeichnen der Invoker Klasse mit
04.02.2016 - Initiale Angabe