Oracle Fusion Middleware Blog

Deutsche Informationen rund um Oracle Fusion Middleware

Archive for the ‘ADF’ Category

JDeveloper 12c, ADF und die Datenbank-Abhängigkeiten

leave a comment »

Bei der Entwicklung und dem Deployment von ADF-Applikationen stößt man immer wieder auf das Thema, dass es zwingende Abhängigkeiten zur Datenbank gibt. Im JDeveloper 12.1.x und 12.2.x wird beim Start des eingebetteten WebLogic Servers zugleich eine Derby Database gestartet, die auf den Port 1527 horcht. Die Derby Database ist ein Teil der WebLogic Server-Installation. Im Blog Post Derby DB lässt sich nicht starten .. wird beschrieben, wie man das Problem lösen kann, das durch fehlende Rechte (Java Policy) beim Start entsteht. Allerdings ist es auch möglich, den Start gänzlich zu unterdrücken, indem man in der Datei setDomainEnv.sh des eingebetteten WebLogic Servers nach dem String „DERBY_FLAG“ sucht und die entsprechende if-Schleife komplett auskommentiert. Man findet diese Datei im Verzeichnis DefaultDomain/bin unter dem Systemverzeichnis des installierten JDevelopers.

Eine weitere Abhängigkeit zu einer Datenbank besteht beim Deployment von ADF-Applikationen in der Version 12c.  Die Abhängigkeit betrifft in diesem Fall die Fusion Middleware Infrastruktur, konkret die Oracle Platform Security Services (OPSS). Sie benötigen für den Betrieb im Cluster eine Datenbank, die beim Anlegen einer JRF (Java Require Files) Extended Domain zwingend erforderlich ist. Die Certification Matrix für das jeweilige Release der Fusion Middleware 12c gibt an, welche Datenbanken und welche Versionen dafür zum Einsatz kommen können.

Duncan Mills hat in seinem Blog Setting up a standalone WebLogic 12c install for ADF Without a Database  beschrieben, wie man diese Anforderung in einer Entwicklungs- oder Test-Umgebung umgehen kann.
Mit dem neuen Release 12.2.1 der Oracle Fusion Middleware ist es nun möglich, eine sogenannte Restricted JRF Domain anzulegen, die keine Abhängigkeit mehr zu einer Datenbank für OPSS aufweist.

<JM>

Advertisements

Written by fmtechteam

12/11/2015 at 13:33

Veröffentlicht in ADF, Appserver, Jürgen Menge

Tagged with ,

SAML SSO zwischen ADF Anwendungen und WebCenter Portal

leave a comment »

Hier werden die notwendigen Schritte zum Aufbau eines SAML basierten Single Sign Ons zwischen WebCenter Portal 11.1.1.8, auch als Spaces bekannt, und einer eigenen, beliebigen ADF Anwendung beschrieben. Mit anderen Worten, die abgesicherte ADF Anwendung kann seine Authentifizierung an WebCenter Portal weiter delegieren und dessen Benutzerkontext adaptieren.

Problembeschreibung

Wenn WebCenter beispielsweise um BPM Process Spaces erweitert wurde, ist in WeCcenter ein Aufgabenlisten TaskFlow verfügbar, der alle Aufgabe aus der BPM Suite anzeigt. Klickt man nun auf einen Eintrag in dieser Liste, so wird in einem Browser Pop-up Fenster die dazugehörige Task UI aufgerufen.

Picture1

Für dieses Szenario muss der Anmeldekontext von Webcenter an die ADF Anwendung übergeben werden, damit beispielsweise in der ADF Form ein Dokumentenupload als Prozessattachment in den Content Server vorgenommen werden kann. Dafür ist ein Web SSO zwischen Webcenter Portal und der ADF Anwendung nötig. Die empfohlene Vorgehensweise ist eine Einbeziehung beider Anwendungen in ein unternehmensweites SSO. Was macht man nun, wenn aber ein solches nicht vorhanden ist? Hier besteht die Möglichkeit, ein minimalistisches SSO auf der Basis von SAML aufzusetzen. Diese Lösung weist einige Einschränkungen auf (z.B. kein globales Single Sign Off), ist aber eine gültige Vorgehensweise und wird auch von WebCenter 11.1.1.8 weiterhin unterstützt. Der WebCenter Portal Admin Guide dokumentiert das Setup dazu im Kapitel 33 (siehe hier).

Lösung

Vorbemerkungen

Der hier beschriebene Lösungsweg berücksichtig SAML v1.1. aufgrund der durch WebCenter bereitgestellten Scripte. Nach jetzigem Stand wird SAML 2.0 mit WebCenter 12g unterstützt (unverbindlich). Wie bereits erwähnt, ist kein globales Single Sign Off in SAML v1.1. möglich. Das bedeutet, dass nach einer Abmeldung und Wiederanmeldung an WebCenter innerhalb der aktuellen Browsersession mit einem anderen Benutzernamen der vorherige Benutzerkontext für die ADF Anwendung beibehalten wird. Der Anwender muss also alle Browserfenster der Sitzung komplett beenden.

Es wird in der hier aufgezeigten Herangehensweise  keine SSL Verschlüsselung, wie im Normalfall bei Anmeldefenstern üblich, berücksichtigt, da nur der allgemeine Lösungsweg an einem einfachen Beispiel skizziert wird.

Als Voraussetzung muss natürlich WebCenter Portal korrekt installiert und konfiguriert sein. Der im Beispiel verwendete Weblogic Server für die eigene ADF Anwendung ist mit dem WebCenter Server in einer gemeinsamen Weblogic Domäne installiert. Eine BPM Suite Installation ist in diesem Fall nicht notwendig, da hier lediglich das Zusammenspiel zwischen der eigenen ADF Anwendung und WebCenter Portal im Fokus liegt. Die BPM Suite dient nur zur Veranschaulichung der Aufgabe.

Namenskonvention für das Beispiel

Hier sind die im Beispiel verwendeten Namen  und Pfade. Diese Werte müsssen natürlich für die eigene Umgebung angepasst werden.

  • Hostname = owc.vm.oracle.com
  • SAML Source Site = für die Anmeldung verantwortliche Anwendung = WebCenter Portal
  • SAML Destination Site = Zielanwendung, die die Authentifizierung von der Source Site übernehmen soll = eigene ADF Anwendung
  • SAMLAPP = Name der eigenen ADF Anwendung , Context root = /samlapp
  • Oracle Fusion Middleware Basisverzeichnis /oracle/fmw/
  • WLS Domäne
  • Name = dot8
  • Verzeichnis = /oracle/fmw/user_projects/domains/dot8
  • Weblogic Servernamen
  • WC_Spaces auf Port 8888 für WebCenter Portal
  • CustomApp auf Port 8100 für eigene ADF App (SAMLAPP)
  • Oracle HTTP Server wurde hier verwendet, ist aber nicht zwingend notwendig. WebCenter hört daher in diesem Falle auf Port 80
  • JDK installiert in /usr/java/jdk1.7.0_55
  • Domain Admin Account lautet weblogic/welcome1 (wird für wlst Anmeldung verwendet)

Aufsetzen des Managed Servers für ADF Anwendung

  1. Erstelle einen neuen WLS Server „CustomApp“ in der Domäne für Port 8100 über WLS Console
  2. Füge ADF Runtime über die EM Website hinzu
    • Wähle den neuen Managed Server in EM Website aus
    • Schalter “Apply JRF Template” wird sichtbar. Durch Anklicken werden alle notwendigen Bibliotheken dem Server zugewiesen

SAML 1.1 Konfiguration der Server

Zunächst sollte ein neuer Schlüssel im Standard Keystore DemoIdentity erstellt und anschließend in eine Zertifikatsdatei exportiert werden. Diese Zertifikatsdatei wird später in der Konfigurationsdatei wcsamlsso.properties referenziert

  1. Identifiziere in der WLS Konsole den Speicherort des Standard Keystores.
    Picture2
  2. Öffne eine SSH Shell und navigiere zu diesem Verzeichnis
    cd /oracle/fmw/wlserver_10.3/server/lib/
  3. Füge einen neuen Schlüssel zum DemoIdentity Keystore hinzu
    /usr/java/jdk1.7.0_55/bin/keytool -genkey -keypass testkeypass 
    -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase 
    -keyalg rsa -alias testalias
  4. Exportiere den Schlüssel in eine Datei
    /usr/java/jdk1.7.0_55/bin/keytool -export -keypass testkeypass 
    -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase 
    -alias testalias -file testalias.der
  5. Erstelle Credential Dateien zum automatisierten Domänenlogin in wlst
    cd /oracle/fmw/user_projects/domains/dot8/config/fmwconfig
    /oracle/fmw/Oraclew_WC1/common/bin/wlst.sh
    connect('weblogic','welcome1','localhost:7001')
    storeUserConfig('spacesconfig.secure', 'spaceskey.secure')
  6. Erstelle eine Verschlüsselung für das Schlüsselpasswort
    print encrypt(obj='testkeypass', domainDir='/oracle/fmw/user_projects/domains/dot8/')
    exit()
  7. Prüfe, ob in dem Verzeichnis die Dateien ordentlich angelegt wurden
  8. Navigiere zum WebCenter Home Verzeichnis und dort ins common/bin
    cd /oracle/fmw/Oracle_WC1/common/bin/
  9. Editiere die Datei wcsamlsso.properties. Die Sektion [spaces_config] sollte in etwa so aussehen
    [spaces_config]
     configFile = /oracle/fmw/user_projects/domains/dot8/spacesconfig.secure
     keyFile = /oracle/fmw/user_projects/domains/dot8/spaceskey.secure
     adminURL = localhost:7001
     usesSSL = false
     url = http://owc.vm.oracle.com/webcenter
     serverName = WC_Spaces
     certAlias = testalias
     certPassword = {AES}0ZvXfi7zJs89AkLXg5/tQzVIAKaV0ZeGIo+oNeM64VE=)
     certPath = /oracle/fmw/wlserver_10.3/server/lib/testalias.der

    Das Certpassword entsprich dem unter Punkt 6 erstellten Schlüssel

  10. Füge folgende Zeilen am Ende der Datei hinzu
    [custom_config]
     configFile = /oracle/fmw/user_projects/domains/dot8/spacesconfig.secure
     keyFile = /oracle/fmw/user_projects/domains/dot8/spaceskey.secure
     adminURL = localhost:7001
     usesSSL = false
     serverName = CustomApp
     certAlias = testalias
     certPath = /oracle/fmw/wlserver_10.3/server/lib/testalias.der
    [samlapp_config]
     url = http://owc.vm.oracle.com:8100/samlapp

    Beachte die Leerzeile nach jeder Sektion sowie am Ende der Datei. Ansonsten wird die Sektion nicht erkannt. Die komplette Beispieldatei liegt hier

  11. Navigiere zum Verzeichnis der SAML SSO Python Scripte, die durch die WebCenter Installation bereitgestellt werden
    cd /oracle/fmw/Oracle_WC1/webcenter/scripts/samlsso/
  12. Erstelle ein neues Script für die Sektion [custom_config]
    vi configureCustomApp.py
  13. Füge den Code aus dem Anhang hinzu und speichere die Datei ab
  14. Erstelle analog dazu eine neue Python Scriptdatei für die Sektion [samlapp_config]
    vi configureSAMLApp.py
  15. Füge den Code aus dem Anhang hinzu und speichere die Datei ab
  16. Navigiere zurück zu common/bin im WebCenter Home Verzeichnis
    cd /oracle/fmw/Oracle_WC1/common/bin/
  17. Starte wlst
    ./wlst.sh
  18. Prüfe, ob die Domain gestartet ist (AdminServer, WC_Spaces) und führe dann folgenden Befehl in der wlst Konsole im Offline Modus aus.
    execfile('/oracle/fmw/Oracle_WC1/webcenter/scripts/samlsso/configureSpaces.py')
  19. Prüfe Fehler und starte dann die Domäne durch (AdminServer, WC_Spaces, CustomApp)
  20. Nun werden relying party und asserting party angelegt. Starte dazu wlst nochmal
    ./wlst.sh
  21. Führe folgenden Befehl in der wlst Konsole im Offline Modus aus
    execfile('/oracle/fmw/Oracle_WC1/webcenter/scripts/samlsso/configureCustomApp.py')
  22. Starte wlst nochmal
    ./wlst.sh
  23. Führe folgenden Befehl in der wlst Konsole im Offline Modus aus
    execfile('/oracle/fmw/Oracle_WC1/webcenter/scripts/samlsso/configureSAMLApp.py')

Das wär’s für die SAML Konfiguration auf Serverseite. Aus Sicherheitsgründen sollten alle Dateien mit Anmeldeinformationen bereinigt werden, d.h. wcsamlsso.properties, und die Credential Dateien im Domänen Konfigurationsverzeichnis wieder gelöscht werden (spacesconfig.secure, spaceskey.secure)

Erstellen der ADF Anwendung

Für die SAML SSO Authentifizierung der ADF Anwendung sind zwei Hauptkriterien zuständig

  • Einschalten der ADF Security mit CLIENT-CERT Authentifizierung
  • Definition eines eindeutigen Cookie Pfades für die Anwendung. Dieser darf nicht mit anderen Cookie Pfaden kollidieren.

Erstellen wir nun eine einfache Beispielanwendung, die lediglich den Benutzernamen ausgeben soll.

  1. Starte JDev 11.1.1.7 und erstelle eine leere generische Anwendung
  2. Wähle ADF Faces als Projekt Technologiescope aus und beende den Assistenten
  3. Rechter Mausklick auf das Projekt und wähle „Project Properties
  4. Setze den JEE Anwendungskontext auf „SAMLAPP
    clip_image044
  5. Rechter Mausklick auf das Projekt und erstelle eine neue JSF Page (WebTier ->JSF). Nenne diese “start.jspx”.
  6. Rechter Mausklick auf “start. Jspx” und wähle “Go To Page Definition”. Klicke auf “YES” und die Page Definition Datei (“startPageDef.xml”) wird erstellt. Schließe die Datei.
  7. Platziere eine panelHeader Komponente auf die JSF Page sowie eine outputText Komponente
  8. Binde den outputText Value auf “Hello User : #{securityContext.userName}“. Die Seite sollte nun in etwa so aussehen.
    clip_image046
  9. Im JDev Hauptmenu rechter Mausklick auf Application -> Secure -> Configure ADF Security
    clip_image048
  10. Wähle “ADF Authentication and Authorization” -> klicke “Next” -> wähle “HTTPS Client Authentication” -> klicke “Next” -> Akzeptiere die Vorgabewerte “No Automatic grants” -> klicke “Next” -> markiere “Redirect Upon Successful Authentication” und wähle “start.jspx” als Welcome Page -> klicke “Next” -> “Finish
  11. Öffne im Application Resource Fenster die Datei “jazn-data.xml
  12. Klicke auf “Resource Grants” und wähle ”Web Page” als “Resource Type
  13. start.jspx” sollte schon ausgewählt sein. Füge eine “Application Role” hinzu.
    clip_image050
  14. Markiere “Authenticated Role” und klicke “OK
  15. Akzeptiere die “View” Rechte und speichere alles.
  16. Öffne im Projects Fenster die Datei “web.xml”, klicke auf “Source” Ansicht und scrolle nach unten ans Ende der XML Datei
    clip_image052
  17. Dort gibt es ein login-config Attribut. Ändere den Code zu
       CLIENT-CERT,BASIC
       jazn.com
    
  18. Speicher alles
  19. Öffne im Projects Fenster die Datei “weblogic.xml”
  20. Füge folgende Zeilen the oberhalb der letzen Zeile hinzu
       /samlapp
    
    
  21. Denke daran, dass der Cookie Pfad für diese Anwendung einzig sein muss. Nutz nicht /webcenter , da dies schon durch die WebCenter portal Anwendung in Gebrauch ist. Empfehlenswert ist die Angabe des URL Context Pfades, also /samlapp beispielsweise.
  22. Speicher alles.
  23. Erstelle ein WAR Deployment Profil für das Projekt
    (rechter Mausklick auf Project -> “Project Properties” -> “Deployment” -> “New” -> Wähle “WAR File” -> gib einen Namen an -> klicke “OK” 3 mal
  24. Erstelle ein Application Deployment Profil
    (JDev Hauptmenu -> “Application” -> “Application Properties” -> “Deployment” ->”New” -> Wähle “EAR” -> gib einen Namen an (z.B. SAMLAPP) -> klicke auf “OK” -> wähle “Application Assembly” -> markiere das WAR Deployment Profil -> klicke auf “OK” zwei mal
  25. Speicher alles.
  26. Deploye die Anwendung auf den “CustomApp” Server, der zuvor erstellt und konfiguriert wurde.
    (Jdev Hauptmenu -> “Application” -> “Deploy” -> “SAMLAPP” -> “Deploy to Application Server” -> klicke “Next” -> Wähle die Appserver Connection bzw. Erstelle eine neue für die WebCenter Domain -> wähle “Deploy to selected instance” -> wähle “CustomApp” als Zielserver -> klicke “Next” -> klicke “Finish

Das war‘s. Nun kann man die Anwendungs URL (http://owc.vm.oracle.com:8100/samlapp/faces/start.jspx ) in einem Webbrowser aufrufen und man müsste zur WebCenter Anmeldeseite weitergeleitet werden. Nach erfolgreichem Login erfolgt die Weiterleitung zurück zur Startseite der SAMLAPP und der aktuelle Benutzername sollte erscheinen.

<DM>

Anhang

Bitte alle Dateien ohne Endung xls abspeichern

configureCustomApp.py

configureSAMLApp.py

wcsamlsso.properties

Written by fmtechteam

30/04/2015 at 10:26

Veröffentlicht in ADF, Detlef Müller, WebCenter

Generierung von REST Clients mit verschiedenen IDEs (JDeveloper, Eclipse, NetBeans)

leave a comment »

In der Welt mobiler Anwendungen erfolgt der Zugriff auf Daten und Funktionen im Backend zumeist über RESTful Services, die die Nachrichten im kompakten JSON-Format austauschen. Im Gegensatz zu SOAP-Services, bei denen sich die WSDL-Beschreibung als Standard durchgesetzt hat, gibt es für RESTful Services mit JSON noch keinen etablierten Standard. Erste Ansätze existieren mit WADL (Web Application Description Language) und RAML (RESTful API Modeling Language).
Wie können nun die verschiedenen IDEs im Oracle-Umfeld mit existierenden REST/JSON-Services umgehen und aus den zur Verfügung stehenden Informationen einen REST-Client generieren, der beispielsweise anschließend in einer mobilen Anwendung verwendet werden kann, um mit dem REST Service zu kommunizieren. Für die Entwicklung der mobilen Anwendungen soll das Oracle Mobile Application Framework (MAF) eingesetzt werden.

Oracle JDeveloper 12.1.3

Sofern der REST Service die Nachrichten im XML-Format austauscht und dafür ein XSD Schema existiert, kann der Web Service Data Control Wizard im JDeveloper verwendet werden, um ein Data Control für den Web Service zu generieren. Sollen die Daten dagegen im JSON-Format ausgetauscht werden, muss der Client unter Verwendung des REST Service Adapters manuell in Java programmiert werden. Anschließend kann aus dem Service Object ein POJO Data Control generiert werden. Dieses Vorgehen ist ausführlich in einem Tutorial auf OTN beschrieben.

Oracle Enterprise Pack for Eclipse 12.1.3.4 (OEPE)

Alternativ zum Oracle JDeveloper kann auch OEPE eingesetzt werden, um mobile Applikationen auf Basis des Oracle Mobile Application Frameworks (MAF) zu entwickeln. In OEPE gibt es einen REST Service Editor, der auch für REST-JSON Services die notwendigen Artefakte automatisch generiert, ohne dass es eine Beschreibung des RESTful Services gibt.
Dazu praktiziert der Wizard einen interessanten Ansatz:

  • Im ersten Schritt (Tab REST Client) wird zunächst der Service „erforscht“, indem der Service wiederholt unter Angabe der URL, von Header-Informationen und Query Parametern aufgerufen wird und die Ergebnisse angeschaut werden. In dieser Phase werden keine Ergebnisse gespeichert.
  • Hat man die Struktur verstanden, kann mit Hilfe der Funktion „Import the REST Client Information“ eine erste Beschreibung des Service im XMI-Format (XML Model Interchange) erstellt werden. Diese wird im Tab REST API sicht- und editierbar. Alle Änderungen werden unmittelbar in der XMI-Beschreibung persistiert.
  • Im letzten Schritt „Artifact Generation“ wird aus der XMI-Beschreibung des Service ein Java Client generiert.
    Aus dem Service Object kann anschließend wie im JDeveloper ein POJO Data Control erzeugt werden.
OEPE REST Service Editor

OEPE REST Service Editor

Dieses Vorgehen ist in zwei Blog Posts ausführlich beschrieben:
https://blogs.oracle.com/oepe/entry/introduction_to_rest_service_editor
https://blogs.oracle.com/oepe/entry/introduction_to_the_rest_service

NetBeans 8.0.2

Im Unterschied zu den zwei vorhergehenden IDEs können mit NetBeans keine mobilen Applikationen auf Basis von Oracle MAF erstellt werden. Trotzdem war es interessant, die Möglichkeiten von NetBeans zu erkunden.
Wurden die REST Services mit NetBeans z.B. als annotierte Java-Klassen erstellt, kann ein REST Service Client dafür generiert werden. NetBeans bietet nach der Installation eine Reihe populärer Services (von Amazon, Delicious, Flickr, Google, ..) an, die jeweils durch eine WADL-Datei beschrieben sind.

NetBeans - Services

NetBeans – Services

Hier können eigene Services (SOAP oder REST) hinzugefügt werden, zu denen eine WSDL- oder WADL-Datei angegeben werden muss. Ist eine WADL-Datei für den Service hinterlegt kann anschließend mit Hilfe des RESTful Java Client Wizard der client-seitige Code generiert werden.
Das Vorgehen ist in diesem Tutorial und in diesem Video beschrieben.
Fehlt eine WADL-Beschreibung des Service müsste man diese vorab erstellen. Dieses Wiki beschreibt einige mögliche Ansätze und Werkzeuge zur Generierung einer WADL-Datei.

<JM>

Written by fmtechteam

13/04/2015 at 15:00

Installation der ADF Runtime 12c (12.1.2.0.0)

leave a comment »

Um ADF-Applikationen auf dem WebLogic Server 12c deployen zu können, müssen die ADF Runtime-Bibliotheken auf dem WLS installiert werden. Eine sehr gute Darstellung findet man in diesem Artikel.
Hier eine kurze Übersicht der notwendigen Schritte:

  • Installation der Fusion Middleware Infrastructure
    Dabei wird nur die Software installiert, die die ADF Runtime 12c enthält.
  • Das Repository Creation Utility (RCU) aufrufen und in einer bereits vorhandenen Datenbank das Repository für die Metadata Services (MDS) anlegen. Den dabei verwendeten Präfix bzw. die Namen der Schemata und der Passworte sollte man sich notieren, da sie im nächsten Schritt gebraucht werden.
  • In diesem Schritt wird mit dem Configuration Wizard die Domain erzeugt. Der Wizard wird mit  ../oracle_common/common/bin/config.sh aus dem Oracle Home-Verzeichnis aufgerufen, das im ersten Schritt angelegt wurde.
    Der Wizard erlaubt die Auswahl der zu konfigurierenden Komponenten. Die ADF Runtime ist in den Java Required Files (JRF) enthalten.

    Image

    WLS Configuration Wizard

    Nach den Angaben zur Domain sollte man die Server konfigurieren (Advanced Configuation). Wurde der Oracle Web Service Policy Manager bei der Konfiguration ausgewählt, muss man hier die Gruppen JRF-MAN-SVR und WSMPM-MAN-SVR auswählen.

  • Nach dem Anlegen der Domain kann der Server gestartet und das Deployment einer ADF-Applikation getestet werden.

<JM>

Written by fmtechteam

26/01/2014 at 20:08

Veröffentlicht in ADF, Jürgen Menge, WebLogic

Mehrsprachigkeit in ADFBC auf Datenebene

leave a comment »

In Anwendungen kann man ja bekanntlich über Resource Bundles  die Weboberfläche mehrsprachig gestalten bzw etwaiges Labeling auf ADF BC Ebene. Aber was macht man, wenn nicht nur Metadaten in der Anwendung, sondern auch einige Stammdaten selbst mehrsprachig gestaltet werden müssen? Ein Beispiel: In Ihrem Datenmodell git es eine Tabelle “TAB_COUNTRIES” mit Ländernamen als Inhalt. Die Spalte “Country” dieser Tabelle soll als Auflistung , z.B. in einer Werteliste oder in einer R/O Table, dargestellt werden. Da bekanntlich die Ländernamen in jeder Sprache anders lauten, also “Deutschland” auf deutsch, “Germany” auf englisch und “Allemagne” auf franzosisch, muss man diese Bezeichnung auch für den aktuellen Sprachenkontext in der Werteliste anzeigen.

Nun kann man ja das Datenmodell mehrsprachig gestalten, also entweder für jede gültige Sprache eine extra Spalte mit dem jeweiligen Bezeichnern oder eine reine Sprachtabelle mit Verpointerung zu den jeweilgen Tabellen. So funktioniert zum Beispiel APEX. Das Problem hierbei ist aber, dass dies Auswirkungen auf die Query hat, das heißt, es muss in ADF der jeweilige Sprachkontext herangezogen und in der Query auf BC verarbeitet werden, bsp “select name_de from tab_countries” für deutsch, “Select name_en from tab_countries” für englisch usw. oder Verarbeitung der Sprache in der Where Clause oder änliches. Der Mechanismus für das Schalten der Mehrsprachigkeit ist hingegen sowieso in ADF für das Labeling on der UI vorhanden. Daher kann man ja versuchen, diese Resource Bundles auch für die jeweiligen Dateninhalte zu verwenden. Demnach würde man in der Table “TAB_COUNTRIES” nun nicht den Ländernamen eintragen, z.B. “Deutschland”, “Frankreich” usw, sondern stattdessen ein Key im Resource Bundle, z.B. “tab.countries.germany”, “tab.countries.france” usw. Natürlich macht das nur Sinn für Stammdaten, d.h. Daten die eine gewisse Statik aufweisen. Jetzt muss man nur noch auf ADF BC das Resource Bundle mit den Werten aus dem Rowset des ViewObject verbinden, Das macht man wie folgt.

    1. ResourceBundle im Project definieren
    2. Prüfe, ob im View Object das ResourceBundle referenizert wird. In der Source Ansicht des ViewObjects müsste es einen Tag <ResourceBundle> geben, der auf das aktuelle ResourceBundle verweist.

image

    1. Erstelle für das ViewObject eine View Row Impl Class

      image

      image

    2. Editiere die Klasse und füge am Ende eine Methode zum Auslesen des ResourceBundles ein

      public String getLocalizedValue(String key) {

          ResourceBundleDef resourceDef = this.getResourceBundleDef();
      Locale locale = this.getApplicationModule().getSession().getLocale();
      String retVal =
      StringManager.getLocalizedStringFromResourceDef(resourceDef, key,
      null, locale, null,
      false);
      return retVal;
      }

 

  • In der Tabelle TAB_COUNTRIES müssen nun in der Spalte Country die entsprechenden RB Key verwendet werden. Editiere das ResourceBundle trage die Keys mit den dazugehörigen Values ein, die als Stammdaten aus der Tabelle geliefert werden, z.B.

    tab.countries.germany=Deutschland
    tab.countries.france=Frankreich

  • Ändere nun in der TabCountriesViewRowImpl die Getter-Methode getCountry, in der der Landesname aus dem Rowset gelesen wird, und schalte hier die getLocalalizedValue Methode dazwischen.

    Original:
    image

    Neu:
    image

  • Beachte: sollte es für den jeweiligen Wert für COUNTRY im Rowset kein RB Key geben, dann wird stattdessen NULL ausgegeben.

 

<DM>

Written by fmtechteam

19/12/2013 at 11:43

Veröffentlicht in ADF, Detlef Müller

Tagged with ,

ADF – Nested Collections als WebService Response individuell darstellen

leave a comment »

Problem:
Wie behandelt man eine Master Detail Beziehung außerhalb der Standard MD UI Komponenten (Master Form/Table –> Detail Form/Table), zum Beispiel in einem Panel Accordion, wenn die Daten statt über ADF BC aus einem Web Service Request bereitgestellt werden und die Datenobjekte geschachtelte Collections sind? Genauer gesagt sollten die showDetailItems des panelAccordion über die Master Daten und commandNavigationItems über die Detail Daten iterieren. Die Darstellung soll in etwa so aussehen:

Master 1 image
    Detail 1.1- Link
    Detail 1.2- Link
Master 2 image
    Detail 2.1- Link
    Detail 2.2- Link
    Detail 2.3- Link
Master 3 image
Master 4 image
Master n image

Lösung

Gehen wir also von folgender Datentyp Definition aus als Ergebnis der Aufbereitung der Datentypen unseres WS Requests:

DetailsType
int linkId;
String linkTitel;
String linkUrl;
. . .

MasterType
int masterId;
String masterTitel;
List<DetailsType> details;
. . .

MDListType
List<MasterType> mdList;

Eine Methode (getMDdata()) in einer Pojo (MDSample) liefert eine Rückgabe vom Typ MDListType. Somit sieht das Data Control in der DC Palette wie folgt aus

image

Als erstes wollen wir den Iterator über die Master Collection aufbauen. Dazu platzieren wir das panelAccordion auf die JSF und darin ein forEach Element. Es wird dabei ein showDetailItem automatisch eingefügt. Bitte die Anordnung derart verändern, dass das showDetailItem als Kindelement zum forEach Element wird. Wir wollen ja pro Master Datensatz ein showDetailItem erhalten.

image

Nun müssen wir ein tree Binding in der PageDefinition anlegen, auf das wir die forEach Komponente binden. Dabei wird als Root Data Source die mdList Collection ausgewählt, dann auf Add Rule geklickt und es wird der MasterType angewählt. Hier bitte den Detail Type hinzufügen und auf beiden Typen die gewünschten Attribute zur Darstellung hinzufügen. Das Binding sollte dann in etwa so aussehen.

image

Jetzt können wir die forEach Komponenten des Masters binden und dem Binding einen Variablennamen vergeben.

<af:forEach items=“#{bindings.mdList.children}“ var=“masterVar“>

Als nächstes wird eine zweite forEach Komponente auf das showDetailItem gezogen und wie folgt gebunden.

<af:forEach items=“#{masterVar.children}“ var=“detailsVar“/>

Die Variable detailsVar ist nun die Basis für alles weitere Binding der Details, z.B. commandNavigationItem oder ähnliches. Der Source Code der Seite sieht dann in etwa so aus

<af:panelAccordion id=“pa1″>
<af:forEach items=“#{bindings.mdList.children}“ var=“masterVar“>
<af:showDetailItem text=“showDetailItem 1″ id=“sdi1″>
<af:navigationPane id=“np1″>
<af:forEach items=“#{masterVar.children}“ var=“detailsVar“>
<af:commandNavigationItem text=“#{detailsVar.linkTitel}“ id=“cni1″/>
</af:forEach>
</af:navigationPane>
</af:showDetailItem>
</af:forEach>
</af:panelAccordion>

Man kann nun die Action des Navigation Items mit dem Attribut detailsVar.linkUrl assoziieren.

<DM>

Written by fmtechteam

16/10/2012 at 11:18

Kostenlose Version von ADF veröffentlicht – ADF Essentials

leave a comment »

Seit dem 24.September 2012 gibt es eine kostenlose Version von ADF – ADF Essentials genannt. Der genaue Wortlaut der Ankündigung ist hier zu finden. Weitere Details darüber, was genau enthalten ist und was nicht, kann man dem FAQ Dokument entnehmen. Hier eine kurze Zusammenfassung:

In ADF Essentials enthalten sind:

  • Oracle ADF Faces Rich Client Components
  • Oracle ADF Controller
  • Oracle ADF Model
  • Oracle ADF Business Components

Nicht enthalten sind :

  • Oracle ADF Mobile
  • Oracle ADF Desktop Integration
  • Oracle ADF Security
  • Oracle ADF Web service data control
  • Oracle ADF remote taskflows
  • Oracle ADF Business Component’s Service Interfaces
  • Oracle ADF Data Controls for BI
  • Essbase und BAM
  • Integration mit Oracle Fusion Middleware Features, wie MDS, OPSS, OWSM, Enterprise Manager und MBeans, High Availability und Clustering

Das heißt nun nicht, dass ADF Essentials zu Open Source wird. Ein Support wird auch nur im Rahmen des Community Supports geleistet. Will man also Product Support in Anspruch nehmen, geht das logischerweise nur über eine gültige ADF Lizenz bzw. man kann Support für ADF Essentials erwerben. Als Zielplatform fürs Deployment werden Weblogic 11g, Glassfish 3.1 und WebSphere 7 supportet. Aus Lizenzsicht gibt es aber keine Restriktionen für andere JEE Server.

Die Veröffentlichung von ADF Essentials ist ein weiterer Beleg dafür, dass ADF Oracles strategische Entwicklungsplatform ist und bleibt.

Weitere Informationen, Downloads sowie Dokumentationen sind auf der entsprechenden OTN Seite zu finden.

<DM>

Written by fmtechteam

26/09/2012 at 11:14

Veröffentlicht in ADF, Detlef Müller, JDeveloper

Tagged with