Contentcompression für CSS abschalten

Beim Erstellen von eigenen Skins für JD11 kommt man schnell an den Punkt, wo einem nicht mehr klar ist, warum die von einem Skin betroffenen Elemente sich nicht so darstellen, wie man es gewünscht hat.

Sieht man sich den Quellcode der erzeugten CSS Infromationen der Seiten an stolpert man über kryptische Namen, die bei der Erzeugung der Seiten angelegt werden, um die CSS-Infos (speichertechnisch) klein zu halten.

.AFInstructionText, .x0, .AFFieldText, .x6, .xk, .xl, .xm, .x23, .x24, .x2d, .x2f, .x2h, .x1u.x2n .x25, .x1u.p_AFDisabled.x2n .x25, .x1u.x2p .x25, .x1u.x2q .x25, .x1u.x2r .x25, .x1u.x2s .x25, .x22.x2n .x24, .x22.p_AFDisabled.x2n .x24, .x22.x2p .x24, .x22.x2q .x24, .x22.x2r .x24, .x22.x2s .x24, .x1t.x2n .x26, .x1t.p_AFDisabled.x2n .x26, .x1t.x2p .x26, .AFFieldTextLTR, .x94, .AFPhoneFieldText, .x96, .AFPostalCodeFieldText, .x98, .AFAddressFieldText, .x9a, .PortletSubHeaderText, .xbz, .PortletText1, .xc0, .PortletText2, .xc1, .PortletText3, .xc2, .PortletText4, .xc3, .portlet-font, .xc4, .portlet-msg-info, .xc6, .portlet-form-input-field, .xcn, .portlet-form-field, .xcs {
color:#000000;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:normal;
}
.AFInstructionTextDisabled, .x1, .AFFieldTextDisabled, .x7, .x1u.p_AFDisabled.x2p .x25, .x1u.p_AFDisabled.x2q .x25, .x1u.p_AFDisabled.x2r .x25, .x1u.p_AFDisabled.x2s .x25, .x22.p_AFDisabled.x2p .x24, .x22.p_AFDisabled.x2q .x24, .x22.p_AFDisabled.x2r .x24, .x22.p_AFDisabled.x2s .x24, .x1t.p_AFDisabled.x2p .x26, .x61, .p_InContextBrandingText, .x8r, .AFFieldTextLTRDisabled, .x95, .AFPhoneFieldTextDisabled, .x97, .AFPostalCodeFieldTextDisabled, .x99, .AFAddressFieldTextDisabled, .x9b, .OraHGridNavRowInactiveLink, .xa5, .OraNavBarInactiveLink, .xac, .portlet-font-dim, .xc5 {
color:#7E807A;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:normal;
}
.AFDataText, .x2, .PortletHeaderText, .xbs {
color:#000000;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:bold;
}

Leider werden so einige zusammenhänge ebenfalls verschleiert. Unter JD10.1.3 konnte diese Komprimierung durch einen Eintrag in der web.xml abgeschaltet werden:


<context-param>

<paramname>oracle.adfinternal.view.faces.DISABLE_CONTENT_COMPRESSION</param-name>
<param-value>true</param-value>

</context-param>

Unter JD11 hat sich der Syntax leicht geändert (siehe forums.oracle.com/forums/thread.jspa?messageID=2432817&tstart=0#2432817) und lautet nun


<context-param>

<param-name>org.apache.myfaces.trinidad.DISABLE_CONTENT_COMPRESSION</param-name>
<param-value>true</param-value>

</context-param>

Hier das Resultat (wie oben mit der neuen Einstellung):

.AFInstructionText, .AFFieldText, .af_outputText, .af_outputFormatted, .af_outputDocument, .af_inputChoice_content, .af_inputChoice_content-input, .af_selectManyCheckbox_content, .af_selectOneChoice_content, .af_selectOneRadio_content, .af_inputText.AFFieldTextMarker .af_inputText_content, .af_inputText.p_AFDisabled.AFFieldTextMarker .af_inputText_content, .af_inputText.AFFieldTextLTRMarker .af_inputText_content, .af_inputText.AFPhoneFieldTextMarker .af_inputText_content, .af_inputText.AFPostalCodeFieldTextMarker .af_inputText_content, .af_inputText.AFAddressFieldTextMarker .af_inputText_content, .af_inputChoice.AFFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.p_AFDisabled.AFFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.AFFieldTextLTRMarker .af_inputChoice_content-input, .af_inputChoice.AFPhoneFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.AFPostalCodeFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.AFAddressFieldTextMarker .af_inputChoice_content-input, .af_inputNumberSpinbox.AFFieldTextMarker .af_inputNumberSpinbox_content, .af_inputNumberSpinbox.p_AFDisabled.AFFieldTextMarker .af_inputNumberSpinbox_content, .af_inputNumberSpinbox.AFFieldTextLTRMarker .af_inputNumberSpinbox_content, .AFFieldTextLTR, .AFPhoneFieldText, .AFPostalCodeFieldText, .AFAddressFieldText, .PortletSubHeaderText, .PortletText1, .PortletText2, .PortletText3, .PortletText4, .portlet-font, .portlet-msg-info, .portlet-form-input-field, .portlet-form-field {
color:#000000;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:normal;
}
.AFInstructionTextDisabled, .AFFieldTextDisabled, .af_inputText.p_AFDisabled.AFFieldTextLTRMarker .af_inputText_content, .af_inputText.p_AFDisabled.AFPhoneFieldTextMarker .af_inputText_content, .af_inputText.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputText_content, .af_inputText.p_AFDisabled.AFAddressFieldTextMarker .af_inputText_content, .af_inputChoice.p_AFDisabled.AFFieldTextLTRMarker .af_inputChoice_content-input, .af_inputChoice.p_AFDisabled.AFPhoneFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputChoice_content-input, .af_inputChoice.p_AFDisabled.AFAddressFieldTextMarker .af_inputChoice_content-input, .af_inputNumberSpinbox.p_AFDisabled.AFFieldTextLTRMarker .af_inputNumberSpinbox_content, .af_menuButtons_text-disabled, .p_InContextBrandingText, .AFFieldTextLTRDisabled, .AFPhoneFieldTextDisabled, .AFPostalCodeFieldTextDisabled, .AFAddressFieldTextDisabled, .OraHGridNavRowInactiveLink, .OraNavBarInactiveLink, .portlet-font-dim {
color:#7E807A;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:normal;
}
.AFDataText, .PortletHeaderText {
color:#000000;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
font-weight:bold;
}

Danke an Frank Nimphius für diese Info!

Damit gestaltet sich die Suche etwas einfacher.

Advertisements

Embedded OC4J startet nicht mit FAILED_IN_CONFIG

Manchmal (die genauen Zusammenhänge habe ich noch nicht herausgefunden) startet der Embedded OC4J Container nicht mehr mit einem Fehler

SCHWERWIEGEND: Server exiting: ApplicationServer entered state FAILED_IN_CONFIG

der auf ein Problem mit der Authentifizierung hinweist. Das passiert auch dann, wenn keine Security verwendet wird. Bevor der Container mit dieser Meldung abbricht, hat er schon eine weitere Meldung ausgegeben:

05.03.2008 09:25:00 oracle.security.jps.internal.credstore.ssp.CsfWalletManager openWallet
SCHWERWIEGEND: Could not open wallet. null
java.io.IOException: Could not open wallet. null
at oracle.security.pki.OracleWallet.open(OracleWallet)
at oracle.security.jps.internal.credstore.ssp.CsfWalletManager.openWallet(CsfWalletManager.java:136)
at oracle.security.jps.internal.credstore.ssp.SspCredentialStore.(SspCredentialStore.java:139)
at oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider.getInstance(SspCredentialStoreProvider.java:109)
at oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider.getInstance(SspCredentialStoreProvider.java:47)
at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.findServiceInstance(ContextFactoryImpl.java:139)
at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.getContext(ContextFactoryImpl.java:170)
at oracle.security.jps.internal.core.runtime.ContextFactoryImpl.getContext(ContextFactoryImpl.java:191)
at oracle.security.jps.internal.core.runtime.JpsContextFactoryImpl.getContext(JpsContextFactoryImpl.java:129)
at oracle.security.jps.internal.core.runtime.JpsContextFactoryImpl.getContext(JpsContextFactoryImpl.java:124)
at oracle.security.jps.internal.policystore.PolicyUtil$1.run(PolicyUtil.java:590)
at oracle.security.jps.internal.policystore.PolicyUtil$1.run(PolicyUtil.java:585)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.security.jps.internal.policystore.PolicyUtil.getDefaultPolicyStore(PolicyUtil.java:584)
at oracle.security.jps.internal.policystore.PolicyDelegationController.(PolicyDelegationController.java:244)
at oracle.security.jps.internal.policystore.PolicyDelegationController.(PolicyDelegationController.java:238)
at oracle.security.jps.internal.policystore.JavaPolicyProvider.(JavaPolicyProvider.java:103)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at oracle.security.jazn.JAZNConfig.setJAASPolicyProvider(JAZNConfig.java:2054)
at oracle.security.jazn.JAZNConfig.setSecurityProperties(JAZNConfig.java:2130)
at oracle.security.jazn.JAZNConfig.setSecurityProperties(JAZNConfig.java:2149)
at com.evermind.server.OC4JServer.main(OC4JServer.java:420)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.classloader.util.MainClass.invoke(MainClass.java:128)
at oracle.oc4j.loader.boot.BootStrap.main(BootStrap.java:41)

Diese gibt den Grund an, nämlich dass die Wallet-Datei nicht geöffnet werden konnte. Ein blick ins Dateisystem ins Verzeichnis

[USERDIR]AnwendungsdatenJDevelopersystem11.1.1.0.22.47.96o.j2eeembedded-oc4jconfigoc4j-credstore

Bild

Zeigt, dass die Datei leer ist (0 KB).

Es gibt nun zwei Möglichkeiten das Problem zu lösen:

  1. Löschen des Verzeichnis embedded-oc4j aus dem oben genannten Pfad. Beim nächsten Start wird es dann neu mit Standardeinstellungen neu angelegt. Dabei gehen aber leider z.B. Änderungen an den Logging-Einstellungen verloren!
  2. man kopiert die Datei cwallet.sso aus dem aktuellen Projekt in das Verzeichnis. Im aktuellen Projekt findet sich die Datei meist im Verzeichnis [Workspacename]/src/META-INF, wobei [Workspacename] das Verzeichnis ist, in dem die *.jws des Projektes zu finden ist.

Fehlende Dokumentation zugänglich machen

Leider hat Oracle bei einigen Jar’s vergessen die Dokumentation in die Libraries einzutragen. Dies führt dazu, dass des öfteren die folgende Meldung erscheint, wenn man mittels F1 die Hilfe aufruft:

Bild

Dies ist vor allem deshalb ärgerlich, da man die Definition der Library nicht ändern kann. Ein entsprechender ER ist bereits über Frank Nimphius erstellt (dieser Thread). In dem Thread wird auch die Lösung beschrieben, wie man die Dokumentation doch zugänglich macht.

Dazu wird eine neue Library z.B. mit dem Namen “Missing Doc” erstellt (im Projekt oder als SystemLibrary damit sie auch für andere Projekte bereit steht):

  1. Tools-> Manage Libraries… auswählen
  2. Button “New…” drücken und als Location <install-pfad>/jdev/system auswählen
  3. im Dialog dann den ‘Doc Path’ markieren und den Button ‘Add URL…’ drücken
  4. Bild
  5. Dann dei URL zur fehlenden Dokumentation eintragen.
  6. Befindet sich die Dokumentation auf dem lokalen Rechner, kann diese über ‘Add Entry…’ hinzugefügt werden.

Jetzt braucht nur noch die neue Library zum Projekt hinzugefügt werden und die Hilfe über F1 liefert wieder Ergebnisse.

Logausgaben im Logwindow aktivieren

Unter JD11TP3 werden nach dem Start des Embedded-Servers keine Logausgaben mehr in das Log-Window geschreiben. Die Ursache dafür, ist in der Konfigurationsdatei des Embedded-Servers für das Logging zu suchen. Die Datei dei diese Einstellungen beinhaltet heisst j2ee-logging.xml und ist für den Embedded-OC4J Container unter dem Verzeichnis:
UserverzsichisAnwendungsdatenJDevelopersystem11.1.1.0.22.47.96o.j2eeembedded-oc4jconfig
zu finden.
Das Original sieht nach der Installation so aus (in Teilen)

<logging_configuration>
   <log_handlers>
      <log_handler name="console-handler" class="oracle.oc4j.util.ConsoleHandler" level="WARNING"/>
      <log_handler name="oc4j-handler" class="oracle.core.ojdl.logging.ODLHandlerFactory">
...

Leider scheint es so, als ob die Klasse oracle.oc4j.util.ConsoleHandler nicht gefunden wird vom Embedded-OC4J Container. Daher sollte man die Klasse ändern in java.util.logging.ConsoleHandler. Passt man auch noch das Level an (z.B. auf FINE) erhält man wieder alle Meldungen.
Das Resultat sieht dann (in Teilen) so aus:

<logging_configuration>
   <log_handlers>
      <log_handler name="console-handler" class="java.util.logging.ConsoleHandler" level="FINE"/>
      <log_handler name="oc4j-handler" class="oracle.core.ojdl.logging.ODLHandlerFactory">
...

JD11TP3 mit JDK1.6

Um die Geschwindigkeit (insgesamt) zu steigern, kann TP3 auch mit JDK 1.6_04 oder höher betrieben werden. Da heißt nicht, dass der Code zwingend gegen dieses JDK kompiliert wird, sondern nur, das TP3 darunter läuft. TP3 ist zwar offiziell nicht für JDK1.6 freigegeben, aber einige Posts, z.B. http://forums.oracle.com/forums/thread.jspa?messageID=2306557, belegen, dass es ohne größere Probleme geht wenn man von 64-Bit Systemen absieht.

Da JDK 1.6 nicht mitgeliefert wird, sollte man es von hier herunterladen und installieren. Für das weitere gehe ich davon aus, dass das JDK im Pfad c:javajdk1.6.0_04 installiert wurde.

Jetzt muss nur von die Konfigurationsdatei von JD11 angepasst werden. Diese ist unter /jdev/bin/jdev.conf zu finden. Bei mir sieht sie so aus:

##############################################################################<br />
#<br />
# Oracle JDeveloper Launcher Configuration File<br />
# Copyright 2000-2007 Oracle Corporation.<br />
# All Rights Reserved.<br />
#<br />
##############################################################################</p>
<p>##############################################################################<br />
#Hier den Pfad zum verwendenden JDK eintragen<br />
SetJavaHome D:/java/jdk1.6.0_04/<br />
##############################################################################</p>
<p>IncludeConfFile ../../ide/bin/ide.conf</p>
<p>#<br />
# MaxPermSize is required to run JDeveloper with Sun Microsystems virtual<br />
# machine (-client and -server). The default value is 64M, which isn't<br />
# enough to run JDeveloper successfully (3459434). With the default value,<br />
# JDeveloper will end up running out of memory at some point in time.<br />
# This option is ignored by OJVM (-ojvm). For technical details, see:<br />
# http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html<br />
#<br />
AddVMOption -XX:MaxPermSize=160M</p>
<p>#<br />
# Replace heavyweight AWT controls with lightweight implementations.<br />
#<br />
AddVMOption -Xbootclasspath/p:../lib/lwawt.jar<br />

Ich habe die Zeilen 9-12 hinzugefügt. Natürlich sollte JDev nicht laufen, wenn man die Zeile SetJavaHome c:/java/jdk1.6.0_04/ hinzufügt!

Beim Start nach der Änderung wird ein Hinweisdialog eingeblendet, der darauf hinweist, dass das JDK nicht zugelassen ist und es zu Problemen kommen kann. Will man den Hinweis nur einmal sehn, kann man den Hacken in der CheckBox setzten.

jkd1

Damit wird beim nächsten Start von JDev nicht mehr nachgefragt.

ADFrc Table single/multi Selection

Aktuell beschäftige ich mit JSF und Oracle ADFrc. Die Aufgabe war die neuen RC-Tabellen für unsere Anwendungen anzupassen bzw. die Neuerungen so zu beschreiben, das die Anwendungsentwickler sie einfach verwenden können.
Nach einigen Recherchen in Netz und in schon vorhandenen Blogs ist hier meine Lösung:

  1. ADFrc Tabellen benötigen keine Checkboxen mehr um einzelne oder mehrere Zeilen für eine Weiterbearbeitung zu markieren
  2. Der Selection-Modus wird am Tabellenelement als RowSelection eingestellt
  3. Die Bearbeitung der Selektion erfolgt über eine Managed Bean (hier TableSelector)
  4. Die Erstellung der Bean kann aus JDev heraus durch drücken des kleinen Dreieck am Ende der Zeile Bindings zusammen mit der Erstellung Property für die Tabelle erfolgen. Dazu muss dann der Button ‘new…’ gedrückt werden. Ist bereits eine Bean vorhanden, kann diese ausgewählt werden.
  5. Soll mit jeder Selektion in der Tabelle eine Änderung in der GUI erfolgen (z.B. Rückmeldung welche Zeile ausgewählt wurde) sollte in der Bean noch ein SelectionListener eingetragen werden
  6. Der Code sorgt dafür, das die ausgewhälte Zeile als aktuelle Zeile des Datenmodell markiert wird
    public void doSelection(SelectionEvent selectionEvent)
    {
        // Add event code here...
        JSFUtils.resloveMethodExpression("#{bindings.UvgoaeZiffernView.collectionModel.makeCurrent}",
        null, new Class[] { SelectionEvent.class },
        new Object[] { selectionEvent });
    }

  7. Für die eigentliche Bearbeitung der Selektion kann dann noch eine Action Methode in der Bean definiert werden:
    public String anzeigenAuswahl()
    {
        // Add event code here...
        RichTable table = getZiffernTable();
        Iterator selection = table.getSelectedRowKeys().iterator();
        DCIteratorBinding rowiter = ADFUtils.findIterator("UvgoaeZiffernViewIterator");
        Object oldKey = table.getRowKey();
        while (selection.hasNext())
        {
            List rowKey = (List)selection.next();
            UvgoaeZiffernViewRow row =
                (UvgoaeZiffernViewRow)rowiter.findRowByKeyString(((Key)rowKey.get(0))
                .toStringFormat(true));
            logger.info("Selected Row = " + rowKey + " Leistung = " + row.getLeistungKurz());
            table.setRowKey(rowKey);
        }
        return "anzeigenZiffer";
    }

  8. Diese muss nun nur noch an einen Button gebunden werden

Die dargestellte Methode gibt nur eine Meldung pro selektierter Zeile aus, zeigt aber den Zugriff auf die Daten des unterliegenden Datenmodell.