### # specify knitr options
knitr::opts_chunk$set(echo = FALSE, results = 'asis')
### # initialize section counter
robjSecEnum <- rqudocuhelper::SectionEnumerator$new()
### # instantiate table of abbreviation
r6ob_abbrtable <- rmddochelper::R6ClassTableAbbrev$new()

Qualitas Logo

\fcolorbox{black}{white}{ \parbox[t]{1.0\linewidth}{ \centering \fontsize{12pt}{20pt}\selectfont % \vspace*{0.5cm} %

    \hfill Umsetzungsdokumentation

    \vspace*{0.5cm} 
}

}

\vspace*{0.5cm}

\fcolorbox{black}{white}{ \parbox[t]{1.0\linewidth}{ \centering \fontsize{25pt}{40pt}\selectfont % \vspace*{0.7cm} Automated Animal Data Exchange \ Jax Webservice Prototyp \ ATDA-ASR \

    \vspace*{0.7cm} % Space between the end of the title and the bottom of the grey box
}

}

\vspace*{1cm}

\begin{center} \includegraphics[width=0.5\textwidth]{png/Pedigree.png} \end{center}

\vspace{5ex} {\centering \small \hfill \begin{tabular}{l} Peter von Rohr \ FB EDV, Qualitas AG \ Chamerstrasse 56, CH-6300 Zug \ \verb+http://www.qualitasag.ch+ \ \verb+peter.vonrohr@qualitasag.ch+
\end{tabular} }

\pagebreak

\tableofcontents

\pagebreak

r6objDocStat <- rmddochelper::R6ClassDocuStatus$new()

# r6objDocStat$set_current_status(psVersion = "0.0.901",
#                                 psStatus  = "Erstellung",
#                                 psProject = "ATDA-ASR",
#                                 psDate = "2016-07-25")
# r6objDocStat$set_current_status(psVersion = "0.0.902",
#                                 psStatus  = "Maven Projekte",
#                                 psProject = "ATDA-ASR",
#                                 psDate = "2016-07-28")
# r6objDocStat$set_current_status(psVersion = "0.0.903",
#                                 psStatus  = "Erstellen WSDL Datei",
#                                 psProject = "ATDA-ASR",
#                                 psDate = "2016-07-28")

r6objDocStat$set_current_status(psVersion = "0.0.904",
                                psStatus  = "Webservice basierend auf WSDL",
                                psProject = "ATDA-ASR",
                                psDate = "2016-08-02")

r6objDocStat$set_current_status(psVersion = "0.0.905",
                                psStatus  = "Ergebnisse von Tests mit CXF und Axis2",
                                psProject = "ATDA-ASR",
                                psDate = "2016-09-14")

r6objDocStat$set_current_status(psVersion = "0.0.906",
                                psStatus  = "Wechsel auf Eclipse Neon",
                                psProject = "ATDA-ASR",
                                psDate = "2016-09-14")

r6objDocStat$set_current_status(psVersion = "0.0.907",
                                psStatus  = "Hello World JAX-WS",
                                psProject = "ATDA-ASR",
                                psDate = "2016-09-21")
r6objDocStat$include_doc_stat(psTitle = "## Dokumentenstatus")

\pagebreak

Erklärung

Dieses Dokument protokolliert die Schritte zur Erstellung eines r r6ob_abbrtable$add_abbrev(psAbbrev = "JAX-WS", psMeaning = "Java XML Webservice"). Im Projekt r r6ob_abbrtable$add_abbrev(psAbbrev = "ATDA-ASR", psMeaning = "Automatisierter Tierdatenaustausch der ASR") stellt sich bei der geplanten Zusammenarbeit mit r r6ob_abbrtable$add_abbrev(psAbbrev = "CRV", psMeaning = "Cooperative Cattle Improvement") zur Entwicklung von PlugIns für den Export von Milchmengendaten ab r r6ob_abbrtable$add_abbrev(psAbbrev = "ISM", psMeaning = "Informationssysteme der Melkanlagen") die Fragestellung nach der Implementierung eines Systems basierend auf Spezifikationen, welche als r r6ob_abbrtable$add_abbrev(psAbbrev = "WSDL", psMeaning = "Webservice Description Language") und r r6ob_abbrtable$add_abbrev(psAbbrev = "XSD", psMeaning = "XML Service Description") Dateien gegeben sind. Mit der Implementierung ist hier gemeint, dass wir die WSDL- und die XSD-Dateien als Input verwenden, um das Grundgerüst des Programmcodes für einen Server (r r6ob_abbrtable$add_abbrev(psAbbrev = "SEI", psMeaning = "Service Endpoint Interface")) und einen Client zu erzeugen. Dieses Grundgerüst wird im Wesentlichen aus Definitionen von Klassen und Methoden bestehen. Die Client-Seite soll durch die Onfarm-Plugins von CRV umgesetzt werden.

Einführung

Der Datentransfer im Projekt ATDA-ASR ist in drei Abschnitten geplant.

  1. Export der Milchmengendaten aus dem ISM mit Hilfe von Onfarm-Plugins (CRV)
  2. Transfer der exportierten Milchmengendaten vom ISM zur Datenbank
  3. Import der transferierten Daten in ARGUS

In den Abschnitten 1 und 2 wäre eine Zusammenarbeit mit CRV für uns sehr wertvoll. Insbesondere die Verwendung der PlugIns auf den ISM auf den Betrieben würde unser Projekt sehr beschleunigen. Die ISM auf den Betrieben sind Hersteller-spezifisch und müssen darum an die technischen Besonderheiten der Hersteller angepasst werden. Eine eigene Entwicklung dieser PlugIns würde den Aufwand im Projekt ATDA-ASR sehr stark erhöhen.

Gemäss r r6ob_abbrtable$add_abbrev(psAbbrev = "BvL", psMeaning = "Bert vant Land") von CRV ist im Herbst 2016 ein Projekt zur Entwicklung eines generischen APIs für die Betriebs-PlugIns geplant. Dieses Projekt soll auf den Vorgaben des Projekts r r6ob_abbrtable$add_abbrev(psAbbrev = "ICAR-ADE", psMeaning = "ICAR Animal Data Exchange") r r6ob_abbrtable$add_abbrev(psAbbrev = "ICAR", psMeaning = "International Committee for Animal Recording", pbQuote = FALSE, pbOut = FALSE) basieren. Diese Vorgaben bestehen aus einer Projektspezifikation und aus WSDL- und XSD-Dateien. Somit bekommt die automatische Code-Generierung basieren auf WSDL- und XSD-Dateien eine bestimmte Wichtigkeit.

Ein SOAP-basierter Web Service

In der Spezifikation zum Projekt ICAR-ADE wurden verschiedene Möglichkeiten für die Umsetzung eines Webservices erwähnt, aber die eigentliche Umsetzung wurde nur für die Variante eines SOAP basierten Webservices mit XML spezifiziert. Die von CRV in Aussicht gestellten PlugIns werden laut BvL auf der Spezifikation von ICAR-ADE basieren. Prinzipiell sind Webservices neutral im Bezug auf die Verwendung von Programmiersprachen. Es ist aber klar, dass die Verwendung der gleichen Programmiersprache in einem System, die Umsetzung vereinfachen sollte. Da die existierenden Webservice-Komponenten von ARGUS in Java umgesetzt wird, kommt auch hier Java zum Einsatz. Deshalb versuchen wir hier als erstes einen einfachen JAX-WS Webservice zu erstellen.

JAX-WS

JAX-WS steht für Java API für XMS Web Services und ist ein Java-API für die Erstellung von Webservices. JAX-WS wurde mit r r6ob_abbrtable$add_abbrev(psAbbrev = "EE", psMeaning = "Enterprise Edition") 5 eingeführt und ist seit Version 1.6 auch Teil der r r6ob_abbrtable$add_abbrev(psAbbrev = "SE", psMeaning = "Standard Edition"). Wie andere Java-EE APIs verwendet auch JAX-WS sogenannte Annotationen {mit @ gekennzeichnete Schlüsselwörter}, zur Vereinfachung der Entwicklung und des Deployments von Webservice-Clients und von Service-Endpunkten {Server}.

Hello World JAX-WS

Gemäss der Anleitung unter http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/TopDownWebService/TopDownWebService.html kann für eine gegebene WSDL-Datei (http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/TopDownWebService/srcfiles/AreaService.wsdl) ein Webservice erzeugt werden.

Die in der Anleitung gezeigten Schritte werden hier nochmals wiederholt. Die folgenden Schritte erzeugen einen JAX-WS server basierend auf einer gegebenen WSDL-Datei.

Server

Als erstes muss in Eclipse ein Dynamic Web Project erstellt werden. Dieses Projekt beinhaltet nachher den Serverteil des Webservice.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "NewDynamicWebProject")

In das Verzeichnis WebContent wird die WSDL-Datei von http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/TopDownWebService/srcfiles/AreaService.wsdl importiert.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "ImportWsdlDatei")

Basierend auf der importierten WSDL-Datei wird nun der Webservice erzeugt.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "NewOtherWebservice")

Innerhalb des Web Service-Fensters werden die Default-Werte übernommen.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "WebServiceWizard")

Die nächsten Fenster werden mit Next durchlaufen. Dabei wird der Applikationsserver gestartet und die nötigen Ergänzungen zum Projekt gemacht. Als Resultat wird die Implementationsklasse des Services im Editor geöffnet. Diese Implementation muss noch angepasst werden damit wirklich die Fläche berechnet wird. Die Anpassung besteht darin den Return-Wert von $-3$ durch den Ausdruck parameters.getHeight()*parameters.getWidth() zu ersetzen.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "AdaptationServiceImpl")

Client

Unter http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/WebServiceClient/WebServiceClient.html ist beschrieben, wie ein Client zum oben erstellten Server erstellt wird.

Die folgenden Schritte wiederholen die Anleitung zur Erstellung des Clients.

  1. Auswahl der Datei AreaServiceSOAP.wsdl. WICHTIG ist, dass wir nicht die Datei AreaService.wsdl, welche wir zur Erstellung des Servers verwendet hatten, auswählen.
rmddochelper::insertOdgAsPdf(psOdgFileStem = "AreaServiceSOAP")
  1. Erstellen des Webservice Clients über den Wizard
rmddochelper::insertOdgAsPdf(psOdgFileStem = "WebserviceClientWizard")

Danach erscheint das Web Service Client-Fenster in welchem der Client konfiguriert werden kann. Den Slider schieben wir ganz hoch bis der Status Test client erscheint. Danach wird unter dem Link Client project das Projekt angegeben, welches den Client beherbergen soll.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "WebserviceConfiguration")

Die verbleibenden Fenster können mit Next durchlaufen werden und dann sollte als Resultat die folgende Webseite angezeigt werden.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "WebseiteResultat")

Im Fenster Methods klickt man auf calculateRectArea. Dann können Inputs eingegeben werden. Der Service funktioniert auch über die Eingabe des URI http://localhost:8080/AreaProjClient/sampleAreaServiceProxy/TestClient.jsp in einem Browser.

In Eclipse kann der Client-Test jeder Zeit wieder gestartet werden, indem durch einen Rechtsklick auf TestClient.jsp in AreaProjCleint > WebContent > sampleAreaServiceProxy und dann Run As > Run on Server auswählt.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "TestClientRunOnServer")

\pagebreak

Anhang

Konfiguration des Applikationsservers in Eclipse

Sobald in Eclipse ein neuer Workspace erzeugt wird, muss die Konfiguration des Applikationsservers neu erstellt werden. Als Voraussetzung für diese Einstellung muss der gewünschte Applikationsserver zuerst installiert sein. Die folgenden Schritte zeigen die Einstellung am Beispiel von TomEE (siehe auch im Abschnitt "Configuration of the Eclipse Workspace" auf http://help.eclipse.org). Folgende Schritte führen zur gewünschten Konfiguration

  1. In Eclipse wähle das Menu File > New > Other ...
  2. Selektiere Server > Server
  3. Click Next
rmddochelper::insertOdgAsPdf(psOdgFileStem = "EclipseTomEESetup")

Maven Projekt

Maven ist ein Projektmanagementtool (https://maven.apache.org). Dieses kann als stand-alone Variante eingesetzt werden. Alternativ dazu existiert das PlugIn M2Eclipse (http://www.eclipse.org/m2e/), welches Maven Support für Eclipse bietet. Die Dokumentation unter http://www.eclipse.org/m2e/ ist nicht sehr ausführlich. Es gibt aber genügend andere Einführungen, wie ein Maven-Projekt in Eclipse gestartet werden kann. Als Bespiel verwenden wir hier eine Anleitung von Tech-Recipes unter http://www.tech-recipes.com/rx/39279/create-a-new-maven-project-in-eclipse.

Voraussetzung

In Eclipse Neon ist das Plugin m2e schon installiert und somit kann dieser Abschnitt ignoriert werden. Für ältere versionen von Eclipse muss m2e von der entsprechenden Download-Site installiert werden. Dies wird im folgenden Abschnitt beschrieben. Bevor M2Eclipse verwendet werden kann, muss das PlugIn installiert werden. Dies kann über die PlugIn-Installations-Funktionalität in Eclipse gemacht werden. Als erstes Fügen wir eine neue Download-Site hinzu.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "InstallM2E", pnPaperWidthScale = 0.6)

Die Installation in Eclipse wird gestartet über "Help" > "Install New Software"

rmddochelper::insertOdgAsPdf(psOdgFileStem = "HelpInstallM2E", pnPaperWidthScale = 0.6)

Erstes Maven Projekt

Die Anleitung unter http://www.tech-recipes.com/rx/39279/create-a-new-maven-project-in-eclipse zeigt, wie ein einfaches Maven-Projekt erstellt wird. In Eclipse wird mit "File" > "New" > "Other" der Maven-Wizard ausgewählt und darin angegeben, dass ein neues "Maven-Projekt" erstellt werden soll.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "EclipseMavenWizard", pnPaperWidthScale = 0.6)

Als erstes wählen wir die Option "Create a simple project". Dies macht eine gewisse Auswahl an Vorlagen (sogenannte Archätypen).

rmddochelper::insertOdgAsPdf(psOdgFileStem = "SimpleMavenProject", pnPaperWidthScale = 0.6)

Danach müssen gewisse Informationen zum Projekt spezifiziert werden. Diese Informationen sind im Eingabefenster mit Namen versehen, welche für den Anfänger nicht auf Anhieb selbsterklärend sind. Als erstes wird eine "GroupId" verlangt. Die entspricht offenbar dem Namen der Institution in der typischen Java-Klassen-Nomenklatur, welche in etwa einem verkehrten URL entspricht. Im Feld "Artifact Id" soll der Name des Projekts eingetragen werden. Die übrigen Felder sind selbsterklärend. Der Abschnitt unter "Parent Project" kann leer gelassen werden.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "ConfigureMavenProject", pnPaperWidthScale = 0.6)

Als Resultat wurde ein neues Projekt in Eclipse erzeugt. Dieses enthält eine vorgegebene Struktur, welche auf dem folgenden Screenshot ersichtlich ist. Java code soll unter "src/main/java" abgelegt werden. Resourcen platziert man in "src/main/resources". Tests werden unter "src/test" angelegt.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "NewProjectInExplorer", pnPaperWidthScale = 0.6)

Die Datei "pom.xml" enthält die Informationen, welche im Konfigurationsfenster eingegeben wurde. Diese Datei kann in verschiedenen Ansichten betrachtet werden. Die Ansicht kann über die Tabs am unteren Fensterrand bestimmt werden.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "PomXml", pnPaperWidthScale = 0.6)

Weiterführendes Maven Projekt

Die im vorangegangenen Unterabschnitt beschriebene Vorgehensweise beschreibt nur die Erstellung eines einfachen Mavenprojektes. In diesem Projekt gibt es aber noch keinen Code und auch keinen Test. Das gleiche Vorgehen, mit Ausnahme, dass kein einfaches sondern ein auf Archätypen basiertes Projekt erzeugt wird, ist unter https://wiki.jasig.org/display/UPM32/Creating+a+Simple+Maven+Project beschrieben. Diese Beschreibung wird hier nicht weiter erläutert werden.

Unter http://crunchify.com/how-to-create-dynamic-web-project-using-maven-in-eclipse wird ein dynamisches Web-Projekt mit Maven in Eclipse erstellt. Diese Anleitung soll hier im Detail analysiert werden. Die Erstellung des Maven-Projekts läuft gleich bis zur Angabe des Archätypen. Dort wird die Artifact-Id "maven-archetype-webapp" ausgewählt.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "MavenArchWebApp", pnPaperWidthScale = 0.6)

In der erzeugten Webapplikation erscheint der unten gezeigte Fehler.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "ServletSuperclassNotFound", pnPaperWidthScale = 0.6)

Dieser Fehler kann behoben werden durch die Angabe der Abhängigkeit im pom.xml oder durch das Hinzufügen von Apache Tomcat als Runtime. Das Projekt kann nun gebuildet werden mit "Rechts-Klick" auf das Projekt und dann "Run As" > "Maven build ...". Die drei Punkte scheinen wichtig und führen im Gegensatz zur ersten "Maven build"-Option im Menufeld dazu, dass ein weiteres Optionsfenster geöffnet wird.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "RunAsMavenBuild", pnPaperWidthScale = 0.6)

Im folgenden Screenshot sind die zusätzlichen Optionen angegeben.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "MavenBuildConfig", pnPaperWidthScale = 0.6)

In der Console von Eclipse sollte als Resultat "BUILD SUCCESS" stehen (siehe roten Pfeil)

rmddochelper::insertOdgAsPdf(psOdgFileStem = "MavenBuildResult", pnPaperWidthScale = 0.6)

Sobald die Applikation der Building-Prozess abgeschlossen ist kann sie auf den Applikationsserver deployed werden. Dies kann über einen Rechts-Klick im Server-Tab auf dem entsprechenden Applikationsserver gemacht werden. Im Menufenster wählt man dann "Add and Remove" aus und verschiebt die Applikation so auf den Server.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "DeployWebApp", pnPaperWidthScale = 0.6)

Der Webservice kann nun über http://localhost:8080/AaDeMavenTutorial/index.jsp im Browser aufgrufen werden.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "WebAppInBrowser", pnPaperWidthScale = 0.6)

Erzeugung einer WSDL-Musterdatei

Gemäss der Anleitung unter http://crunchify.com/create-sample-wsdl-in-eclipse-and-generate-client kann in Eclipse eine WSDL-Datei erzeugt werden. In einem weiteren Abschnitt kann die erzeugte Datei dann getestet werden.

Schritt 1: Ein Java Project

Die Erstellung eines Java-Projekts in Eclipse ist abhängig von der Ansicht in welcher man sich gerade befindet. In der Java EE-Ansicht sind die Java-Projekte unter "New" > "Other" verfügbar. In der Java SE-Ansicht gibt es den direkten Pfad über "File" > "New" > "Java Project". Sobald dieses Projekt angelegt wird, wechselt Eclipse in die Java SE-Anicht.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "NewJavaProject")

Schritt 2: WSDL Datei

Mit "File" > "New" > "Other" > "Web Services" > "WSDL" wird eine neue WSDL-Datei erzeugt.

Schritt 3: Zuweisung der WSDL Datei zum Projekt

Die neu erzeugte WSDL-Datei kann einem Projekt zugewiesen werden. Hier weisen wir die Datei dem unter Schritt 1 erzeugten Java Projekt zu.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "NewWSDLFile")

Schritt 4 und 5: Anpassungen bei Konfiguration

Schritt 6: Generierung des Clients

Auf der WSDL-Datei einen Rechts-Click und dann "Web Services" > "Generate Client" auswählen.

Schritt 7: Test client

Mit dem Schieber auf "Test client" und dann "Finish". Dies erzeugt den Client und macht einen Test.

rmddochelper::insertOdgAsPdf(psOdgFileStem = "TestClient")

Alternative Runtimes

Eine Suche nach mögliche Werkzeugen zur Unterstützung bei der Implementierung einer bestehenden Schema-Definition führte auf das Maven-Plugin Apache CXF. Als Voraussetzung wurde zuerst einmal Maven und das Ecliplse-Plug-in M2Eclipse installiert.

Alternativ zu Apache CXF existiert auch der Code-Generator des Eclipse-Plugins von Apache Axis2.

Apache Axis2

Etlichen Tests einen einfachen SOAP basierten Webservice in Eclipse zu erstellen und dann auf TomEE (v7) unter Verwendung des Projektframeworks Apache Axis2 zu installieren, haben gezeigt, dass dies offenbar nicht funktioniert. Apache Axis2 scheint offenbar nicht mit Version 3.0 von Dynamic Web Projects in Eclipse kompatibel zu sein.

Apache CXF

Als Alternative zu Axis2 steht CXF zur Verfügung. Ob die Verwendung von CXF zu einem lauffähigen Webservice führt muss noch getestet werden.

Maven Webapp

Wie oben beschrieben, kann ein einfacher Webservice auch über die Erstellung eines Maven-Projekts erstellt werden.

if (!r6ob_abbrtable$is_empty_abbr())
  r6ob_abbrtable$writeToTsvFile()

\pagebreak

r6ob_abbrtable$include_abbr_table(psAbbrTitle = "## Abkürzungen")


pvrqualitasag/AadeJaxWsPrototypeDocu documentation built on May 26, 2019, 11:33 a.m.