Design und Implementierung einer mobilen, Workflow

Werbung
Fachhochschule Wiesbaden
Fachbereich Design Informatik Medien
Studiengang Allgemeine Informatik
Diplomarbeit
zur Erlangung des akademischen Grades
Diplom-Informatiker/in (FH)
Design und Implementierung einer mobilen,
Workflow-orientierten BlackBerry-Anwendung für
den Zugriff auf ein SAP-System
vorgelegt von Alexander Opatz
am 28. Februar 2007
Referent: Prof. Dr. R. Kröger
Korreferent: Dipl.-Ing. Dipl.-Kfm. T. Schneider
II
Erklärung
Ich versichere, dass ich die Diplomarbeit selbstständig verfasst und keine anderen als die
angegebenen Hilfsmittel benutzt habe.
Wiesbaden, 28.02.2007
Alexander Opatz
Hiermit erkläre ich mein Einverständnis mit den im Folgenden aufgeführten Verbreitungsformen dieser Diplomarbeit:
Verbreitungsform
Einstellung der Arbeit in die
Bibliothek der FHW
Veröffentlichung des Titels der
Arbeit im Internet
Veröffentlichung der Arbeit im
Internet
Wiesbaden, 28.02.2007
ja
nein
√
√
√
Alexander Opatz
III
IV
Inhaltsverzeichnis
1
Einleitung
1
2
Grundlagen
5
2.1
Die BlackBerry-Architektur . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.1
BES - BlackBerry Enterprise Server . . . . . . . . . . . . . . . .
6
2.1.2
BB-MDS-Studio . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.1.3
BB-Handheld . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.1.4
RIM Push-Technologie . . . . . . . . . . . . . . . . . . . . . . .
11
Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.2.1
WSDL - Web Services Description Language . . . . . . . . . . .
12
2.2.2
SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
SAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.3.1
SAP-CRM 4.0 . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.3.2
SAP-XI - eXchange Infrastructure . . . . . . . . . . . . . . . . .
20
J2ME - Java 2 Platform Micro Edition . . . . . . . . . . . . . . . . . . .
23
2.4.1
Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.4.2
Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
2.4.2.1
MIDlet Suite . . . . . . . . . . . . . . . . . . . . . . .
24
2.4.2.2
OTA Provisioning . . . . . . . . . . . . . . . . . . . .
26
Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2.4.3.1
Lebenszyklus . . . . . . . . . . . . . . . . . . . . . .
26
2.4.3.2
PushRegistry . . . . . . . . . . . . . . . . . . . . . . .
28
2.4.3.3
Graphische Benutzerschnittstelle . . . . . . . . . . . .
28
2.4.3.4
RMS - Persistente Speicherung . . . . . . . . . . . . .
31
2.4.3.5
kSOAP Web-Service-Bibliothek . . . . . . . . . . . .
33
2.4.3.6
Optimierungen für mobile Anwendungen . . . . . . . .
35
Sicherheitskonzept . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.2
2.3
2.4
2.4.3
2.4.4
V
3
Analyse
39
3.1
Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.1.1
Rahmenbedingungen . . . . . . . . . . . . . . . . . . . . . . . .
39
3.1.2
Anwendungsfälle . . . . . . . . . . . . . . . . . . . . . . . . . .
41
3.1.2.1
Server-initiiert . . . . . . . . . . . . . . . . . . . . . .
41
3.1.2.2
Client-initiiert . . . . . . . . . . . . . . . . . . . . . .
42
Problembereiche . . . . . . . . . . . . . . . . . . . . . . . . . .
43
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.2.1
SAP-CRM . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.2.2
Datenmodellierung . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.2.3
Web Service zum SAP-CRM-System . . . . . . . . . . . . . . .
45
3.3
Mobile Gateway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
3.4
Mobile Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.4.1
Kommunikation mit dem Web Service . . . . . . . . . . . . . . .
49
3.4.1.1
JSR 172 - Web-Service-API für J2ME . . . . . . . . .
50
3.4.1.2
REST-Web-Services . . . . . . . . . . . . . . . . . . .
51
3.4.1.3
Voranalysen . . . . . . . . . . . . . . . . . . . . . . .
52
3.4.1.4
Evaluierung . . . . . . . . . . . . . . . . . . . . . . .
54
3.4.2
Synchronisation und Offline-Modus . . . . . . . . . . . . . . . .
55
3.4.3
Usability der mobilen Anwendung . . . . . . . . . . . . . . . . .
61
3.4.4
Logging und Unit-Tests . . . . . . . . . . . . . . . . . . . . . .
63
3.1.3
3.2
4
Design
65
4.1
Architekturüberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
4.2
mobileCRM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
4.2.1
Allgemeine Design-Prinzipien . . . . . . . . . . . . . . . . . . .
67
4.2.2
Benutzerschnittstelle . . . . . . . . . . . . . . . . . . . . . . . .
68
4.2.3
Model und Backend-Zugriffe . . . . . . . . . . . . . . . . . . . .
72
4.2.4
Abbildung der Anwendungsfälle . . . . . . . . . . . . . . . . . .
75
4.2.4.1
Server-initiiert . . . . . . . . . . . . . . . . . . . . . .
75
4.2.4.2
Client-initiiert . . . . . . . . . . . . . . . . . . . . . .
76
Integrationsszenarien in SAP-XI . . . . . . . . . . . . . . . . . . . . . .
83
4.3
VI
5
Implementierung
89
5.1
Entwicklungswerkzeuge . . . . . . . . . . . . . . . . . . . . . . . . . .
89
5.2
SOAP-Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.3
RMS-Schnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
5.4
Multi-Threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.4.1
Worker-Thread . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
5.4.2
Push-Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
5.5
Logging und Internationalisierung . . . . . . . . . . . . . . . . . . . . .
98
5.6
Workarounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.7
5.6.1
javax.microedition.midlet.MIDlet . . . . . . . . . . . . . . . . . 100
5.6.2
javax.microedition.lcdui.Gauge . . . . . . . . . . . . . . . . . . 101
5.6.3
Statische PushRegistry-Verbindungen im JAD . . . . . . . . . . . 102
5.6.4
Initialisierung von statischen Attributen . . . . . . . . . . . . . . 102
Qualitätssicherung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.7.1
Styleguide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.7.2
Software-Metriken . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.7.3
Automatisierte Tests . . . . . . . . . . . . . . . . . . . . . . . . 104
5.8
Implementierungsaufwand . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.9
Performance-Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.9.1
Messreihe 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.9.2
Messreihe 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.9.3
Messreihe 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.9.4
Messreihe 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.9.5
Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6
Zusammenfassung
117
7
Literaturverzeichnis
121
A Abkürzungen
123
VII
VIII
Abbildungsverzeichnis
2.1
Aufbau der BlackBerry-Architektur . . . . . . . . . . . . . . . . . . . .
6
2.2
Komponenten des BES aus [RIM06a] . . . . . . . . . . . . . . . . . . .
7
2.3
Verschlüsselung zwischen BB-Endgerät und BES . . . . . . . . . . . . .
8
2.4
Aufbau einer Beschreibung eines Web Service mit WSDL nach [HL04] .
13
2.5
Aufbau einer SOAP-Nachricht (HTTP als Transportprotokoll) . . . . . .
15
2.6
Überblick der SAP-Module . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.7
Aktivitätsmanagement im GUI-Client von SAP . . . . . . . . . . . . . .
20
2.8
SAP-XI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.9
Aufbau der J2ME-Komponenten . . . . . . . . . . . . . . . . . . . . . .
24
2.10 Lebenszyklus eines MIDlets, angelehnt an [Sch04] . . . . . . . . . . . .
27
2.11 Zusammenhang der Klassen des LCDUI, adaptiert aus [Sch04] . . . . . .
30
2.12 MIDlet-Suite übergreifende Zugriffe auf RecordStores . . . . . . . . . .
31
3.1
Grobe Systemarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.2
Server-initiierte Anwendungsfälle . . . . . . . . . . . . . . . . . . . . .
41
3.3
Client-initiierte Anwendungsfälle . . . . . . . . . . . . . . . . . . . . .
42
3.4
Zusammenhang der Komponenten von JSR 172 . . . . . . . . . . . . . .
51
3.5
Beispiel für ein Lost-Update bei der Synchronisation . . . . . . . . . . .
56
3.6
Synchronisationslösung 1 für Client-initiiertes Aktivitätsupdate . . . . . .
58
3.7
Push-Update, Bestandteil der Synchronisationslösungen 1 und 2 . . . . .
59
3.8
Synchronisationslösung 2 für Client-initiiertes Aktivitätsupdate . . . . . .
60
3.9
Mögliches Lost-Update in Synchronisationslösung 2 . . . . . . . . . . .
61
4.1
Verfeinerter Aufbau der Systemarchitektur . . . . . . . . . . . . . . . . .
66
4.2
Klassen der Benutzerschnittstelle (View) . . . . . . . . . . . . . . . . . .
69
4.3
Übersicht und Zusammenhang der Screens . . . . . . . . . . . . . . . . .
71
IX
4.4
Business Objects in mobileCRM . . . . . . . . . . . . . . . . . . . . . .
73
4.5
Komponenten zur Kommunikation mit den Backend-Systemen . . . . . .
74
4.6
Sequenzdiagramm zum Anwendungsfall Daten synchronisieren . . . . .
76
4.7
Sequenzdiagramm zum Anwendungsfall Aktivitäten auflisten . . . . . . .
77
4.8
Sequenzdiagramm zum Anwendungsfall Aktivität anlegen . . . . . . . .
78
4.9
Sequenzdiagramm zum Anwendungsfall Aktivität löschen . . . . . . . . .
80
4.10 Sequenzdiagramm zum Anwendungsfall Aktivität anzeigen . . . . . . . .
81
4.11 Sequenzdiagramm zum Anwendungsfall Aktivitätenliste anfordern . . . .
82
4.12 Sequenzdiagramm zum Anwendungsfall Daten synchronisieren . . . . .
83
4.13 Aufbau eines synchronen Integrationsszenarios im SAP-XI . . . . . . . .
84
5.1
Aufbau der verschiedenen Nachrichtentypen . . . . . . . . . . . . . . . .
92
5.2
Klassen für Internationalisierung und Logging . . . . . . . . . . . . . . .
99
5.3
Kiviat-Graph der Metriken von mobileCRM . . . . . . . . . . . . . . . . 104
5.4
Messaufbau und Bezeichnung der Messwerte . . . . . . . . . . . . . . . 108
5.5
Zeit zum Serialisieren der Anfrage in SOAP-XML-Markup . . . . . . . . 109
5.6
Messreihe 1: Eine Aktivität als Payload . . . . . . . . . . . . . . . . . . 110
5.7
Messreihe 2: 14 Aktivitäten als Payload . . . . . . . . . . . . . . . . . . 111
5.8
Messreihe 3: Zehn Aktivitäten als Payload . . . . . . . . . . . . . . . . . 112
X
Tabellenverzeichnis
2.1
kSOAP Mappings für primitive Datentypen . . . . . . . . . . . . . . . .
34
3.1
Übersicht der Attribute einer Aktivität in mobileCRM . . . . . . . . . . .
46
4.1
Übersicht der Komponenten von mobileCRM . . . . . . . . . . . . . . .
67
4.2
Übersicht der Integrationsszenarien . . . . . . . . . . . . . . . . . . . .
85
4.3
Integrationsszenario ActionPush . . . . . . . . . . . . . . . . . . . . . .
86
4.4
Integrationsszenario ChangeActivity . . . . . . . . . . . . . . . . . . . .
87
4.5
Integrationsszenario GetActivityList . . . . . . . . . . . . . . . . . . . .
88
5.1
LOC des Package com.csc.bb.mobileCRM . . . . . . . . . . . . . . 105
5.2
LOC des Package com.csc.bb.mobileCRM.gui . . . . . . . . . . 106
5.3
LOC des Package com.csc.bb.mobileCRM.model . . . . . . . . . 106
5.4
LOC des Package com.csc.bb.mobileCRM.model.backend.rms106
5.5
LOC des Package com.csc.bb.mobileCRM.model.backend.sap106
5.6
LOC des Package com.csc.bb.mobileCRM.util . . . . . . . . . . 107
5.7
LOC des Package com.csc.bb.mobileCRM.tests . . . . . . . . . 107
5.8
LOC von mobileCRM und mobileCRMtestsuite . . . . . . . . . . . . . . 107
5.9
Statistische Kenngrößen zu Messreihe 1 (Einheit [ms]) . . . . . . . . . . 110
5.10 Statistische Kenngrößen zu Messreihe 2 (Einheit [ms]) . . . . . . . . . . 112
5.11 Statistische Kenngrößen zu Messreihe 3 (Einheit [ms]) . . . . . . . . . . 112
5.12 Daten aus Messreihe 4 (Einheit [ms]) . . . . . . . . . . . . . . . . . . . 113
XI
XII
Verzeichnis der Quellcodes
2.1
Aufbau einer RIM-Push HTTP-Anfrage . . . . . . . . . . . . . . . . . .
11
2.2
Beschreibung eines Web Service aus [W3C01] . . . . . . . . . . . . . .
14
2.3
Beispiel einer SOAP-Nachricht (Anfrage) . . . . . . . . . . . . . . . . .
16
2.4
Beispiel einer SOAP-Nachricht (Antwort) . . . . . . . . . . . . . . . . .
16
2.5
Beispiel eines Java Application Descriptors . . . . . . . . . . . . . . . .
25
2.6
Beispiel zur Serialisierung in einen Byte-Strom . . . . . . . . . . . . . .
33
2.7
KvmSerializable-Schnittstelle von kSOAP . . . . . . . . . . . . . .
35
3.1
JAD der Push-Test-Anwendung . . . . . . . . . . . . . . . . . . . . . .
52
4.1
Interface zur Umsetzung des Command Pattern . . . . . . . . . . . . . .
72
5.1
build.xml: Target makecod . . . . . . . . . . . . . . . . . . . . . . . .
90
5.2
Parameter für den Obfuscator ProGuard . . . . . . . . . . . . . . . . .
90
5.3
SAPmanager.java: Methode receivePush . . . . . . . . . . . . . . .
93
5.4
RMSmanager.java: Methode saveActivityEntry . . . . . . . . . .
94
5.5
ModelController.java: Methode getActivity . . . . . . . . . . . . .
95
5.6
ModelController.java: Methode handleGetActivity . . . . . . . . .
96
5.7
ModelController.java: Methode stop . . . . . . . . . . . . . . . . . . .
96
5.8
PushReceiver.java: Methode run . . . . . . . . . . . . . . . . . . . . . .
97
5.9
PushReceiver.java: Methode stop . . . . . . . . . . . . . . . . . . . . .
98
5.10 Bug in Klasse MIDlet . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.11 Log-Ausgabe der Testanwendung MIDlet_Destroy_Bug . . . . . . . . . 101
5.12 Bug in Klasse Gauge . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
XIII
XIV
Kapitel 1
Einleitung
Die Verbreitung von mobilen Endgeräten wie Smartphones, PDAs und Handys nimmt
weltweit rasant zu. Im September 2006 wurde global die Marke von 2.5 Milliarden Handys erreicht. In Westeuropa betrug im Jahr 2004 der Verbreitungsgrad 74 - 110 Prozent,
d.h. in manchen Ländern ist pro Kopf bereits mehr als ein Handy vorhanden (siehe Studie
[Gei05]). Man liest in diesem Zusammenhang auch häufig von pervasive oder ubiquitous
computing, womit die Durchdringung und Allgegenwärtigkeit von mobilen oder eingebetteten Endgeräten in allen Lebensbereichen gemeint ist. Dies schafft ein großes Potential
für mobile Anwendungen und darauf basierende Geschäftsmodelle. Zur Unterstützung
von Geschäftsprozessen können mobile Anwendungen auch in Unternehmen eingesetzt
werden.
Unter Mobile Business versteht man die Abwicklung von Geschäftsprozessen durch elektronische Kommunikationstechniken mit mobilen Endgeräten. Die besonderen Merkmale
des Mobile Business sind örtliche Unabhängigkeit, Erreichbarkeit zu jeder Zeit, einfache Handhabung sowie Identifizierungs- und Telemetriefunktionen. Dadurch lassen sich
Prozesse in verschiedenen Geschäftsbereichen effizienter gestalten. Mit dem Einsatz von
mobilen Endgeräten innerhalb logistischer Ketten können beispielsweise Daten in Echtzeit erfasst werden. Dies ermöglicht ein besseres Supply Chain Management (SCM) Engpässe können so früh erkannt werden, und Entscheidungen basieren auf aktuellen
Daten. Außendienstmitarbeiter sind zu jeder Zeit in der Lage, ihre Daten des Personal Information Management (PIM) - also z.B. Aufgaben, Termine und Kontakte - und E-Mails
abzurufen. Diese Funktionalität nennt sich auch Mobile Office und ist auf Kommunikation
und Zusammenarbeit ausgerichtet. Anwendungen für den sogenannten Mobile Workforce
Support dienen der Unterstützung von Geschäftsprozessen und ermöglichen den mobilen
Zugriff auf firmeninterne Backend-Systeme. Beispielsweise können Daten des Customer
1
Kapitel 1. Einleitung
Relationship Management (CRM) somit zu jeder Zeit an einem beliebigen Ort verfügbar
sein, und der Kunde kann ohne Zeitverzögerung Informationen oder spezifische Angebote
von seinem Ansprechpartner erhalten. Auch für Konsumenten als Nutzer bringen mobile Anwendungen Zeitersparnis oder eine Verbesserung der Lebensqualität. Entertainment
in Form von Spielen und Musik hat sich bereits auf Handys etabliert und gehört schon
zum Alltag. Navigations- und Bezahlsysteme steigern die Effizienz im Alltag. Ebenso
ist vorstellbar, dass weitergehende standortbezogene Dienste - auch Location Based Services (LBS) genannt - durch erweiterte Funktionen an Attraktivität gewinnen. Im Bereich
öffentlicher und sozialer Einrichtungen wie Notfalldienste, Polizei und Militär führt eine schnelle und auch interdisziplinäre Kommunikation durch mobilen Datenaustausch zu
effizienterem Agieren und kann dadurch entscheidend oder sogar lebensrettend sein.
Zur Verwaltung und Optimierung von Geschäftsprozessen wie beispielsweise dem bereits
angesprochenen CRM und SCM haben sich Softwaresysteme etabliert. Die SAP AG ist
als Hersteller auf diesem Gebiet führend und ihre Software ist bei großen und mittelständischen Unternehmen weit verbreitet. Die aktuelle Produktlinie setzt mit ihrer Serviceorientierten Architektur (SOA) auf hohe Integration der SAP-Teilkomponenten und auch
der eingebundenen Fremdsysteme. Dadurch sollen die Geschäftsprozesse schneller abgewickelt werden, und unmittelbare Anpassungen der Prozesse an die aktuellen Bedürfnisse
der Marktlage sind leichter durchführbar. An dieser Stelle kann Mobile Business zu weiteren Optimierungen beitragen.
Bei der Arbeit mit sensiblen Daten, seien es Betriebsgeheimnisse oder Abwicklungen von
Geschäften mit hohen Transaktionssummen, ist die Gewährleistung der Sicherheit unabdingbar. Neben der verschlüsselten Kommunikation muss garantiert sein, dass die Endgeräte selbst auch sicher sind, da sie Daten lokal speichern können und Zugriff zum Unternehmensnetzwerk haben. Diese Möglichkeiten bietet z.B. die mobile Plattform BlackBerry (BB) des Herstellers Research in Motion (RIM). Die mobilen Endgeräte sind dabei
über einen zentralen Server in das Unternehmen eingebunden und jegliche Kommunikation ist verschlüsselt. Auf dem Endgerät selbst können Daten kodiert gespeichert und via
Passwort zugriffsgeschützt werden. Über den Server ist es außerdem möglich, die Daten
von Geräten über die drahtlose Verbindung zu löschen und IT-Richtlinien anzuwenden.
Mit 5,5 Millionen Nutzern weltweit zeigt sich bereits eine gewisse Verbreitung dieser
Architektur.
Diese Diplomarbeit entstand extern in Kooperation mit der CSC Deutschland Solutions
GmbH in Wiesbaden. Sie zielt darauf ab, die vielfach bereits in Unternehmen vorhandene SAP-Infrastruktur in die BlackBerry-Plattform zu integrieren, um so sicheres Mobile
Business zu ermöglichen. Ein Workflow in einem SAP-CRM-System wird dabei proto-
2
Kapitel 1. Einleitung
typisch durch eine mobile Anwendung auf einem BlackBerry-Endgerät abgebildet. Um
dabei möglichst plattformunabhängig und generisch vorzugehen, erfolgt die Integration
durch Web Services. Durch die damit verbundene Kommunikation in Form von XMLbasierten Nachrichten bleibt die Kopplung zwischen den zu integrierenden Systemen so
gering wie möglich, und die Interoperabilität mit anderen Plattformen ist gewahrt. Der
Schwerpunkt dieser Arbeit liegt auf dem Entwurf von Konzepten für die Integration, die
anhand einer prototypische mobilen Anwendung realisiert werden soll. Die Implementierung des zu entwerfenden Web Service auf SAP-Seite wird durch den Betreuer (Herrn
Thomas Schneider) von Seiten der Firma CSC vorgenommen.
Der Aufbau dieser Arbeit gliedert sich wie folgt: Im Kapitel Grundlagen werden die technologischen Voraussetzungen BlackBerry, SAP, Web Services und J2ME erläutert, die bei
der Bearbeitung des Themas eingesetzt wurden.
Daran schließt sich die Analyse an, in der zunächst die Rahmenbedingungen und Anwendungsfälle der Anwendung beschrieben werden, um dann die einzelnen Systembestandteile dieser Arbeit und mögliche Alternativen zu untersuchen. Im Abschnitt Design wird
die Realisierung dieser Ausführungen softwaretechnisch entworfen, basierend auf den
Entscheidungen in der Analyse und mit der mobilen Anwendung auf dem BB-Endgerät
als Schwerpunkt. Darauffolgend werden die wesentlichen und interessanten Teile der Implementierung dargelegt. Das abschließende Kapitel Fazit fasst die gesamte Abhandlung
zusammen und gibt einen Ausblick für weitere Entwicklungen in diesem Themenbereich.
3
Kapitel 1. Einleitung
4
Kapitel 2
Grundlagen
Dieses Kapitel dient dazu, den Leser mit Architekturen und Technologien vertraut
zu machen, die für das Verständnis dieser Arbeit benötigt werden. Zunächst wird
die BlackBerry-Architektur erläutert und darauf folgend ein Überblick über die SAPArchitektur gegeben und im Speziellen auf die Module zur Kundenverwaltung (CRM)
und der Integration mit anderen Unternehmensanwendungen (XI) eingegangen. Zum besseren Verständnis der SAP-Integration folgt ein Unterkapitel über Technologien für Web
Services. Für die Realisierung dieser Arbeit ist die Java-Plattform für mobile Endgeräte
(J2ME) maßgebend und wird darauffolgend vorgestellt.
2.1
Die BlackBerry-Architektur
Der kanadische Hersteller RIM bezeichnet mit BB Produkte, die im Zusammenhang mit
dieser mobilen Plattform stehen. Einen Überblick darüber gibt Abbildung 2.1. Über mobile Endgeräte ist man in die firmeninternen E-Mail- und Messaging-Systeme integriert.
Das PIM wird ebenso drahtlos abgeglichen. Weiterhin besteht die Möglichkeit, an die
Kommunikationsplattform weitere Unternehmensanwendungen anzubinden, um Daten
und Funktionen zugänglich zu machen.
Einen Überblick der Architektur und des Zusammenspiels der Komponenten liefert
[RIM06a]. Die Plattform besteht hauptsächlich aus einem BB-Handheld als Client, der
über einen BB-fähigen Mobilfunkanbieter mit einem BlackBerry Enterprise Server (BES)
verbunden ist.
Die BB-Infrastruktur besteht aus globalen Rechenzentren des Herstellers RIM. Diese nehmen für das Endgerät verschlüsselte Nachrichten von BES-Servern und über eine durch
5
2.1. Die BlackBerry-Architektur
Kapitel 2. Grundlagen
Abbildung 2.1: Aufbau der BlackBerry-Architektur
das SRP-Protokoll (SRP steht für Secure Remote Password) authentifizierte Verbindung
an. Die Nachricht wird an den entsprechenden Mobilfunkanbieter weitergeleitet, bei dem
das BB-Endgerät eingebucht ist, welches die Nachricht empfangen soll. Für diesen Vorgang ist die von RIM bereitgestellte BB-Infrastruktur notwendig, da ein BB-Client sonst
nur mit einem Mobilfunkanbieter funktionieren würde. Über GPRS oder UMTS übermittelt der Mobilfunkanbieter die Nachricht zum Endgerät, wo sie entschlüsselt werden kann.
Übertragungen in umgekehrter Richtung arbeiten analog, hierbei kodiert jedoch das mobile Endgerät und der BES nimmt die entschlüsselnde Rolle ein. Eine Dekodierung durch
die BB-Infrastruktur findet nicht statt.
Eine weitere Möglichkeit, das Endgerät mit dem BES zu verbinden, ist mittels USBKabelverbindung zur einer Workstation, auf der die BB-Desktop-Software läuft, von der
die Daten über das LAN an den BES gesendet werden.
2.1.1
BES - BlackBerry Enterprise Server
Das Herzstück der Architektur ist der BES, über den die gesamte Kommunikation stattfindet. Diese Serversoftware besteht aus mehreren Komponenten, die in Abbildung 2.2
dargestellt sind. Die wesentlichen Komponenten werden in den folgenden Abschnitten
besprochen.
Über den BES werden standardmäßig bereits das firmeninterne E-Mail-System (unterstützt werden Microsoft Exchange und IBM Lotus Domino) und einige Instant-
6
Kapitel 2. Grundlagen
2.1. Die BlackBerry-Architektur
Abbildung 2.2: Komponenten des BES aus [RIM06a]
Messaging-Systeme durch entsprechende Clientsoftware in die BB-Endgeräte integriert.
Ein besonderes Merkmal ist dabei die sogenannte Push-Technologie, mit der eingehende Nachrichten vom BES aus auf das entsprechende Endgerät gesendet werden können.
Dadurch ist es möglich, die Rechen- und die Latenzzeit des E-Mail-Empfangs zu verringern, und das aufkommende Datenvolumen im Vergleich zu benutzerinitiierten MailAbfragen (Polling) zu reduzieren. Über die Desktop-Software kann das Verhalten des EMail-Systems benutzerspezifisch eingestellt werden. So können beispielsweise Filter angelegt werden, um zu bestimmen, welche E-Mails auf das BB-Gerät gepusht werden sollen. Vom Handheld aus gesendete E-Mails werden bei Bedarf mit der Desktop-Software
synchronisiert. E-Mail-Anhänge werden vom BES in ein spezielles Binärformat konvertiert, das die BB-Gerätesoftware standardmäßig anzeigen kann, ohne dass spezifische Clientsoftware nötig ist. Dies funktioniert allerdings nur für Formate, die vom Anhangdienst
im BES unterstützt werden und die dieser entsprechend konvertieren kann. Ebenso werden Daten des PIM drahtlos über den BES synchronisiert, so dass die Desktop-Clients
und das BB-Endgerät mit den gleichen Daten arbeiten.
Verbindungen zwischen dem BES und BB-Handhelds sind immer mit einem symmetrischen Verschlüsselungsverfahren gesichert (vgl. Abbildung 2.1), aktuell durch AES mit
7
2.1. Die BlackBerry-Architektur
Kapitel 2. Grundlagen
Abbildung 2.3: Verschlüsselung zwischen BB-Endgerät und BES
einem Schlüssel der Länge 256 Bit. Eine Aufgabe des BES ist also die serverseitige Verund Entschlüsselung, die durch den Dispatcher-Service (siehe Abbildung 2.2) stattfindet.
Dazu gehört auch die Verwaltung der geheimen Schlüssel der Endgeräte.
Ein Hauptkodierungsschlüssel wird mit einem Handheld generiert, der entweder mit der
BB-Desktop-Software oder über die Funkverbindung mit dem BES verbunden ist. Dieser
Schlüssel wird an drei Stellen hinterlegt: im BES, im Endgerät und auf dem Mailsystem.
Mit dem Hauptkodierungsschlüssel wird der sogenannte Nachrichtenschlüssel chiffriert,
mit dem die eigentliche Nachricht verschlüsselt ist (siehe Abbildung 2.3).
Die verschlüsselte Nachricht und der zugehörige kodierte Nachrichtenschlüssel werden
an den BES gesendet. Durch den dort hinterlegten Hauptschlüssel des Endgeräts kann
der Nachrichtenschlüssel dekodiert werden und im nächsten Schritt somit auch die Nachricht. Der Hauptschlüssel des Geräts wird üblicherweise alle 30 Tage automatisch geändert. Eine manuelle Änderung ist jederzeit möglich und kann server- oder clientseitig
initiiert sein, Der Nachrichtenschlüssel ändert sich bei jedem Datenpaket (maximal 2kB)
8
Kapitel 2. Grundlagen
2.1. Die BlackBerry-Architektur
und wird basierend auf Zufallsdaten generiert. Optional kann auch ein Schlüssel zum Inhaltsschutz des Handhelds auf der Grundlage des Geräte-Kennworts generiert werden.
Mit Hilfe dieses Schlüssels werden gespeicherte Daten und der Hauptkodierungsschlüssel chiffriert. Detailliertere Informationen zu den Verschlüsselungsmechanismen finden
sich im im Kapitel „BlackBerry-Codierungsschlüssel“ in [RIM06b].
Die Sicherheitseinstellungen der BB-Endgeräte lassen sich über IT-Richtlinien zentral
vom BES aus drahtlos konfigurieren. Die zuständige Komponente dafür ist der PolicyService. So kann z.B. unterbunden werden, dass die Benutzer der Endgeräte Anwendungen installieren können, oder es können die Aktivierung des Inhaltsschutzes und sichere
Passwörter erzwungen werden. Änderungen an den Richtlinien können für alle oder manuell ausgewählte Endgeräte vorgenommen werden.
Der BES stellt mit der Komponente namens Mobile Data System (MDS) Verbindungen
zwischen den mobilen Endgeräten und Anwendungen des Unternehmens oder dem Internet her. Die Kommunikation zwischen Endgerät und dem BES ist dabei auf bekannte
Weise verschlüsselt, für eine sichere Verbindung zwischen MDS und der Unternehmensanwendung kann SSL verwendet werden.
Neben der Verschlüsselung stellt die Dispatcher-Komponente auch einen Dienst zur Optimierung des Datenverkehrs für BB-Endgeräte bereit. Die Optimierung umfasst Datenverkehr von E-Mail-Kommunikation, MDS-Studio-Applikationen (erstellt mit BBspezifischer IDE), J2ME-Anwendungen und dem BB-Browser (falls diese über das MDSSystem übertragen werden). Je nach Anwendungsfall werden die Daten komprimiert oder
auch in ein anderes Format konvertiert, welches das BB-Gerät darstellen kann.
Eine weitere Funktion des MDS ist der Provisioning-Service, mit dem MDS-StudioAnwendungen zentralisiert an die Endgeräte verteilt werden können. Für die Anbindung
unternehmensspezifischer Anwendungen an BB-Endgeräte bieten sich Applikationen auf
Basis von J2ME (siehe Kapitel 2.4) und MDS-Studio-Anwendungen an, welche im nächsten Abschnitt erläutert werden.
2.1.2
BB-MDS-Studio
Die Software BB-MDS-Studio ist eine Entwicklungsumgebung von RIM (siehe Dokumentation [RIM06c]), mit der relativ schnell und leicht graphische Client-Anwendungen
erstellt werden können, die auf Web Services zugreifen. Als Ausgangsbasis dient dabei
die Beschreibung des Web Service in Form eines WSDL-Dokuments, auf dessen Aufbau
später eingegangen wird. Die IDE erstellt aus einem WSDL-Dokument bereits Dialog-
9
2.1. Die BlackBerry-Architektur
Kapitel 2. Grundlagen
felder, die an den Ein- und Ausgabemöglichkeiten des Web Service orientiert sind. Über
einen graphischen Assistenten können die Dialoge manuell angepasst werden. Auf Basis
der Dialoge kann mittels JavaScript weitere Logik implementiert werden. Die Anwendung wird als XML-Struktur repräsentiert und zusammen mit einer separaten Datei für
das JavaScript sowie optionalen Resourcen in ein Java Archive (JAR) verpackt. Der BES
stellt eine Datenbank zur Verfügung, in der MDS-Studio-Anwendungen verwaltet werden und von BB-Clients zur Installation drahtlos abgerufen werden können. Vom MDSRuntime-System im BB-Endgerät wird die Anwendung in native Java-Aufrufe umgesetzt
und die Web-Service-Bibliothek bereitgestellt.
2.1.3
BB-Handheld
Aktuelle BB-Endgeräte laufen mit einem eigenen Betriebssystem von RIM und unterstützen J2ME- und MDS-Studio-Anwendungen. Standardmäßig sind auf den Geräten bereits
ein E-Mail-Client und ein Web-Browser installiert. Für den Browser gibt es drei verschiedene Profile:
1. Den WAP-Browser, wobei die Verbindung über das WAP-Gateway des Mobilfunkanbieters aufgebaut wird.
2. Den BlackBerry-Browser, der Verbindungen über das MDS des BES herstellt.
3. Internet-Browser, der Verbindungen über die RIM-Infrastructure (nicht über den
BES) schafft.
Unter dem Namen BB-Connect bietet RIM Module an, mit denen einige Endgeräte von
Drittanbietern, basierend auf den Betriebssystemen Symbian OS und Windows Mobile,
einen Großteil an Funktionalitäten der BlackBerry-Enterprise-Lösung nutzen können.
Die ausführbaren Anwendungen für BlackBerry-Geräte bzw. die BlackBerry-JVM werden in einem proprietären Format mit der Datei-Extension .cod gespeichert. Die Entwicklungsumgebung von RIM, das Java Development Environment (JDE), bringt einige Entwicklungswerkzeuge mit, die sich auch außerhalb der IDE nutzen lassen. Unverzichtbar ist dabei rapc.exe, ein Compiler, der reguläre J2ME-Anwendungen in das
BlackBerry-Format übersetzt. Mit der BlackBerry-Desktop-Software lassen sich die installierten Anwendungen auf einem Endgerät verwalten.
10
Kapitel 2. Grundlagen
2.1.4
2.1. Die BlackBerry-Architektur
RIM Push-Technologie
Der BES stellt eine externe Schnittstelle für Anwendungen des Unternehmens bereit, über
die Push-Nachrichten angenommen werden und an das entsprechende BB-Endgerät weitergeschickt werden. Die genaue Funktionsweise wird im BlackBerry Application Developer Guide Volume 1 [RIM05] in Kapitel 10 erläutert. Voraussetzung ist, dass die externe
Anwendung das HTTP-Protokoll beherrscht und mit der POST-Methode die Nachricht
an den BES übermitteln kann. Eine Nachricht wird entweder im RIM-Push-Protokoll
(Aufbau siehe Codeausschnitt 2.1) oder Push Access Protocol (PAP, Teil der WAP 2.0
Spezifikation) verpackt.
1 POST /push?DESTINATION=<Gerät>&PORT=<Port>&REQUESTURI=<URI> HTTP/1.1
<HTTP-Header>
3 <RIM-spezifische HTTP-Header>
5 <Nachrichteninhalt>
Quellcode 2.1: Aufbau einer RIM-Push HTTP-Anfrage
Die notwendigen Informationen und Optionen für die Nachrichtenzustellung werden über
den URI der HTTP-Anfrage und spezifische HTTP Header übermittelt. Das Zielgerät wird
mit Hilfe eines eindeutigen Identifikationsstrings des Geräts, in der Dokumentation des
Herstellers PIN genannt, oder der E-Mail-Adresse des Benutzers identifiziert. Der angegebene Port spezifiziert den Port auf dem Endgerät, auf dem die Anwendung auf eingehende
Verbindungen wartet. Dort wird der Inhalt der Nachricht in Form eines Byte-Datenstroms
entgegen genommen. Den Parameter REQUESTURI gibt der BES über HTTP an das Endgerät weiter. Über optionale, herstellerspezifische HTTP Header kann beispielsweise die
Priorität angegeben werden oder ein URI, den der BES aufruft, um eine Rückmeldung
über die Nachrichtenzustellung zu geben. Die Informationen der Rückmeldung werden
dabei ebenfalls über HTTP Header transportiert. Es ist auch möglich, Push-Nachrichten
eine Lebensdauer zuzuweisen, so daß die Nachricht nicht mehr ausgeliefert wird, falls
dies nicht innerhalb des im BES definierten Zeitraums erfolgt ist.
Im Gegensatz zum RIM-Push-Protokoll werden beim PAP die protokollspezifischen Informationen in einer XML-Struktur transportiert. Daher wird die Nachricht in Form einer
MIME-Multipart-Nachricht versendet, um diese Informationen von dem Nachrichteninhalt zu trennen.
11
2.2. Web Services
2.2
Kapitel 2. Grundlagen
Web Services
Unter einem Web Service versteht man eine Software-Komponente, die über XMLbasierten Nachrichtenaustausch mit anderen Applikationen Daten und Funktionen anbieten und entgegennehmen bzw. ausführen kann. Web Services dienen also der Kommunikation zwischen Anwendungskomponenten. Der Unterschied zu anderen Kommunikationsverfahren ist, dass die Grundlage der Nachrichtenformate XML ist, und Nachrichten
über das HTTP-Protokoll übertragen werden können. Dadurch ergibt sich eine große Interoperabilität zwischen verschiedenen Plattformen und Programmiersprachen und die Integration in bestehende Firewall-geschützte Netzwerke fällt leichter. Für die Bereitstellung
und Nutzung von Web Services haben sich einige Protokolle etabliert, die in den folgenden Unterkapiteln beschrieben werden. Als Grundlage dient dabei das Buch [HL04].
2.2.1
WSDL - Web Services Description Language
Mit der Web Services Description Language (WSDL) lassen sich Web Services in Form
von XML-Dokumenten beschreiben. Die aktuelle Version 2.0 des WSDL-Standards liegt
beim World Wide Web Consortium (W3C) als sogenannte Candidate Recommendation
vor [W3C06]. Die zuvor in Entwicklung befindliche Version 1.2 wurde aufgrund größerer Änderungen in 2.0 umbenannt. Der neue Standard unterteilt sich in die Teile Core
Language, Message Patterns und Bindings. Einige Elemente wurden umbenannt oder um
Attribute erweitert, und das aktuelle SOAP-Binding nutzt nun die Version 1.2 statt 1.1
in der vorherigen Version. Viele Implementierungen nutzen jedoch noch nicht die neuen
Standards. Im Folgenden wird WSDL in der Version 1.1 beschrieben (für die Spezifikation siehe [W3C01]), da SAP die neueste Version noch nicht unterstützt.
Eine Beschreibung für die Schnittstelle eines Web Service ist notwendig, um die bereitgestellten Operationen sowie erwartete und zurückgegebene Daten unabhängig von
der Web-Service-Implementierung zu dokumentieren. Mittlerweile bieten viele Entwicklungswerkzeuge Unterstützung beim Umgang mit WSDL. Ausgehend von einem WSDLDokument kann beispielsweise ein Client-Skelett in einer spezifischen Programmiersprache generiert werden, um mit dem Web Service zu kommunizieren. Umgekehrt gibt es
Tools, die zu einer Web-Service-Implementierung ein entsprechendes WSDL-Dokument
erzeugen. Außerdem gibt es noch graphische Design-Werkzeuge, mit denen man ein
WSDL-Dokument entwerfen kann. Die Beschreibung einer Schnittstelle gliedert sich in
fünf Teile, die in Abbildung 2.4 dargestellt sind.
12
Kapitel 2. Grundlagen
2.2. Web Services
Abbildung 2.4: Aufbau einer Beschreibung eines Web Service mit WSDL nach [HL04]
Das Wurzelelement einer Beschreibung ist das definitions-Element, das alle notwendigen XML-Namensräume einbindet. Innerhalb der darauf folgenden Sektion types
können eigene Datentypen definiert werden, falls die XML-Schema-Datentypen nicht
ausreichend sind - üblicherweise werden damit komplexere Datentypen als XML-Schema
realisiert. Eine WSDL-Beschreibung muss mindestens ein message-Element enthalten,
das mit Namen und Typ den Aufbau einer Nachricht beschreibt, die der Web Service
senden oder empfangen kann. Diese Nachrichtentypen werden in der darauffolgenden
portType-Sektion verwendet, in der sie Operationen als Ein- oder Ausgabe-Typ zugeordnet werden. Durch die Reihenfolge und das Vorhandensein der Unterelemente input
und output wird festgelegt, welcher Endpunkt die Kommunikation initiiert und ob eine
Reaktion von der anderen Seite erwartet wird.
Die Struktur unterhalb des Elements binding ist ähnlich wie portType aufgebaut,
allerdings werden dort die Operationen mit einem Transportprotokoll (z.B. SOAP oder
HTTP) verknüpft. Eine abstrakte Definition einer Operation kann mehrere Bindungen haben. Der letzte Abschnitt service enthält port-Unterelemente, in denen jeweils einem
Binding ein URL zugeordnet wird, auf der diese Operation abzurufen ist. Eine beispielhafte Beschreibung eines Web Service durch WSDL findet sich in Quellcode-Listing 2.2.
2.2.2
SOAP
Ursprünglich bedeutete SOAP Simple Object Access Protocol, wird aber mittlerweile nur
noch als Eigenname verwendet, da eine Objektorientierung nicht gegeben ist. SOAP ist
eine Spezifikation zum plattformunabhängigen Austausch von XML-Nachrichten. Initiiert wurde SOAP von Microsoft, basierend auf der Entwicklung von XML-RPC (Spezifikation siehe [Win99]) durch Dave Winer bei UserLand-Software. Die Version 1.1,
an der sich auch IBM beteiligte, wurde dem W3C zur Standardisierung vorgelegt. Vielen
13
2.2. Web Services
Kapitel 2. Grundlagen
1 <definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
3
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
5
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
7
<types>
9
<schema targetNamespace="http://example.com/stockquote.xsd"
xmlns="http://www.w3.org/2000/10/XMLSchema">
11
<element name="TradePriceRequest">
<complexType>
13
<all>
<element name="tickerSymbol" type="string" />
15
</all>
</complexType>
17
</element>
<element name="TradePrice">
19
<complexType>
<all>
21
<element name="price" type="float" />
</all>
23
</complexType>
</element>
25
</schema>
</types>
27
<message name="GetLastTradePriceInput">
29
<part name="body" element="xsd1:TradePriceRequest" />
</message>
31
<message name="GetLastTradePriceOutput">
33
<part name="body" element="xsd1:TradePrice" />
</message>
35
<portType name="StockQuotePortType">
37
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput" />
39
<output message="tns:GetLastTradePriceOutput" />
</operation>
41
</portType>
43
45
47
49
51
53
55
57
59
61
<binding name="StockQuoteSoapBinding"
type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="GetLastTradePrice">
<soap:operation soapAction="http://example.com/GetLastTradePrice" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote" />
</port>
</service>
63
</definitions>
Quellcode 2.2: Beschreibung eines Web Service aus [W3C01]
14
Kapitel 2. Grundlagen
2.2. Web Services
Abbildung 2.5: Aufbau einer SOAP-Nachricht (HTTP als Transportprotokoll)
SOAP-Implementierungen liegt diese Version zugrunde, die jedoch nur ein Working Draft
des W3C ist. Sie wurde bereits abgelöst in Form einer endgültigen Empfehlung des W3C
durch die Version 1.2, an der auch Sun Microsystems und Canon erstmalig mitgewirkt
haben. In der Version 1.2 besteht die Spezifikation nun aus drei Teilen statt einem. Die
Namensräume für Envelope und Encoding haben sich geändert, und statt einer Bindung
an HTTP ist die Spezifikation in der Version 1.2 nun allgemeiner gefasst und erlaubt andere Protokolle. Im Folgenden wird auf die Version 1.1 eingegangen (für die Spezifikation
siehe [W3C00]), da diese Version in Kombination mit WSDL 1.1 noch bei SAP eingesetzt
wird.
Im Gegensatz zu XML-RPC muss die Kommunikation über SOAP nicht synchron ablaufen. Eine Nachricht kann jedoch einen Informationsfluss in Gegenrichtung auslösen,
ebenso wie eine Nachricht an mehrere Empfänger addressiert werden kann. In der Praxis
wird SOAP hauptsächlich mit den sogenannten Message Exchange Pattern (MEP) in der
Form Anfrage-Antwort (XML-RPC) und Einzelnachrichten verwendet. Zwischen Sender
und Empfänger sieht die Spezifikation noch SOAP intermediaries vor, die die Mitteilung
weiterleiten. Üblicherweise wird die Information jedoch direkt vom Sender zum Empfänger geschickt. Als Transportprotokoll für SOAP-Nachrichten wird oft HTTP verwendet,
deren gemeinsames Binding im Standard fest integriert wurde. Dabei werden auch die
Statuscodes und der Header von HTTP eingesetzt. Es lassen sich aber auch andere Protokolle wie FTP und SMTP für SOAP nutzen.
Abbildung 2.5 verdeutlicht den Aufbau einer SOAP-Nachricht, die aus einem Envelope-XML-Element als Wurzel besteht, das als Kind-Elemente Header und Body hat,
wobei der Header optional ist. Vor den SOAP-spezifischen Elementen kann gff. noch
eine XML-Deklaration stehen, sowie meistens noch der HTTP Header, falls HTTP als
Transportprotokoll verwendet wird.
Während im SOAP-Envelope verschiedene XML-Schema-Namensräume bekannt gemacht werden, ist der Header relativ offen spezifiziert und bietet so Möglichkeiten,
15
2.2. Web Services
Kapitel 2. Grundlagen
dort optionale Funktionalität einzufügen wie beispielsweise Aspekte der Sicherheit oder
Transaktionssteuerungsinformationen.
Innerhalb des Body-Tags werden die eigentlichen Nutzdaten in Form von XMLDokumenten übertragen. Dieses Element und auch Unterelemente davon können im Attribut encodingStyle Angaben darüber machen, welche Regeln für die Deserialisierung von XML in entsprechende Datentypen verwendet werden können. Die SOAPSpezifikation stellt ein Regelwerk zur Verfügung, das auf den Datentypen von XMLSchema basiert und mit dem Namensraum http://schemas.xmlsoap.org/soap/encoding/ assoziiert ist. Im Falle eines Fehlers zwischen den Kommunikationspartnern wird dies durch ein Element namens Fault als Unterelement von Body signalisiert.
Dieses Element enthält weitere Unterelemente für eine genaue Fehlerrückmeldung. Ein
vollständiges Beispiel einer SOAP-Nachricht mit Anfrage und Antwort befindet sich im
Quellcode-Listing 2.3 und 2.4.
<?xml version=’1.0’ encoding=’utf-8’?>
2 <soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
4
xmlns:tns="http://axisversion.sample/xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
8
<tns:getVersion>
</tns:getVersion>
10
</soap:Body>
</soap:Envelope>
Quellcode 2.3: Beispiel einer SOAP-Nachricht (Anfrage)
1 <?xml version=’1.0’ encoding=’utf-8’?>
<soapenv:Envelope
3 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
5
<soapenv:Body>
<ns:getVersionResponse xmlns:ns="http://axisversion.sample/xsd">
7
<return>
Hello I am Axis2 version service , My version is 1.0 May 05, 2006 (12:30:54 IST)
9
</return>
</ns:getVersionResponse>
11
</soapenv:Body>
</soapenv:Envelope>
Quellcode 2.4: Beispiel einer SOAP-Nachricht (Antwort)
16
Kapitel 2. Grundlagen
2.3
2.3. SAP
SAP
Dieses Unterkapitel bietet einen Überblick der SAP-Softwarelösungen und geht danach
auf die für diese Arbeit interessanten Module CRM und XI ein. Die Basis dieses Abschnitts sind die SAP-Schulungsunterlagen [SA03].
Die SAP AG ist ein weltweit agierendes Unternehmen und führender Anbieter von Unternehmenssoftware. Die Service-orientierte Architektur der Software ist darauf ausgelegt, Geschäfte in Echtzeit abzuwickeln, auf veränderte Marktbedingungen schnell reagieren zu können und die Zusammenarbeit der Mitarbeiter zu verbessern. Erreicht werden soll dies durch die Komponente NetWeaver, die dafür zuständig ist, die einzelnen
SAP-Module und auch Fremdanwendungen untereinander zu vernetzen und zu integrieren. Ebenso stellt diese Komponente einen Application-Server zur Verfügung, auf dem
die weiteren Module aufsetzen. Das Kern-Modul ist mySAP ERP, es ist der Nachfolger des SAP R/3 Systems, das weiterhin verfügbar ist, jedoch nicht auf der NetWeaverTechnologie basiert. ERP ist ein Begriff aus den Wirtschaftswissenschaften und bedeutet
Enterprise Resource Planning. Damit werden die Basisfunktionalitäten für ein Unternehmen bereitgestellt. Dieser Kern kann um Zusatzkomponenten ergänzt werden, um weitere Geschäftsprozesse abbilden zu können. Einen Überblick dazu gibt die Abbildung 2.6.
Das SRM (Supplier Relationship Management) umfasst die Planung und Steuerung von
Beziehungen des Unternehmens zu seinen Lieferanten. Das SCM (Supply Chain Management) dient der Optimierung von innerbetrieblichen Logistikketten. Das PLM (Product
Lifecycle Management) gestattet allen an der Produktentwicklung beteiligten Einheiten
und Partnern Zugriff auf die Daten der Produktentwicklung. Dies kann zur Verkürzung
der Produktzyklen beitragen, erlaubt Qualitätsverbesserungen und wird dem Sachverhalt
gerecht, dass Unternehmen mit immer mehr Geschäftspartnern kooperieren. Mit Hilfe
des CRM lassen sich Kundenbeziehungen verwalten, so dass Mitarbeiter alle nötigen Informationen zu Kunden abrufen können. Auf die Funktionalität dieses Moduls wird im
Folgenden näher eingegangen.
2.3.1
SAP-CRM 4.0
Als inhaltliche Quelle zu diesem Abschnitt dient [BEZ04]. Unter CRM versteht man allgemein Strategien und Verfahren, um Beziehungen von Unternehmen zu Kunden individualisiert verwalten zu können. Die wesentlichen Faktoren für den wirtschaftlichen Erfolg
eines Unternehmens - marktgerechte Produkte, profitabler Betrieb und zufriedene Kunden
- können durch CRM optimiert werden. Die Zielsetzung ist dabei, die Kunden kontinu-
17
2.3. SAP
Kapitel 2. Grundlagen
Abbildung 2.6: Überblick der SAP-Module
ierlich und effizient zu betreuen und die Leistungen den jeweiligen Kundenbedürfnissen
anzupassen. Dazu werden alle interessanten Kundendaten wie Kontaktmöglichenkeiten,
eine Historie von bisherigen Geschäftsabwicklungen oder auch die Liquidität des Kunden
festgehalten. Jeder beteiligte Mitarbeiter hat somit Zugriff auf die Daten und kann den
Kunden individuell bedienen. Die Informationen sind also nicht in Köpfen von bestimmten Mitarbeitern oder auf Notizen verteilt, sondern gehören dem Unternehmen und sind
für alle am Geschäftsprozess Beteiligten verfügbar. Durch eine Auswertung der CRMDaten kann auch genau festgestellt werden, welche Kunden am meisten Profit einbringen und welche möglicherweise Verluste verursachen. So können die Kundenbetreuung
aufgrund dieses Aspektes entsprechend gestaltet und Prioritäten festgelegt werden. Ebenso kann eine wirtschaftliche Geschäftsfokussierung stattfinden. Durch weitere Analysen
können Änderungen im Kundenverhalten und des gesamten Marktgeschehens erkannt
und die Ressourcen und Geschäftsprozesse entsprechend adaptiert werden.
Die CRM-Software von SAP ist in drei Kategorien unterteilt:
• Operatives CRM
Das operative CRM unterstützt Geschäftsabläufe, die unmittelbar am Kunden ausgerichtet sind. Darunter fällt der Vertrieb eines Unternehmens, der mit Kaufinteressenten und Kunden bis zur Vertragsabwicklung agiert. Im Service werden Kundenbeschwerden entgegen genommen, mit Unterstützung von Lösungsdatenbanken
18
Kapitel 2. Grundlagen
2.3. SAP
bearbeitet, und Serviceverträge erfüllt. Auch der Bereich Marketing hat direkten
Kontakt zu den Kunden.
• Analytisches CRM
Das Ziel von CRM-Analysen ist die Auswertung von Kundenzufriedenheit und
Kundenverhalten, deren Ergebnisse wiederum die Entscheidungsgrundlage für Vertrieb und Marketing sind.
• Kollaboratives CRM
Das kollaborative oder auch unternehmensübergreifende CRM dient der Zusammenarbeit des Unternehmens mit Geschäftspartnern.
Um den Einsatzbereich eines CRM-Systems weiter zu optimieren, müssen auch beispielsweise die ERP- und SCM-Module zugreifbar sein. So können Bestellungsänderungen
oder andere Wünsche des Kunden direkt vom CRM aus abgewickelt werden. Das CRM ist
quasi die Schnittstelle des Kunden zum Unternehmen, und somit müssen alle relevanten
Geschäftsprozesse im Backend des Unternehmens und auch unternehmensübergreifend
bei Lieferanten und Partnern zugreifbar sein. Bei CRM-Lösungen findet sich auch eine
Spezialisierung nach Branchen, um konkret den unterschiedlichen Bedürfnissen gerecht
zu werden.
Für den technischen Zugriff auf ein CRM-System gibt es BAPIs (Business Application Programming Interface) und Funktionen, die remote-fähig sind, sogenannte RFCBausteine. RFC steht für Remote Function Call und ist ein von SAP definiertes Protokoll für entfernte Funktionsaufrufe. Dabei übernimmt das Protokoll die Kommunikationssteuerung, Parameterübergabe und die Fehlerbehandlung. Ein BAPI ist ein RFC-fähiger
Funktionsbaustein, der einen fest definierten Funktionsumfang hat, meist zusammenfassend für einen bestimmten Geschäftsvorfall. Weiterhin soll eine BAPI-Schnittstelle über
Versionswechsel der Software hinaus konstant bleiben und abstrahiert somit mehr als ein
RFC-Interface.
Eine Funktion des CRM, auf die in diesem Rahmen näher eingegangen wird, ist das Aktivitätsmanagement, das die Mitarbeiter bei der Organisation der täglichen Arbeit unterstützen soll. Eine Aktivität ist vergleichbar mit einem Eintrag in einem Terminkalender,
der um zusätzliche Funktionen erweitert ist. Sie dienen der Dokumentation von Interaktionen mit Kunden. Wie sich eine Aktivität im graphischen SAP-Frontend darstellt, ist in
Abbildung 2.7 zu sehen. Neben den beteiligten Ansprechpartnern auf Unternehmens- und
Kundenseite wird auch der Ort und der Zeitraum festgehalten. Es kann ein Text für den
Grund und das Ziel der Aktivität hinterlegt werden, ebenso wie ein Erledigungsstatus,
19
2.3. SAP
Kapitel 2. Grundlagen
Abbildung 2.7: Aktivitätsmanagement im GUI-Client von SAP
eine Priorität und ein Ergebnis. Als Anlage können weitere Dokumente und Belege verknüpft sein, beispielsweise Marketingbroschüren oder Briefe, die an den Kunden adressiert wurden. Dabei werden noch die speziellen Möglichkeiten vom System angeboten,
einen Aktivitätsbericht zu erstellen oder einen Fragebogen zu entwerfen und Aktivitäten
zuzuordnen. In einem Aktivitätsbericht kann der Produktbezug einer Aktivität festgehalten werden oder auch Feedback des Kunden. Mit Hilfe eines Fragebogens können z.B. die
Verkaufschancen (Opportunity-Bewertung) in einer Geschäftsbeziehung berechnet werden.
2.3.2
SAP-XI - eXchange Infrastructure
Die SAP Exchange Infrastructure (XI) (siehe [SO04]) ist ein Bestandteil von NetWeaver
und dient der Integration von SAP- und Fremdanwendungen inner- oder außerhalb des
Unternehmens. Hervorgehoben sei an dieser Stelle, dass auch einige SAP-Module wie
beispielsweise SRM und CRM über XI angebunden sind. Dies unterstreicht das Serviceorientierte Paradigma der SAP-Architektur. Die an Geschäftsprozessen orientierte Inte-
20
Kapitel 2. Grundlagen
2.3. SAP
Abbildung 2.8: SAP-XI
gration von Applikationen in heterogene Anwendungssysteme nennt sich auch Enterprise
Application Integration (EAI). Ein weiteres Ziel, das mit XI verfolgt wurde, ist das Abspeichern von integrationsspezifischem Wissen an zentraler Stelle. So wird vermieden,
dass die Unternehmensanwendungen direkt miteinander verknüpft werden und dadurch
eine komplexe Struktur mit möglicherweise unterschiedlichen verwendeten Technologien
entsteht. Stattdessen kommuniziert jede Applikation mit der XI, die Daten intern durch
XML-basierte Nachrichten repräsentiert und an die entsprechende Ziel-Anwendung weiterleitet. Dadurch ist die Kopplung der Anwendungen an den Kommunikationsendpunkten gering. Das interne XI-Protokoll basiert auf SOAP und verwendet Header Extensions
und weitere Payload in MIME Multiparts. Der Datenaustausch mit XI kann synchron
und asynchron erfolgen. Eine solche Plattform, die Nachrichten zwischen voneinander
unabhängigen Systemen vermittelt, nennt man in diesem Zusammenhang auch Messageorientied Middleware (MOM).
In Abbildung 2.8 sind die wesentlichen Teile von XI dargestellt. Die Adapter-Engine setzt
Nachrichten der zu integrierenden Systeme in das XI-Message-Format um und umgekehrt. Statt Formatumsetzungen für alle Kombinationen miteinander kommunizierender
Systeme muss lediglich eine Umsetzung für die entsprechenden Protokolle in beide Richtungen stattfinden, beispielsweise SOAP-Nachrichten in RFC- oder BAPI-Aufrufe umsetzen und umgekehrt. Anstatt die Adapter-Engine zu verwenden, kann mit einer Java- oder
ABAP-Anwendung innerhalb des Applikation Servers auch direkt mit der IntegrationEngine kommuniziert werden. Die Integration-Engine übernimmt das Routing der konvertierten Nachrichten, und ggf. werden sogenannte Mappings durchgeführt. Mit Hilfe
von Mappings können Datenkonvertierungen in XI umgesetzt werden, um die Doku-
21
2.3. SAP
Kapitel 2. Grundlagen
mentstruktur der Nachricht eines Senders an den Empfänger anzupassen. Die BusinessProcess-Engine setzt auf der Integration-Engine auf und übernimmt die zustandsbehaftete
Nachrichtenübermittlung auf Geschäftsprozessebene.
Die nötigen Informationen, um Nachrichten zwischen Systemen zu vermitteln, werden
in Integration-Repository, Integration-Directory und System-Landscape-Directory (SLD)
gespeichert, deren Inhalt im Folgenden erläutert wird:
• System-Landscape-Directory
Das SLD enthält einen Katalog mit Beschreibungen über installierbare Softwareprodukte und deren Komponenten in der Systemlandschaft. Mit Komponenten sind
in diesem Fall einzeln installierbare Einheiten gemeint, die jedoch nicht zwangsweise ohne das Hauptprodukt ausführbar sind. Die Beschreibungen enthalten auch
jeweils die Version des Produkts oder der Komponente. In einem weiteren Katalog
werden die konkreten Systeme erfasst, unterteilt in technische Systeme und weiter abstrahierend in Business-Systeme. Abgespeichert werden diese Daten mit dem
Standard Common Information Model (CIM) [DMT06]. Für SAP-Produkte werden
bereits entsprechende Beschreibungen mit ausgeliefert.
• Integration-Repository
Im Integration-Repository werden die Schnittstellen der beteiligten Systeme in
Form von WSDL- und XML-Schema-Dokumenten hinterlegt. Die Definition von
Prozessen kann mittels der Business Process Execution Language (BPEL) [BPE]
stattfinden. Für die bereits erwähnten Mappings werden XSLT-Dokumente verwendet.
• Integration-Directory
Durch das Integration-Directory werden Schnittstellen aus dem Integration-Repository konkrete Systeme aus dem SLD zugeordnet. Dadurch werden letztendlich die
Systeme festgelegt, die untereinander Nachrichten austauschen.
Mit der Browser-basierten Anwendung Integration Builder, die auf der Technologie Java
Web Start (JWS) basiert, kann das Design im Integration-Repository entworfen und die
Konfiguration im Integration-Directory vorgenommen werden. Das SLD kann über eine
Web-Anwendung konfiguriert werden.
22
Kapitel 2. Grundlagen
2.4
2.4. J2ME - Java 2 Platform Micro Edition
J2ME - Java 2 Platform Micro Edition
Dieses Unterkapitel vermittelt das nötige Wissen, um standardisierte Java-Anwendungen
für mobile Endgeräte zu entwickeln. Die Basis dieses Abschnitts sind die Lehr-Bücher
[Sch04] und [Yua06].
2.4.1
Überblick
Die Micro Edition ist eine Spezifikation der Java-Laufzeitumgebung für mobile Endgeräte wie beispielsweise PDAs und Mobiltelefone. Aufgrund der unterschiedlichen Ausprägungen und Einschränkungen solcher Geräte ist J2ME komponentenbasiert aufgebaut
und dadurch flexibler als die Java 2 Standard Edition (J2SE). Die Spezifikationen sind im
offenen Java Community Process (JCP) unter Federführung großer Hersteller wie Nokia
und RIM durch sogenannte Java Specification Requests (JSR) entstanden.
Die unterste von drei Schichten in J2ME (siehe Grafik 2.9) bilden sogenannte Konfigurationen. Sie legen fest, welche Hardwareanforderungen ein Gerät erfüllen muss, und
definieren zu den Anforderungen passende Standardbibliotheken und eine Java Virtual
Machine (JVM). Auf diesen Konfigurationen bauen diverse Profile auf, die weitere fundamentale, gerätespezifische Bibliotheken zur Verfügung stellen. In der letzten Schicht,
die auf ein Profil aufsetzt, gibt es optionale Zusatzpakete, beispielsweise eine 3D-API
oder XML-Parser.
Die Connected Limited Device Configuration (CLDC) zielt auf in der Hardware eingeschränkte Geräte ab. Die Mindestanforderungen sind 160kB nichtflüchtiger Speicher für
die VM und Bibliotheken und 32kB flüchtiger Speicher für den Ablauf der VM. Aufgrund dieser Restriktionen ist nur eine Untermenge der J2SE-API vorgesehen und an die
Endgeräte angepasst implementiert.
Ebenso ist eine auf das Wesentliche reduzierte Kilo Virtual Machine (KVM) verfügbar,
die beispielsweise nicht die Java-Reflection-API unterstützt. Die CLDC ist größtenteils
auf Mobiltelefonen wiederzufinden und wird im JSR 139 in der Version 1.1 definiert.
Details können der zugehörigen Spezifikation [Tai03] entnommen werden.
Die Connected Device Configuration (CDC) hingegen hat höhere Hardwareanforderungen, stellt mehr Funktionalität der J2SE-API zur Verfügung und kommt beispielsweise
auf High-End PDAs, TV Set-Top-Boxen oder Navigationssystemen zum Einsatz. Im Gegensatz zur CLDC bietet sie eine vollständige J2SE JVM. Für diese Diplomarbeit ist nur
die Konfiguration CLDC relevant.
23
2.4. J2ME - Java 2 Platform Micro Edition
Kapitel 2. Grundlagen
Abbildung 2.9: Aufbau der J2ME-Komponenten
Auf der CLDC setzt das Mobile Information Device Profile (MIDP) auf. Es stellt eine
API für die wesentlichen Merkmale eines Mobiltelefons zur Verfügung (vgl. [MW06]):
• Lebenszyklus, Deployment und Signieren von Anwendungen
• Graphische Benutzerschnittstelle (Ein- und Ausgabe)
• Persistente Speicherung für Anwendungsdaten und Einstellungen
• Netzwerkverbindungen und HTTP/HTTPS
• Media API (nur für Audio)
Dementsprechend formuliert die Spezifikation weitere Hardware-Anforderungen, zusätzlich zu denen der CLDC, um die Funktionalität des MIDP realisieren zu können. Im Wesentlichen sind dies weiterer Speicher von mind. 256kB für die MIDP-Implementierung
und 8kB für persistente Daten, eine minimale Auflösung des Displays mit 96x96 Pixeln
und 1 Bit Farbtiefe, sowie eine Tastatur oder einen Touchscreen.
2.4.2
Deployment
In den folgenden Abschnitten erfolgt eine Beschreibung des Packaging und der Installation von J2ME-Anwendungen auf Basis des MIDP (siehe Kapitel 2 der Spezifikation
[MW06]).
2.4.2.1
MIDlet Suite
Die Installation und das Starten einer Anwendung geschehen über die Application Management Software (AMS), die auf dem Endgerät vom Hersteller implementiert ist. Eine
24
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
Deinstallation wird ebenso von der AMS durchgeführt. Eine installierbare Anwendung
nennt sich MIDlet Suite und besteht aus einem JAR und einem optionalen Java Application Descriptor (JAD). Ein Beispiel eines JAD findet sich im Quellcode-Listing 2.5. Das
JAR enthält die kompilierten Klassen der Anwendung, eine Manifest-Datei, sowie optionale Ressourcen wie Text- und Bilddateien, die von der Anwendung benötigt werden.
Der Kompiliervorgang wird mit einem J2SE-Standardcompiler vollzogen. Da die CLDC,
wie in Abschnitt 2.4.1 erwähnt, nicht den vollen J2SE-VM-Umfang implementiert, muss
der generierte Bytecode anschließend noch mit einem sogenannten Preverifier bearbeitet werden. Ein solches Werkzeug wird beispielsweise innerhalb des Wireless Toolkit
(WTK)1 von Sun bereitgestellt, und formt den Bytecode zu einem Äquivalent um, das
auf einer KVM lauffähig ist.
MIDlet-1: MIDletName, /path/to/midlet/icon.png, com.example.MIDletClassName
2 MIDlet-Jar-URL: midletsuite.jar
MIDlet-Name: Midlet Suite Name
4 MIDlet-Vendor: CSC
MIDlet-Version: 1.0.11
6 MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
8 CustomAttribute: value
Quellcode 2.5: Beispiel eines Java Application Descriptors
Die Manifest-Datei besteht aus Key:Value-Paaren und beinhaltet notwendige Informationen für das AMS zur Installation. Optional können einige solcher Attribute auch durch
einen externen JAD zur Verfügung gestellt werden, so dass die Anwendung an den Benutzer oder das Endgerät angepasst werden kann, ohne das JAR modifizieren zu müssen.
Außerdem können eigene anwendungsspezifische Attribute angelegt werden, die jedoch
nicht mit „MIDlet“ oder „MicroEdition“ beginnen dürfen. Weitere Details und eine Übersicht zu verpflichtenden Attributen hält die Spezifikation [MW06] auf S. 435 bereit. Mit
der Methode getAppProperty() der Klasse MIDlet lassen sich alle im JAD angegebenen Attribute der Suite zur Laufzeit abfragen. Die Ressourcen kann ein MIDlet über
die Methode java.lang.Class.getResourceAsStream(String name) als
Datenstrom auslesen. Das Wurzelverzeichnis ist dabei das JAR des MIDlets.
1
http://java.sun.com/products/sjwtoolkit/download-2_5.html
25
2.4. J2ME - Java 2 Platform Micro Edition
2.4.2.2
Kapitel 2. Grundlagen
OTA Provisioning
Der Installationsvorgang wird nach dem Over The Air (OTA) Provisioning Verfahren abgewickelt, das in [MW06] Kapitel 2 genauer spezifiziert ist. Die MIDlet Suite liegt dabei
auf einem entfernten Web Server vor und wird in mehreren Schritten über die Funkverbindung auf das Endgerät übertragen:
1. Der Benutzer wählt im Endgerät die zu installierende Anwendung in der sogenannten Discovery Application (DA) aus - üblicherweise geschieht dies im WAPBrowser. Durch eine HTTP-GET-Anfrage wird der entsprechenden JAD vom Server auf das Endgerät transferiert und von der AMS ausgewertet.
2. Falls alle im JAD enthaltenen Voraussetzungen zur Installation erfüllt sind, wird
durch die AMS das JAR der Anwendung (die URL befindet sich im JAD) ebenfalls
via HTTP auf das Gerät geladen und installiert.
3. Falls entsprechende Attribute im JAD vorhanden sind, erzeugt das AMS per HTTPPOST eine Rückmeldung an einen angegebenen Server, in der ein Statuscode der
Installation übermittelt wird.
Zu beachten ist dabei, dass der Web Server die entsprechenden MIME-Typen für den JAD
(text/vnd.sun.j2me.app-descriptor) und das JAR (application/java-archive) im HTTP
Header angeben sollte.
2.4.3
Programmierung
In den folgenden Abschnitten wird auf die Entwicklung von J2ME-Anwendungen eingegangen, basierend auf der Konfiguration CLDC 1.1 und dem Profil MIDP 2.0.
2.4.3.1
Lebenszyklus
Wenn der Benutzer eine Anwendung zum Starten ausgewählt hat, wird von der AMS
das entsprechende MIDlet geladen. Der Einstiegspunkt einer solchen Anwendung, analog zur Funktion main() in J2SE oder anderen Programmiersprachen, ist in der abstrakten Klasse javax.microedition.midlet.MIDlet definiert. Eine Applikation muss dementsprechend mindestens eine Klasse beinhalten, die MIDlet erweitert und
die Handler-Methoden startApp(), pauseApp() und destroyApp(boolean
unconditional) überschreibt.
26
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
Abbildung 2.10: Lebenszyklus eines MIDlets, angelehnt an [Sch04]
Ein MIDlet kennt die drei Zustände paused, active und destroyed. Der Zustand eines MIDlets kann sowohl von der AMS als auch vom MIDlet selbst in einen anderen überführt werden (siehe Abbildung 2.10). Wenn ein Zustandsübergang von der
AMS ausgelöst wird, ruft diese zunächst die entsprechende Handler-Methode des MIDlets auf. Wird der Zustand vom MIDlet selbst geändert, durch den Aufruf einer der
Methoden notifyPaused() oder notifyDestroyed(), so werden die HandlerMethoden nicht aufgerufen, dafür muss das MIDlet ggf. selbst sorgen. Mittels notifyDestroyed() im MIDlet (nicht überschreibbar, da final) wird eine Anwendung regulär beendet, System.exit() verursacht im Kontext mit MIDP spezifikationsgemäß
eine SecurityException.
Bei Aufruf einer Anwendung wird von der AMS zunächst der Konstruktor des MIDlets aufgerufen, und der Zustand ist paused. Im Konstruktor können nicht-zeitaufwändige
Initialisierungen erfolgen. Weitere Ressourcenanforderungen und das Erfüllen der eigentlichen Aufgabe der Applikation erfolgen in startApp() bzw. von dort aus delegiert in
anderen Klassen. Die Methode startApp() wird ebenfalls von der AMS aufgerufen,
und der Zustand ändert sich zu active. Wenn das Display von einer anderen Anwendung,
z.B. einem eingehenden Telefonanruf, benötigt wird, pausiert die AMS das MIDlet. In
der Handler-Methode pauseApp() sollte das MIDlet dabei zuvor angeforderte Ressourcen freigeben. Falls das MIDlet Hintergrund-Threads gestartet hat, so laufen diese
weiter, auch wenn das MIDlet pausiert. Daher sollten solche Threads nicht viele Ressourcen wie CPU-Zeit, Speicher und Bandbreite benötigen oder anderenfalls gestoppt werden. Soll das MIDlet durch die AMS beendet werden, so wird destroyApp(boolean
unconditional) aufgerufen, wobei der Parameter angibt, ob das MIDlet den Befehl
zur Beendigung mit einer MIDletStateChangeException verweigern kann oder
nicht. Weiterhin werden in dieser Methode üblicherweise Ressourcen freigegeben - bei-
27
2.4. J2ME - Java 2 Platform Micro Edition
Kapitel 2. Grundlagen
spielsweise Deskriptoren freigeben oder Threads beenden - und ggf. Anwendungsdaten
persistent gespeichert.
2.4.3.2
PushRegistry
Für Anwendungen, die auf bestimmte Ereignisse warten, stellt die AMS eine sogenannte PushRegistry zur Verfügung. Bei dieser Komponente können sich Anwendungen dynamisch via javax.microedition.io.PushRegistry oder statisch über einen
Eintrag im JAD registrieren und werden dann von der AMS gestartet, wenn ein entsprechendes Ereignis eintritt. Dadurch ist es für eine Applikation möglich, auf eingehende
TCP- und UDP-Verbindungen an einem registrierten Port oder auf eine SMS von einer
bestimmten Rufnummer zu reagieren. Darüberhinaus bietet die PushRegistry noch die
Möglichkeit, einen Timer zu setzen, so dass die Anwendung regelmäßig gestartet wird.
Der Vorteil der PushRegistry ist, dass die Anwendung erst gestartet wird, wenn das Ereignis eintritt und nicht selbst aktiv wartet. Somit können Ressourcen gespart werden.
Die AMS wartet auf eingehende Verbindungen an registrierten Ports und startet das zugehörige MIDlet, das die Verbindung über javax.microedition.io.Connector
mit der Methode open() öffnen kann. Das MIDlet ist, wenn es gestartet ist, selbst für
eingehende Verbindungen und darauf empfangene Daten verantwortlich. Die AMS überwacht dies erst wieder, nachdem das MIDlet beendet wurde. Zu beachten ist dabei, dass
im JAD das Attribut MIDlet-Permissions entsprechend die vollqualifizierten Klassennamen der PushRegistry und der verwendeten Netzwerkklassen enthält.
2.4.3.3
Graphische Benutzerschnittstelle
Das Lowest Common Denominator User Interface (LCDUI) im Package javax.microedition.lcdui ist ein Framework der J2ME für grafische Benutzerschnittstellen und untergliedert sich in eine High- und Low-Level-API. Letzteres ermöglicht
pixelgenaues Zeichnen auf dem Display, das Nutzen von gerätespezifischen Hardwarefunktionalitäten wie beispielsweise Auflösung, Farbtiefe und das Abfragen von Tasten.
Die Low-Level-API kommt z.B. bei Spielen zum Tragen und wird hier nicht näher betrachtet.
Im Gegensatz dazu ist die High-Level-API eine abstrahierende Schicht über den gerätespezifischen Grafik-Elementen, den sogenannten Widgets. Dies hat zur Folge, dass Anwendungen, die diese API nutzen, nicht auf jedem Gerät das gleiche Look and Feel - also
Erscheinungsbild und Bedienung der Widgets - haben. Auf der anderen Seite integriert
28
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
sich die Anwendung so automatisch, und der Benutzer hat das vom Endgerät gewohnte
Look and Feel.
Ein Überblick der Klassenhierarchie der LCDUI wird in Abbildung 2.11 gegeben. Gemeinsam ist beiden APIs, dass sie eine dem MIDlet zugeordnete Instanz der Klasse
Display verwenden, die das physikalische Display repräsentiert und mit der statischen Methode Display.getDisplay(MIDlet m) abgefragt werden kann. Zu einem Zeitpunkt kann auf dem Display ein einziges Objekt dargestellt werden, das die
abstrakte Klasse Displayable erweitert. Darin werden bereits die Funktionalitäten für
einen Fenster-Titel, -Laufschrift und Hinzufügen von Bedienelementen zur Interaktion
mit dem Benutzer zur Verfügung gestellt. Um die Benutzereingaben zu bearbeiten, kann
man einem Displayable-Objekt auch CommandListener übergeben, die häufig als
anonyme Klasse implementiert werden. Das Framework ruft dessen Callback-Methode
commandAction(Command c, Displayable d) bei entsprechenden Events seriell auf, d.h. weitere Callbacks werden erst aufgerufen, wenn der vorherige beendet wurde. Aus diesem Sachverhalt heraus ergibt sich die Empfehlung, in Callback-Methoden
keine zeitaufwändigen Operationen einzubetten.
Welches Objekt auf dem Bildschirm sichtbar sein soll, kann mit der Methode Display.setCurrent(Displayable nextDisplayable) gesetzt werden. Diese Methode darf jedoch nicht im Konstruktor des MIDlets sondern erst in startApp() aufgerufen werden. Über Display lassen sich außerdem Informationen zum Display abfragen
sowie die Hintergrundbeleuchtung und der Vibrationsalarm steuern.
Von Displayable erbt die Klasse Canvas, an der die Low-Level-API ansetzt. Das
Pendant für die Highlevel API ist Screen, von dem sich die Benutzerelemente List,
Alert, TextBox und Form ableiten. Dabei ist Form ein flexibles Element, das man
mit Items bestücken kann, die eigene ItemCommandListener haben können. Es
gibt vorgefertigte Unterklassen von Item, die häufig benötigte Funktionalitäten zur Verfügung stellen, beispielsweise eine Auswahl mittels ChoiceGroup, die vereinfachte
Eingabe eines Datums durch DateField und Fortschrittsbalken (Klasse Gauge).
Die Aktualisierung auf dem Display gestaltet sich einfach: Modifiziert man Elemente,
führt das LCDUI Framework automatisch eine Aktualisierung durch, eine TextBox
kümmert sich z.B., wenn nötig, eigenständig um einen Scrollbalken.
Ein wichtiger Aspekt bei der Programmierung von graphischen Benutzerschnittstellen
ist die Verwendung von Threads. Die Logik einer Anwendung sollte in einem separaten
Thread laufen, damit der Ausführungsstrang der LCDUI jederzeit Aktualisierungen in der
graphischen Repräsentation vornehmen kann.
29
2.4. J2ME - Java 2 Platform Micro Edition
Kapitel 2. Grundlagen
Abbildung 2.11: Zusammenhang der Klassen des LCDUI, adaptiert aus [Sch04]
30
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
Abbildung 2.12: MIDlet-Suite übergreifende Zugriffe auf RecordStores
2.4.3.4
RMS - Persistente Speicherung
Um Daten auf mobilen Endgeräten persistent speichern zu können, definiert das MIDP
eine abstrakte, herstellerunabhängige Schnittstelle - das sogenannte Record Management
System (RMS). Details können der Spezifikation [MW06] in Kapitel 14 entnommen werden.
Das RMS im Package javax.microedition.rms bietet den Klassen einer MIDlet Suite die Funktionalität, RecordStores anzulegen, die dann wiederum eine Sammlung
von Records enthalten. Ein Record ist ein Datensatz in Form eines Java Byte-Arrays von
beliebigem Inhalt und Länge, dem vom RMS ein Primärschlüssel als Identifikator zugeordnet wird. Der Datentyp des Primärschlüssels ist int, und die Vergabe beginnt mit 1,
jeder weitere Record erhält n+1. Schlüssel von gelöschten Datensätzen werden nicht neu
vergeben. Ein RecordStore ist durch einen innerhalb der MIDlet Suite eindeutigen Namen
bezeichnet, der 1 bis 32 Unicode-Zeichen umfassen kann, wobei Groß- und Kleinschreibung beachtet wird. Seit MIDP 2.0 kann ein RecordStore über ein Attribut auch für andere
MIDlet Suites zugänglich gemacht werden. Der Zugriff erfolgt dabei über die Bezeichner des MIDlet-Suite-Herstellers, der MIDlet Suite selbst (beides Attribute im JAD, siehe
auch 2.4.2) und den Namen des RecordStores. Dies ist in Abbildung 2.12 veranschaulicht.
Wenn eine MIDlet Suite deinstalliert wird, schreibt die Spezifikation vor, dass alle zugehörigen RecordStores mit gelöscht werden. Für das Öffnen und Anlegen von RecordStores stellt die Klasse RecordStore die statische Methode openStore in verschie-
31
2.4. J2ME - Java 2 Platform Micro Edition
Kapitel 2. Grundlagen
denen Ausprägungen (Überladung) zur Verfügung. Ebenso kann man statisch RecordStores löschen und sich alle zu der MIDlet Suite gehörenden RecordStores auflisten lassen. Nachdem ein RecordStore geöffnet wurde, wird er durch eine Instanz der Klasse
RecordStore repräsentiert, über die alle weiteren Operationen erreichbar sind. Im Wesentlichen sind dies die Methoden addRecord(), setRecord zum Modifizieren eines vorhandenen Datensatzes und deleteRecord. Bei jedem Aufruf dieser Methoden
wird die Version des RecordStores inkrementiert sowie der Zeitpunkt der letzten Änderung festgehalten. Diese Attribute können auch über die API abgerufen werden.
Eine Implementierung des RMS muss zusichern, dass diese Operationen immer atomar
nacheinander ablaufen - Transaktionen werden jedoch nicht unterstützt. Bei der Verwendung von Threads muss daher beachtet werden, dass bei zusammengehörenden, aufeinander folgenden Operationen für das zugehörige RecordStore-Objekt mittels eines
synchronized-Block in Java der exklusive Zugriff sichergestellt ist.
Um nun das Datenmodell einer Anwendung mittels RMS zu speichern, müssen die Objekte zu Byte-Arrays serialisiert werden (siehe Codebeispiel 2.6). Dafür bietet es sich
an, die Klasse java.io.DataOutputStream zu verwenden, die für alle primitiven
Datentypen inkl. String eine Methode zum Schreiben in einen Ausgabestrom besitzt.
Dahinter wird ein weiterer Ausgabestrom vom Typ ByteArrayOutputStream geschaltet, der die serialisierten Daten des DataOutputStreams erhält und eine Methode
toByteArray() zur Verfügung stellt. Zu beachten gilt es dabei, dass String-Objekte,
die den Wert null referenzieren, nicht serialisiert werden können. Statt dessen kann ein
leerer String verwendet werden. Außerdem sollte der äußere Ausgabestrom nach der Benutzung mittels close() geschlossen werden. Analog dazu funktioniert die Deserialisierung aus dem RMS mit den Klassen ByteArrayInputStream und DataInputStream.
Für das Suchen von Datensätzen bietet ein RecordStore(-Objekt) die Methode enumerateRecords(RecordFilter a, RecordComparator b, boolean ke
epUpdated). Optional kann man spezifische Implementierungen von RecordFilter
und RecordComparator übergeben, so dass die Enumeration auf Basis des Inhalts
eines Records gefiltert und die Reihenfolge der Records innerhalb der Enumeration beeinflusst werden kann. Für den Fall, dass für die beiden ersten Parameter null übergeben wird, enthält die Enumeration alle Records des RecordStores und die Reihenfolge ist beliebig. Das Resultat von enumerateRecords() implementiert das Interface
RecordEnumeration, über das man durch die Ergebnismenge der Records iterieren kann und deren Primärschlüssel oder den Inhalt abrufen kann. Der dritte Parameter
keepUpdated gibt an, ob die Datensatzrepräsentation sich mit ändern soll, falls am
32
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
private String s = "string";
2 private boolean b = true;
private int i = 42;
4
public byte[] serialize() throws IOException {
6
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(byteStream);
8
dataStream.writeUTF(s);
10
dataStream.writeBoolean(b);
dataStream.writeInt(i);
12
dataStream.close();
14
return byteStream.toByteArray();
}
Quellcode 2.6: Beispiel zur Serialisierung in einen Byte-Strom
RecordStore Änderungen vorgenommen werden. Mit statischen Enumerationen können
Probleme beim Iterieren auftreten, wenn gleichzeitig der RecordStore manipuliert wird.
In diesem Fall bieten sich dynamische Enumerationen an, die jedoch auch mehr Systemressourcen benötigen.
2.4.3.5
kSOAP Web-Service-Bibliothek
Eine Möglichkeit, unter der J2ME- und der J2SE-Plattform Web Services zu konsumieren, bietet das im Sourcecode frei verfügbare Projekt kSOAP1 . Dieser SOAP-Parser ist
speziell für in der Hardware eingeschränkte Geräte gedacht und implementiert daher auch
nicht die gesamte Spezifikation von SOAP. Für übliche Web Services ist der Umfang jedoch nach [Yua06] ausreichend.
Zum Parsing von XML-basierten SOAP-Dokumenten kommt die kXML-Bibliothek in
der Version 2 zum Einsatz, die das XML-Pull API (xmlpull.org) implementiert. Mit diesem Parsing-Modell kann man durch die Elemente des XML-Dokuments seriell iterieren
und benötigte Informationen abfragen, wie z.B. Inhalt des Elements und Attributwerte. Im Vergleich zum etablierten Parsing-Modell Simple API for XML (SAX) kann das
Pull-Modell unter Umständen performanter arbeiten, da der Programmierer die Kontrolle
über den Fluß des Parsings hat. Bei SAX wird das gesamte Dokument seriell bis zum
Ende abgearbeitet und entsprechende benutzerdefinierte Handler-Methoden für die Elemente vom Parser werden aufgerufen. Das Document Object Model (DOM) ist für größere XML-Dokumente auf eingeschränkten Endgeräten ohnehin keine Alternative, da eine
Repräsentation des gesamten Dokuments dabei im Speicher gehalten wird.
1
http://ksoap2.sourceforge.net
33
2.4. J2ME - Java 2 Platform Micro Edition
XML-Datentyp
xsd:int
xsd:long
xsd:string
xsd:Boolean
Kapitel 2. Grundlagen
Java-Datentyp
java.lang.Integer
java.lang.Long
java.lang.String
java.lang.Boolean
Tabelle 2.1: kSOAP Mappings für primitive Datentypen
Für die in SOAP verwendeten Datentypen hat kSOAP bereits für die in Tabelle 2.1 enthaltenen Typen eine standardmäßige Zuordnung zu Java-Datentypen.
Alle weiteren primitiven Datentypen, d.h. Elemente ohne Unterelemente, kapselt kSOAP
in einem Objekt der Klasse SoapPrimitive. Diese enthält den Namen und Namensraum des Datenelements sowie dessen Wert in Form eines Strings. Komplexe Datentypen mit Unterelementen werden durch eine Instanz der Klasse SoapObject repräsentiert, die analog Name und Namensraum des Elements als Attribut
aufnimmt. Die Kind-Elemente werden in einem Vektor als Object gespeichert, gepaart mit einer Instanz von PropertyInfo, in der die XML-spezifischen Namensinformationen gehalten werden. Das referenzierte Object kann dabei je nach KindElement eine Instanz von SoapObject, SoapPrimitive oder einer anwendungsspezifischen Java-Klasse sein. Letzteres ist dann der Fall, wenn beim SOAP-Parser
(SoapSerializationEnvelope) eine Klasse für die Deserialisierung der spezifischen Klasse registriert wurde. Eine solche Klasse kann das Interface Marshal implementieren und stellt somit je eine Methode für das Entpacken von XML-Elementen in ein spezifisches Java-Objekt und umgekehrt zur Verfügung. Als Synonym für
(De)Serialisierung wird auch (Un)Marshaling verwendet. Eine Alternative zu dem LowLevel-Zugriff bietet das Interface KvmSerializable (siehe Abbildung 2.7). Ein Objekt, das diese Schnittstelle implementiert, kann durch den SOAP-Parser automatisiert
sowohl serialisiert als auch deserialisiert werden. Für jedes Attribut des Objekts muss
über die Methode getPropertyInfo eine beschreibende PropertyInfo-Instanz,
die als Parameter übergeben wird, gefüllt werden. Darin wird der Name des zugehörigen XML-Elements des Attributs gespeichert, sowie der Java-Datentyp. Der Datentyp
kann ein primitiver sein (siehe Tabelle 2.1) oder es wird auf eine weitere Klasse verwiesen, die KvmSerializable implementiert. Über die Methoden setProperty
bzw. getProperty kann der SOAP-Parser das entsprechende Attribut, das aus dem
XML-Dokument extrahiert wurde, setzen bzw. den Wert des Attributs erfragen und in das
zugehörige XML-Element serialisieren.
34
Kapitel 2. Grundlagen
2.4. J2ME - Java 2 Platform Micro Edition
1 public interface KvmSerializable {
Object getProperty(int index);
3
int getPropertyCount();
void setProperty(int index, Object value);
5
void getPropertyInfo(int index, Hashtable properties, PropertyInfo info);
}
Quellcode 2.7: KvmSerializable-Schnittstelle von kSOAP
2.4.3.6
Optimierungen für mobile Anwendungen
Die Entwicklung von Anwendungen für mobile Endgeräte bringt einige besondere Anforderungen mit sich. Die Fähigkeiten der Hardware sind stark begrenzt (vgl. MIDP in
Abschnitt 2.4.1), und somit müssen CPU-Zeit und Speicher besonders effizient eingesetzt werden, was in [Yua06] Kapitel 7 näher erläutert wird. Um dies zu erreichen, sind
die verwendeten Bibliotheken für mobile Anwendungen leichtgewichtiger als die J2SEAlternativen, haben also sowohl eine geringere Größe als auch eine Anpassung an den geringen zur Laufzeit zur Verfügung stehenden Speicher. An dieser Stelle bietet sich noch
die Möglichkeit, beim Packaging die Größe zu minimieren. Von der Anwendung nicht
benötigte Klassen können aus den Bibliotheken entfernt werden. Dies übernimmt meist
ein sogenannter Obfuscator, ursprünglich dafür gedacht, den Binärcode von Anwendungen zu verschleiern, um eine Decompilierung zu erschweren. Er läßt sich weiterhin dazu
verwenden, den Binärcode durch Umbenennung von Klassen und Methoden noch zu verkleinern und Methodenaufrufe ’inline’ zur ersetzen. Um den Code aus Bibliotheken nicht
in jede MIDlet-Suite hinzufügen zu müssen, gibt es bei BB-Geräten die Möglichkeit, shared libraries zu installieren, die von mehreren Anwendungen gleichzeitig benutzt werden.
Mit der noch in Planung befindlichen Version 3 des MIDP (JSR 271) ist die Aufnahme
von gemeinsamen Bibliotheken in den Standard geplant.
Ein weiterer Ansatzpunkt für Performance-Optimierungen ist die Garbage Collection,
die soweit wie möglich vermieden werden sollte, da sie kostbare CPU-Zeit in Anspruch
nimmt. Empfohlene Möglichkeiten nach [Yua06] den Speicherverbrauch zu reduzieren
sind:
1. Arrays gegenüber Collection Containern bevorzugen.
2. Bei String-Manipulationen eine StringBuffer-Instanz verwenden (Modifikationen von String-Objekten erzeugen neue Instanzen).
35
2.4. J2ME - Java 2 Platform Micro Edition
Kapitel 2. Grundlagen
3. Ressourcen wie Netzwerkverbindungen, RecordStores und Filehandles frühestmöglich wieder freigeben. In Java lassen sich durch den Einsatz von finallyBlöcken Ressourcen auch nach Auftritt einer Exception freigeben.
4. Design Pattern sollten daraufhin überprüft werden, dass sie nicht zu viele Klassen
und Schnittstellen-Schichten mit sich bringen. In [Yua06] wird als Beispiel eine
schlankere Screen-basierte Logik statt einer klassischen Model View Controller
(MVC)-Architektur bevorzugt.
5. Erzeugte Instanzen nach Möglichkeit wiederverwenden, anstatt neue zu erzeugen.
Um Ein- und Ausgabe-Operationen zu beschleunigen, empfiehlt es sich, die vom Endgerät angesprochenen externen Netzwerkschnittstellen nach außen hin nicht zu feingranular
zu gestalten, so dass insgesamt weniger Aufrufe dieser Schnittstellen notwendig sind.
Desweiteren sollten diese Operationen gepuffert und nicht zeichenweise angesprochen
werden. Bei den meisten J2ME-Schnittstellen bietet sich eine Kombination aus einem
byte[]-Puffer und einem ByteArrayOutputStream an (bzw. analog für einen Eingabestrom).
Der Netzwerkverkehr und die Latenz für den Benutzer lassen sich reduzieren, indem
J2ME-Anwendungen Anwendungsdaten lokal speichern. Dies ermöglicht zudem unter
Umständen auch eine gewisse Funktionalität der Anwendung, wenn das Gerät keine Verbindung zu einem Netzwerk herstellen kann. Beim Zwischenspeichern der Daten ist zu
beachten, dass dies möglichst zeitnah geschieht, um Datenverluste zu vermeiden, auch
unter dem Gesichtspunkt, dass leistungsfähige Endgeräte noch unzureichende Betriebslaufzeiten im mobilen Einsatz haben.
Eine benutzerfreundliche Anwendung sollte benutzerspezifische Einstellungen ebenfalls
speichern, lange Operationen auf mehrere Dialoge aufteilen und Rückmeldungen über
den Status geben.
Ein weiterer Aspekt bei der Entwicklung einer Anwendung ist, dass sie auf möglichst
vielen Endgeräten lauffähig sein sollte. Dabei hilft es, wenn sich die Applikation über
einen JAD konfigurieren lässt und die Benutzerschnittstelle im Quellcode leicht angepasst
werden kann.
Für die Entwicklung von J2ME-Anwendungen auf den BB-Endgeräten hat RIM einen
Programmier-Leitfaden in [RIM05] ab Seite 30 integriert, der weitere Java-Optimierungen auf Quellcode-Ebene liefert.
36
Kapitel 2. Grundlagen
2.4.4
2.4. J2ME - Java 2 Platform Micro Edition
Sicherheitskonzept
Über den JAD besteht seit MIDP 2.0 auch die Möglichkeit, MIDlet Suites mittels PublicKey-Verfahren zu signieren. Dazu wird eine Prüfsumme des JARs mit dem privaten
Schlüssel signiert und zusammen mit dem zugehörigen öffentlichen Schlüsssel in Form
eines Zertifikats in den JAD eingetragen. Bei Installation der MIDlet Suite wird die Prüfsumme des JARs gebildet, mittels Zertifikat die Prüfsumme im JAD entschlüsselt und
mit der ermittelten verglichen. Das Zertifikat selbst muss immer von einer Certification
Authority (CA) signiert sein. So ist sichergestellt, dass der Inhalt der sogenannten Trusted MIDlet Suite seit dem Zeitpunkt der Signierung nicht verändert wurde und einem
bestimmten Softwarehersteller anhand des Zertifikats zugeordnet werden kann. Um die
Integrität des Zertifikats zu überprüfen, sind in den Endgeräten üblicherweise die Zertifikate der Root-CAs hinterlegt. Daher muss der JAD eine Zertifikat-Kette bis hin zu einem
Root-Zertifikat beinhalten. Im einfachsten Fall ist dies nur ein Zertifikat (das des Softwareherstellers), wenn es von einer Root-CA signiert ist. Eine MIDlet-Suite, die keine
Signatur im JAD enthält, wird als Untrusted MIDlet Suite eingestuft und unterliegt dadurch Einschränkungen beim Zugriff auf die J2ME APIs. In diesem Fall muss der Nutzer
explizit für Verbindungen über HTTP zustimmen. Alle weiteren Netzwerkfunktionalitäten im Package javax.microedition.io sind ausschließlich durch Trusted MIDlet
Suites benutzbar. Anwendungen gemäß der MIDP 1.0 Spezifikation werden ebenfalls als
untrusted eingestuft.
An dieser Stelle sei noch erwähnt, dass Attribute im JAD gleichnamige im Manifest überschreiben, außer es handelt sich um eine Trusted MIDlet Suite. In diesem Fall wird die
Installation abgebrochen, wenn sich die Werte der Attribute in JAD und Manifest unterscheiden.
37
2.4. J2ME - Java 2 Platform Micro Edition
38
Kapitel 2. Grundlagen
Kapitel 3
Analyse
In diesem Kapitel werden zunächst die Anforderungen an die gesamte Systemarchitektur und die zu entwickelnde mobile Client-Anwendung erläutert, die von nun an auch
mobileCRM genannt wird. Dies geschieht durch die Rahmenbedingungen, die durch die
Betreuung seitens der Firma CSC und der FH Wiebaden festgelegt wurden, sowie durch
eine Beschreibung der Anwendungsfälle, die die Anwendung abdecken soll. Innerhalb
dieses Rahmens werden darauffolgend die Möglichkeiten zur Realisierung untersucht,
aufgegliedert in die einzelnen Systembestandteile Server, Mobile-Gateway und Client.
3.1
3.1.1
Anforderungen
Rahmenbedingungen
Die bei der Themenstellung gemachten Vorgaben beeinflussen Analyse und Design der
Diplomarbeit. Sie begrenzen die möglichen Lösungansätze für die Realisierung und werden in diesem Abschnitt ausführlich beschrieben:
1. Nutzung der BlackBerry-Enterprise-Architektur
Vorgegeben ist die Verwendung der BB-Infrastruktur (siehe Kapitel 2.1). Die für
diese Arbeit wesentlichen Teile dieser mobilen Plattform sind der BES im Unternehmensnetzwerk und ein spezielles mobiles Endgerät, auf dem die mobile Anwendung läuft. Ein BB-Endgerät vom Typ 7100v ist vorhanden. Insbesondere soll auch
die Push-Funktionalität eingesetzt werden, um Daten aus einem SAP-System über
den BES an das mobile Endgerät zu übermitteln.
39
3.1. Anforderungen
Kapitel 3. Analyse
2. Anbindung an SAP-CRM im Unternehmen
Die BB-Anwendung soll mit einem SAP-CRM 4.0 System (siehe Kapitel 2.3.1)
kommunizieren und dadurch prototypisch die Funktionalität zum Verwalten von
Aktivitäten im CRM bieten.
3. Smart-Client-Anwendung
Die mobile Anwendung soll ein sogenannter Smart Client sein. Im Gegensatz zu
einer Browser-basierten Applikation benutzt der Smart Client die lokale Benutzerschnittstelle des BB-Endgeräts und macht von der Möglichkeit Gebrauch, Daten
lokal zu speichern.
4. Einsatz von Web-Service-Technologien
Die Kommunikation zwischen dem SAP-CRM und der mobilen Anwendung soll
durch einen Web Service erfolgen. Die damit in Zusammenhang stehenden Technologien sind speziell für plattformübergreifende Anwendungen sehr gut geeignet
und ein aktueller Technologie-Trend im Rahmen von SOA.
5. Generische Vorgehensweise
Ein weiteres Ziel dieser Arbeit ist es, bei der Realisierung möglichst generisch vorzugehen, so dass bei der Entwicklung von weiteren mobilen Anwendungen auf Basis der SAP- und BB-Infrastruktur oder Web Services davon profitiert werden kann.
Abbildung 3.1: Grobe Systemarchitektur
Aus diesen Vorgaben resultieren zunächst die in Abbildung 3.1 vereinfacht dargestellten
Komponenten, die für diese Arbeit relevant sind und untersucht werden. Diese Systemarchitektur wird in den Unterkapiteln ab 3.2 ff. detailliert betrachtet. Im Folgenden wird
zuerst genauer definiert, welche Anforderungen die mobile Applikation aus Anwendersicht erfüllen soll.
40
Kapitel 3. Analyse
3.1. Anforderungen
Abbildung 3.2: Server-initiierte Anwendungsfälle
3.1.2
Anwendungsfälle
In diesem Abschnitt werden die Anwendungsfälle definiert, die abstrakt beschreiben, welche Interaktionen zwischen dem Benutzer, mobileCRM und dem SAP-System stattfinden.
Die Anwendungsfälle wurden in Server- und Client-initiiert unterschieden. In den Abbildungen 3.2 und 3.3 sind die sogenannten Use-Cases mit UML modelliert.
Die Anwendungsfälle beziehen sich auf das Aktivitätsmanagement. Der Workflow sieht
dabei so aus, dass Änderungen am SAP-CRM-System über eine Push-Nachricht an alle beteiligten Clients propagiert werden, und umgekehrt Änderungen auf dem Endgerät
möglichst direkt zum SAP-CRM-System übertragen werden. Nach Anlegen einer Aktivität kann sie den Status open oder In Process annehmen, und wird durch den Status
Completed oder auch Rejected abgeschlossen. Dabei kann der Erledigungsstatus
noch prozentual hinterlegt werden. Im SAP-CRM-System selbst wird eine Aktivität nie
gelöscht, sondern bleibt als Beleg erhalten.
3.1.2.1
Server-initiiert
• Aktivitätsänderung
Sobald eine Aktivität im SAP-System neu angelegt oder modifiziert wird, muss
an die Ansprechpartner auf Unternehmensseite ein Update auf das BB-Endgerät
geschickt werden. Dazu muss für den Ansprechpartner in der Aktivität seine
BlackBerry-E-Mail-Adresse hinterlegt sein.
• Daten synchronisieren
Nach einer Aktivitätsänderung werden die neuen Daten vom SAP-System über die
Push-Funktion des BES an die zugehörigen BB-Endgeräte geschickt. Die mobile
Anwendung auf dem Endgerät empfängt und speichert die Aktivität.
41
3.1. Anforderungen
Kapitel 3. Analyse
Abbildung 3.3: Client-initiierte Anwendungsfälle
3.1.2.2
Client-initiiert
In die Kategorie Client-initiiert fallen Aktionen, die der Benutzer in der mobilen Anwendung ausführen kann.
• Aktivitäten auflisten
Alle auf dem BB-Endgerät lokal gespeicherten Aktivitäten werden aufgelistet, zur
Auswahl für weitere Aktionen mit einer Aktivität.
• Aktivität anlegen
Der Benutzer kann in der Anwendung eine neue Aktivität anlegen. Dafür werden
die essentiellen Daten einer Aktivität eingegeben und gespeichert. Dabei wird nur
ein Teil der Attribute unterstützt, die im SAP-System hinterlegt werden können.
• Aktivität modifizieren
Ist eine Aktivität auf dem Endgerät bereits vorhanden, so können die Daten verän-
42
Kapitel 3. Analyse
3.1. Anforderungen
dert und abgespeichert werden. Darunter fällt insbesondere auch das Ändern des
Status der Aktivität.
• Aktivität löschen
Eine Aktivität kann vom Anwender gelöscht werden. Dies bezieht sich allerdings
nur auf die lokale Speicherung auf dem Endgerät, im SAP-System werden keine
Datensätze gelöscht. Zum Abschließen der Aktivität wird lediglich der Status auf
Completed gesetzt.
• Aktivität anzeigen
Der Anwender kann eine gespeicherte Aktivität auswählen und sich die Daten anzeigen lassen. Eine Interaktion mit dem SAP-System findet dabei nicht statt. Es
wird nur eine Auswahl der Attribute dargestellt, die im SAP-System hinterlegt werden können.
• Aktivitätenliste anfordern
Alle Aktivitäten, die den Benutzer der mobilen Anwendung betreffen, werden
Benutzer-initiiert auf das Endgerät geladen und abgespeichert. Somit lassen sich
im SAP-System bereits vorhandene Aktivitäten anfordern.
• Daten synchronisieren
Neue oder modifizierte Aktivitäten auf Client-Seite werden automatisch mit dem
SAP-System abgeglichen. Für diesen Vorgang muss das Endgerät eine Verbindung
zum BES haben. Ein Synchronisationsvorgang kann auch vom Benutzer initiiert
werden. Dies ist beispielsweise sinnvoll, falls ein automatisierter Synchronisierungsvorgang zuvor fehlgeschlagen ist.
3.1.3
Problembereiche
Die Analyse lässt sich in verschiedene Problembereiche aufteilen, welche jeweils verschiedene Komponenten der gesamten Systemarchitektur betreffen. Diese sind zur Einordnung im Folgenden kurz umrissen.
• Synchronisation
Konsistenter Datenabgleich zwischen Client und Server bei konkurrierenden Zugriffen.
• Usability
Benutzerfreundlichkeit und Internationalisierung.
43
3.2. Server
Kapitel 3. Analyse
• Web Service
Bereitstellung einer SAP-Schnittstelle durch einen serverseitigen Web Service und
dessen Kommunikation mit dem Client. Dabei geht es um die Auswahl oder Programmierung einer Implementierung auf Server- und Client-Seite, sowie deren
Kompatibilität.
Die nachfolgenden Teile der Analyse sind anhand der einzelnen Systemkomponenten Server, Mobile Gateway und Mobile Client gegliedert. Die Betrachtung beginnt serverseitig,
da das SAP-CRM-System den Informationsfluss, die Beschaffenheit und den Zusammenhang der Daten vorgibt.
3.2
3.2.1
Server
SAP-CRM
Die in den Anforderungen festgelegte Funktionalität der Anwendung in Bezug auf Aktivitäten kann durch Benutzen der BAPI- und RFC-Schnittstellen des mySAP-CRMModuls in der Version 4.0 abgedeckt werden. Die Modifikation von Aktivitäten - also
ändern und neu anlegen - lässt sich über die Funktion CRMXIF_ORDER_SAVE durchführen. Eine Liste von mehreren benutzerspezifischen Aktivitäten kann durch BAPI_ACTIVITYCRM_GETDETAILMULT abgefragt werden. Hierfür werden jedoch die eindeutigen IDs der Aktivitäten benötigt, die in einer vorhergehenden Abfrage ermittelt werden müssen. Dies lässt sich durch den Aufruf von CRM_MY_ACTIVITIES vereinfachen,
der als Parameter den SAP-Benutzernamen erwartet und alle zugehörigen Aktivitäten zurück liefert.
3.2.2
Datenmodellierung
Das graphische Frontend von SAP bietet für das Management von Aktivitäten den in Abbildung 2.7 bereits vorgestellten, umfangreichen Interaktionsdialog, der viele Verweise
zu weiteren Dialogen enthält wie beispielsweise mehr Details zu den Kontaktpersonen.
Diese Menge von Informationen ist für die Bearbeitung auf einem eingeschränkten mobilen Endgerät zu groß, um übersichtlich dargestellt werden zu können. In Tabelle 3.1
sind die auf dem BB-Endgerät verfügbar gemachten Attribute aufgelistet und anhand von
44
Kapitel 3. Analyse
3.2. Server
Beispieldaten verdeutlicht. Zum Einen sind dabei Datenfelder enthalten, die das SAPSystem verpflichtend als belegt voraussetzt. Weiterhin werden für die technische Umsetzung einige Attribute benötigt wie beispielsweise die eindeutige ID und die Version einer
Aktivität. Zum Anderen wurden weitere Attribute abgebildet, die für das Szenario eines
mobilen Einsatzes Sinn ergeben. Dies sind vor allem die Attribute, die den Status, die
Vervollständigung in Prozent und den Zeitpunkt einer Aktivität definieren.
3.2.3
Web Service zum SAP-CRM-System
Um Punkt 2 der Rahmenbedingungen in Abschnitt 3.1.1 zu erfüllen, muss eine Schnittstelle in Form eines Web Service für das SAP-CRM-System geschaffen werden. Dafür
bieten sich mehrere Alternativen:
• Eigene Web-Service-Implementierung innerhalb des Application-Server von SAP
• SAP-XI Middleware
• SAP-CRM Web-Service-Schnittstelle (CRM-spezifische Middleware)
• Middleware von Drittanbietern, die SAP-Adapter besitzt
Das CRM-Modul verfügt erst ab der Version 5 über eine Web-Service-Schnittstelle. Eine
mögliche Alternative bietet sich durch die NetWeaver-Komponente, auf der das CRMModul aufsetzt. Im Application Server Web AS 6.4 kann eine J2EE-Applikation ablaufen,
die über RFC- und BAPI-Aufrufe das CRM ansprechen kann und diese Schnittstellen als
Web Service zugänglich macht. NetWeaver stellt außerdem das XI-Modul (siehe Kapitel 2.3.2) zur Verfügung, das für den Datenaustausch zwischen SAP-Modulen und auch
Fremdanwendungen via Web Services gedacht ist. Um Punkt 5 der Rahmenbedingungen (3.1.1) bestmöglichst zu erfüllen, sollte XI zur Realisierung näher betrachtet werden.
Eine Implementierung auf Server-Seite entfällt dabei und erleichtert weitere mobile Anwendungen. Ein weiterer Vorteil ist die zentrale Konfiguration der zu integrierenden Systeme, die XI prinzipbedingt mit sich bringt. Neben XI gibt es auch weitere MiddlewareProdukte von Drittanbietern wie IBM oder Oracle, die ebenfalls an SAP-Module angebunden werden können. Für die Umsetzung dieser Arbeit wurde XI verwendet, da entsprechende Softwarelizenzen und administrierte Systeme schon vorhanden sind. Innerhalb des Unternehmens kann bereits auf Erfahrung mit dem SAP-System zurückgegriffen
werden.
45
3.2. Server
Kapitel 3. Analyse
Attribut-Bezeichnung
activityPartnerId
activityPartner
category
categoryText
priority
priorityText
goal
goalText
directionText
direct
objectType
validFrom
validTo
fromTime
toTime
contactPersonId
contactPerson
salesRepresentative
employeeResponsible
createdBy
changedOn
createdOn
systemStatusId
systemStatusText
userStatusId
userStatusText
completion
transactionDescription
transactionType
transactionNumber
objectGUID
organizationalUnit
distributionChannel
salesOrganization
changedBy
Beispielwert
0000600039
Tobias Foo / 73365 Flensburg
001
Sales Call
3
High
005
Better cust. retent.
Outbound
1
BUS2000126
2007-06-22
2007-06-22
16:45:00
16:55:00
0000600037
Foo / 76228 Himmelbrug
2000000010
0000500550
AOPATZ
20070214172936
20070122155130
I1002
Open Planned
E0001
Open
000
Wichtiger Anruf, 50 mio projekt
ZMS0
0000000201
urxewgMZdka41RkHMscGgw==
S 50000790
01
O 50000609
Constant
Tabelle 3.1: Übersicht der Attribute einer Aktivität in mobileCRM
46
Kapitel 3. Analyse
3.3. Mobile Gateway
Durch die Benutzung von XI ergibt sich auch, welches der beiden in Abschnitt 2.1.4
vorgestellten Push-Protokolle verwendet wird. Da die ausgehenden Nachrichten von XI
XML-basiert sind, ist das PAP aus der WAP-Spezifikation nicht geeignet, da dieses die
Nachricht als MIME-Multipart-Nachricht aufbaut. Das RIM-Push-Protokoll hingegen
enthält alle für die Übertragung notwendigen Informationen im URI der Push-Anfrage
an den BES oder in optionalen HTTP Headern. Im Gegensatz zu PAP kann die Payload
dadurch XML-konform sein.
3.3
Mobile Gateway
Die Verwendung der BlackBerry-Plattform ist Vorgabe nach Punkt 1 der Rahmenbedingungen in Abschnitt 3.1.1. Daher werden an dieser Stelle keine alternativen Lösungen
betrachtet, die analog zum BES als Mobile-Gateway für mobile Endgeräte eine sichere
Verbindung zum Unternehmensnetzwerk herstellen können.
Unternehmen wie beispielsweise Audi hatten im Jahr 2005 Bedenken gegenüber der Lösung geäußert, da durch die externe BlackBerry-Infrastruktur des Herstellers RIM (siehe
Abbildung 2.1) prinzipiell die Möglichkeit der Industriespionage besteht. Gewissheit würde an dieser Stelle nur Einsicht in den Quellcode bringen, der von RIM allerdings nicht
zur Verfügung gestellt wird. Die Sicherheitsfunktionen der BlackBerry-Architektur sind
formal sehr umfangreich (siehe Abschnitt 2.1). Neben der Verschlüsselung des Datenverkehrs werden auch IT-Richtlinien unterstützt, und die auf dem Endgerät gespeicherten
Daten können ebenso kodiert und drahtlos gelöscht werden. Ein Artikel zur Kritik an der
BlackBerry-Nachrichten-Verschlüsselung ist nachzulesen bei [Sch05], der unter anderem
zwei Sicherheitsstudien zusammenfasst und zu dem Schluß kommt, dass diese Architektur prinzipiell als sicher einzustufen ist, unter der Annahme, dass die Algorithmen korrekt
implementiert sind und keine Hintertüren in der Software vorhanden sind. Der Quellcode
des BES wurde im Rahmen einer der zuvor erwähnten Studien untersucht, offen zugänglich ist der Code jedoch nicht, so dass die Sicherheit dennoch Vertrauen in den Hersteller
voraussetzt.
In Hinblick auf die Performance des BES wurden vom Hersteller weitreichende Funktionen implementiert. Die einzelnen Komponenten des Systems können bei Bedarf jeweils
auf einer eigenen Servermaschine verteilt betrieben werden, so dass die Performance skalierbar ist. Ebenso ist es möglich, mehrere Instanzen des BES bereit zu stellen, um eine
große Anzahl von BB-Endgeräten damit arbeiten zu lassen. Durch das symmetrische Verschlüsselungsverfahren wird der Overhead so gering wie möglich gehalten und gleichzei-
47
3.4. Mobile Client
Kapitel 3. Analyse
tig die Payload durch die Dispatcher-Komponente des BES komprimiert. Dies ist vor allem für GPRS-basierte Endgeräte entscheidend, da die Bandbreite dort sehr eingeschränkt
ist.
Für die Realisierung wird der BES für MS Exchange in der aktuellen Version 4.1 in Kombination mit Windows 2003 Server verwendet. Die Wahl des E-Mail-Systems (IBM Lotus Domino und Novell GroupWise sind die Alternativen) ist dabei nicht von Bedeutung,
da es nur für den BES selbst benötigt wird und die mobile Anwendung keine E-MailFunktionen benutzt. Der BES kann nur auf den Server-Betriebssystemen Windows 2000
Server und Windows 2003 Server von Microsoft betrieben werden. Als Lizenz für den
BES wird eine kostenlose Trial-Version von RIM benutzt, deren Einschränkung darin besteht, dass nur ein Endgerät damit betrieben werden kann, was für diese Untersuchung
jedoch auch ausreichend ist.
3.4
Mobile Client
Die zu realisierende mobile Anwendung für das BB-Endgerät soll gemäß den Rahmenbedingungen über einen Web Service Funktionalitäten des SAP-CRM zur Verfügung stellen.
SAP bietet eine Gesamtlösung für den mobilen Zugriff auf CRM-Systeme, die sogenannte SAP Mobile Infrastructure (MI). MI bietet für PDAs und Laptops eine J2SE-basierte
Anwendung, die Logik, lokales Zwischenspeichern und Arbeiten im Offline-Modus unterstützt. Für eingeschränkte mobile Endgeräte ist nur eine Browser-basierte Lösung vorgesehen, die diese Funktionen nicht unterstützt. Die MI kann daher nicht als gleichwertige Alternative zu dem in dieser Arbeit entwickelten mobileCRM gesehen werden. Die
Kommunikation des BB-Endgeräts mit dem BES (siehe Abschnitt 2.1.1) funktioniert auf
zwei möglichen Wegen. Serverseitig im Unternehmen initiierte Verbindungen werden als
Push-Nachricht über den BES an das Endgerät gesendet, der dabei als Proxy fungiert, und
Nachrichten für Endgeräte im Offline-Modus zwischenspeichert. Client-initiierte Verbindungen werden über das MDS-Modul des BES aufgebaut, das ebenfalls eine Proxyfunktion übernimmt.
Für die Implementierung der mobilen Anwendung bieten sich folgende Möglichkeiten:
• BB-MDS-Studio
• J2ME mit der API in MIDP und CLDC
• J2ME unter teilweiser Nutzung der propietären API von RIM
48
Kapitel 3. Analyse
3.4. Mobile Client
Anwendungen für aktuelle BB-Endgeräte werden prinzipiell in J2ME (siehe Abschnitt
2.4) und ggf. herstellerspezifischen Erweiterungen programmiert. RIM bietet zusätzlich
mit dem MDS-Studio (vgl. Abschnitt 2.1.2) eine Möglichkeit, auf Web Services basierende Anwendungen IDE-gestützt sehr schnell entwickeln zu können. Diese Lösung bietet
jedoch keinen Zugriff auf die Java-API des Endgeräts. Dadurch ist keine lokale Speicherung von Daten möglich, und das Arbeiten im Offline-Modus (Rahmenbedingungen
Punkt 3) wäre folglich nicht möglich. Ebenso ist eine Übertragung von Aktivitätsdaten
in das PIM somit von vornherein ausgeschlossen. Mit MDS-Studio erstellte Programme
werden in einem proprietären XML-Format gespeichert, und von der MDS-Runtime im
Endgerät in Java-Aufrufe umgesetzt. Daher sind an dieser Stelle keine Erweiterungen
möglich.
Eine alternative Lösungsmöglichkeit besteht in einer J2ME-Anwendung, die zudem auch
kompatibel zu anderen Endgeräten ist. Diese Kompatibilität käme allerdings erst zum
Tragen, wenn die Anwendung auf eine andere mobile Plattform portiert werden sollte.
Weiterhin sieht diese Möglichkeit für die Benutzerschnittstelle die abstrakte API des graphischen Framework LCDUI (siehe Abschnitt 2.4.3.3) innerhalb J2ME vor. Der Vorteil
von LCDUI liegt darin, dass die GUI sich leicht auf andere Endgeräte portieren läßt. Dabei ist das Erscheinungsbild der graphischen Komponenten, Bedienelemente und Menüs
automatisch an das Endgerät angepasst, und der Anwender findet sich durch die gewohnte Gestaltung so leichter zurecht. Erreicht wird dies durch angepasste Implementierungen
der LCDUI API durch die Hersteller der Endgeräte. Die Kommunikation mit dem Web
Service muss in J2ME jedoch selbst implementiert bzw. an eine Bibliothek delegiert werden, während MDS-Studio dies kapselt.
Statt die API von MIDP für Benutzerschnittstelle und Netzwerk-Kommunikation zu verwenden, kann auch die proprietäre API des Herstellers RIM verwendet werden. Die zuvor
erwähnten Vorteile entfallen dabei. Um Zugriff auf die API zu erlangen, muss die Anwendung mit kostenpflichtigen Schlüsseln von RIM signiert werden. Als Rahmenumgebung
für die Implementierung von mobileCRM kommt daher J2ME mit den APIs von MIDP
und CLDC zum Einsatz.
3.4.1
Kommunikation mit dem Web Service
Ein wesentliches Merkmal der mobilen Anwendung ist, dass der Datenaustausch mit dem
SAP-CRM-System über einen Web Service stattfinden soll. In diesem Abschnitt geht es
um die Auswahl entsprechender Protokolle und deren Implementierungen, die für den
49
3.4. Mobile Client
Kapitel 3. Analyse
Web Service eingesetzt werden sollen. Als Protokoll kommen die folgenden beiden Möglichkeiten in Betracht:
• SOAP
• REST-basierter Web Service mit XML-Payload gemäß URI-spezifischer XMLSchemata.
Für das SOAP-Parsing gibt es im J2ME-Umfeld mehrere Alternativen:
• kSOAP Bibliothek (Open Source)
• Referenz-Implementierung (RI) des JSR 172 von Sun (Open Source)
• Wingfoot SOAP-Client (Closed Source)
Eine mögliche Protokollkombination wurde mit SOAP und WSDL bereits in Abschnitt
2.2 beschrieben, ebenso wie ein SOAP-Parser für J2ME mit kSOAP in 2.4.3.5. In den
nächsten beiden Abschnitten wird zunächst mit der JSR 172 eine weitere SOAP-ParserAPI vorgestellt, sowie durch REST eine Alternative zum SOAP-Protokoll. Darauf folgen
minimale Testanwendungen für die SOAP-Bibliotheken und die Push-Funktion, bevor es
abschließend zu einer Auswertung und Abwägung kommt.
3.4.1.1
JSR 172 - Web-Service-API für J2ME
Mit dem JSR 172 wurde im März 2004 innerhalb des JCP die endgültige Version einer
Web-Service-API für Endgeräte mit CLDC oder CDC festgelegt (für die Spezifikation
siehe [EY03]). Sun stellt eine Referenz-Implementierung1 für diese API im Sourcecode
frei zur Verfügung. Eine Übersicht bietet Kapitel 17 in [Yua06]. Hersteller von Endgeräten können eine Implementierung dieser API als optionales Paket zur Verfügung stellen
- neuere Mobilfunkgeräte bieten diese Option mittlerweile, die BB-Modelle von RIM jedoch nicht. Die API baut auf Untermengen der Java API for XML Processing (JAXP)
v1.2 und der Java API for XML-based RPC (JAX-RPC) v1.0 auf, die bereits für die J2SE
existieren. Die JAXP wurde auf einen SAX-Parser reduziert.
Primitive Datentypen innerhalb von SOAP werden analog zu kSOAP in entsprechende Datentypen in Java umgewandelt. Für komplexe Typen werden JavaBeans mit Getund Set-Methoden erzeugt. Im Unterschied zu kSOAP bietet JSR 172 keine Möglichkeit,
komplexe SOAP-Datentypen mit eigenen Java-Klassen zu assoziieren.
1
http://www.sun.com/software/communitysource/j2me/wsa/download.xml
50
Kapitel 3. Analyse
3.4. Mobile Client
Abbildung 3.4: Zusammenhang der Komponenten von JSR 172
Sowohl das XML-Parsing als auch die entfernten SOAP-Aufrufe werden durch die
Schnittstelle des JSR 172 vollständig gekapselt. Eine Übersicht der einzelnen Komponenten und der Kommunikation zwischen ihnen kann der Abbildung 3.4 entnommen werden.
Die Aufrufe erfolgen über einen sogenannten Stub, in dem die Operationen des anzusprechenden Web Service als lokale Methoden repräsentiert werden. Der Stub wird mit Hilfe
eines Stub-Generators erzeugt, der die zugehörige WSDL-Beschreibung des Web Service
benötigt. Dies vereinfacht und beschleunigt die Anwendungsentwicklung stark, und stellt
durch die automatisierte Verarbeitung der Web-Service-Beschreibung einen deutlich weniger fehleranfälligen Ansatz dar. Jedoch ist im Gegensatz zu kSOAP bei der JSR 172 API
auch kein Zugriff auf die XML-Struktur der SOAP-Nachrichten vorgesehen. Der Stub ist
Teil der Client-Anwendung und kommuniziert über das Service Provider Interface (SPI)
mit der Implementierung des JSR 172.
Durch diese Interface-Zwischenschicht ist es möglich, die Anwendung inkl. der generierten Stubs beizubehalten, wenn man die Implementierung wechselt, z.B. die Anwendung
auf einem Endgerät eines anderen Herstellers installiert. Ebenso bietet sich dadurch die
Möglichkeit, zwischen dem Client und dem Web Service ein Gateway zu integrieren, das
das SOAP-Parsing übernimmt. Das Protokoll zwischen Gateway und der Implementierung des JSR 172 könnte dadurch ein optimiertes Binärprotokoll sein, das für die ClientAnwendung jedoch transparent wäre.
3.4.1.2
REST-Web-Services
Der REpresentational State Transfer (REST, siehe [Bay02]) ist eine Architektur, die im
WWW schon lange eingesetzt wird. In einem Netzwerk aus Clients und Servern stellen
die Server über das HTTP-Protokoll Ressourcen bereit, die durch einen URI eindeutig
51
3.4. Mobile Client
Kapitel 3. Analyse
identifiziert werden und eine bestimmte Repräsentation haben, z.B. HTML oder XML.
Die Ressourcen können untereinander verknüpft sein. Indem der Client der Verknüpfung
folgt, erhält er von dem Server die Repräsentation der angefragten Ressource - der Zustand des Clients ändert sich damit.
3.4.1.3
Voranalysen
• Push-Test
Die Push-Funktionalität ist ein Teil von Punkt 1 der Rahmenbedingungen (Abschnitt 3.1.1). Um die korrekte Konfiguration des BES und die Funktionsweise der
Push-Registry (siehe Abschnitt 2.4.3.2) auf dem Endgerät zu testen, wurde eine minimale Anwendung implementiert. Code-Beispiele aus dem Developer-Guide von
RIM, Kapitel „Creating client/server push applications“(siehe [RIM05]), konnten
dabei teilweise übernommen werden. Die Testanwendung besteht aus einem ServerTeil, der mittels einer HTTP POST Anfrage an den BES Push-Port Daten sendet,
und einem Client-Teil, der bei eingehenden Daten gestartet wird.
MIDlet-1: PushTestMIDlet,,com.csc.aopatz.bb.test.PushTestMIDlet
2 MIDlet-Jar-URL: PushTestClient.jar
MIDlet-Name: PushTestClient Midlet Suite
4 MIDlet-Permissions: javax.microedition.io.PushRegistry,
javax.microedition.io.Connector.socket,
6
javax.microedition.io.Connector.serversocket
MIDlet-Push-1: http://:7777,
8
com.csc.aopatz.bb.test.PushTestMIDlet, *
MIDlet-Vendor: CSC
10 MIDlet-Version: 1.0.15
MicroEdition-Configuration: CLDC-1.1
12 MicroEdition-Profile: MIDP-2.0
Quellcode 3.1: JAD der Push-Test-Anwendung
Für die Benutzung der PushRegistry und die Kommunikation über die aufgebaute
Verbindung muss die Client-Anwendung (PushTestClient) entsprechende Berechtigungen für die Klassen besitzen. Dies geschieht über den JAD, der in Abbildung
3.1 dargestellt ist. Außerdem muss bei der Installation des MIDlets auf dem Endgerät der Port reserviert werden, auf dem die PushRegistry eingehende Verbindungen
für die Anwendung entgegen nehmen soll. Dazu bedarf es ebenfalls eines Eintrags
im JAD - in diesem Fall wurde Port 7777 gewählt. Für Push-Verbindungen schreibt
die MIDP-Spezifikation nicht vor, welche Protokolle unterstützt werden müssen.
Während das WTK 2.5 von Sun als Protokoll socket:// erwartet, muss für BB-
52
Kapitel 3. Analyse
3.4. Mobile Client
Endgeräte http:// verwendet werden. Nachdem die Applikation von der PushRegistry gestartet wurde, werden die eingehenden Daten gelesen und auf dem
Display in einer Textbox angezeigt.
Der Server (PushTestServer) sendet eine aufgezeichnete SOAP-Nachricht inkl.
HTTP Headern durch das RIM-Push-Protokoll an den BES, wobei die E-MailAdresse und der Port des Endgeräts bzw. der Client-Anwendung spezifiziert werden. Nachdem der Client von der PushRegistry gestartet wurde, öffnet er die eingehende Push-Verbindung und liest die einkommenden Daten. Diese werden in einer
graphischen Komponente als Text angezeigt.
• Test von JSR 172 mit XI Web Service
Die mobilen Endgeräte von RIM stellen zur Zeit keine Implementierung der WebService-API des JSR 172 zur Verfügung. Daher wurde die Referenz-Implementierung (RI) von Sun verwendet. Durch die Testanwendung soll geklärt werden, ob das
WSDL-Dokument des SAP-Web-Service mit dem Stub-Generator aus dem WTK
kompatibel ist und ob das Parsing der SOAP-Nachrichten mit der RI funktioniert.
Weiterhin muss abgeschätzt werden, inwiefern die RI modifiziert werden muss, um
eine Nachricht über eine Push-Verbindung entgegenzunehmen.
Die Testanwendung (sapjsr172test) besteht aus den Packages der Referenz-Implementierung, die mit dem Präfix csc versehen wurden, um Namenskonflikte zu vermeiden, und dem dem Java-Package com.csc.sap_jsr172_test. Der SAPWeb-Service ist zunächst so konfiguriert, dass er eine Aktivität per Request entgegen nimmt und dann über den BES an das entsprechende BB-Endgerät übermittelt. Anhand der WSDL-Beschreibung können die Stubs problemlos generiert werden, Voraussetzung ist allerdings, dass primitive Datentypen verwendet werden.
So muss beispielsweise der Zeitstempel einer Aktivität vom Typ xsd:date als
xsd:string übermittelt werden. Aus dem Stub wird nur der Code benötigt, der
für das Mapping zwischen XML-Elementen mit entsprechenden Datentypen auf der
einen Seite und den Attributen einer Java-Bean auf der anderen Seite zuständig ist.
Das Mapping wird zusammen mit dem InputStream einer eingehenden PushVerbindung an eine Instanz der Klasse SOAPDecoder übergeben, die Bestandteil
der RI ist und nicht der API des JSR 172. Das Parsing der SOAP-Nachricht schlägt
jedoch fehl. Dieses Resultat ist auch mit dem Beispiel-Web-Service Version des
Apache Axis2 Frameworks und unmodifiziertem Client-Stub zu beobachten.
53
3.4. Mobile Client
3.4.1.4
Kapitel 3. Analyse
Evaluierung
Neben den folgenden Entscheidungen bezüglich der Kommunikation von mobileCRM
dienen die Tests auch zur Verifizierung des Systemaufbaus. Dazu zählt hauptsächlich die
Installation und Konfiguration des BES und die Aktivierung des BB-Endgeräts. Durch den
Push-Test wurde zusätzlich noch das Deployment einer Anwendung auf dem Endgerät,
die Benutzung der Push-Registry mit JAD und die Kommunikation zwischen BES und
dem Endgerät getestet.
• Web-Service-Protokoll: REST oder SOAP
Auf SOAP basierende Web Services nutzen das REST-Prinzip nicht. Die Ressourcen und Operationen werden im Rumpf der SOAP-Nachricht statt über den URI
spezifiziert. Alle Nachrichten richten sich an einen URI des Service. Dies hat zur
Folge, dass ein Proxy für SOAP-Nachrichten nur schwer implementiert und gewartet werden kann. Somit entfallen Zugriffsbeschränkungen und Caching durch
einen Proxy. Zudem können auf SOAP basierende Web Services frei Operationen definieren, während Web Services nach dem REST-Prinzip nur die generischen
HTTP-Methoden zur Verfügung stellen. Ein weiterer Unterschied ist, dass bei auf
REST basierenden Web Services jede Ressource für ihre Repräsentation innerhalb
von HTTP ein spezifisches Protokoll nutzen kann. Bei einer REST-basierten WebService-Implementierung entfällt der Overhead von SOAP. Die HTTP-Payload enthält nur die zu übertragenden Daten in Form von XML, beispielsweise gemäß einer
XSD. Die mobile Anwendung muss die Verarbeitung der XML-Daten jedoch vollständig selbst implementieren. Die RI des JSR 172 vereinfacht die Entwicklung an
dieser Stelle, da ein Stub-Generator diese Arbeit erledigt. Für kSOAP ist kein StubGenerator verfügbar, und der Aufwand ist ähnlich wie bei einer REST-basierten
Implementierung. Für beide Varianten ist es jedoch möglich, einen Stub-Generator
zu implementieren. In der neuen Version 2.0 der WSDL-Spezifikation wird auch
die Beschreibung von REST-basierten Web Services möglich. Prinzipiell hat sich
SOAP in Kombination mit WSDL jedoch zur Integration von Softwaresystemen
weit verbreitet und lässt sich mit SAP-XI leichter für den Zugriff auf das SAPCRM-System nutzen, als einen REST-basierten Web Service zu implementieren.
Aus diesem Grund wird die Realisierung mit SOAP-Kommunikation durch SAPXI vollzogen.
• SOAP-Bibliothek: kSOAP oder JSR 172
Die RI des JSR 172 erfüllt Punkt 5 der Rahmenbedingungen am Besten, da für das
54
Kapitel 3. Analyse
3.4. Mobile Client
Type-Mapping größtenteils auf einen Stub-Generator zurückgegriffen werden kann.
Durch die Voranalyse hat sich jedoch ergeben, dass die Test-Anwendung mit der RI
des JSR 172 in Kombination mit dem SAP-XI Web Service nicht funktioniert und
die RI noch instabil ist.
Eine weitere SOAP-Implementierung für mobile Endgeräte ist der WingfootSOAP-Client1 . Der Hersteller bietet die Bibliothek jedoch nur in binärer Form an,
wodurch Anpassungen für eine eingehende Push-Verbindung nicht möglich sind
und man für Erweiterungen, Bugfixes und Support auf den Hersteller angewiesen
ist. Für die Implementierung von mobileCRM kommt Wingfoot deshalb nicht in
Betracht.
Folglich wird mobileCRM mit der kSOAP-Bibliothek implementiert, mit der bei
Kompatibilitätsproblemen auch auf XML-Ebene gearbeitet werden kann, statt Mappings zu verwenden. Für den Empfang einer Push-Nachricht mit kSOAP muss zunächst der entsprechende Codeabschnitt für die eingehende Verbindung aus der Methode call ausgegliedert werden. Daher wurde die Methode receive(InputStream istream, SoapEnvelope envelope) der öffentlichen Schnittstelle der Klasse HttpTransport hinzugefügt. Im Gegensatz zum Stub-Generator für die API des JSR 172 existiert für kSOAP kein frei verfügbarer StubGenerator, so dass die Zuordnungen zwischen XML-Elementen und Java-Datentypen manuell programmiert werden müssen.
3.4.2
Synchronisation und Offline-Modus
Ein wichtiges Merkmal von mobileCRM ist die Realisierung als Smart Client: die Aktivitäten sollen lokal auf dem Endgerät gespeichert und auch neue Aktivitäten ohne FunknetzVerbindung angelegt werden können. Für diesen Offline-Modus wird zum lokalen Zwischenspeichern das RMS verwendet, das in Abschnitt 2.4.3.4 vorgestellt wurde und Bestandteil von J2ME ist. Eine andere Option zur Umsetzung der Zwischenspeicherung auf
BB-Endgeräten gibt es nicht. Jedoch gibt es Produkte diverser Hersteller, die auf dem
RMS aufsetzend eine beschränkte relationale Datenbank realisieren, was jedoch im Rahmen von mobileCRM nicht notwendig ist und nur Overhead wäre.
Sobald Daten aus dem SAP-CRM auf dem Endgerät modifiziert werden, können bei der
Synchronisation zwischen SAP und mobileCRM Probleme bei der Datenkonsistenz auftreten. Dies ist dann der Fall, wenn zwei oder mehr Benutzer eine bestimmte Aktivität be1
http://www.wingfoot.com/download_wsoap.html
55
3.4. Mobile Client
Kapitel 3. Analyse
Abbildung 3.5: Beispiel für ein Lost-Update bei der Synchronisation
arbeiten. Die Synchronisationsprobleme werden in der Datenbanktheorie mit Dirty Read,
Inconsistent Read und Lost Update bezeichnet. Die Anomalien eines Inconsistent Read
und eines Dirty Read sind dadurch ausgeschlossen, dass die RFC- oder BAPI-basierte
Kommunikation mit dem SAP-CRM-System transaktionssicher ist. Ein Lost Update kann
durch das SAP-CRM-System nicht verhindert werden. Ein Fallbeispiel für ein solches
Problem folgt und ist in Abbildung 3.5 visualisiert:
• Der Benutzer ändert eine Aktivität A in mobileCRM, die Änderung wird lokal gespeichert, aber es ist kein Funknetz verfügbar.
• Zwischenzeitlich nimmt die Sekretärin im Unternehmen von einem Kunden einen
Anruf entgegen, der eine Änderung in Aktivität A zur Folge hat, beispielsweise
eine Terminänderung. Die modifizierte Aktivität wird durch die direkt an das SAPSystem angebundene SAP-GUI im CRM abgespeichert und eine Push-Nachricht
an den BES gesendet, die dort vorgehalten wird, bis der mobile Nutzer erreichbar
ist.
• Das mobile Endgerät hat wieder Netzempfang und erhält die Push-Nachricht. Dabei
werden die lokalen Änderungen überschrieben, falls keine speziellen Vorkehrungen
in der Anwendungslogik getroffen werden. Eine weitere Möglichkeit (nicht in Abbildung enthalten) wäre, dass aufgrund von Race Conditions der mobile Nutzer
seine Änderung an das SAP-System überträgt, bevor die Push-Nachricht, die durch
die Änderung der Sekretärin ausgelöst wird, ihn erreicht. In diesem Fall wäre die
getätigte Änderung der Sekretärin im SAP-System überschrieben.
56
Kapitel 3. Analyse
3.4. Mobile Client
Zur Verhinderung solcher Probleme gibt es verschiedene sogenannte Replikationsstrategien (siehe [Rah05]). Unter Replikation versteht man die Vervielfältigung von Daten. Im
konkreten Fall bezeichnet man die Daten im SAP-CRM-System als Primärdaten, und die
Kopien auf den BB-Endgeräten als replizierte Daten. Bei den Strategien unterscheidet
man zwischen Verfahren, die eine strenge Konsistenz garantieren (synchrone Änderungen), und solchen, die nur eine schwache Konsistenz erreichen (asynchrone Änderungen).
Für eine strenge Konsistenz, die eine Transparenz der Replikation gewährleistet, ist eine
Serialisierung der Änderungen an Daten notwendig. Dies wird in den gängigen Verfahren
durch Schreibsperren auf allen oder der Mehrheit der Kopien gelöst. Durch den OfflineModus von mobileCRM ist es möglich, dass parallele Änderungen auf einem Datensatz
stattfinden, ebenso wie nicht immer alle Replikate konsistent sind. Daher ist eine strenge Konsistenz nicht realisierbar. Für mobile Anwendungen eignet sich eine sogenannte
Merge-Replikation. Dabei ist die Konsistenz der einzelnen Kopien nicht sichergestellt,
und es kann beim Synchronisieren zu Konflikten kommen, die dann automatisiert oder
ggf. manuell aufgelöst werden müssen.
Um solche Konsistenzprobleme sicher zu erkennen, müssen in dem Fall die Datensätze versioniert werden, um unterschiedliche Datenstände identifizieren zu können. Eine
sichere Vermeidung von Lost Updates ist nur durch eine Transaktion möglich, so dass
die Versionsüberprüfung und das Schreiben des Datensatzes atomar durchgeführt werden
können. Zur Unterscheidung der Datenstände kann bei den Datensätzen im SAP-CRMSystem das Attribut DocumentNumber herangezogen werden, das bei jeder Transaktion mit der Aktivität automatisch inkrementiert wird.
Für die Umsetzung von mobileCRM werden die folgenden zwei Möglichkeiten zur Synchronisation untersucht:
1. Transaktionslogik zwischen Web Service und SAP-CRM-System (Abbildung 3.6).
2. Keine Transaktionslogik, Lost Updates können auftreten (Abbildung 3.8).
Die Möglichkeit, Transaktionen über den Web Service anzubieten, wird nicht näher betrachtet, da die Realisierung aufwendiger ist und die Dauer einer einzelnen Transaktion
dadurch länger wird. Im schlimmsten Fall müsste eine Transaktion dabei durch einen
Timeout abgebrochen werden, falls das BB-Endgerät die Funkverbindung verliert.
Der Ablauf von Synchronisationslösung 1 ist in Abbildung 3.6 dargestellt, der BES wurde hierbei zur besseren Übersicht nicht dargestellt. Eine lokal als modifiziert markierte
Aktivität wird dabei an den Web Service im SAP-XI gesendet. In einer dort implementierten Transaktionslogik wird innerhalb einer Transaktion mit dem SAP-CRM-System
57
3.4. Mobile Client
Kapitel 3. Analyse
Abbildung 3.6: Synchronisationslösung 1 für Client-initiiertes Aktivitätsupdate
58
Kapitel 3. Analyse
3.4. Mobile Client
Abbildung 3.7: Push-Update, Bestandteil der Synchronisationslösungen 1 und 2
überprüft, ob sich die DocumentNumber im CRM-System geändert hat im Vergleich zu
der Aktivität, die abgespeichert werden soll. Falls die Version gleich geblieben ist, kann
die Aktivität ins CRM geschrieben werden, und die Transaktion abgeschlossen werden.
Anderenfalls wird die Transaktion abgebrochen, und mobileCRM erhält vom Web Service
eine Fehlermeldung. Seitens dem SAP-CRM-System wird nach einer Aktivitätsänderung
eine Push-Nachricht im SAP-XI veranlasst (siehe Abbildung 3.7), die alle Benutzer von
mobileCRM erhalten, die eine Rolle in der modifizierten Aktivität einnehmen.
Wenn die Push-Nachricht eintrifft, muss die Aktivität auf dem Endgerät überschreibbar
sein. Deshalb wird die Markierung vor dem Update bereits auf unmodifiziert gesetzt, so
dass Race Conditions nicht zu einem Fehlschlagen der Push-Nachricht führen können.
Bei einem Push-Update auftretende Versionskonflikte können auf dem Endgerät sicher
erkannt werden. Nachdem ein Konflikt festgestellt wurde, muss geprüft werden, ob er
sich lösen lässt. Betreffen die Änderungen in beiden Datensätzen nicht die gleichen Attribute, können die zwei Datenversionen möglicherweise automatisiert zusammengeführt
werden. Bedingung ist jedoch, dass die geänderten Attribute nicht in einer Abhängigkeit zueinander stehen. Weiterhin muss für eine Zusammenführung auch der unmodifizierte Datensatz auf dem Endgerät vorhanden sein, um die Änderungen in lokalem und
SAP-Datensatz erkennen zu können. Betreffen die Änderungen gleiche Attribute, ist ein
Zusammenführen (oder auch Merging im Englischen) ohne manuellen Eingriff des Benutzers nicht möglich. Die Funktionalität des automatischen Mergens ist auch als Teil der
59
3.4. Mobile Client
Kapitel 3. Analyse
Abbildung 3.8: Synchronisationslösung 2 für Client-initiiertes Aktivitätsupdate
Transaktionslogik im SAP-XI denkbar, so dass kein Fehler an das Endgerät zurückgegeben werden muss und der Vorgang dadurch schneller durchgeführt werden kann. Die
Realisierung eines Merge-Vorgangs ist nicht Bestandteil des Prototyps mobileCRM.
Der besondere Fall eines Lost-Updates auf Client-Seite kann auftreten, wenn der Benutzer
eine Aktivität lokal bearbeitet, während für dieselbe Aktivität ein Push-Update eingeht.
Ohne Vorkehrungen kann der Benutzer die neue Version der Aktivität mit der vorherigen
überschreiben.
Die zweite Synchronisationslösung verwendet keine Transaktionslogik, und daher sind
Lost-Updates in diesem Szenario prinzipiell möglich. Der Fokus dieser Arbeit liegt nicht
bei der Transaktionssicherheit auf SAP-Seite, weshalb für den Prototyp mobileCRM dieses optimistische Verfahren ausreichend ist. Solange das Endgerät keine Push-Nachricht
vom SAP-System erhält, wird davon ausgegangen, dass die lokale Version der Aktivität
noch die aktuelle ist. Die modifizierte Aktivität wird ohne weitere Vorkehrungen direkt an
den Web Service gesendet und SAP-XI kann eine entsprechende Anfrage an das CRMSystem stellen. Nach dem Abspeichern löst das CRM-System Push-Updates für alle an
der Aktivität beteiligten BB-Benutzer aus (siehe Abbildung 3.7). Währenddessen erhält
der Benutzer, der das Update durchgeführt hat, eine Rückmeldung vom Web Service und
markiert die Aktivität lokal als unmodifiziert. Ein Lost-Update kann auftreten, falls ein
anderer Benutzer ein Update mit der gleichen Aktivität durchführt, bevor er das PushUpdate erhält, und zu einem Merge-Vorgang aufgefordert wird. Neben einer verzögerten
Auslieferung einer Push-Nachricht kann dies auch durch eine verloren gegangene PushNachricht hervorgerufen werden. Das Zeitfenster, in dem ein Lost-Update auftreten kann,
60
Kapitel 3. Analyse
3.4. Mobile Client
Abbildung 3.9: Mögliches Lost-Update in Synchronisationslösung 2
beginnt also mit dem Update-Vorgang eines Benutzers und endet, wenn alle mit der Aktivität assoziierten BB-Benutzer die entsprechende Push-Nachricht erhalten haben. Dies
ist in Abbildung 3.9 veranschaulicht. Die SAP-XI und der BES als vermittelnde Systeme
zwischen Client und SAP-CRM wurden der Einfachheit halber nicht dargestellt.
Ein weiteres Problem ergibt sich speziell für den produktiven Einsatz. Die SAP-GUI öffnet Aktivitäten nur lesend, falls ein weiterer SAP-GUI-Client diese Aktivität bereits geöffnet hat. Um keine Konflikte hervorzurufen sollte die Implementierung der mobilen
Anwendung auf die Funktionsweise der SAP-GUI abgestimmt sein. Hierfür ist jedoch
Detailwissen zur SAP-GUI notwendig. Diese Problemstellung wird für den Entwurf des
Prototyps nicht näher betrachtet.
3.4.3
Usability der mobilen Anwendung
Für den erfolgreichen Einsatz einer Anwendung ist die Akzeptanz der End-Anwender
ein wichtiger Aspekt. Die Schnittstelle von Mensch zu Maschine sollte möglichst intuitiv bedienbar sein, so dass der Benutzer die Anwendung als eine Hilfe empfindet und
keinesfalls dadurch ineffizienter arbeitet. Insbesondere bei mobilen Applikationen stellt
dies eine besondere Herausforderung dar, weil die Endgeräte nur eingeschränkte Ein- und
Ausgabemöglichkeiten haben. Im Hinblick auf die zu realisierende Anwendung mobileCRM ergeben sich dabei folgende Schwerpunkte:
• Internationalisierung
Durch die gegebenen Anforderungen, dass die mobile Anwendung ein SAP-CRMSystem durch die BlackBerry-Plattform nutzt, ergeben sich als Zielgruppe der Anwendung Mitarbeiter aus mittelständischen, großen oder global agierenden Unternehmen, da nur dort die entsprechende Infrastruktur vorhanden ist oder sich die
61
3.4. Mobile Client
Kapitel 3. Analyse
Investition in selbige lohnen würde. Daraus ergibt sich, dass mobileCRM oder darauf basierende Anwendungen international einsetzbar sein müssen. Internationalisierung (I18N) zur Bedienung der Anwendung muss eine Einstellung der Sprache
umfassen. Speziell im Kontext von Geschäftsanwendungen müssen dabei auch landesspezifische Währungen und Maßeinheiten beachtet werden.
• Bedienbarkeit
Die Bedienbarkeit - auch Usability genannt - ist entscheidend, wenn es um die Akzeptanz und effiziente Arbeitsweise der Benutzer mit der Anwendung geht. Es ist
von vornherein zu vermeiden, dass End-Anwender aus Effizienzgründen auf Stift
und Papier oder andere Anwendungen zurückgreifen. Dies sollte ebenfalls nicht
aufgrund einer zu komplexen Bedienung der Anwendung passieren. Die Verantwortung liegt dabei nicht ausschließlich beim Entwickler, sondern Usability ist schon
in der Spezifikation der Anforderungen und im Design zu berücksichtigen. Bei Anwendungen mit großem Funktionsumfang sind ein Benutzerhandbuch und Benutzerschulungen ebenso notwendig. Der Grundstein dafür wird bei mobileCRM bereits bei der Datenmodellierung in Abschnitt 3.2.2 gelegt, um die Funktionen und
die Komplexität der Anwendung an das mobile Endgerät anzupassen. Die durch
die mobile Anwendung abzubildenden Funktionen sollen außerdem übersichtlich
angeordnet sein. Hierzu kann das Untergliedern von Menüs in Kategorien mit Untermenüs hilfreich sein. Aufgrund des kleineren Displays kann es sinnvoll sein,
Dialogfelder, wie beispielsweise das der SAP-GUI (siehe Abbildung 2.7), oder Vorgänge auf mehrere Dialoge zu verteilen. Im Gegensatz zu typischen Desktop-GUIAnwendungen mit Menüleiste und personalisierbarer Werkzeugleiste ist die Benutzerschnittstelle von mobilen Endgeräten bereits kontext-sensitiv ausgelegt. Zu
einer angezeigten graphischen Komponente werden spezifische Aktionen definiert,
die damit durchgeführt werden können. Um die Komplexität der Anwendung aus
Benutzersicht zu reduzieren, ist eine weitere Möglichkeit, dem Benutzer Arbeit abzunehmen. Dies wäre innerhalb von mobileCRM beispielsweise denkbar mittels
Autovervollständigung und sinnvoller Vorbelegung in Eingabefeldern, oder indem
die Liste der Aktivitäten nach bestimmten Kriterien sortiert und durchsucht werden
kann.
• Performance
Lange Ladezeiten, in denen der Benutzer auf die Anwendung warten muss, sind
unbedingt zu vermeiden und beeinflussen die Akzeptanz der Applikation negativ.
Infolge der Hardware-Einschränkungen von mobilen Endgeräten ist der Aspekt der
62
Kapitel 3. Analyse
3.4. Mobile Client
Performance bei Design und Implementierung daher besonders wichtig. Durch die
Nutzung eines Web Service kommt erschwerend die Latenz der GPRS-Verbindung
und das Parsing von XML hinzu. Um die Leistung des Endgeräts möglichst effizient
zu nutzen, werden die in Abschnitt 2.4.3.6 zusammengestellten Optimierungsmöglichkeiten beachtet.
Ein Performance-Vorteil ergibt sich bereits aus den Rahmenbedingungen Punkt
3, nach denen die Anwendung als Smart Client realisiert werden soll. Dadurch
ist nicht für jede Operation der Anwendung eine Kommunikation mit dem SAPSystem notwendig und die Latenz, die der Benutzer erfährt, deutlich geringer.
3.4.4
Logging und Unit-Tests
Für die Rekonstruktion von Fehlern und Debugging kann Logging ein gutes Hilfsmittel
sein. In der Java-Welt hat sich unter anderem die Open-Source-Bibliothek log4j etabliert,
bei der verschiedene Ausgabeströme, -formatierungen und unterschiedliche Log-Level
unterstützt werden. Mit Microlog1 gibt es eine log4j-ähnliche Implementierung für den
Einsatz im J2ME-Umfeld, da log4j selbst nur mit J2SE lauffähig ist. Zusätzlich bietet
Microlog noch einen Adapter für das RMS und ein entsprechendes MIDlet zum Auslesen,
so dass ein Logging-Ausgabestrom auch so konfiguriert werden kann, dass er im RMS
gespeichert wird. Dies ist für mobile Endgeräte sinnvoll, die nicht über eine Konsole im
Sinne einer Standard-Ausgabe verfügen.
Das weit verbreitete jUnit Test-Framework ist innerhalb von J2ME nicht verwendbar, so
dass auf J2MEUnit 2 zurückgegriffen wird. Die API für einen Testcase ist dabei äquivalent zu jUnit, jedoch werden Test-Suites aufgrund der fehlenden Reflection-API in J2ME
anders aufgerufen, und es gibt einen weiteren TestRunner, der als MIDlet realisiert ist.
1
2
http://microlog.sourceforge.net/
http://j2meunit.sourceforge.net/
63
3.4. Mobile Client
Kapitel 3. Analyse
64
Kapitel 4
Design
In diesem Kapitel wird das Design für die zu realisierende Anwendung mobileCRM
entworfen. Es basiert auf den Anforderungen aus Abschnitt 3.1 und den DesignEntscheidungen, die während der Analyse getroffen wurden. Zunächst wird ein verfeinerter Architekturüberblick des gesamten Systems gegeben. Der Abschnitt mobileCRM
geht auf die einzelnen Komponenten der mobilen Anwendung ein und erläutert danach
deren Zusammenspiel, um eine Abbildung der einzelnen Anwendungsfälle zu realisieren.
Abschließend wird der Entwurf des Web Service im SAP-XI beschrieben.
4.1
Architekturüberblick
Aufgrund der im Analyse-Kapitel getroffenen Technologie- und Design-Entscheidungen
ergibt sich ein verfeinerter Aufbau der Architektur, die in Abbildung 4.1 dargestellt ist.
Als Endgerät wird von der Firma CSC ein BlackBerry 7100v mit Mobilfunkvertrag bei
Vodafone bereitgestellt. Ebenso kann für SAP-XI und SAP-CRM auf die am Standort
Wiesbaden vorhandene Infrastruktur in einer Testumgebung zurückgegriffen werden. Auf
einer weiteren Servermaschine wurde im Rahmen dieser Arbeit Windows 2003 Server,
MS Exchange 2003 und der BES in der Version 4.1 für Exchange installiert und konfiguriert. Die mit 1 und 2 in der Abbildung gekennzeichneten Systembestandteile sind dabei
im Rahmen dieser Arbeit zu entwickeln bzw. zu konfigurieren. Der Schwerpunkt dieses
Kapitels ist das Design von mobileCRM. Anschließend wird im SAP-XI der zugehörige
Web Service entworfen.
65
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.1: Verfeinerter Aufbau der Systemarchitektur
4.2 mobileCRM
Die Anforderungen an die mobile Anwendung mobileCRM wurden bereits in Abschnitt
3.1 festgelegt. Weitere Vorgaben für den Client wurden in Abschnitt 3.4 der Analyse
herausgearbeitet.
Daraus ergeben sich Teil-Komponenten der Anwendung, die als Java-Packages realisiert
werden und im Folgenden beschrieben sind:
• com.csc.bb.mobileCRM
In diesem Package befindet sich der Einstiegspunkt der Anwendung, der gemäß
J2ME als MIDlet realisiert ist. In MobileCrmMIDlet wird der Lebenszyklus der
Anwendung gesteuert, weitere Komponenten der Applikation initialisiert und die
eigentlichen Aufgaben der Anwendung an diese delegiert.
• com.csc.bb.mobileCRM.gui
Die graphischen Komponenten der Benutzerschnittstelle, die die LCDUI-API von
J2ME benutzen, sind in diesem Package enthalten.
• com.csc.bb.mobileCRM.model
Die von der Benutzerschnittstelle dargestellten Daten werden in getrennten Komponenten bereitgehalten, ebenso wie deren Synchronisation mit dem RMS auf dem
Endgerät und dem Web Service des SAP-Systems.
66
Kapitel 4. Design
4.2. mobileCRM
• com.csc.bb.mobileCRM.util
In diesem Package befinden sich Klassen für die Internationalisierung und das Logging.
Die Tabelle 4.1 zeigt die Komponenten von mobileCRM mit ihren jeweiligen Zuständigenkeiten in einer Übersicht. Im nächsten Abschnitt werden allgemeine DesignPrinzipien für mobileCRM besprochen. Die darauf folgenden Unterkapitel sind nach der
rechten Tabellenspalte gegliedert und betitelt.
Java-Package
com.csc.bb.mobileCRM.gui
com.csc.bb.mobileCRM.model
com.csc.bb.mobileCRM.util
Zuständigkeit
Benutzerschnittstelle
Model und Backend-Zugriffe
Logging und Internationalisierung
Tabelle 4.1: Übersicht der Komponenten von mobileCRM
4.2.1
Allgemeine Design-Prinzipien
In diesem Abschnitt werden zunächst allgemeine Design-Prinzipien besprochen, die in
mehr als einer Komponente von mobileCRM oder komponentenübergreifend Anwendung
finden.
In [Yua06] werden zwei grundsätzlich verschiedene Architektur-Beispiele für eine mobile Anwendung gegeben. Die Beispielanwendung Smart Ticket von Sun benutzt zahlreiche
Interfaces zur Kapselung. Hinter einer Fassade für das Model findet beispielsweise eine
Unterteilung in local und remote Model statt, während letzteres noch ein Chain-Handling
von einem RMS-Cache und den eigentlich HTTP-Anfragen zu einem Server kapselt. Das
Gegenbeispiel zu diesem schwergewichtigen Design bildet die iFeedback-Anwendung
des Autors ([Yua06]), die ein sogenanntes screen-flow Design verwendet. Der Autor hat
mit dieser Anwendung im Jahr 2002 den University Wireless Developer Contest gewonnen, der von NexTel, Sun und Motorola durchgeführt wurde. In einer MVCComponent
werden dabei graphische Elemente eines anzuzeigenden Screens zusammengefasst, und
die dazu spezifisch erforderliche Programm-Logik für Benutzerinteraktion und Kommunikation mit Backend-Systemen ebenso in dieser Komponente implementiert. Für die Nagivation von einem Screen zum nächsten gibt es keinen zentralen Controller, sondern jede
MVC-Komponente ist selbst dafür zuständig, bei welchen Benutzerinteraktionen eine andere Komponente angezeigt werden muss. Von dieser Klasse wird dann eine neue Instanz
67
4.2. mobileCRM
Kapitel 4. Design
angelegt und diese auf dem Display zur Anzeige gebracht - die Kontrolle liegt somit bei
der neuen Komponente. Da ein graphisches Element nicht mehrfach angezeigt werden
kann (es ist nur ein Display vorhanden), sind die Attribute aller Komponenten statisch
und werden somit nicht mit jeder Instanz neu erzeugt.
Die leichtgewichtige Architektur bietet klare Vorteile in Bezug auf Performance (siehe
dazu Abschnitt 2.4.3.6). Durch den reduzierten Umfang an Klassen wird weniger flüchtiger und nicht-flüchtiger Speicher für die Anwendung benötigt, ebenso wird weniger
Delegation notwendig. Auf der anderen Seite geht dies zu Lasten der Erweiterbarkeit und
Testbarkeit der Anwendung. Insbesondere kann der Code für Backend-Zugriffe nicht sauber wiederverwendet werden.
Für mobileCRM kommt eine Variante des MVC Design Pattern zum Einsatz, auch
Document-View-Architektur genannt, die einen bestmöglichen Kompromiss aus den unterschiedlichen Design-Ansätzen darstellen soll. Die graphischen Elemente sind dabei
View und Controller in einem, und die Navigation von einer zur nächsten Komponente erfolgt ähnlich wie bei dem iFeedback-Beispiel. Dafür sind statische Klassenattribute
notwendig, damit der gegenseitige direkte Zugriff auf Instanzen möglich ist. In mobileCRM wird dies durch das Singleton Design Pattern (siehe [GHJV95] S. 127) realisiert
und auf alle Klassen angewendet, für die auf Anwendungsebene nur eine Instanz benötigt wird. Hierdurch wird die Neuinstanziierung von Objekten minimiert und die Garbage
Collection weniger in Anspruch genommen. Es sei jedoch darauf hingewiesen, dass dies
bei umfangreicheren Anwendungen und weiteren Workflows innerhalb der Anwendung
zu einem zu hohen Speicherverbrauch führen kann, da einmal erzeugte Komponenten
für weitere Benutzungen im Speicher vorgehalten werden. Die Kommunikation mit RMS
und SAP-System wird in einem Model gekapselt, auf das alle graphischen Komponenten
zugreifen. Die folgenden Abschnitte gehen auf das konkrete Design der Benutzerschnittstelle (View) und des Modells (Document) ein.
4.2.2
Benutzerschnittstelle
Die Benutzerschnittstelle besteht hauptsächlich aus graphischen Komponenten, die die
abstrakte Klasse BasicScreen erweitern. Abbildung 4.2 gibt eine Übersicht aller Klassen im Package com.csc.bb.mobileCRM.gui.
Bevor ein Screen auf dem Display mit der Methode show() angezeigt werden kann,
muss zunächst der Inhalt initialisiert werden, wofür jede graphische Komponente die
Methode initData() individuell überschreibt. Benötigt ein Screen vor der Initiali-
68
Kapitel 4. Design
4.2. mobileCRM
Abbildung 4.2: Klassen der Benutzerschnittstelle (View)
69
4.2. mobileCRM
Kapitel 4. Design
sierung noch Daten, so kann dies über zusätzliche Set-Methoden geschehen, die vor
initData() aufgerufen werden müssen. Dies ist beispielsweise bei der Klasse ShowActivityForm der Fall, der man zunächst eine Aktivitäts-ID übergeben muss, bevor
die entsprechenden Daten aus dem Model transferiert werden können.
Da ein Screen auch den Controller-Part des MVC-Designs übernimmt, wird das Interface
CommandListener implementiert, und die Methode commandAction(Command
cmd, Displayable disp) muss in jeder Unterklasse entsprechend überschrieben
werden. Dort können Benutzerinteraktionen verarbeitet und dementsprechend Vorgänge im Screen ausgelöst werden oder andere Screens aufgerufen werden, die wiederum
zuvor initialisiert werden müssen. Damit die GUI während solcher Vorgänge nicht blockiert, werden Aufrufe im Model durch den ModelController gekapselt und in einem anderen Thread ausgeführt. Vom Model angefragte Daten werden asynchron vom
ModelController an die entsprechende GUI-Komponente übergeben. Dafür muss sie das
Interface AsyncDataHandler implementieren, den generischen Parameter der Methode updateData(Object data) zu dem erwarteten Datentyp anpassen (Casting)
und dann adäquat verarbeiten. Während eines Vorgangs im Model wird auf dem Display ein Wartebildschirm angezeigt, der in der Klasse StatusBar implementiert ist.
Zuvor muss mittels setNextScreen(BasicScreen nextScreen) jedoch angegeben werden, welcher Screen nach Abschluß des Vorgangs angezeigt werden soll. Die
Statusanzeige kann modellgetrieben aktualisiert werden, so dass der Benutzer eine Rückmeldung erhält, was im Hintergrund geschieht. Dafür wird im ModelController und
in StatusBar die Schnittstelle ProgressObserver implementiert. So kann vom
Model aus die Methode updateProgress(final int percentage, final
String status) aufgerufen werden, die der Controller zur Statusanzeige delegiert.
Durch die Notwendigkeit der Schnittstellen AsyncDataHandler und ProgressObserver bei der Kommunikation zwischen Model und ModelController in der GUISchicht ist die Model-Fassade unterteilt in die Schnittstelle ModelFacade, die nur
Methoden zu Operationen mit den Datensätzen definiert, und die Klasse Model, die
ModelFacade implementiert und zusätzlich noch die Kommunikation mit dem Controller umsetzt.
Für einen kompletten Übergang von einem Screen zum nächsten ist also auch das Model involviert, weshalb ein Sequenzdiagramm eines solchen Vorgangs erst nach dem Abschnitt zum Model folgt. Der Einstiegspunkt der Benutzerschnittstelle ist das Hauptmenü,
in dem ein Vorgang ausgewählt werden kann, angelehnt an die Anwendungsfälle der Applikation. Eine Übersicht der einzelnen Screens von mobileCRM zeigt Abbildung 4.3.
70
Kapitel 4. Design
4.2. mobileCRM
Abbildung 4.3: Übersicht und Zusammenhang der Screens
So können neben den wesentlichen Punkten Aktivität anlegen, Liste aller Aktivitäten
anzeigen und Synchronisieren auch die Anwendung beendet oder die Benutzereinstellungen angepasst werden. Die zugehörige Implementierung befindet sich in der Klasse
MainMenu. Die Liste aller lokal auf dem Endgerät vorhandenen Aktivitäten zeigt der
Screen ActivityList an, der intern List aus dem LCDUI-Framework für die Darstellung verwendet. Über ein Kontext-Menü kann eine ausgewählte Aktivität angezeigt,
modifiziert oder lokal gelöscht werden. Diese Aufgabe übernimmt die Klasse ShowActivityForm.
Der Screen für die Benutzereinstellungen wird in SettingsMenu nur beispielhaft implementiert, weil für die Testumgebung keine Konfiguration notwendig ist. Im Fehlerfall
kann eine Instanz von BasicAlert angezeigt werden. Vor der Anzeige können ein Fehlertext und ein eigener CommandListener übergeben werden. Bereits vorimplementiert sind die Fälle, in denen nach dem Fehler-Dialog der nächste Screen angezeigt sowie
dass die Anwendung für kritische Fehler beendet wird. Ist Letzteres nicht der Fall, so muss
vor der Anzeige des Dialogs setNextScreen(BasicScreen nextScreen) aufgerufen werden.
Der ModelController erweitert java.lang.Thread, um die Model-Aufrufe in
einem von der GUI getrennten Thread auszuführen. Dabei muss ein Aufruf im GUI-
71
4.2. mobileCRM
Kapitel 4. Design
Thread auf einen Aufruf im Model-Thread abgebildet werden. Der objektorientierte Ansatz ist zunächst, für jeden ModelController-Aufruf im GUI-Thread eine anonyme Klasse
anzulegen, die ModelAction (siehe Quellcode 4.1) erweitert. Dieses sogenannte Command Design Pattern findet sich in [GHJV95] S. 233. Diese Vorgehensweise impliziert
für jede Methode des Models eine weitere Klasse und verstößt damit gegen Prinzipien aus dem Abschnitt Optimierungen für mobile Anwendungen im Grundlagen-Kapitel.
Deswegen wird der Code, um einen Vorgang im Model durchzuführen, in einer HandlerMethode ebenfalls im ModelController implementiert werden. Jede Handler-Methode ist
über eine ID mit der von der GUI aufgerufenen Methode verknüpft. Die ID und ein optionaler Parameter werden in der Handler-Methode gesetzt und in Attributen des ModelControllers gespeichert, und der Model-Thread aufgeweckt, der anhand der ID die zugehörige
Handler-Methode aufrufen kann und dann wieder pausiert. Da der Thread nur eine ModelAnfrage bearbeiten kann, müssen die Aufrufe des ModelControllers serialisiert werden.
Die öffentlichen Methoden sind deshalb als synchronized deklariert. Um das Model
abstrakt zu halten, wurde das Threading und die damit verbundene asynchrone Kommunikation im ModelController im GUI-Package implementiert. Obwohl Model und ModelController die gleichen Methoden für Operationen mit den Model-Komponenten, die
im Interface ModelFacade zusammengefasst sind, implementieren müssen, kann der
ModelController dieses Interface nicht implementieren, da sich die Methodensignaturen
aufgrund der asynchronen Aufrufe unterscheiden.
public interface ModelAction {
void setExecuteParam(Object param);
void execute();
4 }
2
Quellcode 4.1: Interface zur Umsetzung des Command Pattern
4.2.3
Model und Backend-Zugriffe
Im Model von mobileCRM werden die Datensätze repräsentiert, die mit dem SAP-CRMSystem ausgetauscht werden. Neben der Kommunikation mit dem SAP-CRM wird das
Model außerdem noch im RMS des mobilen Endgeräts für den Offline-Modus abgespeichert. Die Model-Schicht besteht aus Klassen für die Datenhaltung und den Datenaustausch mit Backend-Systemen. Diese einzelnen Komponenten werden durch eine einzige Schnittstelle nach dem Facade Design Pattern (siehe [GHJV95] S. 185) nach außen
hin gekapselt, so dass Änderungen an Sub-Komponenten keinen Einfluß auf die View-
72
Kapitel 4. Design
4.2. mobileCRM
Abbildung 4.4: Business Objects in mobileCRM
Komponenten haben. Der Zugriff auf das RMS erfolgt über die Klasse RMSmanager,
die als Singleton implementiert ist und sich im Package com.csc.bb.mobileCRM.model.backend.rms befindet. Die SOAP-Kommunikation mit dem SAP-System
findet über die Schnittstelle der Klasse SAPmanager statt, die alle weiteren Details im
Package com.csc.bb.mobileCRM.model.backend.sap kapselt.
Klassen, die abstrakte Entitäten aus der Anwendungsdomäne enthalten, werden auch
BusinessObjects (BO) genannt. Dabei gibt es im Fall von mobileCRM im Prinzip nur
die Entität einer Aktivität aus dem SAP-CRM. Diese wurde jedoch noch feiner zerlegt,
da dies Vorteile beim Zugriff auf das RMS mit sich bringt. Einen Überblick über die
Schnittstelle der BOs in mobileCRM gibt Abbildung 4.4.
In der Klasse ActivityBO sind dabei alle mit dem SAP ausgetauschten Daten einer Aktivität in Form von Attributen enthalten. Einige Daten, die in mehreren GUIKomponenten benötigt werden, wurden in die Klasse ActivityEntryBO ausgegliedert. Damit die BOs alle serialisierbar sind und die Daten auf Konsistenz überprüft werden
können, ist jedes BO Nachfahre der abstrakten Klasse BasicBO, die eine abstrakte Methode validate() vorsieht, die jedes BO entsprechend implementieren muss. Dadurch
kann jedes BO auf seine Datenkonsistenz hin überprüft werden. Die Serialisierung erfolgt
durch Implementierung der dafür entworfenen Schnittstelle Serializable. Diese wird
vom RMSmanager angesprochen, und ein BO ist dafür verantwortlich, all seine Attribute
in den übergebenen Ein- bzw. Ausgabe-Strom zu serialisieren bzw. wieder zu deseriali-
73
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.5: Komponenten zur Kommunikation mit den Backend-Systemen
sieren.
Für die lokale Speicherung der Daten verwaltet der RMSmanager den Zugriff auf die
RecordStores. Die zugehörige UML-Darstellung findet sich in Abbildung 4.5.
Für die BOs ActivityBO und ActivityEntryBO werden zur Serialisierung mittels RMSmanager zwei unterschiedliche RecordStores verwendet. Das Schreiben einer
Aktivität impliziert gleichzeitig einen neuen ActivityEntryBO-Datensatz, so dass
beide Identifikatoren gleich sind. Um die Liste der Aktivitäten (Screen Nr 2 in Abbildung 4.3) anzuzeigen, müssen so nicht alle ActivityBOs gelesen werden, sondern es ist
ausreichend, nur die ActivityEntryBOs auszulesen, welche deutlich kleiner sind. Weiterhin können in ActivityEntryBO-Datensätzen Verwaltungsinformationen gespeichert werden wie beispielsweise, ob eine gespeicherte Aktivität auf dem Endgerät bereits modifiziert wurde oder noch im Original-Zustand ist. Bei der Synchronisation mit
dem SAP-System müssen so ebenfalls nicht alle ActivityBOs ausgelesen werden. Die öffentliche Schnittstelle sieht Methoden zum Laden, Speichern und Löschen einer Aktivität vor, welche jeweils auch den zugehörigen ActivityEntryBO-Datensatz beachten.
Der direkte Zugriff auf ActivityEntryBO-Einträge ist nur über die Methode loadAllActivityEntries() für die Liste aller Aktivitäten vorgesehen. Um die Datenkonsistenz zu gewährleisten, sind alle öffentlichen Methoden synchronized, so dass
konkurrierende Zugriffe auf das RMS immer seriell ablaufen. Der RMSmanager ist nach
dem Singleton Design Pattern entworfen. Dies spart Referenzen und Delegation zwischen
Model und dem PushReceiver, schränkt die Funktionalität der Klasse jedoch nicht ein, da
74
Kapitel 4. Design
4.2. mobileCRM
auf die RecordStores nicht parallel zugegriffen werden soll.
Während die Anwendung aktiv ist, muss sie selbst auf eingehende Push-Verbindungen
warten. Um Benutzerinteraktionen nicht zu stören, wird diese Funktionalität in einem eigenen Thread umgesetzt. Die Klasse PushReceiver erweitert java.lang.Thread
und nimmt auf dem angegebenen Port blockierend in einer Endlos-Schleife Verbindungen
entgegen. Eine Verbindung wird dann geöffnet und als InputStream an den SAPmanager
übergeben. Das Ergebnis ist ein ActivityBO und wird im RMS abgespeichert.
Die Kommunikation mit dem SAP-XI Web Service findet über die Klasse SAPmanager
statt (siehe Abbildung 4.5). Um eine Instanz zu erzeugen, werden zunächst die URL des
Web Service sowie Benutzername und Passwort für die Authentifizierung beim SAPXI benötigt. Zum Empfangen eines Push-Updates dient die Methode receivePush(InputStream inputStream), die als Parameter die eingehende Verbindung erwartet und ein ActivityBO zurückgibt. Mit der Methode getActivities() erhält man
einen Vector mit allen Aktivitäten des SAP-Systems, die zum Benutzername gehören.
Um eine modifizierte Aktivität zum SAP-CRM zu übermitteln, wird das entsprechende
BO an die Methode updateActivity(ActivityBO activity) übergeben.
4.2.4
Abbildung der Anwendungsfälle
Anhand von Sequenzdiagrammen wird das Zusammenspiel der Komponenten für die in
der Analyse festgelegten Anwendungsfälle verdeutlicht (vgl. 3.1.2).
4.2.4.1
Server-initiiert
• Aktivitätsänderung
Dieser Use-Case bezieht sich auf Änderungen einer Aktivität im SAP-CRMSystem, die durch einen Client wie mobileCRM (siehe Aktivität modifizieren unter
Client-initiierte Anwendungsfälle) oder der SAP-GUI durchgeführt werden. Dieser
Vorgang ist der Auslöser für die Datensynchronisation durch eine Push-Nachricht,
die nachfolgend beschrieben wird.
• Daten synchronisieren
Der in Abbildung 4.6 dargestellte Ablauf beginnt damit, dass der PushReceiver
einen eigenen Thread startet und auf eingehende Push-Verbindungen wartet, die
75
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.6: Sequenzdiagramm zum Anwendungsfall Daten synchronisieren
vom SAP-CRM-System bei Änderungen an Aktivitäten initiiert werden. Die Verbindung wird an den SAPmanager übergeben, wo die ankommenden SOAPDaten gelesen und das Parsing durchgeführt werden. Die resultierende Instanz eines
ActivityBO wird vom PushReceiver im RMS über den RMSmanager abgespeichert. Abschließend wird der erfolgreiche Eingang einer Push-Nachricht über das
AsyncEventHandler-Interface an den ModelController als Event übermittelt, und dem Benutzer wird ein entsprechender Informationsdialog angezeigt.
4.2.4.2
Client-initiiert
• Aktivitäten auflisten
Ausgehend vom Hauptmenü von mobileCRM wird die Methode initData() der
ActivityList-Instanz aufgerufen (siehe Abbildung 4.7). Während der Initialisierung soll der Warte-Screen StatusBar mit der Methode show() angezeigt
werden, zunächst wird jedoch als Folge-Screen die initialisierte ActivityListInstanz gesetzt. Zur Initialisierung werden alle Aktivitätseinträge im RMS benötigt, deren Beschaffung durch Aufruf der Methode getActivityEntries()
des ModelControllers angestoßen wird. Die aufgerufenen Methoden der graphischen Komponenten (MainMenu und ActivityList) beenden sich, und der
Kontrollfluss des GUI-Threads liegt wieder beim LCDUI-Framework. Damit im
ModelController hinterlegt ist, welche GUI-Komponente die Daten angefordert hat,
76
Kapitel 4. Design
4.2. mobileCRM
Abbildung 4.7: Sequenzdiagramm zum Anwendungsfall Aktivitäten auflisten
77
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.8: Sequenzdiagramm zum Anwendungsfall Aktivität anlegen
muss diese zuvor setCaller(this) am ModelController aufrufen. Der angestoßene Worker-Thread arbeitet die Anfrage durch den Aufruf von handleGetActivityEntries() ab. Dabei wird die Aufgabe an das Model und von dort
aus zum RMSmanager delegiert, der alle Aktivitäten als ActivityEntryBOObjekte ausliest und in einem java.util.Vector zurückgibt. Auch in diesem
Fall wird die Statusmeldung des Warte-Screens (StatusBar) wieder vom Model
aktualisiert. Für den Transport der ausgelesenen Daten vom ModelController
(Worker-Thread) zur GUI-Komponente, die das Interface AsyncDataHandler
implementiert, wird die Methode updateData(Object data) genutzt. Abschließend wird der Übergang von StatusBar zum nächsten Screen ActivitList vollzogen.
• Aktivität anlegen
Der Schritt vom Hauptmenü über den Menüeintrag Neue Aktivität anlegen zur graphischen Komponente ShowActivityForm wurde in Abbildung 4.8 zur besseren Übersicht auf die wesentlichen Vorgänge beschränkt. Das Sequenzdiagramm
beginnt an der Stelle, nachdem der Benutzer die entsprechenden Daten eingegeben
hat und die Speicherung der neuen Aktivität veranlasst. Zunächst wird der WarteScreen eingeblendet, bevor dann die eigentliche Speicherung im Model im Thread
78
Kapitel 4. Design
4.2. mobileCRM
des ModelControllers abgearbeitet wird. Wichtig ist dabei, dass das Flag modified
im ActivityBO gesetzt wird, was im Model geschieht. Die Aktivität kann dann
über den RMSmanager gespeichert werden. Danach wird versucht, die Methode
updateActivity erfolgreich aufzurufen, was jedoch nur bei einer Funkverbindung des Endgeräts gelingt. Andernfalls wird die Aktivität beim nächsten Synchronisationsvorgang zum SAP übertragen. An dieser Stelle kommt das modifiedAttribut der Aktivität zum Tragen, woran erkannt wird, dass die Aktivität noch nicht
synchronisiert wurde. Abschließend wird der nächste Screen angezeigt, was in diesem Fall die ActivityList ist.
• Aktivität modifizieren
Dieser Anwendungsfall unterscheidet sich vom vorherigen nur in dem Punkt,
dass zu Beginn die ausgewählte Aktivität in der graphischen Komponente ShowActivityForm dargestellt wird und nicht mit einer leeren Aktivität begonnen
wird. Wie das Laden der Aktivität und das Initialisieren der graphischen Komponente stattfindet, lässt sich im Use-Case Aktivität anzeigen (Abbildung 4.10) nachvollziehen. Der Update-Vorgang ist analog zu dem in Abbildung 4.8.
• Aktivität löschen
Innerhalb der Aktivitätsliste besteht die Option, eine markierte Aktivität zu löschen. Dieser Vorgang ist in Abbildung 4.9 abgebildet und beginnt in der Methode commandAction in der Instanz von ActivityList, der Benutzer hat
also den Menü-Eintrag zum Löschen ausgewählt. Nach dem Vorgang im Model soll wieder die Aktivitätsliste angezeigt werden, weshalb zunächst setNextScreen(this) aufgerufen wird, bevor der StatusBar auf dem Display angezeigt wird. Im Hintergrund wird nun die asynchrone Methode deleteActivity vom ModelController mit der RecordID der zu löschenden Aktivität als Parameter aufgerufen. Nachdem dort der Worker-Thread aufgeweckt
wurde, kehrt der Kontrollfluss des GUI-Threads wieder zurück in die graphische Komponente ActivityList, die ihre graphische Repräsentation anpasst
(nicht in Abbildung dargestellt). Die Methode commandAction() wird verlassen, und Benutzereingaben können so wieder durch das LCDUI-Framework bearbeitet werden, beispielsweise zum Abbrechen des Vorgangs. Während der Bearbeitung im Model kann eine Statusmeldung über die ProgressObserver
Schnittstelle im ModelController mit der Methode updateProgress(int percentage, String status) bis zur GUI propagiert werden. Das
Löschen der Aktivität wird vom Model durch Aufruf der Methode delete-
79
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.9: Sequenzdiagramm zum Anwendungsfall Aktivität löschen
80
Kapitel 4. Design
4.2. mobileCRM
Abbildung 4.10: Sequenzdiagramm zum Anwendungsfall Aktivität anzeigen
Activity(int recordId) der RMSmanager-Instanz veranlasst. Wenn der
Vorgang im Worker-Thread beendet ist, ruft der ModelController die Methode
showNextScreen() des StatusBar auf, was in diesem Fall zur Folge hat, dass
abschließend wieder die aktualisierte Aktivitätsliste angezeigt wird.
• Aktivität anzeigen
Dieser Anwendungsfall knüpft an Aktivitäten auflisten in Abbildung 4.7 an.
Nachdem in der Liste vom Benutzer eine Aktivität ausgewählt wurde, wird
initData() der graphischen Komponente zum Anzeigen einer Aktivität aufgerufen. Damit der asynchrone Datentransfer vom Model zur GUI-Komponente
über das AsyncDataHandler-Interface erfolgen kann, muss sich die Komponente zuerst beim ModelController mit setCaller(this) registrieren.
Danach wird der Aufruf getActivity(activityId) über den ModelCon-
81
4.2. mobileCRM
Kapitel 4. Design
Abbildung 4.11: Sequenzdiagramm zum Anwendungsfall Aktivitätenliste anfordern
troller im Worker-Thread zum Model delegiert. Über die ProgressObserverSchnittstelle im ModelController kann das Model Statusänderungen des Vorgangs
zum Warte-Screen propagieren. Das eigentliche Auslesen der Aktivität wird an den
RMSmanager delegiert, der anhand der activityId den Datensatz aus dem
RMS auslesen kann, und die Daten als ActivityBO-Instanz zurück gibt. Im
Worker-Thread des ModelControllers wird die Aktivität an die aufrufende GUIKomponente mittels updateData übergeben. Abgeschlossen wird der Anwendungsfall durch anzeigen der initialisierten ShowActivityForm-Instanz.
• Aktivitätenliste anfordern
Der in Abbildung 4.11 dargestellte Anwendungsfall beginnt durch Auswahl im
Hauptmenü, und es wird der Warte-Screen angezeigt. Über den Thread des ModelControllers wird die Methode getActivies(status) im Model aufgerufen.
Der Parameter gibt dabei an, welchen Status die zurückgelieferten Aktivitäten haben sollen, beispielsweise open. Der Aufruf wird an den SAPmanager delegiert,
der eine SOAP-Anfrage abschickt, das Parsing der Antwort durchführt und als Resultat einen Vector mit ActivityBO-Instanzen zurückliefert. Diese Aktivitäten
werden im Model einzeln über den RMSmanager lokal abgespeichert. Nachdem
dieser Vorgang beendet ist, wird wieder das Hauptmenü angezeigt.
82
Kapitel 4. Design
4.3. Integrationsszenarien in SAP-XI
Abbildung 4.12: Sequenzdiagramm zum Anwendungsfall Daten synchronisieren
• Daten synchronisieren
Ausgehend vom Hauptmenü können lokal modifizierte Aktivitäten mit dem SAPSystem synchronisiert werden (siehe Abbildung 4.12). Währenddessen wird dem
Benutzer der Warte-Screen angezeigt, und der Vorgang an das Model bzw. den
Worker-Thread delegiert. In der Methode synchronizeActivities() werden zunächst über den RMSmanager alle modifizierten Aktivitäten ausgelesen.
Für jede dieser Aktivitäten wird die Methode updateActivity aufgerufen, in
der die Kommunikation mit dem Web Service auf SAP-Seite stattfindet. Nach erfolgreichem Update einer Aktivität wird im RMS der Status auf unmodified
gesetzt. Der Vorgang wird durch erneute Darstellung des Hauptmenüs abgeschlossen.
4.3
Integrationsszenarien in SAP-XI
Hier werden die Integrationsszenarien und die dazugehörigen Komponenten aus dem
SAP-XI aufgeführt und erläutert. Die Arbeiten zur Integration im SAP-XI wurden durch
den Betreuer (Herrn Thomas Schneider) von Seiten der Firma CSC durchgeführt und
83
4.3. Integrationsszenarien in SAP-XI
Kapitel 4. Design
Abbildung 4.13: Aufbau eines synchronen Integrationsszenarios im SAP-XI
sind nicht Bestandteil dieser Arbeit. Insbesondere die Definition der Schnittstelle zwischen BB-Endgerät und XI sowie die Auswahl der benötigten BAPIs im SAP-CRM sind
in enger Abstimmung mit der Analyse und dem Design der mobilen Anwendung entstanden.
Anwendungsfälle werden im SAP-XI durch Integrationsszenarien abgebildet. Einem Integrationsszenario sind verschiedene Anwendungskomponenten zugeordnet. Diese sind im
SLD zu pflegen, die Komponente von RIM (BES) muss dort aufgenommen werden. Den
einzelnen Anwendungskomponenten werden im Designprozess ein oder mehrere Actions
zugeordnet. Die Anwendungsszenarien für die SAP-BB-Integration definieren jeweils nur
eine Action pro Anwendungskomponente. In den Actions werden die Message-Interfaces
festgelegt, aus denen XI ein WSDL-Dokument generiert. Zwischen den Actions sind die
Mappings definiert, die für die Transformation der eigentlichen Nachrichten notwendig
sind (siehe Abbildung 4.13). Für ein Mapping gibt es in XI zwei Abstraktionsebenen. Zum
einen das Interface Mapping, welches festlegt zwischen welchen Interfaces ein Mapping
stattfinden soll. Und dann das eigentliche Mapping der Nachrichten (Message-Mapping).
Für ein synchrones Interface Mapping wie im Fall der SAP-BB-Integration werden jeweils zwei Message-Mappings benötigt - eins für die Anfrage und eins für die Antwort.
Für die in Abschnitt 3.1.2 beschriebenen Anwendungsfälle sind im SAP-XI die in Tabelle
4.2 dargestellten Integrationsszenarien definiert. Dabei werden die Anwendungsfälle Aktivität anlegen, Aktivität modifizieren und Daten synchronisieren nur auf dem Endgerät
unterschieden, und alle Resultate über das Szenario ChangeActivity an das SAP-System
übermittelt. Die Anwendungsfälle Aktivität anzeigen und Aktivität löschen finden nur lokal im RMS des Endgeräts statt und haben keine Auswirkungen auf das SAP-System.
84
Kapitel 4. Design
4.3. Integrationsszenarien in SAP-XI
In den folgenden Tabellen 4.3, 4.4 und 4.5 wird der Aufbau der drei Integrationsszenarien
beschrieben. Die aus den Szenarien erzeugten WSDL-Dokumente wurden für die Implementierung verwendet und befinden sich im Projektverzeichnis von mobileCRM auf der
CD-ROM zu dieser Arbeit.
Integrationsszenario
ActionPush
ChangeActivity
GetActivityList
Beschreibung
Push einer neuen oder geänderten Aktivität auf das BB-Gerät
Änderung oder Neuanlage einer Aktivität auf dem BB-Gerät
und Update der Daten im SAP-CRM
Holen einer Aktivitätenliste aus dem SAP-CRM
Tabelle 4.2: Übersicht der Integrationsszenarien
85
4.3. Integrationsszenarien in SAP-XI
Kapitel 4. Design
Objekttyp
Objekt
Integrationszenario ActionPush
Action
ActivityPushCRM
Action
ActionPush
Message-Interface
ActionPush_In
RFC-MessageInterface
Message-Typ
ZACTIVITY_PUSH
Message-Typ
ActionPushResponse
RFC-Message-Typ
ZACTIVITY_PUSH
RFC-Message-Typ
ZACTIVITY_PUSH.Response
ActionPushRequestDatatype
Datentyp
Datentyp
ActionPushRequest
Datentyp
ActionPushResponseDatatype
Activity
Interface-Mapping
ActionPushMapping
Message-Mapping
ActionPushRequestMapping
Message-Mapping
ActionPushResponseMapping
Beschreibung
Definiert das Integrationszenario für
die Push Funktionalität von Aktivitäten
Definiert den serverseitig initiierten
Anwendungsfall Pushen einer Aktivität
Definiert den clientseitigen Anwendungsfall Empfangen eines Aktivität
Schnittstelle zwischen SAP-XI und
BB-Endgerät für Push-Nachricht
Schnittstelle zwischen SAP-CRM
und XI um eine Aktivität zu pushen
XSD zur Definition einer Push-Nachricht zum BB-Endgerät
XSD zur Definition der Antwort vom
BB-Server auf einen PushRequest
Request-Datentyp, welcher die Aktivität beinhaltet
Response-Datentyp als Antwort auf
einen Aktivitäts-Push
Datentyp innerhalb einer Push-Nachricht. Beinhaltet den Datentyp Activity
Datentyp eines Response auf eine Push-Nachricht
Kapselt eine Aktivität und wird im
ActionPushRequestDatatype verwendet
Definiert das Mapping vom Ausgangs-Interface ZACTIVITY_PUSH
auf das Ziel-Interface ActionPush_In
Definiert das Mapping des Requests
von der Ausgangs-Nachricht ZACTIVITY_PUSH auf die Ziel-Nachricht
ActionPushRequest
Definiert das Mapping des Responses
von der Ausgangs-Nachricht ActionPushResponse auf die Ziel-Nachricht
ZACTIVITY_PUSH_RESPONSE
Tabelle 4.3: Integrationsszenario ActionPush
86
Kapitel 4. Design
4.3. Integrationsszenarien in SAP-XI
Objekttyp
Objekt
Integrationszenario ChangeActivity
Action
ChangeActivityAction
Action
ChangeActivityActionCRM
Message-Interface
ChangeActivity_Out
RFC-MessageInterface
Message-Typ
CRMXIF_ORDER_SAVE
ChangeActivityRequest
Message-Typ
ChangeActivityResponse
RFC-Message-Typ
CRMXIF_ORDER_SAVE
RFC-Message-Typ
CRMXIF_ORDER_SAVE.Response
Datentyp
ChangeActivityRequestDatatype
ChangeActivityResponseDatatype
Activity
Datentyp
Datentyp
Interface-Mapping
ChangeActivityMapping
Message-Mapping
ChangeActivityRequestMapping
ChangeActivityResponseMapping
Message-Mapping
Beschreibung
Definiert das Szenario für das Erzeugen
und Ändern von Aktivitäten im CRM
Definiert den clientseitig initiierten Anwendungsfall für das Erzeugen und Ändern einer Aktivität
Definiert den serverzeitigen Anwendungsfall für das Verarbeiten einer Aktivitätenänderung oder einer Neuanlage
von einer Aktivität
Schnittstelle zwischen dem Endgerät
und XI für den Dienst ChangeActivity
Schnittstelle zwischen XI und SAPCRM für den Dienst ChangeActivity
XSD zur Definition der RequestNachricht zwischen BB-Endgerät und
XI für das Erzeugen oder Ändern einer
Aktivität
XSD zur Definition der ResponseNachricht vom XI auf einen ChangeActivityRequest
XSD zur Definition der RequestNachricht
zwischen
XI
und
CRM für den RFC-Aufruf CRMXIF_ORDER_SAVE zum Erzeugen und
Ändern einer Aktivität
XSD zur Definition der ResponseNachricht als Antwort auf den RFCAufruf CRMXIF_ORDER_SAVE
Datentyp innerhalb des ChangeActivityRequest. Enthält den Datentyp Activity
Datentyp innerhalb des ChangeActivityResponse
Kapselt eine Aktivität und wird im
ChangeActivityRequestDatatype
verwendet
Definiert das Mapping vom AusgangsInterface ChangeActivity_Out auf das
Ziel-Interface CRMXIF_ORDER_SAVE
Definiert das Mapping des Requests von
der Ausgangs- zur Ziel-Nachricht
Definiert das Mapping des Responses
von der Ausgangs- zur Ziel-Nachricht
Tabelle 4.4: Integrationsszenario ChangeActivity
87
4.3. Integrationsszenarien in SAP-XI
Kapitel 4. Design
Objekttyp
Objekt
Integrationszenario GetActivityList
Action
RequestActivityList
Action
ProvideActivityList
Message-Interface
RequestActivityList_Out
RFC-MessageInterface
Message-Typ
CRM_MY_ACTIVITIES
ActivityListRequest
Message-Typ
ActivityListResponse
RFC-Message-Typ
CRM_MY_ACTIVITIES
RFC-Message-Typ
CRM_MY_ACTIVITIES.Response
Datentyp
ActivityListRequestDatatype
ActivityListResponseDatatype
Datentyp
Datentyp
Activity
Interface-Mapping
ActivityGetList
Message-Mapping
ActivityGetListRequestMapping
ActivityGetListResponseMapping
Message-Mapping
Beschreibung
Definiert das Integrationszenario für das
holen einer Aktivitätenliste
Definiert den clientseitig initiierten Anwendungsfall für das holen einer Aktivitätenliste
Definiert den serverzeitigen Anwendungsfall für das Suchen nach Aktivitäten für einen Anwender
Schnittstelle zwischen dem BB-Endgerät und SAP-XI für den Dienst GetActivityList
Schnittstelle zwischen XI und SAPCRM für den Dienst GetActivityList
XSD zur Definition der Request-Nachricht zwischen BB-Endgerät und XI für
das holen einer Aktivitätenliste
XSD zur Definition der Response-Nachricht vom XI auf einen ActivityListRequest
XSD zur Definition der Request-Nachricht zwischen XI und SAP-CRM für
den RFC-Aufruf CRM_MY_ACTIVITIES zum Holen einer Aktivitätenliste
XSD zur Definition der Response-Nachricht als Antwort auf den RFC-Aufruf
CRM_MY_ACTIVITIES
Datentyp innerhalb des ActivityListRequest
Datentyp innerhalb des ActivityListResponse. Dieser Datentyp beinhaltet eine
Liste von Aktivitäten in Form des Datentyps Activity
Kapselt eine Aktivität und wird im ActivityListResponseDatatype verwendet
Definiert das Mapping vom AusgangsInterface RequestActivityList_Out auf
das Ziel-Interface CRM_MY_ACTIVITIES
Definiert das Mapping des Requests von
der Ausgangs- zur Ziel-Nachricht
Definiert das Mapping des Responses
von der Ausgangs- zur Ziel-Nachricht
Tabelle 4.5: Integrationsszenario GetActivityList
88
Kapitel 5
Implementierung
Ausgewählte Einzelheiten aus der Realisierung des im Design entworfenen Modells von
mobileCRM werden nun besprochen. Zunächst wird kurz auf die Entwicklungswerkzeuge
eingegangen. Danach wird das mittels kSOAP implementierte SOAP-Parsing vorgestellt.
Darauf folgt mit der RMS-Schnittstelle eine weitere Komponente zum Zugriff auf ein
Backend-System. Im Abschnitt Multi-Threading werden die Feinheiten der in mobileCRM zum Einsatz kommenden Threads dargelegt. Probleme bei der Implementierung,
die sich nicht sauber lösen lassen, sind im Abschnitt Workarounds zusammengefasst. Abschließend wird auf die Qualitätssicherung und den Implementierungsaufwand von mobileCRM eingegangen.
5.1
Entwicklungswerkzeuge
Für die Implementierung der mobilen Anwendung mobileCRM kommt die Java-Entwicklungsumgebung Eclipse1 in der Version 3.2 zum Einsatz. Zum Testen der Anwendung
wird das in der Analyse ausgewählte Framework J2ME-Unit verwendet, ebenso wie das
Logging-Framework Microlog. Die Definition von Namenskonventionen und eine statische Code-Analyse wird mit dem Eclipse-Plugin Checkstyle 2 durchgeführt. Inhaltlich
geht das Unterkapitel Qualitätssicherung (Abschnitt 5.7) näher auf die Unit-Tests, einen
Styleguide und Software-Metriken ein.
Das Eclipse-Plugin Eclipse-ME 3 (Version 1.5.5) erleichtert die Entwicklung mit J2ME.
Es bietet Unterstützung für das Wireless Toolkit von Sun und bindet daraus den Emu1
http://www.eclipse.org
http://eclipse-cs.sourceforge.net
3
http://eclipseme.org
2
89
5.1. Entwicklungswerkzeuge
Kapitel 5. Implementierung
lator und die Bibliotheken in ein J2ME-Projekt ein. Der Build- und Packaging-Prozess
einer mobilen Anwendung, resultierend in einem JAD und einem JAR, kann durch ein
von Eclipse-ME generiertes Ant-Skript automatisiert und konfiguriert werden. Die Erweiterbarkeit der Skripte wird ausgenutzt, um aus einer MIDlet-Suite gemäß MIDP eine Blackberry-spezifische Anwendung zu generieren. Der Codeausschnitt dazu findet
sich in Quellcode-Listing 5.1. Das Programm zur Konvertierung ist Bestandteil der JDEEntwicklungsumgebung von RIM, und wird über das Ant-Skript parametrisiert.
2
4
6
8
10
<target name="makecod"
description="Builds a .cod file for BlackBerry devices from .jar + .jad">
<mkdir dir="${bb.cod.output}"/>
<exec dir="${bb.cod.output}" executable="${bb.jde.bin}\\rapc.exe">
<arg line=" import=${bb.jde.libs}"/>
<arg line=" codename=${midlet.name}"/>
<arg line=" -midlet ../${midlet.name}.jad ../${midlet.name}.jar"/>
</exec>
<copy file="${basedir}/packaging/mobileCRM.alx" todir="${bb.cod.output}"/>
</target>
Quellcode 5.1: build.xml: Target makecod
Durch die bei mobilen Endgeräten typischerweise beschränkte Hardwareleistung spielen Performance-Optimierungen bei mobilen Anwendungen eine wichtige Rolle, so dass
dieser Punkt bereits in Analyse und Design beachtet wurde. Die Optimierungsmöglichenkeiten wurden im Grundlagenabschnitt 2.4.3.6 erläutert. Als Obfuscator bietet sich die
Benutzung von ProGuard1 an, der sich in EclipseME integrieren lässt. Die prinzipielle
Funktionsweise lässt sich in der Dokumentation des Projekts nachlesen. Für mobileCRM
und die zugehörige Testsuite kommen die in Quellcode-Listing 5.2 dargestellten zusätzlichen Parameter für ProGuard zum Einsatz.
-keepnames class *
2 -allowaccessmodification
Quellcode 5.2: Parameter für den Obfuscator ProGuard
Standardmäßig werden Klassennamen von ProGuard verkürzt, zur Erschwerung von
Reverse-Engineering und zur Reduzierung der Applikationsgröße. Dies ist im Fall von
mobileCRM unerwünscht, da die Implementierung von Logging und Internationalisierung auf den ursprünglichen Klassennamen basiert, und wird durch den ersten Parameter verhindert. Der Parameter -defaultpackage ” wurde aus der StandardKonfiguration von EclipseME entfernt, damit die Package-Struktur im JAR erhalten
1
http://proguard.sourceforge.net/
90
Kapitel 5. Implementierung
5.2. SOAP-Parsing
bleibt. Dies ist für das Auffinden der Ressourcen-Dateien notwendig. Mit dem zweiten
Parameter wird ProGuard erlaubt die Access-Modifier innerhalb von Klassen zu ändern.
Dadurch können beispielsweise Attribute als public deklariert werden und Methoden
können dann inline implementiert werden. Der Methodenaufruf entfällt also, und der
Rumpf der Methode wird an die jeweilige Stelle des Aufrufs kopiert, was insbesondere bei trivialen Get- und Set-Methoden sinnvoll ist.
Eine weitere Möglichkeit, um die Performance zu verbessern, bietet sich durch das
Verwenden von Präprozessor-Direktiven. EclipseME unterstützt diese Funktion erst seit
kurzem, und kommt im Rahmen von mobileCRM daher nicht zum Einsatz. Die Direktiven sind in Java-Kommentaren untergebracht, um den Code kompatibel zu halten, so dass er auch ohne Präprozessor compilierbar ist. Durch Einsatz von Preprocessing kann in bestimmten Situationen überflüssiger Code entfernt werden. So ließe sich
für eine Release-Version sämtlicher Debugging- und Logging-Code entfernen, und auch
Endgerät-spezifische Implementierungen realisieren (siehe z.B. Abschnitt Workarounds).
In mobileCRM wird dies zumindest teilweise dadurch erreicht, dass das Logging an zentraler Stelle deaktiviert werden kann.
5.2
SOAP-Parsing
Das SOAP-Parsing ist im Package com.csc.bb.mobileCRM.model.backend.sap vollständig gekapselt, und ist für alle anderen Komponenten transparent. Für jeden komplexen XML-Datentyp innerhalb der verwendeten SOAP-Nachrichten (siehe
Message-Typen in den Tabellen 4.3, 4.4 und 4.5) gibt es eine gleichnamige Klasse, die
für die (De-)Serialisierung zuständig ist. Dafür wird das KvmSerializable-Interface
verwendet, das in den Grundlagen in Abschnitt 2.4.3.5 besprochen wurde. Der Aufbau
der fünf verschiedenen SOAP-Nachrichten-Typen ist in Abbildung 5.1 dargestellt. Dabei
wird der Zusammenhang zwischen konkreten Instanzen der Klassen aufgezeigt, ähnlich
wie es durch die XML-Schema-Definition auf XML-Ebene ausgedrückt wird. Eine PushNachricht stellt eine Besonderheit dar, aus Sicht des SAP-XI handelt es sich um eine
Push-Anfrage an das Endgerät, weshalb die Benennung des Message-Typs als Request
generiert wird. Die Implementierung auf dem BB verarbeitet die Verbindung jedoch als
Antwort, und der Payload ist eine Aktivität.
Das SOAP-Parsing wird vom Model aus über die Schnittstelle der Klasse SAPmanager
(siehe Abschnitt 4.2.3) durchgeführt. Die Vorgehensweise beim Parsing ist anhand der
Methode reveivePush in Quellcode-Listing 5.3 dargestellt. Zunächst müssen die
91
5.3. RMS-Schnittstelle
Kapitel 5. Implementierung
Abbildung 5.1: Aufbau der verschiedenen Nachrichtentypen
Klassen zum (De-)serialisieren der verwendeten Datentypen mit den entsprechenden
XML-Elementen assoziiert werden (Mapping). In kSOAP wird mit der Methode call eine SOAP-Anfrage gesendet und die entsprechende Antwort empfangen, jeweils inklusive
dem SOAP-Parsing. Für das Lesen und Parsing der empfangenen Push-Nachricht wurde
der entsprechende Code aus der Methode call in die Methode receive ausgelagert,
so dass er auch ohne eine Anfrage benutzt werden kann. Nach erfolgreichem Parsing kann
auf die erzeugten Objekte über das KvmSerializable-Interface des Resultats mit der
Methode getProperty zugegriffen werden.
Die Schnittstellen aus MIDP und CLDC stellen keine Möglichkeit zum Abfragen des
aktuellen Funkverbindungsstatus zur Verfügung. Dies wäre für die Methode updateActivity jedoch wünschenswert, um die Methode im Offline-Zustand des Endgeräts
direkt verlassen zu können, statt auf eine Timeout-Rückmeldung des Betriebssystems
warten zu müssen. Für BB-Geräte gibt es eine herstellerspezifische Lösung über die Klasse net.rim.device.api.system.RadioInfo, die eine Anwendung jedoch nur
verwenden kann, wenn sie mit einem kostenpflichtigen Lizenzschlüssel von RIM signiert
ist.
5.3
RMS-Schnittstelle
Die Schnittstelle des RMSmanager wurde im Design schon vorgestellt (siehe Abschnitt
4.2.3). Die MIDP-API für den Zugriff auf RecordStores wurde im Grundlagenteil 2.4.3.4
beschrieben. In Quellcode-Listing 5.4 wird beispielhaft eine der Methoden des RMSma-
92
Kapitel 5. Implementierung
2
5.3. RMS-Schnittstelle
public ActivityBO receivePush(final InputStream inputStream)
throws ApplicationException {
4
final SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
6
// add mappings for complex custom types
envelope.addMapping("http://csc.com/bbsap",
"ActionPushRequest",
new ActionPushRequest().getClass());
envelope.addMapping("http://csc.com/bbsap",
"Activity", new Activity().getClass());
8
10
12
14
// needs not to be initialized with URL,
// because only a Push is received here (no request)
final HttpTransport http = new HttpTransport(null);
16
18
try {
http.receive(inputStream, envelope);
} catch (final IOException e) {
// ... Fehlerbehandlung
}
Object result = envelope.bodyIn;
20
22
24
// get ActivityBO
result = ((ActionPushRequest) result).getProperty(0);
26
28
return (ActivityBO) result;
}
Quellcode 5.3: SAPmanager.java: Methode receivePush
nagers dargestellt. Die Instanzen m_byteOut und m_out der Streaming-Klassen werden von allen Methoden des RMSmanagers wiederverwendet und nach Benutzung lediglich geschlossen. Für InputStream-Instanzen lässt sich diese Optimierung nicht vornehmen. Beim Speichern eines ActivityEntryBO muss unterschieden werden, ob es
sich um einen neuen Datensatz handelt (ID ist -1). In dem Fall muss die nächste zu vergebende ID des RecordStores erfragt werden und im BO gespeichert werden, bevor es dann
serialisiert und mit der RMS-Methode addRecord abgespeichert werden kann. Existiert
der Datensatz bereits, so wird der alte mit der RMS-Methode setRecord überschrieben. Wichtig ist, dass der zu Beginn geöffnete RecordStore immer vor dem Beenden der
Methode wieder geschlossen wird, was durch den finally-Block sichergestellt wird.
Anderenfalls bleiben die Deskriptoren für den RecordStore geöffnet, auch nach beenden
des MIDlets.
Die lesenden Methoden des RMSmanager benutzen einen gemeinsamen Puffer zum Einlesen, welcher mit der Methode assertBufferSize(int size) auf die benötigte
Größe des zu lesenden Datensatzes angepasst ist. Dies spart CPU-Leistung, da nicht für
jede Operation erneut ein Puffer allokiert wird. Bei Datensätzen, deren Größe stark variiert, kann dies zu erhöhtem Speicherverbrauch führen, da der Puffer sich nicht mehr
93
5.4. Multi-Threading
Kapitel 5. Implementierung
1 // ...
private static final String ACTIVITY_ENTRY_STORE = "ActivityEntries";
3 private ByteArrayOutputStream m_byteOut;
private DataOutputStream m_out;
5
private void saveActivityEntry(final ActivityEntryBO activityEntry)
7
throws RecordStoreException{
9
final boolean createIfNecessary = true;
RecordStore rs = null;
11
try {
rs = RecordStore.openRecordStore(ACTIVITY_ENTRY_STORE,
createIfNecessary);
13
15
if (activityEntry.getRecordId() == -1) {
// new record, set id before serialize
activityEntry.setRecordId(rs.getNextRecordID());
activityEntry.serialize(m_out);
final byte[] data = m_byteOut.toByteArray();
// create new record
rs.addRecord(data, 0, data.length);
} else {
activityEntry.serialize(m_out);
final byte[] data = m_byteOut.toByteArray();
// record update
rs.setRecord(activityEntry.getRecordId(), data, 0, data.length);
}
m_byteOut.reset();
} catch (RecordStoreException e) {
throw e;
} finally {
if (rs != null) {
rs.closeRecordStore();
}
}
17
19
21
23
25
27
29
31
33
35
37 }
Quellcode 5.4: RMSmanager.java: Methode saveActivityEntry
verkleinert. Bei Aktivitäten sind die Attribute jedoch statisch vorgegeben, so dass die
Datensatz-Größe nicht stark streut. Dadurch entstehen bei der Wiederverwendung des
Puffers in diesem Fall keine Nachteile.
5.4 Multi-Threading
Im Design-Kapitel wurden bereits die drei in mobileCRM verwendeten Threads entworfen. Der Hauptstrang (GUI-Thread) ist für die Darstellung der graphischen Komponenten
im Package com.csc.bb.mobileCRM.gui zuständig. Die Schnittstelle zum Model,
der ModelController, führt lang andauernde Vorgänge im Model in einem anderen
Thread (Worker-Thread) aus, so dass die Benutzerschnittstelle nicht blockiert. Um PushNachrichten empfangen zu können existiert ein weiterer Thread (Push-Thread), der ein-
94
Kapitel 5. Implementierung
5.4. Multi-Threading
gehende Push-Verbindungen annimmt und abarbeitet. Im folgenden Abschnitt wird näher
auf die Threads im Hintergrund eingegangen, da der Hauptstrang keine Besonderheiten
aufweist, die an dieser Stelle betrachtet werden müssen.
5.4.1
Worker-Thread
Der ModelController erweitert java.lang.Thread und bietet die Funktionalität der Methoden im Interface ModelFacade. Da der ModelController jedoch
für asynchrone Aufrufe gedacht ist, und das Model für synchrone, unterscheiden sich
die Methoden-Signaturen, so dass der Zusammenhang nicht durch class ModelController implements ModelFacade ausgedrückt werden kann. Auf eine
weitere Schnittstelle, die AsyncModelFacade heissen könnte, wurde an dieser Stelle
verzichtet, um die Anwendung so schlank wie möglich zu halten. Die öffentlichen Methoden des ModelControllers, die mit der Ausführung im Worker-Thread zu tun haben,
sind alle durch das Keyword synchronized vor konkurrierenden Zugriffen geschützt.
So ist sichergestellt, dass im Model durchzuführende Vorgänge durch den Worker-Thread
seriell abgearbeitet werden. Deadlocks können dabei nicht entstehen, da jeder Vorgang
im ModelController unabhängig von anderen Vorgängen ist und irgendwann terminiert.
Am Beispiel der Methode getActivity() wird die Funktionsweise des ModelControllers näher erläutert. Die Implementierung für den asynchronen Aufruf aus der GUISchicht findet sich in Quellcode-Listing 5.5.
1 public synchronized void getActivity(final Integer recordId) {
m_action = GET_ACTIVITY;
3
m_param = recordId;
notifyAll();
5 }
Quellcode 5.5: ModelController.java: Methode getActivity
Über das Attribut m_action wird dem Worker-Thread über eine ID mitgeteilt, welche
Methode im Model aufzurufen ist. Ein optionaler Parameter vom Typ Object kann an
das Attribut m_param zugewiesen werden - in diesem Fall die RecordID der auszulesenden Aktivität. Nun wird mit notifyAll() der schlafende Worker-Thread aufgeweckt,
andere Threads warten nicht auf die ModelController-Instanz. Der Worker-Thread führt
die Methode run() des ModelControllers aus. Dort wird in einer Endlos-Schleife je Zyklus ein Vorgang im Model durchgeführt, und der Thread wartet bis zum nächsten Aufruf.
95
5.4. Multi-Threading
Kapitel 5. Implementierung
1 private void handleGetActivity(final Integer recordId) {
try {
3
ActivityBO activity = m_model.getActivity(recordId.intValue());
m_caller.updateData(activity);
5
m_statusBar.showNextScreen();
} catch (ApplicationException e) {
7
// ... error handling
}
9 }
Quellcode 5.6: ModelController.java: Methode handleGetActivity
1 public void stop() {
m_stopped = true;
3
m_instance = null;
try {
5
synchronized (this) {
notifyAll();
7
}
} catch (final IllegalMonitorStateException e) {
9
// Worker-Thread arbeitet gerade
// und beendet sich danach
11
}
m_model.stopPushReceiver();
13 }
Quellcode 5.7: ModelController.java: Methode stop
Anhand der ID in m_action wird in run() die zugehörige Handler-Methode aufgerufen, die in Quellcode-Listing 5.6 dargestellt ist.
Die Aufgabe wird an das Model delegiert, und der Rückgabewert ist eine ActivityBOInstanz. Über die Schnittstelle AsyncDataHandler wird das Business Object an
die aufrufende GUI-Komponente übergeben. Dies setzt voraus, dass diese vor dem
Auruf von getActivity zunächst beim ModelController mittels setCaller(AsyncDataHandler caller) registriert wird. Als Abschluß eines Vorgangs wird
der Folge-Screen des StatusBar angezeigt.
Zum Beenden des Worker-Threads (siehe Quellcode-Listing 5.7) wird die Abbruchbedingung der Schleife in run() erfüllt, und der Worker-Thread aufgeweckt, so dass die
Methode verlassen wird und der Thread sich beendet. Wenn der Worker-Thread gerade
aktiv ist, beendet er sich erst nach Abschluß des Vorgangs im Model. Der Push-Receiver
im Model wird auch durch den ModelController beendet.
96
Kapitel 5. Implementierung
5.4. Multi-Threading
1 public void run() {
// ...
3
try {
m_connection = (StreamConnectionNotifier) Connector.open(m_pushUrl);
5
} catch (IOException e1) {
m_errorHandler.reportError(e1);
7
}
9
while (!m_stopped) {
try {
m_blocking = true;
// wait for Push connection
streamConnection = m_connection.acceptAndOpen();
// connection should NOT be closed by stop()
// while receiving data
m_blocking = false;
inputStream = streamConnection.openInputStream();
11
13
15
17
19
// parse SOAP message
final ActivityBO activity = m_sapManager.receivePush(inputStream);
21
// save activity in RMS
RMSmanager.getInstance().saveActivity(activity);
23
25
streamConnection.close();
}
// ... error handling
27
}
29 }
Quellcode 5.8: PushReceiver.java: Methode run
5.4.2
Push-Thread
Der Thread zum Empfangen neuer Push-Nachrichten ist in der Klasse PushReceiver
implementiert. Die Methode run() ist entsprechend überschrieben und ist in QuellcodeListing 5.8 dargestellt.
Zunächst wird ein Connection-Objekt erzeugt, das auf eingehende Verbindungen wartet. Dabei wird die Art des Protokolls und der Port in Form einer URL angegeben. Die
BB-Endgeräte benötigen für TCP-Verbindungen auf Port 8888 die URL http://8888,
während es beim Emulator von Sun socket://8888 ist. Die MIDP Spezifikation
schreibt nicht vor, welche Protokolle auf einem Endgerät für eingehende Verbindungen
unterstützt werden müssen. Nachdem das Connection-Objekt vorhanden ist, werden in
einer Endlosschleife Verbindungen entgegen genommen und verarbeitet, bis der Thread
beendet werden soll. Mit der Methode acceptAndOpen() wartet das ConnectionObjekt blockierend auf eine eingehende Verbindung. Die Methode kehrt zurück, wenn eine Push-Verbindung aufgebaut ist. Für die weitere Verarbeitung wird der InputStream
des Connection-Objekts zum Einlesen und Deserialisieren der SOAP-Nachricht an den
SOAP Parser (SAPmanager) übergeben. Das resultierende ActivityBO-Objekt wird
97
5.5. Logging und Internationalisierung
Kapitel 5. Implementierung
im RMS gespeichert, und der Datenstrom geschlossen. Falls die Abbruchbedingung nicht
gesetzt wurde, wird dann auf weitere Push-Verbindungen gewartet.
Die Methode stop() (siehe Quellcode-Listing 5.9) zum Beenden des Push-Threads
setzt die Abbruchbedingung auf true, und falls der Thread gerade beim Warten auf
Push-Verbindungen blockiert, wird noch die Connection-Instanz durch close() geschlossen. Dadurch kehrt acceptAndOpen() zurück, und run() wird in jedem Fall
beendet.
1 public void stop() {
Log.info(this, "stopping");
3
m_stopped = true;
if(m_blocking) {
5
// interrupt blocking operations
try {
7
m_connection.close();
} catch (IOException e) {
9
// ...
}
11
}
}
Quellcode 5.9: PushReceiver.java: Methode stop
5.5 Logging und Internationalisierung
J2ME stellt für die Internationalisierung von Anwendungen keine API zur Verfügung.
Um die Daten getrennt vom Code zu halten, bieten sich Key-Value-Paare in Form von
Property-Dateien an, wie sie in J2SE bekannt sind. Für jede Sprache wird dabei eine eigene Datei angelegt, in der der Key ein Bezeichner für eine Ressource wie beispielsweise
die Beschriftung einer Titelleiste ist, und der Wert die zugehörige Beschriftung in der entsprechenden Sprache. Ein Überblick der Klassenhierarchie für Internationalisierung und
Logging findet sich in Abbildung 5.2.
Die Dateien werden im JAR der Anwendung hinterlegt, worauf dann mit der generisch
gehaltenen Klasse PropertyFileReader zugegriffen werden kann - J2ME stellt auch
diese Funktion nicht standardmäßig bereit. Mit der statischen Klasse I18nResources
werden die Konventionen für Dateipfade und -namen der der Sprachdateien sowie für
die Bezeichnung der Ressourcen festgelegt. Die Sprachdateien liegen innerhalb des JARs
in /resources/i18n/ und tragen als Dateinamen die Sprachkennung nach ISO 639
Code mit der zusätzlichen Endung .property, also beispielsweise de.property für
98
Kapitel 5. Implementierung
5.5. Logging und Internationalisierung
Abbildung 5.2: Klassen für Internationalisierung und Logging
die deutsche Sprache. Auf die Sprachkennung kann innerhalb J2ME über die SystemProperty microedition.locale zugegriffen werden. Das WirelessToolkit von Sun
benutzt dabei RFC 4646 (z.B. de-DE), während die BB-Endgeräte die Kennung nach ISO
639 (z.B. de) verwenden. Da aus dem String nach RFC 4646 der Code gemäß ISO 639 extrahiert werden kann, wurde dieser als kleinster gemeinsamer Nenner für die Sprachkennung gewählt, die die Methode loadResources(String locale) erwartet. Die
entsprechende Property-Datei wird eingelesen, und die Key-Value-Paare werden in einer
Hashtable-Instanz gehalten. Der Bezeichner einer Ressource beginnt mit dem Klassennamen in dem die Ressource benötigt wird und einem frei definierbaren Folge-String,
der mit einem Punkt abgetrennt ist. Zum Abrufen einer Ressource aus der Hashtable wird
die Methode getString(Object obj, String resource) bereitgestellt, wobei obj das Objekt ist, das die Ressource anfragt, und resource der Folge-String. Soll
die Methode innerhalb einer statischen Methode aufgerufen werden, so kann statt dem
Objekt auch eine Instanz der Klasse Class übergeben werden. Da die Umwandlung einer
Objekt- oder Class-Instanz in den Klassennamen allgemeingültig ist und auch für das
Logging benötigt wird, wurde diese Funktion in die Klasse StringUtils ausgelagert.
Ein typischer Aufruf der Methode innerhalb des Hauptmenüs MainMenu könnte also folgendermaßen aussehen: I18nResources.getString(this, "title"). Dabei
wird aus der entsprechenden Sprachdatei bzw. der Hashtable der Wert für den Key Main-
99
5.6. Workarounds
Kapitel 5. Implementierung
Menu.title ausgelesen.
Für das Logging wird die in der Analyse ausgewählte Bibliothek Microlog (siehe Abschnitt 3.4.4) verwendet. Um den kompletten Code der mobilen Anwendung nicht von
den Microlog-Klassen abhängig zu machen, wird eine eigene Wrapper-Klasse Log eingeführt, die intern Microlog verwendet. Die Methoden sind an die Microlog-API angelehnt.
Eine Priorisierung der Meldungen erfolgt somit über die Methoden error(), info()
und debug(). Jedoch wird zusätzlich zur zu loggenden Nachricht noch der Klassenname mit geloggt, in der die Meldung verursacht wurde. Weiterhin sind optionale Informationen wie die Zeit der Nachrichtenausgabe in Millisekunden und Informationen zum
ausführenden Thread zuschaltbar. Damit die Meldungen aufgrund des Multithreadings
sich nicht gegenseitig beeinträchtigen, sind alle Logging-Methoden synchronized.
5.6
Workarounds
In diesem Abschnitt werden implementierungsspezifische Probleme besprochen, die im
Zusammenhang mit der Hersteller-Implementierung von MIDP stehen.
5.6.1
javax.microedition.midlet.MIDlet
Die Spezifikation der MIDP-API sieht innerhalb der Methode startApp() vor, dass
im schweren Fehlerfall notifyDestroyed() aufgerufen wird, um das MIDlet zu beenden. Handelt es sich nur um einen temporären Fehler, der beim nächsten Start der Anwendung möglicherweise nicht mehr auftritt, so soll stattdessen eine MIDletStateChangeException geworfen werden. Der Codeausschnitt in Quellcode-Listing 5.10
führt auf dem BB-Endgerät und dem Simulator zu einer Ausnahme in der Implementierung des Herstellers.
2
protected void startApp() throws MIDletStateChangeException {
notifyDestroyed();
}
Quellcode 5.10: Bug in Klasse MIDlet
Anhand einer minimalen Testanwendung (MIDlet_Destroy_Bug) kann der Fehler nachvollzogen werden. Die entsprechende Log-Ausgabe des Endgeräts findet sich in Quellcodelisting 5.11. Erwähnt sei an dieser Stelle noch, dass dieser Fehler mit der Referenzimplementierung im Emulator von Sun (Bestandteil des WTK) nicht auftritt.
100
Kapitel 5. Implementierung
5.6. Workarounds
1 Started mobileCRM(101)
Foreground mobileCRM(100)
3 START_APP
END_APP
5 Foreground net_rim_bb_ribbon_app(63)
Exit mobileCRM(100)
7 RuntimeException
java.lang.NullPointerException
9 net_rim_cldc-2
MIDletMain
11 <private>
0x7042
Quellcode 5.11: Log-Ausgabe der Testanwendung MIDlet_Destroy_Bug
Als Workaround für dieses Problem wird in mobileCRM bei schwerwiegenden Fehlern innerhalb von startApp() stattdessen immer eine MIDletStateChangeException geworfen. Dadurch wird die Anwendung ebenso beendet, der oben beschriebene Fehler tritt jedoch nicht auf.
5.6.2
javax.microedition.lcdui.Gauge
Mit der Klasse Gauge kann dem Benutzer ein Fortschritt angezeigt werden. Dabei kann
unterschieden werden, ob der Vorgang definierte Einzelschritte hat oder nicht, und ob
die Anwendung gerade aktiv ist oder sich in einem Wartezustand befindet. Der Codeausschnitt in Quellcode-Listing 5.12 initialisiert die Darstellung für einen Vorgang mit
undefiniert vielen Einzelschritten in einem arbeitenden Zustand. Die Darstellung auf dem
Endgerät ist meist als drehende Sanduhr realisiert, während definierte Einzelschritte als
Fortschrittsbalken dargestellt werden. Sobald der Konstruktor mit den beschriebenen Parametern aufgerufen wird, ist die CPU des Rechners ausgelastet, auf dem der Emulator
läuft. Beim Emulator des WTK ist dies nicht der Fall. Auf dem Endgerät kann darüber keine Aussage getroffen werden, da es keine Überwachungsmöglichkeit gibt, jedoch scheint
der Fehler dort nicht aufzutreten, die Benutzbarkeit der Anwendung ist im Gegensatz zum
Emulator nicht eingeschränkt. Als Workaround für den Simulator kann die Erzeugung der
Gauge-Instanz auskommentiert werden, was lediglich eine graphische Einbuße ist und
die Funktion der Anwendung nicht beeinträchtigt.
Gauge gauge = new Gauge("test", false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING);
Quellcode 5.12: Bug in Klasse Gauge
101
5.6. Workarounds
5.6.3
Kapitel 5. Implementierung
Statische PushRegistry-Verbindungen im JAD
Verbindungen, die für die Funktion eines MIDlets zwingend und dauerhaft erforderlich
sind, können nach der MIDP-Spezifikation statisch über einen Eintrag im JAD registriert
werden (siehe [MW06] Seite 89). Das BlackBerry-Endgerät (7100v) bricht die Installation einer MIDlet-Suite jedoch nicht spezifikationsgemäß ab, wenn der zu registrierende
Port bereits von einer anderen Applikation verwendet wird. Schwerwiegender ist jedoch
das Problem, dass die AMS die statische Registrierung entfernt, falls die Anwendung auf
dem registrierten Port eine Server-Verbindung öffnet, ohne dass eine eingehende PushVerbindung verfügbar ist. Eine erneute Registrierung ist nicht möglich, wenn das statische
Registrierungsverfahren über den JAD genutzt wurde. Das Entfernen von statischen Einträgen ist in der Spezifikation nicht vorgesehen und nach [Sch04] S. 223 nicht möglich.
Wenn das entsprechende MIDlet gestartet ist, nimmt die AMS laut MIDP keine PushVerbindungen mehr für die Anwendung entgegen, so dass an dieser Stelle das Öffnen einer Server-Verbindung notwendig ist. Dieses Problem kann umgangen werden, indem die
Verbindung für Push-Nachrichten dynamisch registriert wird. Der Nachteil der dabei entsteht ist, dass die Anwendung einmalig gestartet werden muss, bevor Push-Nachrichten
empfangen werden können.
5.6.4
Initialisierung von statischen Attributen
Ein ClassLoader in Java ist dafür verantwortlich, die zur Ausführung benötigten Klassen einzulesen. Dabei werden auch statische Attribute der zu ladenden Klassen initialisiert. Nach dem Beenden einer Anwendung auf einem mobilen Endgerät würde man
möglicherweise erwarten, dass die statischen Variablen oder gar der gesamte Classloader von der Garbage-Collection aus dem Speicher entfernt werden. Bei den Implementierungen des BB-Endgeräts und des BB-Simulators ist dies jedoch nicht der Fall, bei
erneutem Starten einer Anwendung sind die Variablen noch mit den vormaligen Werten
initialisiert. Als minimale Testanwendung dient ein MIDlet mit einem statischen Zähler
vom Typ int. Um Fehler zu umgehen, werden statische Variablen, insbesondere bei den
Singleton-Klassen, vor Beenden der Anwendung zurückgesetzt, so dass die Variablen
sauber hinterlassen werden, und die dann nicht mehr referenzierten Instanzen entfernt
werden können.
102
Kapitel 5. Implementierung
5.7
5.7.1
5.7. Qualitätssicherung
Qualitätssicherung
Styleguide
Mit dem bereits erwähnten Eclipse-Plugin Checkstyle (siehe Abschnitt 5.1) wird der
Quellcode von mobileCRM anhand von Regeln überprüft. Diese werden durch ein XMLDokument spezifiziert (checkstyle-config.xml), das auch über den Konfigurationsdialog in Eclipse erstellt werden kann. Neben der Benutzung der parametrisierbaren
Standard-Module gibt es auch die Möglichkeit, eigene Checkstyle-Module zu entwickeln.
Im Folgenden werden nur einige ausgewählte Regeln beschrieben, die nicht Bestandteil
der üblichen Java-Konventionen sind:
• Attribute beginnen mit dem Präfix m_ (von Member-Variable), um Attribute von
lokalen Variablen optisch unterscheiden zu können, und um Shadowing zu vermeiden, also das Scope-bedingte Verdecken von Variablen mit gleichem Namen.
• Die Basisklasse Exception und RuntimeException sollten nicht in catchBlöcken verwendet werden (bzw. nur an bestimmten Stellen). Hintergrund ist,
dass mehrere zu fangende Exception-Typen nicht nur einen einzigen catchBlock gefangen werden sollen, da dort beispielsweise auch Nullpointer- und
OutOfMemoryExceptions gefangen würden.
• Die Verschachtelung von try-Blöcken ist nicht zugelassen, bei if maximal bis
zu einer Tiefe von 2. Dies verbessert die Wartbarkeit des Codes und verringert die
Fehleranfälligkeit.
• Referenzen, die nicht modifiziert werden, sollten als final deklariert werden. Dadurch kann die JVM Optimierungen bei der Ausführung vornehmen.
• Klassen mit ausschließlich statischen Methoden sollten Konstruktoren als private deklarieren. Die nicht zweckgemäße Instanziierung solcher Klassen ist somit
unterbunden.
Alle weiteren Regeln können der Konfiguration von Checkstyle entnommen werden. In
der Summe tragen sie zu einem einheitlichen, konsistenten Programmierstil bei, und helfen Programmierfehler zu vermeiden sowie Best-Practices durchzusetzen.
103
5.7. Qualitätssicherung
Kapitel 5. Implementierung
Abbildung 5.3: Kiviat-Graph der Metriken von mobileCRM
5.7.2
Software-Metriken
Die Kenngrößen einer statischen Codeanalyse wurden mit dem Werkzeug SourceMonitor1 ermittelt. Die wichtigsten Kenngrößen sind in Abbildung 5.3 dargestellt. Alle weiteren Messwerte finden sich auf der CD-ROM zu dieser Arbeit. Dabei ist zu sagen, dass die
Komplexität, Anzahl der Statements in einer Methode und vergleichbare Messgrößen erhöht sind. Dies ist darauf zurückzuführen, dass bestimmte Vorgänge mit allen Attributen
einer Aktivität durchzuführen sind. Das Aufsplitten dieser Methoden wäre semantisch
jedoch nicht sinnvoll und würde die Fehleranfälligkeit des Codes auch tendenziell eher
vergrößern.
5.7.3
Automatisierte Tests
Die Durchführung automatisierter Tests mit dem bereits angesprochenen J2MEUnitFramework (Abschnitt 3.4.4) beschränkt sich auf die Model-Schicht, da die GUI nur manuell getestet werden kann. Die Unit-Tests sind als eigenes Projekt (mobileCRMtestsuite)
angelegt, mit Abhängigkeiten zu mobileCRM und der kSOAP-Bibliothek. Dies hält die
1
http://www.campwoodsw.com/sourcemonitor.html
104
Kapitel 5. Implementierung
5.8. Implementierungsaufwand
Datei
MobileCrmMIDlet.java
Lines Of Code
249
Tabelle 5.1: LOC des Package com.csc.bb.mobileCRM
Build-Prozesse der einzelnen Projekte übersichtlicher.
Die wichtigsten Komponenten im Model sind der RMSmanager und der SAPmanager,
in denen die eigentliche Datenverarbeitung stattfindet. Für diese Komponenten wurden
Tests angelegt, die mit lokalen Datenströmen arbeiten, damit die Datenkommunikation verifiziert werden kann, und die Tests ohne SAP-System und Netzwerkverbindung
durchgeführt werden können. Dafür müssen die zu testenden Klassen entsprechende TestParameter erhalten, so dass die darüber liegende Schicht, das Model, nicht mitgetestet
werden kann.
Die Klasse SAPmanager wurde zur Testbarkeit so erweitert, dass eine Verbindung übergeben werden kann, anstatt eine HTTP-Verbindung zu erzeugen. Um diese Möglichkeit
auch auf Ebene des SOAP-Parsers zu haben, wurde die kSOAP Bibliothek um eine überladene Methode call erweitert, die eine ServiceConnection der kSOAP-API entgegennimmt. Die Testdaten liegen als SOAP-Nachrichten in Form von XML-Dateien
vor, die jeweils eingelesen werden, und in einen Datenstrom konvertiert werden, der an
die modifizierte Implementierung der ServiceConnection (MyServiceConnection)
übergeben werden kann. Die Instanz der ServiceConnection wird an den SAPmanager übergeben, der das SOAP-Parsing übernimmt. Das Ergebnis kann mit einer
ActivityBO-Instanz aus der Klasse ActivityTestData verglichen werden. Um
eine eingehende Push-Verbindung zu testen muss diese ServiceConnection nicht verwendet werden, da die Methode direkt einen InputStream entgegen nimmt.
Die Klasse RMSmanager kann auch im Emulator getestet werden, so dass spezielle
Vorkehrungen für das Testen nicht zu treffen sind. Die Methoden werden mit Testdaten
aus der Klasse ActivityTestData getestet, so dass die Ergebnisse verifiziert werden
können.
5.8
Implementierungsaufwand
Dieser Abschnitt gibt den Implementierungsaufwand von mobileCRM in Lines Of Code
(LOC) inklusive Kommentarzeilen an.
105
5.8. Implementierungsaufwand
Kapitel 5. Implementierung
Datei
ActivityList.java
AsyncDataHandler.java
BasicAlert.java
BasicScreen.java
MainMenu.java
ModelController.java
SettingsMenu.java
ShowActivityForm.java
StatusBar.java
Lines Of Code
183
11
140
38
109
385
84
495
108
Tabelle 5.2: LOC des Package com.csc.bb.mobileCRM.gui
Datei
ActivityBO.java
ActivityEntryBO.java
AsyncEventHandler.java
BasicBO.java
Model.java
ModelFacade.java
ProgressObserver.java
SAPUserBO.java
Lines Of Code
733
154
11
53
242
17
9
59
Tabelle 5.3: LOC des Package com.csc.bb.mobileCRM.model
Datei
RMSmanager.java
Serializable.java
Lines Of Code
441
23
Tabelle 5.4: LOC des Package com.csc.bb.mobileCRM.model.backend.rms
Datei
ActionPushRequest.java
Activity.java
ActivityList.java
ActivityListRequest.java
ActivityListResponse.java
ChangeActivityRequest.java
ChangeActivityResponse.java
PushReceiver.java
SAPmanager.java
Lines Of Code
49
480
60
86
48
115
54
122
275
Tabelle 5.5: LOC des Package com.csc.bb.mobileCRM.model.backend.sap
106
Kapitel 5. Implementierung
5.8. Implementierungsaufwand
Datei
ApplicationException.java
I18nResources.java
Log.java
PropertyFileReader.java
StringUtils.java
Lines Of Code
58
60
149
96
57
Tabelle 5.6: LOC des Package com.csc.bb.mobileCRM.util
Datei
ActivityTestData.java
AllTests.java
MobileCRMtestrunner.java
MyServiceConnection.java
RMSmanagerTests.java
SAPmanagerTests.java
Lines Of Code
141
34
18
54
82
226
Tabelle 5.7: LOC des Package com.csc.bb.mobileCRM.tests
Datei
mobileCRM
mobileCRMtestsuite
Gesamt
Lines Of Code
5253
555
5808
Tabelle 5.8: LOC von mobileCRM und mobileCRMtestsuite
107
5.9. Performance-Bewertung
Kapitel 5. Implementierung
Abbildung 5.4: Messaufbau und Bezeichnung der Messwerte
5.9 Performance-Bewertung
An dieser Stelle werden die im Rahmen von mobileCRM durchgeführten PerformanceMessungen zunächst aufgearbeitet und dann bewertet. Diese sind notwendig, um Aussagen über die Praxistauglichkeit der in der Systemarchitektur dieser Arbeit kombinierten
Komponenten treffen zu können. Weiterhin können dadurch die primären leistungsbegrenzenden Komponenten ausgemacht werden.
Die Messungen wurden auf dem BB-Endgerät als J2MEUnit-Test realisiert. Das TestSzenario ist der Anwendungsfall Aktivitätenliste anfordern, da dieser vom Endgerät aus
initiiert wird, Request und Response beinhaltet, und die Nutzlast vom SAP-CRM in Richtung des BBs variabel ist. Die Testimplementierung ruft die Methode SAPmanager.getActivities auf, und die Nutzlast kann über die im SAP-CRM verfügbaren Aktivitäten gesteuert werden. Dadurch wird für jede einzelne Messung eine Verbindung aufund abgebaut, was jedoch erwünscht ist, um einen realistischen Testfall zu haben. Zur
Testumgebung ist zu sagen, dass SAP-CRM, SAP-XI, BES und deren Netzwerkverbindung nur durch den Test-Client benutzt wurden, so dass die Ergebnisse nicht durch andere
Benutzer verfälscht werden.
Dies sind optimale Voraussetzungen, so dass in der Praxis eher mit höheren Latenzzeiten zu rechnen ist. Auf der anderen Seite ist das Testsystem auf nicht so leistungsfähiger Hardware installiert, wie es in Produktivsystemen üblich ist. Zu der Auslastung des Mobilfunkanbieters und der RIM-Infrastructure kann keine Aussage getroffen
werden. Für die Performance-Tests wurden zunächst innerhalb der kSOAP-Bibliothek
Zeitnahmen in den Code implementiert. Dies geschieht durch Aufruf der Methode
System.currentTimeMillis(), die eine Auflösung von 10 Millisekunden hat.
Daraus folgt, dass die ermittelten Durchschnittswerte im schlimmsten Fall eine Ungenauigkeit von 10ms haben. Durch den niedrigsten in allen Messreihen ermittelten Wert von
108
Kapitel 5. Implementierung
5.9. Performance-Bewertung
Abbildung 5.5: Zeit zum Serialisieren der Anfrage in SOAP-XML-Markup
1750ms ergibt sich ein maximaler prozentualer Fehler unter 0,572%. Die Berechnung der
Zeitdifferenzen zwischen Messpunkten und die Ausgabe erfolgt erst nach Abschluss einer
einzelnen Messung, während einer Messung finden keine Log-Ausgaben statt. Das mobile Endgerät befand sich bei allen Messreihen am selben Ort, so dass der Funk-Empfang
vergleichbar ist, der im Übrigen eine gute Signalstärke (-55dBm) aufwies. Der Messaufbau und die Bezeichnung der einzelnen gemessenen Teilstrecken sind in Abbildung 5.4
dargestellt. Die Verbindung zwischen XI und SAP-CRM ist dabei lokal, da beide Anwendungen auf einem Host installiert sind.
Die Auswertung der Messgröße Request Parsing wird den Messreihen vorangestellt, da
diese Zeitspanne unabhängig von der im Response übertragenen Nutzlast ist und im Vergleich zu anderen Messwerten nicht ins Gewicht fällt. Unter Request Parsing ist die Serialisierung zu verstehen, um aus dem Java-Objekt, das die Daten des Requests enthält,
SOAP-XML-Markup zu generieren. In Abbildung 5.5 sind die gemessenen Werte aus den
ersten beiden Messreihen dargestellt. Der größte gemessene Wert beträgt 240ms und die
Payload ist bei allen Messreihen vergleichbar.
5.9.1
Messreihe 1
Der Performance-Unittest ist so konfiguriert, dass nacheinander 100 Anfragen vom BBEndgerät über das XI an das SAP-CRM gesendet werden. Dabei wird in Messreihe 1
zunächst der minimale Testfall betrachtet, bei dem nur eine Aktivität vom SAP-CRM
109
5.9. Performance-Bewertung
Arithmetisches Mittel
Minimum
Maximum
Standardabweichung
Kapitel 5. Implementierung
Gesamtzeit
5540
4580
26680
2168
Resp. Parsing
2097
1930
2980
106
Antwortzeit
3266
2310
24510
2176
XI
308
188
766
83
Tabelle 5.9: Statistische Kenngrößen zu Messreihe 1 (Einheit [ms])
Abbildung 5.6: Messreihe 1: Eine Aktivität als Payload
aus gesendet wird. Die nächste Anfrage wird jeweils erst gesendet, wenn die zugehörige
Antwort vollständig empfangen und durch das Parsing wurde, sowie die Zeitberechnung
stattgefunden hat und ausgegeben wurde. Nach der Ausgabe wird der Test-Thread noch
pauschal zwei Sekunden pausiert, so dass die Vorgänge im Betriebssystem, die mit der
Ausgabe zu tun haben, gänzlich abgeschlossen sind und einen nächsten Testlauf nicht
beeinträchtigen. Die Messergebnisse sind graphisch in Abbildung 5.6 dargestellt. Die statistischen Kenngrößen können Tabelle 5.9 entnommen werden.
Die Gesamtzeit wurde in der modifizierten kSOAP-Bibliothek gemessen. Die Zeitnahme erfolgte dabei vor Deserialisieren der Anfrage und nach dem erfolgreichen Parsing
der Antwort. Durch einen weiteren Messwert vor dem Parsing lässt sich dessen Dauer
ermitteln. Die Antwortzeit berechnet sich aus der Gesamtzeit abzüglich der Parsing-Zeit
von Request und Response. Dem Performance-Monitoring von XI lassen sich die Zeiten für die Bearbeitungszeit der einzelnen Requests entnehmen. Diese Zeit umfasst die
Verarbeitung im SAP-XI, die Übertragung zum SAP-CRM und dessen Verarbeitung sowie den Rücktransport und die erneute Bearbeitung des XI. Dabei sei noch einmal darauf
110
Kapitel 5. Implementierung
5.9. Performance-Bewertung
Abbildung 5.7: Messreihe 2: 14 Aktivitäten als Payload
hingewiesen, dass im konkreten Testaufbau die Anwendungen SAP-XI und SAP-CRM
auf einem Host installiert sind. Von einem Ausreißer im statistischen Sinne wird in den
folgenden Messreihen gesprochen, wenn ein Wert nicht im Intervall des Durchschnitts
plus/minus der zweifachen Standardabweichung liegt.
5.9.2
Messreihe 2
Diese Messreihe wurde unter den gleichen Voraussetzungen wie Messreihe 1 durchgeführt, allerdings mit 14 Aktivitäten als Nutzlast, um das Verhalten der einzelnen Systemkomponenten bei größeren Datenmengen zu testen. Die Darstellung der Messwerte in Abbildung 5.7 zeigt, dass bei dieser zweiten Messreihe starke Schwankungen bei
der Datenübertragung vorhanden sind. Eine der 100 durchgeführten Messungen brach
sogar durch eine Timeout-Exception ab, weshalb nur 99 Messwerte vorhanden sind. In
der Konsolen-Ausgabe des Endgeräts konnten bei der erhöhten Nutzlast deutlich mehr
Garbage-Collection-Aufrufe festgestellt werden. Die Zeit für das Parsing des Requests ist
jedoch sehr stabil, weshalb die Garbage-Collection-Aufrufe nicht als Begründung für die
Ausreißer der Antwortzeit in Frage kommen. Die Antwortzeiten des SAP-XI sind konstant gering, und die Ursache der Schwankungen ist daher vermutlich zwischen dem BES
und dem BB-Endgerät zu suchen, denn die CPU-Auslastung auf dem BES ist gering und
die Internetanbindung ausreichend dimensioniert.
111
5.9. Performance-Bewertung
Arithmetisches Mittel
Minimum
Maximum
Standardabweichung
Kapitel 5. Implementierung
Gesamtzeit
24595
18770
113750
12189
Resp. Parsing
14449
13880
16240
421
Antwortzeit
9950
4140
98310
12098
XI
600
281
1406
211
Tabelle 5.10: Statistische Kenngrößen zu Messreihe 2 (Einheit [ms])
Abbildung 5.8: Messreihe 3: Zehn Aktivitäten als Payload
5.9.3
Messreihe 3
Innerhalb der Messreihe 3 wurden ebenfalls 100 Anfragen vom Endgerät über XI an
das CRM gesendet, jedoch umfasst die Antwort des CRM zehn Aktivitäten als Nutzlast.
Durch diese Messreihe soll erörtert werden, wie sich Parsing und Antwortzeit bei weniger
als 14 Aktivitäten verhalten. Die Darstellung der gemessenen Werte ist Abbildung 5.8 zu
entnehmen, die statistischen Kenngrößen finden sich in Tabelle 5.11. Es zeigt sich, dass
die Schwankungen der Antwortzeit deutlich geringer ausfallen als in Messreihe 2.
Arithmetisches Mittel
Minimum
Maximum
Standardabweichung
Resp. Parsing
10631
10060
11620
331
Antwortzeit
4844
3650
8150
582
XI
383
250
1094
100
Tabelle 5.11: Statistische Kenngrößen zu Messreihe 3 (Einheit [ms])
112
Kapitel 5. Implementierung
Messung
1
2
3
4
5
5.9. Performance-Bewertung
Parsing
3900
3980
3670
3930
3870
Antwortzeit
5850
5310
4140
3640
6310
XI
988
877
1144
628
933
BES
4862
4433
2996
3012
5377
Tabelle 5.12: Daten aus Messreihe 4 (Einheit [ms])
5.9.4
Messreihe 4
Diese Messreihe wurde manuell durchgeführt, wobei je Messung drei Aktivitäten aus dem
SAP-CRM übertragen wurden. Weiterhin wurden alle Datagramme, die den Testvorgang
betreffen, auf dem BES aufgezeichnet. Die gemessenen Werte sind in Tabelle 5.12 dargestellt. Die Spalte XI wurde anhand manueller Auswertung der aufgezeichneten Pakete
errechnet. Die Zeit umfasst dabei Übertragung der Daten vom BES zum SAP-XI, von dort
weiter zum SAP-CRM und zurück bis zum BES, sowie die Verarbeitungszeit im SAP-XI
und im SAP-CRM. Die gemessenen Zeiten der XI-Verarbeitung sind also nicht mit denen
aus den vorangegangenen Messreihen vergleichbar. Die Spalte BES bezeichnet die Übertragungszeit des Requests vom Endgerät zum BES zuzüglich derjenigen des Responses
vom BES zum Endgerät. Sie berechnet sich aus der Antwortzeit abzüglich der gemessenen Zeit des XI. Alle anderen Spalten stammen aus der Aufzeichnung des Clients.
Wie in Abschnitt 2.1.1 beschrieben wurde, findet die Übertragung zwischen einem BBEndgerät und dem BES verschlüsselt und komprimiert statt. Durch die aufgezeichneten
Pakete kann die Komprimierungsrate bestimmt werden, was an der ersten Messung vorgenommen wurde. Die zwischen SAP-XI und BES ausgetauschte, unverschlüsselte Nutzlast
beträgt dabei 4757Byte. Die verschlüsselte und komprimierte Nutzlast zwischen BES und
der RIM-Infrastructure beträgt hingegen nur 1945Byte, was einer Komprimierungsrate
von 59,11% entspricht.
5.9.5
Bewertung
Der Vergleich der Ergebnisse aus den vorangegangenen Messreihen erlaubt Rückschlüsse
auf die Performance und die Skalierbarkeit der Komponenten, aus denen das Gesamtsystem aufgebaut ist.
Zum SAP-XI lässt sich sagen, dass es auf den Umsatz von großen Datenmengen ausgelegt
ist. Die durchschnittliche Verarbeitungszeit zwischen Messreihe 2 mit einer Aktivität und
113
5.9. Performance-Bewertung
Kapitel 5. Implementierung
Messreihe 3 mit zehn Aktivitäten als Nutzlast unterscheidet sich nur um 75ms (19,6%).
Die erhöhte Nutzlast hat also nur eine sehr geringe Auswirkung auf die Antwortzeit. Bei
den absoluten Werten der XI-Messungen ist zu beachten, dass SAP-XI und SAP-CRM
im gegebenen Testszenario auf der selben Maschine arbeiten. Dadurch verringert sich einerseits die Übertragungzeit zwischen beiden Systemen, andererseits jedoch konkurrieren
sie um gemeinsame Ressourcen wie Speicher und CPU.
Auf die Dauer des SOAP-Parsings hat die Verzehnfachung der Nutzlast jedoch deutliche
Auswirkungen. Zwischen Messreihe 1 mit 2097ms Response-Parsing-Zeit und Messreihe
3 mit 10631ms ergibt sich eine Verfünffachung der Dauer. Dass sich die Dauer nicht
proportional zur Nutzlast geändert hat, könnte darauf zurückzuführen sein, dass der XMLParser und die SOAP-Mappings zunächst initialisiert werden müssen, was zusätzlich (eine
vom Umfang der Nutzlast unabhängige) Zeit in Anspruch nimmt. Der Peak der ParsingZeit in Messreihe 1 könnte seine Ursache in Vorgängen auf Betriebssystem- oder VMEbene haben, wie beispielsweise die Garbage-Collection.
Die durchschnittliche Antwortzeit zwischen den Messreihen mit einer und zehn Aktivitäten als Nutzlast unterscheidet sich nur um den Faktor 1,5, obwohl die Zehnfache Nutzlast übertragen wurde. Dieser sehr geringe Faktor lässt sich vermutlich auf den Auf- und
-Abbau der TCP/IP Verbindung zurückführen, die unabhängig von der Größe der übertragenen Nutzlast Zeit in Anspruch nimmt. Bei einer Verbindung mit hoher Latenz und
Übertragung von geringer Nutzlast macht die Summe der für den Verbindungsauf- und
-abbau notwendigen Datagramme einen erheblichen Anteil der Gesamtübertragungszeit
aus.
Die Gesamtzeit aus Messreihe 2 (rund 25 Sekunden) kann einem Benutzer sicherlich
nicht zugemutet werden. Jedoch ist für den Praxiseinsatz Messreihe 1 besser anwendbar,
da der Benutzer auf Dauer nur einzelne Aktivitäten als Push-Nachricht empfängt oder
als Update zum SAP-System sendet. Messreihe 2 und 3 wären also nur für die initiale Synchronisation aller Aktivitäten relevant. Von den rund 5 Sekunden der Gesamtzeit
aus Messreihe 1 entfallen im Schnitt 3 Sekunden auf die Antwortzeit, wobei die Zeit des
SAP-XI und SAP-CRM mit rund 0,3 Sekunden sehr gering ausfällt. Aufgrund der bereits
angewendeten Komprimierung der Nutzlast könnte die Antwortzeit durch Verwendung
eines Binärprotokolls statt SOAP nur minimal verbessert werden. Der Spielraum für eine Optimierung beschränkt sich beim untersuchten Testaufbau also auf die 2 Sekunden,
die das SOAP-Parsing in Anspruch nimmt. Dafür biete sich zwei Möglichkeiten: Die Implementierung weiter optimieren, beispielsweise durch Profiling oder durch den Einsatz
leistungsfähigerer Hardware auf Client-Seite könnte die Zeit für das Parsing reduziert
werden. Die Entwicklungsumgebung von RIM bietet jedoch nur für den Emulator ei-
114
Kapitel 5. Implementierung
5.9. Performance-Bewertung
ne Profiling-Funktion an, nicht für die Endgeräte. Durch bessere Hardware könnte statt
GPRS auch UMTS für die Übertragung der Daten zum Einsatz kommen, was die Antwortzeit verbessern würde.
115
5.9. Performance-Bewertung
Kapitel 5. Implementierung
116
Kapitel 6
Zusammenfassung
Die vorliegende Arbeit entstand als externe Diplomarbeit bei der Firma CSC Deutschland Solutions GmbH in Wiesbaden. Das Ziel bestand darin, ein Konzept zur Integration
zwischen einem SAP-System und einem mobilen BlackBerry-System zu entwerfen und
zu realisieren. Der dabei entstehende möglichst praxisnahe Prototyp soll die Realisierung
zukünftiger ’Real World’-Anwendungen erleichtern. Aus dieser Anforderung resultierte
die Randbedingung, dass ein Web Service als Bindeglied zwischen dem SAP-System und
der BlackBerry-Lösung operieren soll. Darauf aufbauend sollte der Entwurf aus Benutzerund auch aus Infrastruktur-Sicht für den Einsatz in Unternehmen geeignet sein. Weiterhin
sollte die Applikation für das mobile Endgerät als Smart-Client realisiert werden. Dabei
werden die übertragenen Daten lokal auf dem Endgerät zwischengespeichert, wodurch
ein Offline-Modus und Performance-Gewinne ermöglicht werden.
Für die Realisierung der Arbeit wurde als abzubildener Anwendungsfall im SAP-System
das Aktivitätsmanagement eines SAP-CRM-Systems (Customer Relationship Management) ausgewählt. Dabei wurde prototypisch ein Client für ein mobiles BlackBerryEndgerät umgesetzt. Die Nachrichten-orientierte Middleware SAP-XI dient als WebService-Schnittstelle zwischen dem CRM-System und dem BlackBerry Enterprise Server, der für die Kommunikation zwischen Unternehmensanwendungen und den mobilen
Endgeräten zuständig ist. Die Vorteile von SAP-XI liegen in der zentralen Konfiguration der Kommunikation zwischen den zu integrierenden Anwendungen, und es ist keine anwendungsspezifische Implementierung eines Web Service notwendig. Mit diesem
Ansatz können weitere Anwendungen leichter und übersichtlicher, da weniger stark gekoppelt, miteinander verknüpft werden. Die mobile Anwendung (mobileCRM) für das
BlackBerry-Endgerät wurde in J2ME entwickelt, für die Kommunikation mit dem Web
Service über SOAP kam die Bibliothek kSOAP zum Einsatz, die der Analyse entspre-
117
Kapitel 6. Zusammenfassung
chend der Referenz-Implementierung der JSR 172 API von Sun vorgezogen wurde. Die
Daten aus dem SAP-System werden auf dem Endgerät mit der RMS-API aus J2ME zwischengespeichert, wodurch auf den Flash-Speicher des Geräts zugegriffen werden kann.
Die dabei unter Umständen auftretenden Synchronisationsprobleme zwischen Daten auf
Clients und dem SAP-CRM-System wurden theoretisch untersucht und Realisierungsmöglichkeiten zur Lösung vorgestellt. Bei der Abbildung der Attribute eines Datensatzes im SAP-CRM-System auf das mobile Endgerät wurden die technisch notwendigen
und die für den mobilen Einsatz wichtigsten Attribute übernommen. Diese können im
Prototyp durch die implementierten Anwendungsfälle verarbeitet werden. Welche Attribute benötigt werden ist anwendungsspezifisch und hängt von den abzubildenden Geschäftsprozessen bzw. dem Einsatzgebiet der Anwendung ab. Der Schwerpunkt der Implementierung lag auf dem Entwurf einer einfach zu erweiternden Architektur und auf
der Kommunikation über SOAP. Ersteres wurde durch den Einsatz eines Document-View
Architektur-Ansatzes in mobileCRM erreicht, und kann so als Basis für Erweiterungen
dienen. Bei der SOAP-Kommunikation empfängt und verarbeitet die Anwendung PushUpdates vom SAP-System, sendet Updates vom Client in umgekehrter Richtung, und
eine Liste aller Aktivitäten kann manuell in einem bidirektionalen Vorgang angefordert
werden. Das Design der GUI stand nicht im Vordergrund. Im Rahmen der Implementierung hat sich herausgestellt, dass für Anwendungen mit mehr Dialogfeldern und komplexerem Informationsfluss auf jeden Fall eine zentrale Steuerung des Übergangs von
einer graphischen Komponente (Screen) zur nächsten ratsam ist. Weiterhin empfiehlt sich
für mobile Anwendungen allgemein, den Programmcode und den Build-Prozess so flexibel und konfigurierbar wie möglich zu halten. Dies ist darin begründet, dass der Code
Endgerät-spezifisch angepasst werden muss, beispielsweise aufgrund von notwendigen
Workarounds, und den unterschiedlichen Features und APIs, die ein Endgerät zur Verfügung stellt.
Bei den durchgeführten Performance-Messungen hat sich ergeben, dass die meiste Zeit
bei der Übertragung zwischen BES und dem Endgerät sowie dem Parsing der SOAPNachrichten verloren geht. Letztere Größe ist im Gegensatz zur Übertragung deutlicher
von der Nutzlast abhängig. Die Dauer für die Übertragung von 10 Aktivitäten kann bereits
nicht mehr als benutzerfreundlich eingestuft werden, auch wenn sie für mobile Geräte
nicht ungewöhnlich ist. In den Anwendungsfällen von mobileCRM wird jedoch im alltäglichen Einsatz bei einem Aktivitätsupdate vom Endgerät zum SAP-System und umgekehrt
nur eine einzelne Aktivität übertragen, da die Synchronisation kontinuierlich durchgeführt
wird, sofern eine Funknetzabdeckung verfügbar ist. Die Dauer des Parsings macht dabei
ca. 2 Sekunden aus. Daraus ergibt sich, dass SOAP-basierte mobile Lösungen für den
118
Kapitel 6. Zusammenfassung
Einsatz in ähnlichen Szenarien wie dem in dieser Arbeit vorgestellten erwartungsgemäß
nur dann geeignet sind, wenn die Nutzlast der einzelnen Anwendungsfälle nicht zu groß
ist. Der Vorteil einer solchen Lösung gegenüber möglicherweise performanteren aber proprietären Binärprotokollen ist, dass Web Services eine plattformunabhängige und offene
Schnittstelle definieren, und teilweise in Unternehmensanwendungen bereits vorhanden
sind.
Für einen produktiven Einsatz von mobileCRM sollte der Prototyp insbesondere in Bezug auf die Usability optimiert werden. Eine graphisch ansprechendere und übersichtlichere Darstellung könnte beispielsweise durch Benutzen des Frameworks J2ME Polish1
(für den kommerziellen Einsatz kostenpflichtig) erreicht werden. Notwendigerweise zu
implementierende Erweiterungen der Benutzerschnittstelle sind Suchmasken, beispielsweise für die Suche von Aktivitäten nach bestimmten Kriterien, und das Auflösen eines
Namens in die entsprechende Personalnummer, so wie es die SAP-GUI auf PCs bietet.
Durch eine kategorisierte Darstellung der Attribute einer Aktivität können möglicherweise mehr Attribute trotzdem übersichtlich in die mobile Anwendung übernommen werden.
Weiterhin kann die vom Benutzer wahrgenommene Latenz eines Netzwerk-Vorgangs wie
z.b. einem Aktivitätsupdate verkürzt werden, indem dieser Prozess im Hintergrund stattfindet, und der Benutzer weiter arbeiten kann. Eine Rückmeldung könnte der Anwender
erhalten, indem eine nicht zu bestätigende Meldung in einem Statusbereich eingeblendet
wird.
Die an diese Diplomarbeit gestellten Vorgaben, wie sie im ersten Abschnitt der Zusammenfassung aufgeführt wurde, konnten alle umgesetzt werden. Die Praxistauglichkeit des
entstandenen Prototyps mobileCRM wurde weiterhin auf verschiedene Aspekte hin analysiert. Diese Arbeit kann als Machbarkeitsstudie angesehen werden, und dient der Firma
CSC als Demonstrationssystem für Akquisetermine Die Umsetzung einer ansprechenden
graphischen Benutzeroberfläche wie zuvor empfohlen ist dafür jedoch Vorraussetzung.
Für die Weiterentwicklung der Methodik konnten in dieser Arbeit verschiedene Ansätze identifiziert werden. Für die Realisierung weiterer Anwendungen im Projektgeschäft
der Firma CSC ist ein Stub-Generator für die SOAP-Kommunikation ein zeitsparender
Faktor, insbesondere wenn die Web-Service-Beschreibungen komplexer werden. Eine
Möglichkeit könnte dabei die Realisierung oder Lizensierung eines Stub-Generators für
kSOAP sein. Weiterhin könnte ein Tool für die Generierung einer graphischen Darstellung auf Basis eines WSDL-Dokuments entwickelt werden, ähnlich der Funktionalität
des MDS Studio von RIM. Denkbar wäre auch die Integration der Aktivitäten in die
1
http://www.j2mepolish.org/
119
Kapitel 6. Zusammenfassung
PIM-Anwendungen (Kalender und Adressbuch), so dass alle Informationen für den Benutzer zentral einsehbar sind. Jedoch müsste dabei auch die Synchronisation von PIMAnwendungen zu mobileCRM gewährleistet sein.
Auf der Grundlage der in dieser Arbeit vorgestellten Ergebnisse können noch weitere
Studien durchgeführt werden und insbesondere zur Verfeinerung der angestrebten Methodik wären noch weitere Studien empfehlenswert. Zunächst wäre zu prüfen, wie stark
sich die Leistung der Systemarchitektur mit einem leistungsfähigeren BB-Endgerät verbessern lässt. Das BB-Modell Pearl weist beispielsweise 16MB SRAM (statt 4MB im
verwendeten Gerät) und eine leistungsfähigere CPU auf, was die Parsing-Dauer deutlich reduzieren könnte. Weiterhin sind Modelle mit UMTS verfügbar, wodurch die Übertragungszeit sich vermutlich verkürzen ließe. Auch aus Sicht der Bedienbarkeit können
noch andere Endgeräte wie beispielsweise auch PDAs evaluiert werden, insbesondere für
die Dateneingabe. Neben Hardware-Verbesserungen können auch Engpässe in der Implementierung der einzelnen Bestandteile von mobileCRM durch Profiling weiter optimiert
werden. Für Anwendungsfälle mit höherer Nutzlast oder höherer Priorität einer geringen
Latenz kann ein Binärprotokoll zwischen SAP-XI und BB-Endgerät entwickelt werden.
Ebenfalls wäre für den produktiven Einsatz zu testen, wie sich die Performance der einzelnen Systemkomponenten bei massiver, paralleler Nutzung verhält.
In der Einleitung wurde bereits aufgezeigt, dass der Einsatz mobiler Anwendungen im
Vergleich zur großen Verbreitung und den immer besseren Fähigkeiten der mobilen Endgeräte noch sehr gering ist. Die Weiterführung der Untersuchungen, die mit dieser Arbeit
eingeleitet wurden, sind daher von wissenschaftlichem Interesse und haben nicht zuletzt
betriebswirtschaftliche Bedeutung für die Firma CSC, in der weitere Untersuchungen bereits fest eingeplant sind.
120
Kapitel 7
Literaturverzeichnis
[Bay02]
BAYER, Thomas. REST Web Services. http://www.oio.de/public/
xml/rest-webservices.htm. 2002
[BEZ04]
B UCK -E MDEN, Rüdiger ; Z ENCKE, Peter: mySAP CRM - Kundenbezogene
Geschäftsprozesse mit SAP CRM 4.0. Galileo Press GmbH, 2004
[BPE]
BPEL4WS. Business Process Execution Language for Web Services Version
1.1
[DMT06] DMTF. Common Information Model (CIM). http://www.dmtf.org/
standards/cim/. 2006
[EY03]
E LLIS, Jon ; YOUNG, Mark. JSR 172: J2ME Web Services 1.0. http:
//jcp.org/en/jsr/detail?id=172. 2003
[Gei05]
G EIGER, Philipp. Mobilfunk Deutschland 2010. http://www.solon.
de/download_secure/Solon_Mobilfunk_%202010.pdf. 2005
[GHJV95] G AMMA, Erich ; H ELM, Richard ; J OHNSON, Ralph ; V LISSIDES, John: Design Patterns - Elements of Reusable Object-Oriented Software. AddisonWesley, 1995
[HL04]
H AUSER, Tobias ; L ÖWER, Ulrich M.: Web Services - Die Standards. Galileo
Computing, 2004
[MW06]
M ILIKICH, Mike ; WARDEN, James. JSR 118: Mobile Information Device
Profile 2.0. http://jcp.org/en/jsr/detail?id=118. 2006
121
Kapitel 7. Literaturverzeichnis
[Rah05]
R AHM, Erhard. Replizierte Datenbanken. http://dbs.uni-leipzig.
de/skripte/MRDBS/PDF2/kap7.pdf. 2005
[RIM05]
RIM. BlackBerry Java Development Environment - BlackBerry Application
Developer Guide Volume 1: Fundamentals. 2005
[RIM06a] RIM. BlackBerry Enterprise Server für Microsoft Exchange - Funktionen und
technischer Überblick. 2006
[RIM06b] RIM. BlackBerry Enterprise Solution - Sicherheit. www.blackberry.com.
2006
[RIM06c] RIM. BlackBerry MDS Studio - Feature and Technical Overview. 2006
[SA03]
SAP-AG. SAP Schulungsunterlagen, SAP01 SAP-Überblick. 2003
[Sch04]
S CHMATZ, Klaus-Dieter: Java 2 Micro Edition - Entwicklung mobiler Anwendungen mit CLDC und MIDP. dpunkt.verlag, 2004
[Sch05]
S CHMIDT, Michael. Der Pusher - Blackberries Sicherheits-Architektur.
http://www.heise.de/security/artikel/64996. 2005
[SO04]
S TUMPE, Jens ; O RB, Joachim: SAP Exchange Infrastructure. Galileo Press
GmbH, 2004
[Tai03]
TAIVALSAARI, Antero. JSR 139: Connected Limited Device Configuration
1.1. http://jcp.org/en/jsr/detail?id=139. 2003
[W3C00] W3C. Simple Object Access Protocol (SOAP) 1.1. http://www.w3.org/
TR/2000/NOTE-SOAP-20000508/. 2000
[W3C01] W3C. Web Services Description Language (WSDL) 1.1. http://www.
w3.org/TR/2001/NOTE-wsdl-20010315. 2001
[W3C06] W3C. Web Services Description Language (WSDL) 2.0. http://www.
w3.org/TR/2006/CR-wsdl20-20060327. 2006
[Win99]
W INER, Dave. XML-RPC. http://www.xmlrpc.com/spec. 1999
[Yua06]
Y UAN, Michael J.: Enterprise J2ME: Developing Mobile Java Applications.
Prentice Hall Ptr, 2006
122
Anhang A
Abkürzungen
A
AMS
Application Management Software.
B
BB
BlackBerry.
BES
BlackBerry Enterprise Server.
BO
Business Object.
BPEL
Business Process Execution Language.
C
CA
Certification Authority.
CDC
Connected Device Configuration.
CIM
Common Information Model.
CLDC
Connected Limited Device Configuration.
CRM
Customer Relationship Management.
123
Anhang A. Abkürzungen
D
DA
Discovery Application.
DOM
Document Object Model.
E
EAI
Enterprise Application Integration.
J
J2SE
Java 2 Standard Edition.
JAD
Java Application Descriptor.
JAR
Java Archive.
JAX-RPC
Java API for XML-based RPC.
JAXP
Java API for XML Processing.
JCP
Java Community Process.
JDE
Java Development Environment.
JSR
Java Specification Request.
JVM
Java Virtual Machine.
JWS
Java Web Start.
K
KVM
Kilo Virtual Machine.
L
LBS
Location Based Services.
LCDUI
Lowest Common Denominator User Interface.
LOC
Lines Of Code.
124
Anhang A. Abkürzungen
M
MDS
Mobile Data System.
MEP
Message Exchange Pattern.
MIDP
Mobile Information Device Profile.
MOM
Message-oriented Middleware.
MVC Pattern
Model View Controller Pattern.
O
OTA
Over The Air.
P
PIM
Personal Information Management.
PLM
Product Lifecycle Management.
R
REST
REpresentational State Transfer.
RI
Referenz Implementierung.
RIM
Research in Motion.
RMS
Record Management System.
S
SAP MI
SAP Mobile Infrastructure.
SAP XI
SAP Exchange Infrastructure.
SAX
Simple API for XML.
SCM
Supply Chain Management.
125
Anhang A. Abkürzungen
SLD
System Landscape Directory.
SOA
Service-orientierte Architektur.
SOAP
Simple Object Access Protocol.
SPI
Service Provider Interface.
SRM
Supplier Relationship Management.
W
W3C
World Wide Web Consortium.
WSDL
Web Service Description Language.
WTK
Wireless Toolkit.
126
Herunterladen