Montag, 28. Februar 2011

BPMN: Deployment auf Weblogic Server

Das Deployment erfolgt im JDeveloper aus dem Application Navigator (falls nicht sichtbar: --> View --> Application Navigator).

Hier sollte es 3 Projekte geben: 'Urlaub' (das BPM Projekt), 'UrlaubsAntragErstellen_UI' und 'Genehmigung_UI' (die Projekte der Web-UI). Bitte alle 3 Projekte minimieren, das Projekt 'Urlaub' auswählen und rechte Maustaste -> deploy _> Urlaub.

'Deploy to Application Server' auswählen.
'Overwrite any existing composites with the same revision ID' ankreuzen, Next.
'Overwrite Existing Application' ankreuzen. Ebenso links neben 'Projects' den Haken setzen bei 'Click here to select all WAR profiles to deploy'. Dadurch werden die beiden UI-Projekte mit ausgewählt, ohne welche die Anwendung nicht lauffähig wäre.
Hier den SOABPM Server auswählen.
Der AdminServer ist genau richtig, Next.
In der Übersicht wird dann per 'Finish' das Deployment gestartet.


Wenn alles geklappt hat, steht unten im Log am Ende ---- Deployment finished. ----.

Nächster Schritt ---> BPMN: Prozess im Weblogic Server testen

Donnerstag, 24. Februar 2011

BPMN: Benutzeroberflächen generieren

Weiter geht es im SCA-Composite. Dieses sollte noch in einem Tabreite offen sein, ansonsten im Application Navigator das Projekt 'Urlaubsantrag' expandieren, SOA Content expandieren und Doppelklick auf composite.xml.

Im Composite sind jetzt auch die beiden Human Tasks zu sehen, die im Prozess definiert wurden. Diese müssen jetzt mit einer Benutzeroberfläche versehen werden. Start mit Doppelklick auf 'AntragErstellen.task'.

Weiter geht es oben links mit Create Form|Launch Task Form Wizard. Jede Taskform wird ein eigenes Projekt im JDeveloper. Als Name bitte 'UrlaubsAntragErstellen_UI' eingeben (UI = User Interface - ist wichtig, damit man im Application Navigator den Überblick behält beim Deployment) und 'OK'.

Die ersten beiden Seiten im Task Form Wizard können mit 'Next' übersprungen werden. Auf der Seite für den Body den Title eingeben 'Bitte Urlaubsdaten erfassen'. Setup des Seitenlayouts nach belieben  und weiter mit 'Next'.

Auf der folgenden Seite für die erste Spalte die gewünschten Attribute (Vorschlag: Name, Datum_von, Datum_bis, Anzahl_Tage, Resturlaub) auswählen oder einfach alle übernehmen (bei nur einer Spalte). Weiter mit 'Next', ggf. wiederholen mit zweiter Spalte (Vorschlag: Vertreter, Kommentar, Status, Personalnr).
Auf der letzten Seite für den Footer als Title 'Weitere Informationen' eintragen sowie 'Comments' und 'History' selektieren. Bei 'Display in … columns' den Zähler auf 2 hochsetzen. Abschließen mit 'Next' und 'Finish'.

Als Ergebnis erhält man die generierte ADF Eingabeform.
Entsprechend soll jetzt noch die zweite Human Task für die Genehmigung erstellt werden, beginnend mit dem Doppelklick auf AntragGenehmigen im composite.xml. Als Projektname sollte 'Genehmigung_UI' vergeben werden.
Auch hier erhält man wieder eine Task-Form wie oben abgebildet. An dieser Stelle speichern und alle Fenster ausgenommen composite.xml schliessen.

ACHTUNG: da sich im JDeveloper 11.1.1.4 ein kleiner Fehler eingeschlichen hat, bitte noch die verlinkten Anweisungen befolgen. Da der Fehler aber mit 11.1.1.5 wieder behoben wurde, ist dieser Workaround dort nicht mehr notwendig.

Nächster Schritt ---> BPMN: Deployment auf Weblogic Server

Mittwoch, 23. Februar 2011

BPMN: Objekte mit dem Prozess verknüpfen

Weiter geht es wieder im Prozess, den man erreicht über den entsprechenden Tabreiter bzw. das durch Doppelklick im 'BPM Project Navigator' auf den 'UrlaubsProcess'.

Auf dem Prozessschritt Antrag (erstellen) rechter Mausklick, Properties. Wechseln auf Tabreiter 'Implementation' und neben dem leeren Feld 'Human Task' das grüne Plus-Symbol (+) anklicken.
Im 'Create Human Task' Dialog den Namen setzen auf 'AntragErstellen' und das Pattern auf 'Initiator' umstellen. Der Title wird 'Bitte Urlaubsdaten erfassen'.
Neben Parameters das grüne Plus-Symbol (+) klicken und aus dem Dialog 'BrowseDataObjects' das 'UrlaubDataObjekt' mit der linken Maustaste von rechts aus dem Fenster in die leere Parameterliste ziehen, loslassen und 'editable' auswählen.
Jetzt das Fenster 'Browse Data Objects' schließen, ebenso 'Create Human Task' via 'OK' - eine Human Task definition wird angelegt (noch nicht das UI). STOP! An dieser Stelle noch nicht mit 'OK' den Properties-Dialog verlassen! Statt dessen bei 'Data Associations' den Haken setzen bei 'Use Associations' und klick auf den gelben Bleistift daneben ('Edit Data Associations').

Es öffnet sich der 'Data Associations' Editor. Hier per Drag&Drop von rechts das UrlaubDataObject in das Input-Feld links vom 'urlaubsantrag'-Prozessobjekt bewegen. Im Output-Feld ist das UrlaubDataObject bereits vorbelegt.
Jetzt die beiden Fenster jeweils mit 'OK' schließen. Das Aussehen der User Task hat sich geändert: es ist der kleine Pfeil dazugekommen, weil es eine 'Initiator Task' ist.

Die gleichen Schritte werden jetzt noch einmal wiederholt für die Aktivität 'Genehmigung' mit folgenden Parametern: Name: 'AntragGenehmigen' (Pattern: Simple), Title: 'Bitte Antrag prüfen', Parameters: UrlaubDataObjekt: editable: angehakt. Dieses Mal kann auch gleich das 'Outcome Target' unten entsprechend auf 'Outcome' gesetzt werden. Über das 'Outcome'-Object wird die Genehmigung [APPROVE] oder Ablehnung [REJECT] vom Manager weitergegeben im Prozess.

Dann ist bei Data Associations wieder der Haken zu setzen bei 'Use Associations'. Mit dem Klick auf das Edit-Icon (gelber Bleistift) gelangt gelangt man wieder zu den 'Edit Data Associations'. Dieses Mal müssen auf der linken Seite alle Felder einzeln zugewiesen werden, ausgenommen das Feld Resturlaub. Dieses wird anschließend mit einer Funktion gefüllt über den fx-Button.

Hier wird zunächst der 'Mode' oben links umgestellt auf 'XPath Exp.', bei Functions werden die 'Conversion Functions' voreingestellt. Dann wird die Funktion 'string' ausgewählt und nach oben in die 'Expression' übernommen per Doppelklick oder den Button 'Insert Into Expression'.
Oben in der 'Expression' setzt man den Cursor zwischen die beiden Klammern von 'string()'. Nun wird links unten bei 'Variables' ResturlaubReturn ausgewählt und wiederum oben in den Ausdruck eingefügt, so dass dieser jetzt aussieht wie auf dem Bild oben.
Die drei Fenster werden jeweils geschlossen mit 'OK'.

In der Prozess-Grafik verschwindet auch sogleich die Warning, da diese Task nun vollständig implementiert ist. Es ist allerdings noch kein User Interface generiert worden, das folgt später. An dieser Stelle bitte wieder speichern.

Jetzt wird die Verbindung 'abgelehnt' (von Bescheid zu BescheidAbgelehnt) bearbeitet. Hierzu den Pfeil anklicken und rechte Maustaste, Properties, wechseln auf den Tab Properties, Type setzen auf 'Condition'. Über das Icon: [fx] gelangt man in den Expression Builder.


Unter 'Variables' die Variable Outcome auswählen und per Drag&Drop oder über den Button 'Insert into Expression' in das Feld 'Expression' bewegen. Hier muss es nun heissen: Outcome == "REJECT" (Wichtig!!! => vor REJECT ist ein doppeltes Gleichheitszeichen und REJECT ist von Anführungszeichen umschlossen) !). Verlassen mit zwei Mal 'OK'.
Der Manager erhält den Urlaubsantrag und gemäß des "Simple" Patterns (nur APPROVE oder REJECT wählen zu können) wählt er bei Nicht-Genehmigung REJECT und somit läuft der Prozess jetzt diesen Pfad entlang. APPROVE wird nicht modelliert, denn das entspricht dem Default/Standard Pfad.

Nun wird der Prozessschritt BescheidGenehmigt implementiert. Hierzu Rechtsklick auf die Aktivität BescheidGenehmigt und 'Properties' auswählen. Dann auf Reiter 'Implementation', Implementation Type setzen auf 'Service task' und Implementation 'Service Call' auswählen. Weiter über Lupensymbol neben dem Feld 'Name'. Hier 'AntwortSchreiben' auswählen und die Operation 'write' wird automatisch übernommen. Noch nicht OK klicken.


Jetzt wieder 'use Associations' ankreuzen und den Button (Stift) für 'edit Data Associations' anklicken. In der Mitte das Data Objekt 'Urlaubsdaten' expandieren durch [+], ebenso rechts das "Urlaubsantrag" Dataobject.
Von rechts mit gedrückter rechter Maustaste die UrlaubsAntragObjekt Attribute nach links in die korrespondierenden Felder unter 'Input' ziehen. Ausnahmen: die Attribute 'status' und 'resturlaub'. Hierhin kommen statt dessen die Data Objekts 'Outcome' und 'ResturlaubReturn', für letzteres bitte wieder die Funktion anwenden wie oben beschrieben. Beenden mit zwei Mal 'OK'.



Die Warnung im Prozessschritt verschwindet, da jetzt die Implementierung auf den Service Call zum File-Adapter gesetzt wurde. Hierdurch werden die UrlaubsDataObjekt-Inhalte und der Status (REJECT oder APPROVE) in ein Textfile geschrieben.
Die gleichen Schritte sind noch ein mal entsprechend für die Aktivität 'BescheidAbgelehnt' durchzuführen, dann alles sichern. Unser Prozess sollte jetzt keine Warndreiecke mehr verzeichnen.

Nächster Schritt ---> BPMN: Benutzeroberflächen generieren

BPMN: File-Adapter einbinden

Nach dem Lauf des Urlaubsantrags-Prozesses soll nun irgend etwas mit dem Ergebnis passieren. In einem realen Projekt, würde das Resultat z.B. über den entsprechenden Adapter an ein HR-System gemeldet werden. Um das Beispiel für den Workshop einfach zu gestalten, wird das Ergebnis einfach via File-Adapter ins Dateisystem rausgeschrieben. Wichtig an dieser Stelle: für den Prozess ist es völlig unerheblich, ob die Resultate nun an ein HR-System weitergeben oder nur in eine Datei geschrieben werden. Durch das Adapter-Framework ist das Einbinden der Adapter identisch, nur benötigt das Dateisystem weniger und andere Parameter.


Der Adapter wird auf Ebene des SCA-Composites (Fenster composite.xml) eingebunden. Hierzu wird der File Adapter rechts aus der Component Palette in den rechten Bereich des Composites, unter 'External References' gezogen.

Daraufhin öffnet sich der Wizard zur Konfiguration des Files Adapters. Die erste Seite kann gleich mit 'Next' übersprungen werden. Auf der zweiten Seite wird der Serivce Name gesetzt auf 'AntwortSchreiben', dann 'Next'.
Die Auswahl 'Define from operation and schema', kann so bleiben, 'Next'.

Operation Type 'Write File' setzt automatisch Operation Name 'Write'. Add Output Header kann aktiviert werden, um etwas ausführlichere Ergebnisse zu erhalten.
Als Directory for Outgoing Files kann z.B. gewählt werden /tmp oder /home/oracle (Linux) oder wenn vorhanden c:\temp (Windows). Die FileNameConvention setzt man am besten mit einer Sequenz (%SEQ%) auf z.B. 'ua_%SEQ%.txt'. Weiter mit 'Next'.

Die URL für das Schema auswählen über die Lupe. Im Type Chooser 'Project Schema Files' expandieren, Urlaubsantrag.xsd expandieren und root-element <> Urlaubsantrag auswählen. Weiter mit OK, Next und Finish,  dann alles sichern.

Der Zwischenstand sollte dann wie oben aussehen.

Nächster Schritt ---> BPMN: Objekte mit dem Prozess verknüpfen

BPMN: Datenmodell erstellen

Im weiteren wird für die Implementierung das Objekt 'Urlaubsantrag' benötigt, welches die Urlaubsdaten beinhaltet. Im Hintergrund wird dafür eine XML-Schema Datei (xsd) erzeugt.

Dieses wird aus dem BPM Projekt Navigator erstellt via rechte Maustaste auf 'Business Catalog'  ->  New -> 'Business Objekt'.

Der Name wird gesetzt auf  'Urlaubsantrag' und beim 'Destination Module' geht es weiter über die Lupe zum 'Browse Module' Dialog. Hier kann ein neues erzeugt werden für den 'Module'-Knopf (weisses Blatt mit gelbem Stern). Diese bekommt den Namen 'Daten'. Alle Dialoge wieder mit 'OK' schliessen.


Die Oberfläche zum Definieren des Geschäftsobjekts öffnet sich automatisch. Über das grüne Plus-Symbol (+) können die folgenden Attribute vergeben werden:

beschreibung Type
name string
datum_von string
datum_bis string
anzahl_Tage string
vertreter string
kommentar string
status string
personalnr decimal
resturlaub string

An dieser Stelle sollte zur Sicherheit gespeichert werden (File|Save all), danach kann das Fenster mit dem Objekt 'Urlaubsantrag' geschlossen werden.
Um jetzt im Prozess mit einem DatenObjekt aus dem BusinessCatalog arbeiten zu können, muß ein ProcessDataObject Urlaubsantragsobjekt auf Basis des Business Objekts aus dem Business Catalog angelegt werden.
Dazu im BPM Project Navigator das Projekt 'Urlaub',  Processes = 'Urlaubsprozess' auswählen. Dann darunter im StructurePane auf 'ProcessDataObject' via rechter Maustaste 'New' auswählen.
Der Name wird gesetzt auf 'UrlaubDataObject', als Type dann [Component] auswählen. Im darunter erscheinenden Eingabefeld die Lupe anklicken. Dann in dem sich öffnenden Dialog den Urlaubsantrag auswählen und jeweils mit 'OK' beide Dialoge schliessen.
Um das Ergebnis (Genehmigung des Managers) im Prozess weitergeben zu können, wird noch ein weiteres ProzessDataObject benötigt. Dieses wird den Status APPROVED oder REJECT halten, solange der Urlaubsantrag im Prozess weitergereicht wird. Daher wird analog zu oben ein weiteres ProcessDataObject erzeugt vom Typ String mit Namen 'Outcome'.
Auf dem gleichen Weg wird noch ein weiteres ProcessDataObject 'ResturlaubReturn' vom typ Decimal erzeugt.
Zur Sicherheit bitte an dieser Stelle noch einmal speichern (danach ist der Titel des Tabs nicht mehr kursiv).

Nächster Schritt ---> BPMN: File-Adapter einbinden

Dienstag, 22. Februar 2011

BPMN fachliches Modell erstellen

Nachdem nun die Vorbereitungen abgeschlossen sind, soll im nächsten Schritt das fachliche Modell erstellt werden.

Hierzu im JDeveloper links im 'Process Navigator' den Process 'Urlaubsprocess' per Doppelklick auswählen.

Swimlane 'Role' ändern in 'Mitarbeiter' per Rechtsklick auf Role -> Properties –> Mitarbeiter.

Darunter neue Swimlane 'Manager' anlegen via Rechtsklick -> add Role -> Name:  Manager auswählen -> OK.

Der UserTask wird umbenannt über Doppelklick auf den Namen 'User Task' und ersetzt durch 'Antrag'.
Aus der Component Palette (rechts, falls die Component Palette nicht angezeigt wird, kann diese via View|Component Palette aktiviert werden) im Bereich 'Activities|Interactive' die Aktivität User auf Swimlane 'Manager' ziehen.

Als Name 'Genehmigung' eingeben und beenden mit 'OK'. Hiermit wird eine 'Human Task' erstellt, damit der Manager den Antrag genehmigen kann. Das rote 'x' (Error) ist OK - es fehlen noch die Verbindungen und die Implementierung. Das Ein-/Ausschalten von Errors/Warnings ist möglich über Schieberegler unter "Show Warnings").
Das Resultat sieht jetzt wie folgt aus:

Jetzt die Pfeilspitze der Verbindung -Antrag' -> 'End' mit der Maus aufnehmen und nach 'Genehmigung' verschieben, denn so soll der Prozess später laufen.
Wir brauchen etwas mehr Platz: den 'End' Bubble mit linker Maustaste nach rechts ziehen und dort wieder loslassen.

Nun aus der Component Palette 'Gateways' den 'Exclusive Gateway' in die Swimlane 'Mitarbeiter' ziehen (s. auch Grafik unten) und den Namen auf 'Bescheid' setzen.
Aus der Component Palette 'Activities' die Activity 'Service' (Name: 'BescheidGenehmigt') links neben "End" ziehen (Bitte an der Grafik orientieren). Darunter eine weitere Service-Activity mit dem Namen 'BescheidAbgelehnt' platzieren.

Nun wird der Default bzw. Standard Pfad erstellt: mit rechter Maustaste auf 'Genehmigung' klicken, 'add Default Sequence Flow' und mit der Maus auf 'Bescheid' ziehen und loslassen (dort, wohin man verbinden kann, ändert sich das Cursor-Aussehen).
Das gleiche ist für die Verbindungen Bescheid -> BescheidGenehmigt und BescheidGenehmigt -> End durchzuführen, jeweils 'add default Sequence Flow'.
Wir haben nun den Standard Pfad (default flow) modelliert; d.h. wenn der Manager genehmigt, geht der Prozess diesen Weg.
Nun folgt die 'Ablehnung': Bescheid mit rechter Maustaste anklicken, 'add conditional Sequence Flow' und auf 'BescheidAbgelehnt' loslassen. Jetzt noch von 'BescheidAbgelehnt' nach End via 'add default Sequence Flow' verbinden.
Die Pfeile ausgehend von 'Bescheid' beschriften mit 'genehmigt' (nach 'BescheidGenehmigt') und 'abgelehnt' (nach 'BescheidAbgelehnt') via rechtem Mausklick|Properties|Name'.

Es sind jetzt noch Warnings und Errors auf den Aktivitäten bzw. Flows. Das ist korrekt so, sobald die Objekte (Daten des Urlaubsantrags) angelegt und im Prozess implementiert wurden, verschwinden die Warnings und Errors.

Nächster Schritt: BPMN: Datenmodell erstellen

BPMN Rollen & User anlegen

Die (fachlichen) Rollen müssen  angelegt und den (Demo-)Usern zugewiesen werden. Diese User müssen zunächst im Weblogic Server angelegt werden. Hierzu wird die WLS Console geöffnet unter http://localhost:7001/console.

Login im Workshop mit weblogic/Oracle123 (standard welcome1).

Links die Security Realms auswählen, dann rechts myrealm auswählen.

'Users and Groups' auswählen, hier müssen die beiden User achrist und jcooper über 'New' angelegt werden.

'OK' und das ganze noch einmal für den jeweils anderen User.
Das Ergebnis sollte dann wie oben gezeigt aussehen.
Zurück im JDeveloper, den BPM Project Navigator (Tab rechts neben Applications Navigator) öffnen, Baum 'Urlaub' öffnen (+), dann rechte Maus auf Organization -> Open.
Über das grüne Plus oben rechts (+) wird die Rolle Mitarbeiter hinzugefügt.
'Mitarbeiter' auswählen (Zeile ist dann blau), darunter bei 'Members' nach den WLS Usern 'achrist' und 'jcooper' suchen mittels der Lupe.
Es erscheint 'Identity Lookup', bei Application Server 'SOAbpm' auswählen (nicht 'integratedWeblogic'). Dann mit SearchPattern='*' neben 'User Name' auf das Zahnrad (Lookup) klicken. Aus der Trefferliste 'achrist' auswählen, Button 'Select' und mit 'OK' abschließen.
Diese Schritte bitte wiederholen mit Role 'Manager' und User 'jcooper'. 
Ausserdem wird der bestehenden Rolle 'Process Owner' auch der User 'achrist' hinzugefügt, sonst wird im Workspace der StartForm-Link nicht angezeigt.
Dann alles speichern mit File|Save all.
Später kann man sich als Administrator 'weblogic' einloggen in den Business Process Workspace (http://oel5r5:7001/bpm/workspace), oben rechts im Header den Link 'Administration' wählen und Zuordnungen einsehen/ändern. Die Zuordnungen aus dem JDeveloper sind hier aber erst sichtbar nachdem die Anwendung erstmalig deployed wurde. Auch kann ein LDAP oder Active Directory hinter dem WLS eingebunden werden.

---> Nächster Schritt: BPMN fachliches Modell erstellen