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