Estoy haciendo un programa que genera reportes a partir de un archivo XML. La idea es que cuando se quiera un nuevo reporte o modificar alguno existente solo se tenga que cambiar la definicion del reporte en un archivo XML y no tener que modificar el codigo. Las clases que utilizo son las siguientes:

Esto lo hice en C# de forma sencilla mediante el uso de la clase System.Xml.Serialization.XmlSerializer y sus métodos Serialize y Deserialize. Esta clase me generó un XML como el siguiente:

<?xml version=”1.0″ encoding=”utf-8″?>
<Reporte xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<Nombre>Reporte de Prueba</Nombre>
<Consultas>
<Consulta>
<Nombre>Consulta 0</Nombre>
<SQL>SELECT * FROM CONSULTA_0</SQL>
</Consulta>
<Consulta>
<Nombre>Consulta 1</Nombre>
<SQL>SELECT * FROM CONSULTA_1</SQL>
</Consulta>
</Consultas>
</Reporte>

a mi parecer esta bastante limpio y se entiende lo suficiente para que una persona lo pueda modificar en cualquier editor de texto.
Luego quise hacer lo mismo en java y encontre que lo podia hacer mediante la clase java.beans.XMLEncoder y java.beans.XMLDecoder, y asi fue. El problema es que me genera XML como el siguiente:

<?xml version=”1.0″ encoding=”UTF-8″?>
<java version=”1.5.0_06″ class=”java.beans.XMLDecoder”>
<object class=”tsj.estadisticas.Reporte”>
<void property=”consultas”>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 0</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_0</string>
</void>
</object>
</void>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 1</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_1</string>
</void>
</object>
</void>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 2</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_2</string>
</void>
</object>
</void>
</void>
<void property=”nombre”>
<string>Nuevo Reporte</string>
</void>
</object>
</java>

Y pues no me gustó para nada, así que busqué otras alternativas.
Buscando en google encontré las 3 opciones que me parecieron mejores: JAXB, Simple y JiBX. Escogí Simple por simple:D jeje … que es lo mismo a fácil de aprender, fácil de usar y eficiente, además de que en escencia es similar a la serializacion de C#.
Simple me produjo el siguiente XML:

<reporte>
<nombre>Nuevo Reporte</nombre>
<consultas class=”java.util.ArrayList”>
<consulta>
<nombre>Consulta 0</nombre>
<sql>SELECT * FROM CONSULTA_0</sql>
</consulta>
<consulta>
<nombre>Consulta 1</nombre>
<sql>SELECT * FROM CONSULTA_1</sql>
</consulta>
<consulta>
<nombre>Consulta 2</nombre>
<sql>SELECT * FROM CONSULTA_2</sql>
</consulta>
</consultas>
</reporte>

que es el mismo que en C# excepto por algunas líneas del encabezado.
El único problema que tuve para poder utilizar Simple fue por no haber leído el siguiente texto en la sección de descarga:

For Java 6 the framework has no external
dependancies and is completely self contained. For Java 5 two external JAR files are required,
the StAX API and the StAX implementation, both are provided with the download.

Como la version de java que utilizo es la 1.5, necesitaba tambien agregar las librerias indicadas. Estas librerias se encuentran en la carpeta “lib” donde hayas descomprimido Simple.
Si no las agregas te genera el siguiente error:

Exception in thread “main” java.lang.NoClassDefFoundError: javax/xml/stream/XMLInputFactory

En el trabajo hay un proceso de BPEL que trae algunos documentos mediante un servicio web y luego los inserta en una base de datos. Algunas ocasiones -especialmente cuando eran muchos documentos o archivos de gran tamaño- el proceso nunca aparecía en la consola despues de ser invocado. Yo esperaba que si no se insertaban los datos porque habia sucedido algun error con el servicio, al menos podria ver el flujo del proceso para saber donde ocurrió el error y tratar de resolverlo. Pero simplemente no aparecían en el listado de instancias, ni marcados como erroneos y mucho menos como ejecutados correctamente.
Donde si aparecían es en la pestaña “Administration” y luego en “Recover(Invokes)”, pero no se registra el flujo del proceso ni nada.

Investigando un poco encontré que probablemente esto se debía a que ocurría un timeout en el proceso, ocasionado seguramente por la cantidad de documentos y el tamaño de los archivos. Para resolverlo hay que modificar la configuración del tiempo de expiración de las transacciones(transaction-timeout) y el tiempo de espera maximo para la respuesta de algun servicio(syncMaxWaitTime). Esto se explica claramente en el primer enlace en la parte de abajo, de todos modos dejo aqui la forma de hacerlo:

  1. Establecer las propiedades transaction-timeout y syncMaxWaitTime de la siguiente forma:

    Propiedad Ubicación El valor debe ser… Ejemplo
    transaction-timeout SOA_Oracle_Home\j2ee\home\config\transaction-manager.xml Mayor que el valor de transaction-timeout en orion-ejb-jar.xml y el valor de syncMaxWaitTime. 7200
    transaction-timeout SOA_Oracle_Home\j2ee\home\application-deployments\orabpel\ejb_ob_engine\orion-ejb-jar.xml Menor que el valor de transaction-timeout en transaction-manager.xml.

    Nota: Debes cambiar el valor de la propiedad transaction-timeout en todos los lugares donde aparece en este archivo.

    3600
    syncMaxWaitTime SOA_Oracle_Home\bpel\domains\domain_name\config\domain.xml

    donde domain_name es el nombre del dominio en el que reside el proceso.

    Menor que el valor de transaction-timeout en orion-ejb-jar.xml. 240

    Recuerda que tienes que reiniciar el servidor del SOA despues de modificar los archivos para que los cambios surtan efecto. En mi caso los valores que estableci fueron 7200, 3600 y 1200 en el orden en el que aparecen en la tabla. Despues de esto los procesos se han estado ejecutando correctamente y aparecen en la consola en el listado de instancias.

Fuentes:
Oracle® BPEL Process Manager Developer’s Guide 10g (10.1.3.1.0)
Oracle SOA Stuff
ShanBPEL

La mayoria de laptops(yo diria que todas) tienen una tarjeta de red inalambrica y una tarjeta de red por cable. Algunas veces deseamos usar las dos al mismo tiempo. Por ejemplo si tienes un celular HTC-Mogul, BAM o algo parecido que te permita usarlo como router inalambrico y te de acceso ilimitado a internet mientras que la red del trabajo solo te permite ver algunos sitios pero te bloquea otros. En este caso quisieramos el acceso a internet por medio del celular pero a la vez poder accesar a recursos(servidores) del trabajo. Asi que ¿como logramos esto? estableciendo politicas de ruteo.

Primero debes conectar y configurar la conexion por el cable de red. Ya sea que exista un servidor DHCP en tu trabajo o le asignes manualmente a tu computadora una IP.
Despues conectate al router inalambrico(tu celular o un “access point”) mediante el nm-applet

Supongamos que la conexion por cable te asigno la IP 172.180.0.146 y una mascara de red
255.255.0.0.
Para ver la ip que te asigno, ingresa el comando

ifconfig eth0

Con ello tenemos acceso automaticamente a las computadoras
cuya IP comienza con 172.180, pero que pasa si queremos accesar a un
servidor que esta en otra red que es parte del trabajo, por ejemplo un
servidor con IP 132.147.0.15. Si hacemos un ping a la IP 132.147.0.15 no vamos a obtener ninguna respuesta porque los paquetes se estaran enviando a traves del router inalambrico(como nos conectamos al router inalambrico despues de haber realizado la conexion por cable, el router nos asigno una puerta de enlace predeterminado y sobreescribio la que nos habia asignado antes la conexion por cable).

Para accesar al servidor 132.147.0.15 hay que definir las politicas de ruteo, esto lo realizamos con el comando route de la siguiente manera:

sudo route add -host 132.147.0.15/32 gw 172.180.0.254

o su equivalente

sudo route add -host 132.147.0.15 netmask 255.255.255.255 gw 172.180.0.254

donde 132.147.0.15 es el servidor al cual queremos conectarnos a traves de la puerta de enlace 172.180.0.254 a la cual tenemos acceso a traves de la red 172.80 que llegamos por medio del cable.

Si quisieramos acceder a todas las computadoras en la red 132.147, no solo al servidor 132.147.0.15, tendriamos que ejecutar el comando de la siguiente forma:

sudo route add -net 132.147.0.0/16 gw 172.180.0.254

Despues de instalar drupal e ir a la pagina de administracion me tope con un mensaje que me decia que se habian detectado uno o mas problemas en la instalacion. Al dar clic en el informe de estado, me encontre con el siguiente error:

La biblioteca GD para PHP no se encuentra o está desfasada.

Para corregir este error basta con instalar el paquete php5-gd y reiniciar el servidor web (apache)

sudo aptitude install php5-gd
sudo /etc/init.d/apache2 restart

Para activar los url’s limpios o “clean urls” en drupal, es necesario tener instalado y activo el modulo mod_rewrite en Apache. En ubuntu 8.04 para activarlo existe un comando llamado a2enmod. Basta con ejecutar en una terminal los siguientes comandos:

sudo a2enmod rewrite
sudo /etc/init.d/apache2 force-reload

por si las moscas tambien hice un:

sudo /etc/init.d/apache2 restart

para verificar que el modulo se activo correctamente ejecuta el comando:

apache2ctl -M

Drupal 6.8 viene con un archivo .htaccess con directivas que nos permiten activar los URL’s limpios. Para que el servidor apache pueda leer y aplicar estas directivas es necesario modificar el archivo /etc/apache2/apache2.conf agregando las siguientes lineas:

AccessFileName .htaccess
<Directory “/var/www/carpeta_de_drupal”>
        AllowOverride All
</Directory>

No olvides hacer un

sudo /etc/init.d/apache2 restart

El dia de hoy me aparecio el siguiente error cuando intentaba instalar drupal 6.8:

Configuración de la base de datos
Su servidor web parece no admitir ninguno de los tipos de bases de datos más comunes. Consulte con su proveedor de alojamiento para saber si ofrece alguna de las bases de datos soportada por Drupal.

En mi computadora tengo instalado ubuntu 8.04 y tenia instalado mysql,apache y php.
Lo que me hacia falta para corregir el error era instalar el soporte para mysql en php, esto lo realice ejecutando en una terminal los siguientes comandos:

sudo aptitude install php5-mysql
sudo /etc/init.d/apache2 restart

Seguir

Get every new post delivered to your Inbox.

Únete a otros 195 seguidores