Archive for the ‘Programmierung’ Category

Serveral links on how to integrate 3rd Party Libraries into Web DynPro Projects (e.g. Hibernate) and how to use a Java Bean Model:

Hibernate
complex Java Beans
Changing a Java Bean Model
Jar of a Java Bean Model
Including Rhino as Example of an external library
Exernal Jars in Web DynPro

Open Terminal
enter pico ~/.profile

GRAILS_HOME=~/Library/grails
PATH=$PATH:$GRAILS_HOME/bin

Save with Ctrl+X, Y
Close and open new Terminal window

SSL und somit auch https nutzen eine asysmetrische Verschlüsselung, d.h. der Client benötigt den öffentlichen Schlüssel des Servers, mit dem er die Nachricht für diesen verschlüsseln kann.

Um mit einem Java-WebService-Client eine SSL Verbindung herzustellen, muss das Zertifikat des Servers in den JVM Keystore importiert werden. Man kann es entweder in den Standardkeystore importieren, der je nach Betriebssystem an verschiedenen Orten liegen kann. Bei Windows liegt er normalerweise hier:

C:\Dokumente und Einstellungen\<user>\.keystore

Um einen Zertifikat und somit einen Schlüssel in diese Datei zu importieren, kann man das Keytool von SUN nutzen, welches unter %JAVA_HOME%\bin\keytool.exe zu finden ist. Ein Import eines Zertifikates sieht folgendermaßen aus:

keytool -import -v -alias <keyalias – frei wählbar> -file <Speicherort des Zertifikats> -storepass <standard:changeit>

Leider scheint Tomcat warum auch immer partout nicht auf diese Datei zuzugreifen, also habe ich eine eigene Datei mit dem zusätzlichen Parameter -keystore <datei.keystore> erstellt.

Nun musste ich auch noch beim Initialisieren meines Servlet, welches den WebService über https aufruft das System-Property javax.net.ssl.trustStore setzen:

System.setProperty(„javax.net.ssl.trustStore“, „datei.keystore“);

Für den Client MUSS es das trustStore-Property sein und NICHT das keyStore-Property.

Das ganze kann man natürlich auch Tomcat als Startparameter mit übergeben, wie hier beschrieben.

Update: Der java-weite Keystore liegt in JAVA_HOME\jre\lib\security\cacerts

Nach längerem Suchen habe ich endlich verstanden, wie man n:m-Beziehungen in Hibernate am besten mappt.
Für die Verwaltung von solchen Beziehungen benötigt man in relationalen Datenbanken eine Beziehungstabelle.

Nehmen wir an es gibt 3 Tabellen:

News, Category und NewsCategory.

Eine News kann mehreren Categories zugeordnet sein und die Categories können natürlich in verschiedenen News benutzt werden. NewsCategory ist somit die Relationship-Tabelle.

Folgende Felder sind definiert (Auszug):

  • News-Tabelle: newsId(PK)
  • Category-Tabelle: categoryId(PK)
  • NewsCategory-Tabelle: newsCategoryId(PK), newsId(FK), categoryId(FK)

In der news.hbm.xml-Mapping-Datei definiert man ein Set, das die Beziehung zu den Categories abbildet:

<set name=“categories“ table=“NewsCategory“>
<key column=“newsId“ />
<many-to-many class=“net.vland.demo.Category“ column=“categoryId“/>
</set>

Das gleiche in der category.hbm.xml

<set name=“news“ table=“NewsCategory“>
<key column=“categoryId“ />
<many-to-many class=“net.vland.demo.News“ column=“newsId“/>
</set>

Nun muss man nur noch in den POJOs einfache Sets mit den definierten Namen erzeugen und das war’s. Es ist jetzt möglich ohne Umwege über die Beziehungstabelle die Daten auszulesen, z.B.:

Set categories = news.getCategories();

Anmerkung: Hibernate wirft eine Exception, wenn für einen Datensatz kein „Beziehungs-Set“ da ist. Dies kann durch not-found=“ignore“ im <many-to-many>-Tag unterbunden werden.

Wenn ein Hibernate-Property mit einem Kleinbuchstaben anfängt und darauf ein Groß-Buchstabe folgt, funktionieren die Getter und Setter, die Eclipse generiert, nicht mehr.

Das Property heißt tEinkaeufer.

Dafür hat Eclipse diese Getter und Setter generiert:

public TEinkaeufer getTEinkaeufer()
{
return tEinkaeufer;
}

public void setTEinkaeufer(TEinkaeufer einkaeufer)
{
tEinkaeufer = einkaeufer;
}

Beim initialisieren von Hibernate wurde dann folgender Fehler geworfen:

Initial SessionFactory creation failed.org.hibernate.PropertyNotFoundException: Could not find a getter for tEinkaeufer in class …

Daraufhin habe ich den Code folgendermaßen abgeändert:

public TEinkaeufer gettEinkaeufer()
{
return tEinkaeufer;
}

public void settEinkaeufer(TEinkaeufer einkaeufer)
{
tEinkaeufer = einkaeufer;
}

Und nun funktioniert es, was mich ein bisschen wundert.

Ich weiß nicht ob das ein Fehler in Hibernate ist, oder ob das so gewollt ist. Kann mir nicht vorstellen wieso…

Den Web Service habe ich heute fertig modelliert und ihn soweit gebracht, dass er mal ein paar Testdaten ausspuckt.

In der Web DynPro Anwendung wurde das Model über die WSDL-Definition importiert und die Mappings und Bindings über die GUI zusammengeklickt. Eine Zeile Code musste ich dort programmieren um folgendes Formular zu haben, welches seine Daten über den Web Service bezieht.

Schon erstaunlich wie „einfach“ das geht.

Morgen werde ich dann mal das bisher gelernte dokumentieren.

Heute habe ich hauptsächlich an dem Web Service fürs Auslesen der Daten aus der Anwendung weitergemacht, welcher dann zum Test über eine Web DynPro Applikation angesprochen wird.

Waren relativ viel Hibernate-Sachen dabei, weil das meiner Meinung nach die einfachste Art ist, aus einer bestehenden DB Daten auszulesen, vor allem wenn man die Hibernate Tools benutzt.

Außerdem habe ich versucht ein bestehendes Servlet auf dem Web AS zum laufen zu bringen, was realtiv einfach ging:

Zunächst muss das Deploy Tool unter

C:\usr\sap\<SID>\<IID>\j2ee\deploying

aufgerufen werden.

Dort ein neues Deployment-Projekt anlegen.

Im J2EE Reiter mit Rechtsklick „Add Web“ und die web.xml und den Pfad der Anwendung angeben.

Dann ist eine Komponente im J2EE Reiter zu sehen. Diese mit Rechtslick „archivieren“ und im Assembler Reiter ein EAR packen.

Somit kann im Deployment Reiter nach Verbindung mit dem Server das EAR deployt werden.

Schien ohne Probleme zu klappen, aber leider konnte ich die Anwendung noch nicht aufrufen, weil ich die URL noch nicht rausgefunden habe. Naja vielleicht morgen dann.

Heute ging es endlich ans Eingemachte. Ich konnte Anwendungen entwickeln und installieren, außerdem habe ich einiges über Enterprise Java Beans gelernt.

Zunächst habe ich versucht eine Beispiel EAR (Enterprise Application Archive) in die J2EE Engine zu deployen. Vom NWDS aus wollte das aber partout nicht funktionieren. Das lag daran, dass der Port für die J2EE Engine sich von NW 2004 zu anscheinend 2004s geändert hat und in dem NWDS noch der alte Port eingestellt war. Das war nur eine Schätzung von mir, weil ich nirgends dazu Infos gefunden habe. Auf jeden Fall habe ich herausgefunden, wo der Port konfiguriert ist:

/usr/sap//

Work29

3900

Hier ist anstatt dem alten Port 3601 der neue 3900 konfiguriert. Also habe ich diesen in die J2EE Einstellungen übernommen:

Leider hat es dann immer noch nicht funktioniert mit dem Deployen, weil der SecureStore des SAP Deployment Managers (SDM) mein Master Passwort der Installation nicht übernommen hatte. Also musste den Anweisungen hier unter „SDM cannot Connect to J2EE Engine“ folgen.

Dann hat’s auch mit dem Deployen geklappt.

Als nächstes habe ich das Car Rental J2EE Tutorial durchgemacht, welches eigentlich recht gut verständlich war und währenddessen habe ich auch endlich mal richtig verstanden, was das mit den EJBs auf sich hat.

Kurzzusammenfassung der Beans die ich heute verwendet hab:

  • Entity Beans
    Mit ihnen kann man die persistenten Daten des System modellieren.
    Diese Mappings werden dann entweder selbst programmiert (Bean Managed Persistance, BMP) oder vom J2EE Container übernommen. (Container Managed Persistance, CMP). Für mein Beispiel habe ich CMP verwendet.
  • Session Beans
    Diese enthalten die Businesslogik, d.h. sie bilden die Vorgänge ab, die der Benutzer mit dem System durchführt. Es gibt stateful Session Beans (mit „Gedächtnis“) und stateless Session Beans, welche immer wieder neu instanziiert und mit Parametern gefüttert werden.

Dann habe ich heute noch ein Servlet und ein JSP im NWDS erstellt und festgestellt, dass auch hier mit der standardisierten web.xml gearbeitet wird. Mal sehen, ob ich es dann schaffe auch eine unserer Anwendungen im SAP WS zu deployen. Mit dem Deploy Tool sollte das möglich sein. Diese Verwendet allerdings keine WARs sondern so wie ich das sehe nur die bereits angesprochenen EARs.

Ach ja und dann hatte ich heute morgen auch gleich wieder eine schöne Überraschung, als mich mein Rechner mit einem Bluescreen begrüßte und ich Netweaver wieder frisch hochfahren musste, was diesmal allerdings nur 38 Minuten gedauert hat…

Der ganze Entwicklungsprozess von Web DynPro ist so ausgelegt, dass man so wenig wie möglich programmieren muss. Und wenn man es dann muss, ist’s relativ einfach.

Das wichtigste ist, dass man die Kontexte initialisert. Dies geschieht in der wdDoInit()-Methode der Controller Kontexte. Hier mal ein Code-Schnipsel aus dem Beispiel im SDN:

/** Hook method called to initialize controller. */

public void wdDoInit()

{

[…]

Collection questions = new ArrayList();

for (int i = 0; i < size; i++) {

// instantiate the new context node element of type QuizData

IPublicQuiz.IQuizDataElement quizDataElement =

wdContext.createQuizDataElement();

// set contained context value attributes

quizDataElement.setQuestion(resourceHandlerForQuestions.getString(„Q“+i));

quizDataElement.setAnswer(resourceHandlerForAnswers.getString(„A“+i));

quizDataElement.setCounter(String.valueOf(i+1)+“/“+String.valueOf(size));

// add new context node element of the type QuizeData to ArrayList

questions.add(quizDataElement);

}

//===== STEP 3: Bind collection of Q&A pairs to context value node QuizData ====

// Bind collection of context node elements to context value node QuizData

wdContext.nodeQuizData().bind(questions);

//@@end

}

SAP Library – Web Dynpro for Java

Hier werden die vorher angelegten Context Nodes (quizDataElement) der Komponente initialisiert und in einer Collection gespeichert. Auf diese kann man dann in den Views über

wdContext.nodeQuizData().<operation>;

zugegriffen werden.

Der eigene Context des Views wird über

wdContext.currentContextElement().<operation>;

aufgerufen.

Dann noch ein bisschen Logik implementieren und das war’s.

Da ich leider Netweaver immer noch nicht installieren konnte, habe ich mich gerade mit der Einrichtung von Eclipse und der Installation diverser Plugins beschäftigt.

Besonders gut finde ich die Hibernate Tools. Damit kann man sich unter anderem aus einer bestehenden Datenbank Hibernate hbm Dateien und POJOs generieren lassen. Hier ist die sehr gute Doku dazu.

Leider sind bei der Datenbank, die ich brauche die Foreign Keys nicht eingerichtet, so dass ich die Relationships wohl händisch nachziehen muss.

Dann habe ich mir noch das Web Toolkit und die abhängigen Plugins installiert. Noch nicht viel damit gemacht, nur ein bisschen rumgespielt.