Follow Us on Twitter

De Oracle APEX Listener: een eerste indruk

Gepubliceerd in

April 2010 - Een typische APEX architectuur vereist een manier om webbrowser-requests op te vangen en door te zetten naar de APEX engine in de database. Tot voor kort waren hier twee mogelijke oplossingen voor: de Apache webserver met MOD_PLSQL en de embedded PLSQL-gateway in de database. Met de verschuiving van Oracle's middleware van OC4J naar Weblogic ontstaat dus de behoefte om ook in deze architectuur APEX applicaties te kunnen ontsluiten.

De oplossing is de APEX listener, een pure java implementatie die de interactie verzorgt tussen de APEX engine in de database en de eindgebruiker. Ondanks dat de listener zich op dit moment nog in betafase bevindt weerhoudt het ons er niet van de mogelijkheden ervan te onderzoeken.

Installatie

De Oracle APEX Listener is een java oplossing die gedownload kan worden als een WAR-file. Deze file kan geïnstalleerd worden in vrijwel elke gangbare java applicatieserver waaronder Oracle's eigen Weblogic, Apache Tomcat en OC4J. Voor dit Whitebook heb ik de installatie op zowel Tomcat als Weblogic uitgevoerd.

Installatie in de Weblogic server
Fig. 1: Installatie in de Weblogic server.

Alvorens de listener te installeren moeten we eerst zorgen er een database user beschikbaar is waarmee we de verbinding op zetten: APEX_PUBLIC_USER. Indien het account nog gelocked is en het password onbekend moeten we de volgende stappen uitvoeren als sys:

alter user APEX_public_user account unlock;
alter user APEX_public_user identified by nieuwpaswoord;

De installatie van de APEX listener in de Tomcat J2EE-server is het gemakkelijkst. De APEX.war-file moet in de /webapps directory worden gekopieerd waarna deze automatisch deployed word. Wat nog rest is het aanmaken van de specifieke rollen met gebruikers die de configuratie- en administratiepagina’s mogen benaderen. Voeg in het bestand /conf/tomcat-users.xml de volgende entries toe:

<role rolename="Manager"/>
<role rolename="Admin"/>
<user username="manager" password="paswoord" roles="Manager"/>

<user username="admin" password="paswoord" roles="Admin"/>

Op het eerste gezicht is het doel van de verschillende rollen niet echt duidelijk, maar als we in de deployment descriptor /WEB-INF/web.xml kijken zien we dat de listener status opgevraagd mag worden door users met de rol “Manager”. De configuratie van de listener kan alleen gedaan worden door users met de “Admin” rol.

Installatie in de Weblogic server gebeurt door het deploymentproces te volgen, het APEX.war-bestand moet geupload worden via de administratie console waarna de deployment naar de targets gebeurt. Daarna moeten de Manager- en Admin-rollen aangemaakt worden met een koppeling met groepen of users.

Alvorens straks de APEX homepage te kunnen opvragen moeten we natuurlijk nog de statische files zoals javascripts en afbeeldingen installeren. Als er geen webserver voor de J2EE server staat moeten we dus onze afbeeldingen in de java container zien te krijgen. In het geval van de Weblogic installatie betekent dit dat we een webarchief moeten maken. Dit archief moet dan deployed worden in de J2EE server. De APEX installatie bevat een images directory waar we als volgt een archief van maken:

C:\download\APEX_3.1.2\APEX\images> D:\"Program Files"\Java\jdk1.6.0_20\bin\jar.exe cvf i.war *

Het archief kan vervolgens net als de APEX.war-file deployed worden, waarna de statische files bereikbaar worden.

Voor de Tomcat server verloopt dit iets gemakkelijker: alle images kunnen direct naar /webapps/ROOT/i/ gekopieerd worden.

Na deze stap is de APEX homepage bereikbaar met url:

http://servernaam:poort/apex

Configuratie

Het configuratiescherm kan opgevraagd worden middels de url:

http://webserver:port/apex/listenerConfigure

In het configuratiescherm zijn de belangrijkste opties het instellen van de verbinding met de Oracle database en de standaard pad waar de APEX homepage bereikbaar is, standaard "apex".

Er kan op verschillende manieren met de database verbonden worden. Basic, waarin hostname, poort en Oracle SID opgegeven moet worden of TNS-servicenaam. Bij de meest recente versie van de listener is de optie in het configuratiescherm om een specifieke JDBC-driver op te geven verdwenen, deze kan wel handmatig in apex-config.xml opgegeven worden.

Het APEX listener configuratiescherm
Fig. 2: Het APEX listener configuratiescherm.

Security

Het uitvoeren van gevoelige of systeemprocedures door middel van url's kan tegengehouden worden door het configureren van de securityparameters. Een standaardlijst, waarvan de inhoud niet direct zichtbaar is, houdt uitvoering van objecten van het sys-schema, dbms-packages en procedures van de PLSQL-webtoolkit tegen. De standaardlijst is meestal afdoende om het meeste kwaad van buitenaf af te weren, maar het is verstandig om een DBA te raadplegen of er risicovolle packages bestaan die public uitgevoerd moegen worden. Indien noodzakelijk kan de standaardlijst wel uitgezet worden.

Extra procedures kunnen worden opgegeven door gebruik te maken van wildcardtekens, een vraagteken staat dan voor een enkel karakter, een asterisk voor een reeks. In de database zelf kan ook een lijst worden bijgehouden. In de configuratie van de listener moet dan de functienaam worden opgegeven die true of false teruggeeft. De inputparameter is dan de procedure die middels een url wordt opgevraagd.

Caching

Nieuw is het onderdeel “caching” waarin te downloaden bestanden gecached kunnen worden. Dit kan in zwaar gebruikte systemen een performancewinst opleveren door databaseraadplegingen te beperken.
Ook hier kunnen met wildcards meerdere procedurenamen opgegeven worden waarvan de output gecached wordt.

Vervolgens moet een keuze gemaakt worden hoe het cachingmechanisme zijn werk doet. Ten eerste kan een lijst van meest recente bestanden bijgehouden worden waarvan het aantal in te stellen is. Ten tweede is er de mogelijkheid om te cachen op basis van geldigheidsduur, het bestand wordt na een in te stellen aantal minuten automatisch uit de cache verwijderd.

Pre- en postprocessing

Een mooie feature is dat er ook weer één of meer PLSQL-procedurenamen kunnen worden opgegeven die voor of na een request worden uitgevoerd. Het wordt hiermee mogelijk om in databasetabellen te loggen wat is opgevraagd en met welke parameters. Dit biedt vele mogelijkheden als het bijhouden van gebruiksstatistieken of zelfs het afspelen van requests ten behoeve van unit- of performancetests.

Tot zover de instellingen die we via het configuratiescherm kunnen invoeren. Eenmaal opgeslagen kan de configuratiepagina wel opgevraagd worden, maar kan de databaseverbinding niet gewijzigd worden. Hiervoor moeten aanpassingen rechtreeks in het apex-config.xml bestand gedaan worden. Als de databaseverbinding gewijzigd moet worden is het verstandig om het nieuwe password vooraf te laten gaan door het @-teken zodat het password wordt versleuteld.

Excel collections

Een mooi voorbeeld van de uitbreidbaarheid van de listener is de mogelijkheid om echte Excel bestanden op te laden in een APEX collection. Hiervoor moet op een APEX pagina een file-upload item en een button met request XLS2COLLECTION gemaakt worden. Indien de bestandsnaam .xls of .xlsx als extensie heeft zal de APEX listener de upload voor zijn rekening nemen. Het Excel bestand wordt dan door Apache POI gelezen en als collection in de huidige APEX sessie geplaatst.
Vervolgens kunnen we zo als we gewend zijn de collectie met PL/SQL uitvragen of manipuleren.

Om te bepalen hoe omgegaan moet worden met het opladen van Excel bestanden moeten in het apex-config.xml nog wat zaken aangepast worden.
Allereerst moet de Excel upload aangezet worden door de volgende entry toe te voegen:

<entry key="APEX.excel2collection">true</entry>

Als een Excel bestand wordt opgeladen zal een collection aangemaakt worden met dezelfde naam als het file upload item op de pagina, bv P1_FILE, waarbij de worksheet naam zich in kolom C001 bevindt.

Als een aparte collection per worksheet moet worden aangemaakt:

<entry key="APEX.excel2collection.onecollection">false</entry>

De collection naam wordt dan file-upload itemnaam:worksheetnaam, bv P1_FILE:Groep 1.
De itemnaam prefix is handig indien onderscheid gemaakt moet worden tussen Excel uploads en andere collections of om de gegevens van een file bij elkaar te houden.

Als dan nog in plaats van de worksheetnamen een sequentiële naam moet toegekend worden:

<entry key="APEX.excel2collection.useSheetName">false</entry>

De collection naam wordt: file-upload itemnaam:WORKSHEET:volgnummer, bv P1_FILE;WORKSHEET:1.
Vreemd is wel bij deze optie dat ook de inhoud van kolom C001 de echte worksheetnaam verloren gaat, dit wordt WORKSHEET:volgnummer

Inhoud van een collection na upload van een Excel bestand met meerdere sheets
Fig. 3 Inhoud van een collection na upload van een Excel bestand met meerdere sheets.

Conclusie

Door de de uitbreidbaarheid van de listener zullen zaken die net wat te hoog gegrepen zijn om in APEX of PL/SQL op te lossen mogelijk worden. Denk hierbij aan het “basic” printen van PDF's waar nu een aparte servlet voor gedownload moet worden. Ook zou in de toekomst het exporteren van APEX rapporten naar echte Excel bestanden tot de mogelijkheden kunnen behoren.
De APEX listener als pure java implementatie past goed in een moderne middleware architectuur. Er zijn geen extra servers vereist zoals de Oracle http Server (OHS) / MOD_PLSQL waarvan voor Windows 64-bit platformen zelfs geen versie bestaat.

Tijdens het schrijven van dit Whitebook is Early Adopter release 3 van de listener vrijgegeven die ondermeer veel nettere configuratie- en statuspagina’s bevat. Daarnaast zijn veel problemen opgelost, waaronder het niet kunnen uploaden van bestanden op sommige J2EE-servers als Weblogic die war-files niet uitpakken. Documentatie voor het configureren van de gebruikers en rollen voor de administratiepagina’s ontbreken nog. Het configureren van meerdere verbindingen naar verschillende APEX-instances zou een welkome aanvulling zijn. Nu moet dit opgelost worden door de listenerapplicatie meerdere keren te deployen onder een verschillende naam. Ook zou het wenselijk zijn dat de listener ook goed overweg zou kunnen met applicaties die alleen met de PLSQL-webtoolkit zijn geschreven, en er dus geen beroep gedaan wordt op APEX specifieke databaseobjecten.
Ondanks deze tekortkomingen kan gesteld worden dat de ontwikkeling op de goede weg zit. De listener zal dan ook hoogstwaarschijnlijk deel uit gaan maken van de komende 4.0 release van APEX dit jaar, waar we uiteraard zeer naar uitkijken.

Referenties

Waardering:
 
Tags:

Reacties

Ik heb het ook draaien tegen weblogic.

Maar ik heb config.xml en geen apex-config.xml

Hoi Maarten,

Goed artikel! Lees meer over deze nieuwe listener. Apache werkt ook erg goed. is dit nog sneller?

Weet jij mischien nog een andere manier om excel rechtstreeks te uploaden?

Of is dit de enige? (alternatief is csv bestanden, maar dat is voor de eindgebruiker onhandig).

Mvg,

Toon Schilder

(je weet wel, oud collega...)

Toon,

De enige mogelijkheid die ik ken is Apache Poi, wat de APEX Listener zelf ook gebruikt. Het voordeel is dat de geconfigureerde databaseverbinding wordt gebruikt om voor jouw APEX sessie een collectie aan te maken met de data van het excelsheet, zodat je die dmv. (PL)SQL kunt transformeren naar het juiste formaat of tabellen.
Als je echt speciale wensen hebt met een xls-document zou je zelf POI kunnen gebruiken (in de database of service) om de extractie te doen.

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.