Business Logic Komponenten¶
Paket-Struktur¶
Das Java-Projekt hat eine Verzeichnisstruktur zur übersichtlichen
Strukturierung der verschiedenen Inhalte. Eine Vorgabe ist, das
Verzeichnis mit dem Quellcode und den übersetzten Klassendateien zu
trennen. Die üblichen Ordnernamen für Java EE-Projekte sind
src
und bin
.
Anmerkungen für Eclipse:
Entwicklungsumgebungen wie Eclipse übersetzen Java-Typen aus dem src
- in
den bin
-Ordner und kopieren Ressourcen wie Bilder und Übersetzungsdateien
bei jedem Build ebenfalls in den src
-Ordner. Eclipse unterstützt diesen
Aufbau standardmäßig, wenn beim Dialog für ein neues Java-Projekt unter
Project layout
die Option Create separate folders for source and class files
aktiviert ist.
Anmerkungen für NetBeans:
Unter NetBeans ist die Standardstruktur etwas anders und eng mit dem Build-Tool Ant verbunden. Der Ordner
src
enthält die Standard-Klassen und Ressourcen, ein zweiter Ordner test die Test-Klassen und Ressourcen. Die
übersetzten Java-Klassen nimmt der Ordner build/classes
auf. Das Ergebnis des
Builds, eine Jar-Datei im Fall eines einfachen Java-Projekts, steht im Ordner dist
.
Die Verzeichnisstruktur hat zusätzlich einen lib
und resource
-Ordner. Im
lib
-Ordner werden die von der Geschäftslogik verwendeten Bibliothek abgelegt. Der resource
-Ordner unterteilt sich nochmal in
localization
für Sprachdateien, media
für multimediale Dateien, sowie templates
für Nachrichten-Vorlagen. Die
Projektstruktur schaut wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | BusinessBot<Projectname> |- src |- Package <country.company.businesslogic.<application name> |- Package <country.company.businesslogic.<common> |- Package <country.company.businesslogic.<database> (optional) |- Package <country.company.businesslogic.plugin (required) |- PluginClient.java (required) (Schnittstelle) |- Package <country.company.businesslogic.<services> |- classes |- extension.idx (Extension Point für den Klassenlader) |- MANIFEST.MF (META Informationen) |- lib (Bibliotheken) |- de.citunius.businesslogic.api-1.0.0.jar (Common API für die Business Bot Plattform) |- de.citunius.businesslogic.api.messenger-1.0.0.jar (Generic Messenger API für die Business Bot Plattform) |- de.citunius.businesslogic.api.sfb-1.0.0.jar (Skype for Business API für die Business Bot Plattform) |- de.citunius.businesslogic.api.telegram-1.0.0.jar (Telegram Messenger API für die Business Bot Plattform) |- resources |- localization |- string_de.properties (Sprachlabels für Deutsch) |- string_en.properties (Sprachlabels für Englisch) |- string.properties (Default-Sprachlabels) |- media |- images |- icon.png (Geschäftslogik Icon) |- templates |- list.ftl (Vorlage für Instant-Nachrichten - Vorlage: Liste) build.xml (Apache Ant Build-Konfiguration) MANIFEST.MF (Default Projekt META-Informationen) plugin.properties (META-Informationen für das Plugin) |
Wichtig:
Eine Geschäftslogik darf entweder die Bibliothek Skype for Business API
ODER die
Telegram Messenger API
verwenden, jedoch dürfen NICHT beide Bibliotheken im lib
--Verzeichnis des Projekts vorhanden sein.
Plugin Manager¶
Der Plugin Manager sucht nach den META-Informationen des Plugins, die in
der Manifest-Datei unter classes/MANIFEST.MF
festgelegt werden. Die MANIFEST.MF
-Datei beinhaltet die Einträge wie im folgenden Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Manifest-Version: 1.0 Implementation-Title: calculator Plugin #1 Implementation-Version: 1.2.0-SNAPSHOT Plugin-Id: de.citunius.telegram.calculator Built-By: ME Created-By: Apache Maven 3.3.9 Plugin-Version: 1.0.0 Plugin-Provider: Citunius GmbH Plugin-Class: de.citunius.businesslogic.plugin.PluginClient Plugin-Dependencies: Implementation-Vendor-Id: de.citunius.plugins Build-Jdk: 1.7.0_67 Specification-Title: calculator Plugin #1 Specification-Version: 1.2.0-SNAPSHOT Archiver-Version: Plexus Archiver |
In der Beispiel-Manifest wurde ein Plugin mit der Id
de.citunius.telegram.calculator
beschrieben, mit der Klasse
de.citunius.businesslogic.plugin.PluginClient
und Version 0.0.1
. Die
Plugin-Id muss eindeutig sein und den Konvensionen
jsemver
als Implementation für SemVer, weil es den Vergleich von
Versionen unterstützt).
Eine andere interne Komponente des Plugin-Managers ist der
ExtensionFinder der beschreibt, wie der Plugin-Manager die Erweiterung
über den Extensionpoint findet. Der DefaultExtensionFinder sucht nach
der Erweiterung mit einer Extension Annotation in der Datei
META-INF/extensions.idx
. Die Business
Bot Plattform benutzt dabei Java Annotation Processing, um alle Klassen
der Erweiterung zur Laufzeit zu kompilieren, die mit
@Extension
annotiert sind und erstellt
dafür die entsprechende Extension Index-Datei.
Plugin Lebenszyklus¶
Jedes Plugin durchläuft die festgelegten Lebenszykluszustände. Der PluginState definiert dabei alle möglichen Zustände. Die primären Plugin-Zustände sind:
- CREATED (The runtime knows the plugin is there. It knows about the plugin path, the plugin descriptor.)
- ENABLED (The plugin can be used.)
- DISABLED (The plugin cannot be used.)
- STARTED (The Plugin.start() of the business logic has executed. A started plugin may contribute extensions.)
- STOPPED (The Plugin.stop() of the business logic has executed.)
- RESOLVED (The plugin is created. All the dependencies are created and resolved. The plugin is ready to be started.)
Der DefaultPluginManager enthält die folgende Logik:
- Alle Plugins werden aufgelöst und geladen
DISABLED
-Plugins werden NICHT automatisch von der Business Bot Plattform gestartet, ABER Sie können einDISABLED
-Plugin manuell starten (und damit aktivieren), indem SiestartPlugin
auf der Business Bot Plattform ausführen, anstelle vonenablePlugin()
+startPlugin()
- Nur
STARTED
Plugins können Erweiterungen beitragen. Jeder andere Zustand sollte nicht als betriebsbereit angesehen werden, da die Erweiterung nicht dem laufenden System hinzugefügt wird.
Die Unterschiede zwischen einem DISABLED
Plugin und einem STARTED
Plugin sind:
- Ein
STARTED
Plugin hat die MethodePlugin.start()
ausgeführt, einDISABLED
Plugin jedoch nicht. - Ein
STARTED
Plugin kann Erweiterungsinstanzen der Business Bot Plattform hinzufügen, einDISABLED
-Plugin kann dies nicht.
DISABLED
-Plugins haben immer gültige
Klassenlader und die Klassen können manuell geladen und untersucht
werden, allerdings wird der Ressourcenlader - der für die Inspektion
wichtig ist - durch die DISABLED
-Prüfung
blockiert.
Anmerkungen für Eclipse:
Wenn Sie Eclipse verwenden, vergewissern, dass die Annotationsverarbeitung für Plugin-Projekte aktiviert ist, die
Objekte mit Annotationen registrieren. In den Eigenschaften des Eclipse-Projekts
gehen Sie zu Java Compiler
→ Annotation Processing
und überprüfen Sie das die Option
Enable Project Specific Settings
und Enable annotation processing
eingeschaltet ist.
Schnittstelle¶
Der Übergabepunkt des Plugin-Managers zwischen der Business Bot Plattform und der Geschäftslogik erfolgt in der Klasse
PluginClient
im Paket de.citunius.businesslogic.plugin
. In der Klasse finden sich die Methoden start()
,
stop()
sowie die Klasse BusinessLogic
die das Interface BusinessLogicInterface
implementiert. In dieser Klasse
werden vom Benutzer eingehende Nachrichten durch die Methode handleIncomingMessage()
und vom Geschäftssystem ausgehende
Nachrichten in der Methode sendMessage()
festgelegt. Die Übergabe von Parameter erfolgt über die HashMap pluginMap
.
Geschäftslogik Bibliothek¶
Folgende Geschäftslogik-Bibliotheken werden ausgeliefert:
de.citunius.businesslogic.api-1.0.0.jar
(Common API für die Business Bot Plattform)de.citunius.businesslogic.api.messenger-1.0.0.jar
(Generic Messenger für die Business Bot Plattform)de.citunius.businesslogic.api.sfb-1.0.0.jar
(Skype for Business API für die Business Bot Plattform)de.citunius.businesslogic.api.telegram-1.0.0.jar
(Telegram Messenger API für die Business Bot Plattform)
Es darf nur eine der Messenger Bibliothek (Datei de.citunius.businesslogic.api.<messenger>-<version>.jar
) pro Geschäftslogik verwendet werden, da es sonst zu Problemen mit den Klassenlader kommen kann. Die Messenger Bibliothek enthält spezifische Funktionen, die nur für den jeweiligen Messenger gültige sind, wie beispielsweise Menü-Struktur.
Menü-Struktur¶
Möchte man für die Geschäftslogik ein Menü kreieren, so kann man die vorgefertigten Funktionen aus der Messenger Bibliothek verwenden. Damit
sich die Geschäftslogik merkt, in welchen Menü oder Untermenü sich der Benutzer befindet, muss der UserState
abgespeichert werden. Die kann man über eine Datenbankfunktion realisieren, welche die UserState
für alle Benutzer abspeichert.
Ein Menü wird mit dem Objekt ReplyKeyboardMarkup
zusammengestellt. Dazu wird das Objekt
ReplyKeyboardMarkup
instanziiert, einige Eigentschaft mitgegeben und die Buttons definiert. Folgendes
Programmierbeispiel dient zur Veranschaulichung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * * @return */ private ReplyKeyboardMarkup getKeyboardPreferencesMainMenu() { ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup(); replyKeyboardMarkup.setSelective(true); replyKeyboardMarkup.setResizeKeyboard(true); replyKeyboardMarkup.setOneTimeKeyboad(false); List<List<String>> keyboard = new ArrayList<>(); List<String> keyboardFirstRow = new ArrayList<>(); keyboardFirstRow.add(getCommandLanguages(language)); keyboardFirstRow.add(getCommandAbout()); keyboard.add(keyboardFirstRow); replyKeyboardMarkup.setKeyboard(keyboard); return replyKeyboardMarkup; } |
Im obigen Beispiel wird ein Preferences
-Menü erzeugt, das die Button Languages
und About
besitzt.
Datenbankzugriff¶
Geschäftslogiken müssen die Datenhaltung entweder Datei-basiert realisieren oder eine Datenbank verwenden. Der Datenbank-basierte Ansatz muss für jede Geschäftslogik individuell implementiert werden. Dazu muss die entsprechende Bibliothek für den Datenbankzugriff ins
lib
-Verzeichnis kopiert werden. Für weitere Information zwecks Implementierung entnehmen Sie bitte der Dokumentation der jeweiligen Hersteller.
National Language Processing (NLP)¶
Geschäftslogiken können um die Fähigkeit von National Language Processing (NLP) und KI (Künstliche Intelligenz) durch entsprechende Bibliotheken erweitert werden. Beispielsweise können hierbei Bibliotheken wie Apache OpenNLP und IBM Watson eingesetzt werden. Für mehr Informationen schauen Sie bitte in die Dokumentation der jeweiligen Hersteller.