Java Expert....Java/Open Source Addict

Redes Sociales

twitterlinkedinrss feedemail youtube

jueves, 2 de julio de 2009

Problemas con Transformador XML + JAVA + Toplink



Hay d铆as en los que buscas y buscas la soluci贸n a un problema, te inventas diez mil y una formas para que luego!!!! nada el mismo error.....a todos nos pasa, el problema muchas veces radica en el cansancio que nos desvia la mente del objetivo final, hoy fue uno de esos d铆as.

Bueno el problema radico en que estoy haciendo la migraci贸n de la capa de persistencia PersistenceManager a Toplink y me tope con un problema de transformaci贸n de los XML, para no hacerles largo el relato el c贸digo que ten铆a era este.

javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.
newTransformer(new javax.xml.transform.stream.StreamSource(new File(URLXSLT)));
javax.xml.transform.dom.DOMSource xmlDoc = new javax.xml.transform.dom.DOMSource(doc);
transformer.transform(xmlDoc, new javax.xml.transform.stream.StreamResult(new java.io.File(path)));

Cabe aclarar que todo funcionaba bien hasta que comence con Toplink, como Toplink implementa unas nuevas librer铆as para el manejo de xml como son xml.jar y xmlparserv2.jar (parseador) pense que podr铆a haber alguna incopatibilidad colocando las dos en el classpath, hice las pruebas respectivas y nada, cambie de parseadores y seguia saliendo el mismo error:

javax.xml.transform.TransformerException: java.io.FileNotFoundException

Luego de implementar nuevos parser, abrirme jar y reemplementar cosas... buscar en internet full tiempo comence a ver otra forma de llamar al archivo (oj贸 que esto actualmente en la versi贸n que se maneja del sistema funciona bien tal y como esta) y efectivamente por alguna extra帽a raz贸n el problema radicaba aqu铆. Esta fue la soluci贸n:

javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.
newTransformer(new javax.xml.transform.stream.StreamSource(new File(URLXSLT)));
javax.xml.transform.dom.DOMSource xmlDoc = new javax.xml.transform.dom.DOMSource(doc);
transformer.transform(xmlDoc,
new javax.xml.transform.stream.StreamResult(new java.io.File(path).toURI().getPath()));


Como pueden apreciar la soluci贸n fue en cambiar la forma de llamar al archivo, estoy investigando porque se produjo esto. Talv茅z la especificaci贸n de toplink asi lo requiere ya que utiliza nuevos jar y actualizaciones de los tipicos xalan y xerces, en todo caso ya les comentar茅

Espero les sirve y que alegr铆a sali贸 esta situaci贸n.............seguimos en migraci贸n.

lunes, 29 de junio de 2009

Usando Perl con /


Luego de terminar una implementaci贸n nueva de reportes realizada en java utilizando un servidor de reportes llamado Crystal Clear, el siguiente paso consist铆a en cambiar la llamada del viejo servidor por el nuevo. Lo cual involucraba cambiar cierta [cadena1] por [cadena2] en cada uno de los archivos, que eran muchos y que residian en un servidor web Tomcat localizado en un RedHat.

Para realizar esta tarea utilice el comando perl con las diferentes opciones que ten铆a pero en pleno proceso ocurri贸 un error, el cual era que mis cadenas conten铆an el caracter / que daba inconvenites en la b煤squeda del patr贸n. Mi primer intento fue este.

perl -e s//matoosfe//matoosfe_company/g -pi.bak *.xsl


Pero no tuve 茅xito ya que el caracter / no era reconocido con un separador de la expresi贸n, por lo cual la siguiente opci贸n fue utilizar el caracter de escape que era el backslahe \ quedando el comando de la siguiente forma:

perl -e s/\/matoosfe/\/matoosfe_company/g -pi.bak *.xsl

Pero tenia errores al ejecutarlo, asi que la soluci贸n que encontre fue cambiar el caracterer separador de la expresi贸n / por otro en mi caso utilice ¡, pudiendo utilizarse cualquier otro excepto los utilzados por gnu-linux en operaciones bash como el ! por ejemplo. Aclarando esto mi comando quedo de la siguiente manera:

perl -e s¡/matoosfe¡/matoosfe_company¡g -pi.bak *.xsl

Para terminar el comando ejecutado anteriormente lo que hace es cambiar la cadena /matoosfe por la cadena /matoosfe_company en todo el directorio en todos los archivos con extensi贸n .xsl y sacar un respaldo del archivo cambiado con extensi贸n .back .

Espero les sea de mucha utilidad