Dienstag, 23. Dezember 2008

Sonntag, 21. Dezember 2008

Freaky Friday - A6: Almighty Webservice Client

Ein paar abendliche Punsch können erstaunliche Auswirkungen auf die Kreativität des menschlichen Gehirns haben - so geschehen Freitag abend, als auf der Heimfahrt in der U-Bahn die Idee geboren wurde, einen universellen Webservice Client zu erschaffen.

Die Idee hat sich hartnäckig gehalten und so sind Skripte und Quellen unter http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/client/ zu finden - die Matrikelnummer bitte wieder selbst aus der Teilnehmerliste kopieren.

Ein paar der interessanten Features sind:
  • Komplett automatisiert (Nur WS Name / Ersteller / WSDL URL sind manuell erfasst)
  • Formulargenerierung inkl. Labels
  • Geparster Methodenname als Formulartitel (erkennt "get", "add", CamelCase)
  • Unterstützung komplexer Typen, auch verschachtelt
  • Unterstützung von Arrays als Input Parameter (immer 3 Elemente)
  • Tracelog (Per JavaScript Ein/Ausblendbar)
  • Retournierte Arrays werden als Listen ausgegeben
  • Retournierte Objekte werden als Tabelle ausgegeben (Attributname und Wert)
Sehr viel Magie ist leider nicht dabei, hauptsächlich besteht die Arbeit aus stupidem (quick and dirty) Parsen. Mit ein paar gescheiten Regex wäre das ganze kürzer geworden, aber hauptsächlich ging es mir darum just for fun einen Prototypen zu erstellen. Interessant sind:
  • Reflection für die Objekte: get_object_vars($result); in response.php
  • Method Invocation für den SOAP Client: call_user_func_array( array($this->client,$operation) , $arguments); in definitions.php
Die Anzahl der Server, die damit kompatibel sind ist zwar erschreckend gering, das liegt allerdings an Fehlern in deren Implementierung - Feedback ist in der Auswahlliste zu finden.

Montag, 8. Dezember 2008

A6: Webservice Server Release

Das zuvor beschriebene Arzneimittel-Codex Webservice ist nun fertig implementiert, hier gibt es die Details.

Operation 1: String[] getArzneimittelliste(String stoffklasse)
Operation 2: Medikament getMedikament(String handelsname)

Der komplexe Datentyp Medikament enthält (in dieser Reihenfolge) die String-Elemente handelsname, freiname, wirkstoff, indikationen, kontraindikationen

Folgende Arzneimittelklassen sind vorhanden: Antibiotika, Antihistaminika, Benzodiazepine, Sonstiges. Je nach Kategorie werden dabei zwischen 1 und 3 Medikamente (Array Elemente) gespeichert. Wird eine "unbekannte" Arzneimittelklasse angefordert, so werden immer die Allheilmittel Panazee und Theriak zurückgeliefert.

Mögliche Medikamente sind Fenistil, Floxapen, Invanz, Ospamox, Panazee, Psychopax, Theriak und Valium. Zu diesen 8 Medikamenten können mit Operation 2 auch Details abgerufen werden. Bei einem unbekannten Medikament sind alle Attribute des zurückgelieferten Objekts NULL-Werte.

Wer bereits den Client implementieren will, dem kann ich versprechen dass ich keine Änderungen mehr geplant habe. WSDL und Server Source befinden sich am Almighty (http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/). Interessenten mögen die Matrikelnummer in der Teilnehmerliste der Übungsumgebung nachschlagen, da ich sie hier nicht gleich Google direkt in den Rachen werfen möchte.

Sonntag, 7. Dezember 2008

A6: Webservice Server Preview

Meine aktuelle Idee zu dieser Aufgabe kommt einmal mehr aus dem Bereich der medizinischen Informatik.

Operation 1 erhält als Parameter eine Arzneimittelklasse, und retourniert ein Array von Präparaten (Handelsnamen). Eine Liste dazu gibt es unter http://www.meduniwien.ac.at/medtools/medlist/ind-list.pdf, ein Teil davon wird wohl per Copy und Paste Einzug in mein Webservice erhalten.

Operation 2 realisiert einen Arzneimittelkodex (In Österreich: "Austria Codex"). Als Parameter wird der Handelsname eines Präparats als String übergeben, der komplexe Datentyp "Medikament" mit detailierten Informationen (Freiname, Wirkstoff, Indikationen, Kontraindikationen) zurückgegeben. Online verfügbare Kodizes sind unter http://www.meduniwien.ac.at/medtools/medlist/cms1/ueberuns/00000095fc12aeb01/index.php verlinkt. Die Schweizer Liste ist auch ohne vorhergehender Registrierung komplett abrufbar - einfach mal "Aspirin" oder sonst etwas bekanntes auf http://www.kompendium.ch/Search.aspx?lang=de eingeben.

A4: XPath Abfragen

Nach der Deadline gibt es nun auch die "Auflösung":
  • Zu welchen Tumoren wurde noch kein Krebsmeldeblatt angelegt?

    //tumor[count(krebsmeldeblatt)=0]

  • Untersuchungen, bei denen ein Residuum entdeckt wurde

    //untersuchung[diagnose/tumorstatus="Residuum"]

  • Die Ausdehnung aller benignen Tumoren des Patienten mit der SVNR 1234010155

    //patient[@svnr="1234010155"]/untersuchung/diagnose[id(@tumor)
    [differenzierung/@name="benign"]]/ausdehnung
Das ganze auch für die Regierungs-Teilaufgabe:

  • Die Namen aller SPÖ-Sozialminister

    id(//minister[@ressort="sozial"]/@person_id)[@partei="SPÖ"]/@name
    XPath2: distinct-values( id(//minister[@ressort="sozial"]/@person_id)[@partei="SPÖ"]/@name)

  • Zurückgetretene FPÖ-Minister

    //minister[ id(@person_id)/@partei="FPÖ" and @durchgehalten="nein" ]

  • Bundeskanzler gescheiterter Regierungen

    //minister[ @bundeskanzler="ja" and ../@vorzeitige_neuwahlen="ja" ]

  • Die durchschnittliche Amtszeit von Regierungen (nur XPath 2)

    sum(//legislaturperiode/number(@end_jahr - @beginn_jahr)) div count(//legislaturperiode)
Da sind auch einige Abfragen mit id() dabei, die ResultSets werden daher in der Übungsumgebung nicht ganz wie gewohnt farblich markiert - aber sie funktionieren.

Wer vor ähnlichen Problemen steht, kann ganz einfach mit Saxon arbeiten (unterstützt auch XPath2, Download: http://saxon.sf.net). Die Abfrage muss in eine Datei geschrieben werden (zb q.txt), der Aufruf lautet dann wie folgt:

java -cp saxon9.jar net.sf.saxon.Query -s file.xml q.txt

A5b: XSLT

Schon vor etwas mehr als einer Woche habe ich angefangen, A5 zu erledigen. Variante B (XSLT) war vermutlich die einfachste Aufgabe nach A1 (HTML) und dementsprechend schnell fertig. Die XML-Datenquelle war schnell erstellt, für das XSLT war auch nicht viel mehr nötig, als die vorhandene HTML Seite mit XSL-Tags auszustatten.

Zwei Tipps an dieser Stelle: Das erste Beispiel zeigt das Grundgerüst zum Sortieren einer Liste. Das zweite Beispiel demonstriert, wie man Werte in ein HTML Attribut einfügen kann (<xsl:value-of> wäre ja ein Tag im Tag und funktioniert somit auch nicht). Der String innerhalb der geschwungenen Klammern ist dabei der XPath-Ausdruck, der normalerweise im select="..." stehen würde)
<xsl:for-each select="...">
<xsl:sort select="..." />
</xsl:for-each>

<img id="cover" src="{cover}" alt="{titel}" />
(Fleiß-)Aufgabe A5a werde ich mir dann ersparen, wenn bis 16.12. schon die nächste (Teil)aufgabe Webservice Server abzugeben ist. Außerdem beginnt am 9.12. ja wieder die ORF Ski-Challenge 09, da muss dann natürlich fleißig trainiert werden.