Problème de mémoire à l'utilisation des API de Oracle BI Publisher

La semaine dernière je développais une application en java dont le but est de convertir un document RTF en PDF.
Le cahier des charges stipulait l’utilisation des API d’Oracle BI Publisher pour faire ce travail. Bien ! Qu’il en soit ainsi ! Utilisons les API d’Oracle BI Publisher !

DEVELOPPEMENT DE L’APPLICATION…

Les API dont nous disposons permettent effectivement de faire ce travail en deux étapes :

  • Conversion du RTF en XSL-FO (RTFProcessor)
  • Conversion du XSL (couplé à un fichier de données XML) en PDF (FOProcessor).

Nous écrivons le code qui va bien dans une servlet:

// ETAPE 1 CONVERSION RTF->XSL
// on definit le RTF Processor dasn lequel on injecte le fichier RTF recupéré du inputstream
processor = new RTFProcessor(req.getInputStream());
// on selectionne en output le fichier temporaire
processor.setOutput(xslFile.getPath());
// et on genere le XSL
processor.process();
//ETAPE 2 : CONVERSION XSL->PDF
// on défini le fichier de données
gprocessor.setData(xmlFile.getPath());
// et on injecte aussi le XSL genere precedemment
gprocessor.setTemplate(xslFile.getPath());
// et on defini le fichier de sortie au format PDF
fprocessor.setOutput("/usr/local/jakarta-tomcat-5.0.28/webapps/emp.pdf"); gprocessor.setOutputFormat(FOProcessor.FORMAT_PDF);
// et on genere le PDF
gprocessor.generate();

COMPILONS ET TESTONS …

Bien … il n’y a plus qu’à tester.
Nous compilons le projet, nous déclarons dans le classpath les jars composant les API de Oracle BI Publisher nécessaires à la compilation. Nous créons le fichier WAR que nous déployons sur notre serveur (ici un serveur Tomcat).
Et … ca plante … en effet, le fichier XSL est bien créé mais le fichier PDF n’est pas généré ou plutôt si, mais sa taille est de 0 octet et de plus il est impossible de l’ouvrir sous quelque éditeur que ce soit.

LE BUG …

Les logs nous informent qu’une exception à été déclenchée (ce qui ne nous étonne guère, mais qui nous rassure un peu quand même :))

[DEBUG] fk.obipub.ConvertToPDFServlet - LOG00C000D000 doGet() - ${pom.application.code}:Calling getReport [DEBUG] fk.obipub.ConvertToPDFServlet - LOG00C000D000 getReport(HttpServletRequestreq,HttpServletResponserep) - ${pom.application.code}:Begin getReport [101310_032817949][oracle.apps.xdo.template.FOProcessor][ERROR] End Memory: max=63MB, total=15MB, free=5MB

Finalement on se demande si cela est rassurant… à première vu il s’agit d’un problème de mémoire et puis dans le milieu des développeurs on prétend souvent que « google » est notre meilleur ami, ou allié, et qu’il se peut qu’une personne ait eu ce problème et qu’il soit résolu.
En effet, on trouve par ci et par là des développeurs aillant eu ce problème sans qu’aucune âme charitable veuille bien donner le correctif.
Pourtant tout est correct, les syntaxes, les appels de méthodes, les types attendus sont cohérents, peut être un problème de paramétrage au niveau de notre serveur Tomcat ?
Au bout de quelques heures de recherches intensives et de tests en tout genres, nous avons réussi à générer le PDF !
Merci de m’avoir lu 😉

RESOLUTION

Bon d’accord vous avez le problème et vous voulez savoir comment je l’ai résolu.
Alors voila:
Lors de la compilation nous avons défini dans le classpath uniquement les jar nécessaires à la compilation (xmlpserver.jar, xdocore.jar). Mais lors de l’exécution, il utilise peut être des méthodes incluses dans d’autres jars composant les API de OBI Publisher !?
Soyons fous, incluons tous les jars composant les API (se trouvant dans le répertoire $ORA_HOME/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib) dans notre WAR et testons.
Et lors du test, nous avons généré notre PDF !! Le problème était aussi « simple » que cela…
Il ne reste plus qu’à compléter votre fichier Manifest.mf afin que votre servlet pointe sur tous les jars du répertoire contenant les API de OBI Publisher :

Manifest-Version: 1.0
Class-Path: /oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/aolj.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/audit-client.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/axis-ant.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/axis.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/axis-schema.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/bicmn.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/bijdbc14.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/bipres.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/collections.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-beanutils.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-codec-1.3.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-collections-3.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-collections.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-dbcp-1.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-digester.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-discovery.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-el.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-fileupload.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-httpclient-3.0.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-lang-2.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-logging-api.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-logging.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/commons-pool-1.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/css-9_5_0.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/cssimportexport.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/cssSpy.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/cssweb.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/ess_es_server.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/ess_japi.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/http_client.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/hyjdbc.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/i18nAPI_v3.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/interop-common.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/interop-sdk.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/jakarta-slide-webdavlib.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/jaxrpc.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/jdom.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/jewt4.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/jsp-el-api.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/ldapjclnt10.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/log4j-1.2.8.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/logkit-1.2.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/mdds.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/opensaml-1.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/oracle-el.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/orasaaj.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/orawsdl.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/quartz-1.5.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/quartz-jboss-1.5.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/quartz-oracle-1.5.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/quartz-weblogic-1.5.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/regexp.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/registry-api.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/saaj.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/share.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/toplink.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/uix2.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/uix2tags.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/versioninfo.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/wsdl4j.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/wss4j-1.5.4.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xddo.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xdochartstyles.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xdocore.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xdoparser.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xmlparserv2.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xmlpserver.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xmlrpc-2.0.1.jar
/oracle/BIP/OraHome_1/oc4j_bi/j2ee/home/applications/xmlpserver/xmlpserver/WEB-INF/lib/xmlsec-1.4.0.jar

Bon développement ! 🙂

2 réflexions sur “Problème de mémoire à l'utilisation des API de Oracle BI Publisher”

  1. comment peut-on faire une connexion à BI publisher avec le code JSP ???
    en fait je veux intégrer des etats de BI publisher dans mes page JSP, mais le probleme que BI demande l’authentification pour afficher les etats demander.
    merci d’avance 🙂

  2. comment peut-on faire une connexion à BI publisher avec le code JSP ???
    en fait je veux intégrer des etats de BI publisher dans mes page JSP, mais le probleme que BI demande l’authentification pour afficher les etats demander.
    merci d’avance :))

Les commentaires sont fermés.