bipro-tag 2012 · 2020-05-13 · bipro-tag 5./6. juni 2012 © biss gmbh 2012| novotel...
TRANSCRIPT
BiPRO-Tag 2012
5./6. Juni 2012 | Novotel Düsseldorf /Neuss
Von der WSDL zum Service-
Consumer
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Von der WSDL zum Service-Consumer
■ Ausgangssituation
■ Ziel
■ Wege zum Ziel
■ Live-Coding
■ Demo
■ Anpassung an VU-individuelle Erweiterung
■ Lessons learned
■ Diskussion
Inhalt
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
BiPRO-konformer Webservice zur Tarifierung
einer Tierhalterhaftpflichtversicherung
Authentifizierung erfolgt am zugehörigen STS
mit Benutzername und Kennwort
Endpoint-URL und Zugangsdaten sind
bekannt
Relevante BiPRO-Normen sind bekannt
Ausgangssituation
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Ziel uc TAA-Prozess
User Prov ider
Dateneingabe
Authentifizierung
Berechnung
Ergebnisausgabe
RequestSecurityToken
RequestSecurityTokenResponse
GetQuote
GetQuoteResponse
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Plattformen
• PC (Windows)
• iPad (IOS)
Ziel
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Service-Consumer als Client-Server-
Architektur mit Java-basiertem Server
Wege zum Ziel
Consumer Provider
Java
.Net
IOS
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
MVC-Pattern
Wege zum Ziel
View Model
Controller
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
MVC-Pattern mit
Wege zum Ziel
View Model
Controller
Dialog
Prozess
Service
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Axis (Apache eXtensible Interaction System) ist eine
SOAP-Engine zur Konstruktion von darauf basierenden
Web Services und Client-Anwendungen
Axis erschien 2002 als Neuentwicklung und Nachfolger
von Apache SOAP, das auf dem IBM-Framework IBM
SOAP basierte.
Axis2 erschien 2005 als vollständige Neuentwicklung der
bisherigen Axis-Version
Axis2 wird von der Apache Software Foundation entwickelt
und unter der Apache Lizenz 2.0 vertrieben
Aktuelle Version: 1.6.2 vom 17.04.2012
(Quelle: Wikipedia u. Apache.org, Stand 27.05.2012)
Wege zum Ziel
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
1. Client-Stub generieren mit dem Axis2-Werkzeug wsdl2java
2. Generierten Code patchen
3. Mithilfe des generierten Codes Service-Consumer erstellen
Live-Coding
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Client-Stub generieren mit dem Axis2-Werkzeug wsdl2java
wsdl2java.bat -d xmlbeans -o <destination> -uri <wsdl-url>
Binding-Mechanismus
(Default ADB scheitert an der
Komplexität des Schemas)
Zielverzeichnis für
Code-Generierung
URL der Service-
Beschreibung (WSDL)
Live-Coding
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Generierten Code patchen
1. Stub.getPolicy: private static org.apache.neethi.Policy getPolicy (java.lang.String policyString) {
java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(policyString.getBytes());
return org.apache.neethi.PolicyEngine.getPolicy(bais);
}
ersetzen durch private static org.apache.neethi.Policy getPolicy (java.lang.String policyString) {
java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(policyString.getBytes());
try
{
StAXOMBuilder builder = new StAXOMBuilder(bais);
OMElement documentElement = builder.getDocumentElement();
return org.apache.neethi.PolicyEngine.getPolicy(documentElement);
}
catch (XMLStreamException e)
{
throw new RuntimeException( e);
}
}
2. Global <wsa:Address />
ersetzen durch <wsa:Address xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" />
Live-Coding
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Service-Consumer: Ablauf
■ Stub instanziieren
■ Security-Token anfordern
■ Norm-konformes Request-Objekt erzeugen
■ Request an Server senden
■ Ergebnis (Beitrag) aus Response entnehmen
Live-Coding
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Request-Objektdiagramm class Request
«soap»
Env elope
«soap»
Header
«soap»
Body
«wsse»
Security«wsc»
SecurityContextToken
+ Indentifier :String
«tarifierung»
GetQuote«tarifierung»
Request
«tarifierung»
Tarifierung
«tarifierung»
Verkaufsprodukt
«tarifierung»
Aktiv itaet
+ AktivitaetID :allgemein::AktivitaetID
«tarifierung»
Gegenstand
+ GegenstandID :allgemein::GegenstandID
«tarifierung»
Produkt
«tarifierung»
VersicherungssummeOderLeistung
+ ArtID :tarifierung::ArtID = Versicherungssumme
+ Werteinheit :tarifierung::Werteinheit = 20
+ Wert :tarifierung::Wert
+ Waehrung :tarifierung::Waehrung
«komposit»
Deckung
+ ArtID :komposit::ArtID = 0401
«tarifierung»
Elementarprodukt
«komposit»
VersichertesWagnis
+ AktivitaetID :allgemein::AktivitaetID
«haftpflicht»
Haftpflichtwagnis
+ Wagnisart :haftpflicht::Wagnisart = 3001
«haftpflicht»
Tierhalter
«haftpflicht»
VersichertesTier
+ GegenstandID :allgemein::GegenstandID
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
public Output compute( final Input input) throws Exception {
/* Stub instanziieren */
THVDemoService21511Stub stub = new THVDemoService21511Stub( "http://192.168.7.50:8080/pos/services/THVDemoService-2.1.5.1.0");
/* Security-Token anfordern */
STSRequestService.Token tok = STSRequestService.getToken( "192.168.7.50", 8080, "/pos/services/STService-2.1.2.1.0", "***", "***");
OMElement secElem = STSRequestService.getSecurityElement( tok);
stub._getServiceClient().addHeader( secElem);
/* Norm-konformes Request-Objekt erzeugen */
GetQuoteDocument qReq = GetQuoteDocument.Factory.newInstance();
GetQuote getQuote = qReq.addNewGetQuote();
CTQuoteRequest quoteReq = getQuote.addNewRequest();
CTTarifierung tarif = quoteReq.addNewTarifierung();
CTVerkaufsprodukt vprod = tarif.addNewVerkaufsprodukt();
CTProdukt prod = vprod.addNewProdukt();
prod.setBeginn( "2012-07-01");
prod.setGewuenschteZahlungsweiseArray(
new STZahlungsweise.Enum[]{STZahlungsweise.X_1});
prod.setSparte( STSparte.X_040);
//040 = Haftpflicht, s. bipro-datentypen-2.1.4.xsd
prod.setKennung( "STANDARD");
CTDeckung deck = CTDeckung.Factory.newInstance();
STEDeckung dArtID = STEDeckung.Factory.newInstance();
dArtID.set( "0401");
//0401 = Haftplicht, s. bipro-datentypen-2.1.4.xsd
deck.setArtID( dArtID);
CTVersicherungssummeOderLeistung sum = deck.addNewVersicherungssummeOderLeistung();
STEVersicherungssummeOderLeistung sArtID = STEVersicherungssummeOderLeistung.Factory.newInstance();
sArtID.set( "Versicherungssumme");
sum.setArtID( sArtID);
sum.setWaehrung( STWaehrungsschluessel.EUR);
sum.setWerteinheit( STWerteinheit.X_20);
//20 = Waehrung gem. Waehrungsschlüssel, s. bipro-datentypen-2.1.4.xsd
sum.setWert( new BigDecimal( input.getVersicherungssumme()));
CTVersichertesWagnis wag = deck.addNewVersichertesWagnis();
wag.setAktivitaetID("1");
prod.setElementarproduktArray(
new CTElementarprodukt[]{ deck});
Consumer-Code (1/3)
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
CTHaftpflichtwagnis hWag = CTHaftpflichtwagnis.Factory.newInstance();
hWag.setAktivitaetID( wag.getAktivitaetID());
STEWagnisart wArt = STEWagnisart.Factory.newInstance();
wArt.set( "3001");//3001 = Hund, s. bipro-datentypen-2.1.4.xsd
hWag.setWagnisart( wArt);
CTTierhalter th = hWag.addNewTierhalter();
CTVersichertesTier vtier = th.addNewVersichertesTier();
vtier.setGegenstandID( "1");
tarif.setAktivitaetArray( new CTAktivitaet[]{hWag});
CTTier tier = CTTier.Factory.newInstance();
tier.setGegenstandID( vtier.getGegenstandID());
CTTierErweiterung erw = CTTierErweiterung.Factory.newInstance();
erw.setListenHund( input.getListenhund());
tier.setErweiterung( erw);
tarif.setGegenstandArray( new CTGegenstand[]{ tier});
/* Request an Server senden */
GetQuoteResponseDocument respDoc = stub.getQuote( qReq);
/* Ergebnis aus Reponse entnehmen */
CTQuoteResponse quoteResp = respDoc.getGetQuoteResponse().getResponse();
CTStatus st = quoteResp.getStatus();
System.out.println( "Status.ID=" + st.getStatusID());
final List<String> lstMeld = new ArrayList<String>();
for ( CTMeldung meld : st.getMeldungArray()) {
lstMeld.add( "[" + meld.getIdentifikationsnummer() + "] " + meld.getText());
}
final int statusCode = quoteResp.getStatus().getStatusID().intValue(); //OK = 1; NOK = 2
final CTBeitrag beitrag = statusCode == 1 ? quoteResp.getTarifierung().getVerkaufsproduktArray(0).getProduktArray(0).getBeitragArray(0) : null;
Consumer-Code (2/3)
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
return new Output() {
@Override
public String getZahlweise() {
if ( statusCode == 1) { //OK
switch (statusCode) {
// Werte s. bipro-datentypen-2.1.4.xsd
case STZahlungsweise.INT_X_1:
return "jährlich";
case STZahlungsweise.INT_X_2:
return "halbjährlich";
case STZahlungsweise.INT_X_4:
return "vierteljährlich";
case STZahlungsweise.INT_X_5:
return "sonstige";
case STZahlungsweise.INT_X_6:
return "einmal";
case STZahlungsweise.INT_X_7:
return "täglich";
case STZahlungsweise.INT_X_8:
return "monatlich";
case STZahlungsweise.INT_X_9:
return "beitragsfrei";
}
return "?" + statusCode + "?";
} else {
return "";
}
}
@Override
public List<String> getMeldungen() {
return lstMeld;
}
@Override
public double getBeitragGemZahlweise() {
return statusCode == 1 ? beitrag.getBetrag().doubleValue() : 0.0;
}
@Override
public boolean isOK() {
return statusCode == 1;
}
};
}
Consumer-Code (3/3)
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
■ Code neu generieren
■ Patches anwenden
■ Service-Consumer erweitern
■ Frontend anpassen
• View (Dialog)
• Model (Service)
• Controller (Prozess)
■ Test
VU-individuelle Erweiterung
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Erweiterung: Objekt-Diagramm class Request
«soap»
Env elope
«soap»
Header
«soap»
Body
«wsse»
Security«wsc»
SecurityContextToken
+ Indentifier :String
«tarifierung»
GetQuote«tarifierung»
Request
«tarifierung»
Tarifierung
«tarifierung»
Verkaufsprodukt
«tarifierung»
Aktiv itaet
+ AktivitaetID :allgemein::AktivitaetID
«tarifierung»
Gegenstand
+ GegenstandID :allgemein::GegenstandID
«tarifierung»
Produkt
«tarifierung»
VersicherungssummeOderLeistung
+ ArtID :tarifierung::ArtID = Versicherungssumme
+ Werteinheit :tarifierung::Werteinheit = 20
+ Wert :tarifierung::Wert
+ Waehrung :tarifierung::Waehrung
«komposit»
Deckung
+ ArtID :komposit::ArtID = 0401
«tarifierung»
Elementarprodukt
«komposit»
VersichertesWagnis
+ AktivitaetID :allgemein::AktivitaetID
«haftpflicht»
Haftpflichtwagnis
+ Wagnisart :haftpfl icht::Wagnisart = 3001
«haftpflicht»
Tierhalter
«haftpflicht»
VersichertesTier
+ GegenstandID :allgemein::GegenstandID
«allgemein»
Erweiterung
«provider»
TierErweiterung
+ ListenHund :bool
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header> <!-- …-- > </soapenv:Header>
<soapenv:Body>
<tar:getQuote xmlns:tar="http://www.bipro.net/namespace/tarifierung"
xmlns:all="http://www.bipro.net/namespace/allgemein"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tar:Request>
<tar:Tarifierung>
<tar:Verkaufsprodukt> <!-- … --></tar:Verkaufsprodukt>
<tar:Aktivitaet xmlns:haf="http://www.bipro.net/namespace/haftpflicht"
xsi:type="haf:CT_Haftpflichtwagnis">
<all:AktivitaetID>1</all:AktivitaetID>
<haf:Wagnisart>3001</haf:Wagnisart>
<haf:Tierhalter>
<haf:VersichertesTier>
<all:GegenstandID>1</all:GegenstandID>
</haf:VersichertesTier>
</haf:Tierhalter>
</tar:Aktivitaet>
<tar:Gegenstand xmlns:sac="http://www.bipro.net/namespace/sachen"
xsi:type="sac:CT_Tier">
<all:Erweiterung xmlns:nam="http://www.provider.de/namespace"
xsi:type="nam:CT_TierErweiterung">
<nam:ListenHund>true</nam:ListenHund>
</all:Erweiterung>
<all:GegenstandID>1</all:GegenstandID>
</tar:Gegenstand> </tar:Tarifierung>
</tar:Request>
</tar:getQuote>
</soapenv:Body>
</soapenv:Envelope>
Erweiterung: Request
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
...
<bw:fgroup>
<bw:fitems>
<bw:fnum id="I1"><bw:prompt>Vers.-Summe</bw:prompt></bw:fnum>
<bw:fbool id="I2"><bw:prompt>Listenhund</bw:prompt></bw:fbool>
<bw:fcmd id="C1" action="{event('compute')}"><bw:prompt>Beitrag berechnen</bw:prompt></bw:fcmd>
</bw:fitems>
</bw:fgroup>
...
Erweiterung: Dialog
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
...
public static interface Input {
public double getVersicherungssumme();
public boolean getListenhund();
}
...
Erweiterung: Service
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Neues Merkmal:
private String strSumme;
private boolean bListenhund;
private THVService thvService;
Event-Behandlung:
if ( "I1".equalsIgnoreCase( id)) {
strSumme = val;
} else if ( "I2".equalsIgnoreCase( id)) {
bListenhund = val.equalsIgnoreCase( Component.XVAL_TRUE);
} else {
logWarning( "unexpected event " + evt);
}
Verwendung im Service
THVService.Input inp = new THVService.Input() {
public double getVersicherungssumme() {
return versSum;
}
public getListenhund() {
return bListenhund;
}
};
Erweiterung: Prozess
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Demo (Windows-PC)
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Demo (iPad)
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
BiPRO normiert den Service-Contract:
BiPRO liefert weder fertige Software, noch wird die
Anwendungsarchitektur reglementiert.
Normiert ist lediglich das Verhalten über die Schnittstelle
(Prozess und Datenmodell).
Die Anbindung von Front- und Backend ist nicht normiert und
wird vollständig individuell implementiert.
Bei der Implementierung können existierende Werkzeuge und
Frameworks (Open-Source oder kommerziell) helfen.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Objekt-orientierter Ansatz (Code-Generierung
mit Java und Axis2) ist möglich:
„Contract-First“-Ansatz (Code-Generierung mit wsdl2java)
funktioniert mit kleineren Anpassungen.
Data-Binding: ADB funktioniert nicht, XMLBeans funktioniert.
Generierter Code teilweise etwas umständlich zu benutzen
(Beispiele: Aufzählungstypen, n-fach Elemente).
Für komplexere Aufgaben muss evtl. eher ein dokument-
orientierter Ansatz gewählt werden.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
VU-individuelle Erweiterungen:
Erweitertes Schema erfordert erneute Code-Generierung.
Code-Generierung mit wsdl2java weitgehend automatisierbar.
Individualitäten erfordern i.d.R. Anpassungen von Front- und
Backend.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Lose Kopplung:
Client-Server basierte Anbindungen führen automatisch
einen „Kompatibilitäts-Layer“ ein – Anpassungen an einen
neuen Service-Provider können ggfs. im Server umgesetzt
werden, ohne dass sofort das Frontend angepasst werden
muss.
Sofern Masken und Prozessteuerung dynamisch durch den
Server erfolgt, können neue Funktionen realisiert werden,
ohne das ein neues Release des Clients erfolgen müsste.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Multikanalfähigkeit:
Mit geeigneten Frameworks ist es einfach, eine einmal
implementierte BiPRO-Anbindung von verschiedenen
Endgeräten aus zu nutzen.
Der Wiederverwendung sind lediglich dort Grenzen gesetzt,
wo ein Endgerät technische Beschränkungen aufweist.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
Lessons learned
FUNKTiOniert!
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss © BISS GmbH 2012
BiPRO funktioniert!
Aufwände bei der Systemintegration werden erheblich
reduziert.
Es bleibt Raum für Individualitäten.
Konkrete Implementierung mit Integration von Front- und
Backends müssen erfolgen.
Die Komplexität sollte nicht unterschätzt werden.
Lessons learned
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss 34
BiPRO-Tag 5./6. Juni 2012 | Novotel Düsseldorf/Neuss