3.2 FH Notify - fhtw-swp-tutorium/documentation GitHub Wiki

Sie werden im Zuge dieser Übung folgende Pattern implementieren:

  • Decorator
  • Composition
  • Strategy

Es soll im Zuge dieser Übung ein vereinfachtes Benachrichtigung-System für die FH Technikum Wien entstehen. Durch eine Kommandozeilenapplikation können Personen über verschieden Kanäle Text-Nachrichten erhalten. Die Anwendung ist stateless, das bedeutet, sie wird mit gewissen Kommandozeilenparameters gestartet, führt die gewünschte Aktion aus und beendet sich anschließend wieder. Ähnlich zu git, ls oder ähnliche Tools.

1. Domain

Die Domaine besteht aus Nachrichten und Abonnenten. Nachrichten werden an einen oder mehrere Abonnenten verschickt. Um die Handhabung zu vereinfachen, können Alias definiert werden, welche entweder auf einen Abonnenten oder weitere Alias zeigen.

2. Konfiguration

Die Konfiguration beschreibt alle verfügbaren Abonnenten und alle gesetzten Alias. Beispiel für eine gültige Konfiguration:

{
	"subscribers": [
		"se15m001",
		"if12b017"
	],
	"alias": [
		{
			"name": "latex-2015",
			"for": [
				"se15m001",
				"if12b017"
			]
		},
		{
			"name": "bif1",
			"for": [
				"if12b017"
			]
		},
		{
			"name": "bif3",
			"for": [ ]
		},
		{
			"name": "bif5",
			"for": [ ]
		}
		{
			"name": "all-bif-students",
			"for": [
				"bif1",
				"bif3",
				"bif5"
			]
		},
	]
}

Das Programm muss die Konfiguration beim Start validieren:

  1. Ein Alias darf nur auf definierte Abonnenten (subscribers) oder definierte Alias zeigen. Zeigt ein Alias A auf einen zweiten Alias B, so muss Alias B vor Alias A definiert sein.
  2. Eine leere Konfiguration ist eine gültige Konfiguration.

Falls die Konfiguration nicht gültig ist, soll sich das Programm mit einer Fehlermeldung beenden.

3. Optionen & Parameter

Folgende Optionen sollen vom Programm akzeptiert werden:

  • --config path
    Spezifiziert einen relativen oder absoluten Pfad zu einer Konfigurationsdatei im oben beschriebenen Format. Der Parameter ist optional und hat den Defaultwert ~/.fh-notify/config.json. ~ ist die Kurzschreibweise für das Verzeichnis des aktuellen Benutzers.

  • --message path
    Spezifiziert den relativen oder absoluten Pfad zu der Textdatei, welche die Nachricht enthält, die gesendet werden soll. Eine solche Nachricht hat typischerweise keine Kopf- und Fußzeile, sondern besteht wirklich nur aus dem zu sendenden Text. Beispiel:

    $ cat C:\Users\Thomas\Desktop\sample-message
    Der Lift im A-Gebäude wird voraussichtlich ab nächsten Montag (14.12.2015) für 2 Wochen außer Betrieb sein.
    
  • --format format-identifiers
    Definiert eine Komma-separierte Liste mit Formatierern, welche auf die Nachricht angewendet werden sollen.
    Die Reihenfolge, in der die Formatierer angegeben sind, ist zu respektieren. Das heißt, falls mehrere Formatierer angegeben sind, welche eine Signatur hinzufügen, muss die Signatur des letzten Formatierers auch wirklich am Ende der Nachricht stehen.

  • --transport transport-identifier
    Definiert den zu verwendenden Transportweg. Siehe 6. Transportwege.

Alle zusätzlichen Parameter sind als Empfänger der Nachricht zu interpretieren. Das Programm soll sich mit einer Fehlermeldung beenden, falls ein angeführter Empfänger nicht in der Konfiguration definiert ist.

4. Formatieren der Nachricht

Das Programm soll vor dem Versenden die übergebene Nachricht iterativ formatieren, indem eine Anrede und eine Signatur hinzugefügt wird. Nachrichten können für verschiedene Anlässe und Zielgruppen gedacht sein, daher gibt es mehrere Möglichkeiten, wie diese Nachrichten formatiert werden können müssen:

  • casual-greeting
    Dieser Formatierer fügt der Nachricht als Anrede ein Hallo XY,\n hinzu.

  • formal-greeting
    Dieser Formatierer fügt der Nachricht als Anrede Guten Tag XY\n hinzu.

  • casual-signature
    Dieser Formatierer fügt der Nachricht als Signatur \nViele Grüße,\ndie FH-Leitung hinzu.

  • promotion
    Dieser Formatierer fügt der Nachricht als Signatur \nVersendet mit fh-notify. hinzu.

  • christmas
    Dieser Formatierer fügt der Nachricht als Signatur \nFrohe Weihnachten wünscht,\ndie FH-Leitung hinzu.

5. Versenden der Nachrichten

Das Versenden einer Nachricht soll simuliert werden, indem eine Datei mit dem Namen des Empfängers angelegt wird, welche die fertige Nachricht enthält.
Eine Nachricht soll an jeden Abonnenten immer nur einmal versendet werden.
Nachrichten können nur an echte Abonnenten verschickt werden, jedoch nicht an einen Alias. Ist der Empfänger einer Nachricht ein Alias, so wird die Nachricht in Wirklichkeit an die dahinterstehenden Abonnenten geschickt. Befindet sich unter diesen wieder ein oder mehrere Alias, müssen diese ebenfalls aufgelöst werden.

6. Transportwege

Ein Transportweg beschreibt, wie die Nachricht am Ende jedem einzelnen Abonnenten zugestellt wird. Das System soll die folgenden Kanäle unterstützen:

  • Whatsapp
  • Telegram
  • E-Mail

Da der Fokus der Übung nicht darauf liegt, alle diese Systeme anzubinden, sollen Nachricht je nach Transportweg in einen pro Transportweg definierten Ordner geschrieben werden:

Transportweg Ordnername
Whatsapp whatsapp
Telegram telegram
E-Mail email

Der Ordnername ist auch gleichzeitig der Identifier, mit dem ein Transportweg über die Option --transport ausgewählt werden kann.

Daraus ergibt sich schlussendlich folgender Pfad zum Speichern der Benachrichtigungen: Transportweg/Abonnent (z.B. whatsapp/se15m010)

7. Patterns

  • Verwenden Sie das Decorator-Pattern um die verschiedenen Formatierungsmöglichkeiten und Schritte abzubilden.
  • Verwenden Sie das Composite-Pattern um die Alias abzubilden.
  • Verwenden Sie das Strategy-Pattern um die verschiedenen Transportwege abzubilden.