Cáñamo, de OREO a Licurgo
A aquellos que ya conoceis Cáñamo sin duda os sonará OREO, su motor de persistencia, basado en módelos dinámicos. Si quereis saber más sobre ellos no dudeis en preguntar a Al, sin duda os dará una charla sobre sus bondades :). Y gracias a él ahora tenemos otro motor de persistencia, Licurgo, también basado en modelos dinámicos pero esta vez con el objetivo de ser una implementación de Service Data Objects (SDO, JSR 235).
¿Y a qué viene todo esto? Bueno como me han pedido un pequeño manual de como se pasa de OREO a Licurgo que mejor sitio para ponerlo que en mi "concurrido" weblog :D.
El paso es muy sencillo, ya que no requiere cambios en el código de nuestras aplicaciones, solo en los ficheros de configuración.
Bueno ya está bien por hoy, seguro que me dejo cosas pero para comenzar debería valer y además así tengo algo de lo que volver a escribir ;).
¿Y a qué viene todo esto? Bueno como me han pedido un pequeño manual de como se pasa de OREO a Licurgo que mejor sitio para ponerlo que en mi "concurrido" weblog :D.
El paso es muy sencillo, ya que no requiere cambios en el código de nuestras aplicaciones, solo en los ficheros de configuración.
- Servicio de persistencia:
Lo primero que tenemos que hacer es cambiar el servicio de persistencia. Este se encuentra en "WEB-INF/conf/services.xml". Tendremos algo como esto:
<!-- Servicio de persistencia --> <service name="persistence" class="org.javahispano.canyamo.services.persistence.oreo.OreoDataSource"> </service>
Que tendremos que sustituir por:<!-- Servicio de persistencia --> <service name="persistence" class="org.javahispano.canyamo.services.persistence.licurgo.LicurgoService"> </service>
De esta forma indicamos a Cáñamo que use Licurgo en vez de OREO. - Datasource:
El fichero que indica la BD a utilizar, "datasources.xml" también a cambiado un poco. Ahora su nombre es "licurgo-datasources.xml" aunque se encuentra en el mismo lugar "WEB-INF/conf". Y el formato pasa de:
<?xml version="1.0"?> <!DOCTYPE DATASOURCES SYSTEM "classpath:/org/oreodata/metadata/datasources.dtd"> <DATASOURCES> <DATASOURCE CLASS="org.javahispano.canyamo.services.persistence.oreo.CanyamoRecordSet" NAME="canyamo" > <PROPERTY KEY="JDBC_DRIVER_CLASS" VALUE="@JDBC_DRIVER@" /> <PROPERTY KEY="JDBC_URL" VALUE="@JDBC_URL@" /> <PROPERTY KEY="USER" VALUE="@JDBC_USER@" /> <PROPERTY KEY="PASSWORD" VALUE="@JDBC_PASSWORD@" /> <PROPERTY KEY="MAX_CACHE_SIZE" VALUE="0" /> <PROPERTY KEY="DOUBLE_QUOTE_LITERAL" VALUE="N" /> <PROPERTY KEY="CONNECTION_POOL_MINIMUM" VALUE="3" /> <PROPERTY KEY="CONNECTION_POOL_MAXIMUM" VALUE="15" /> </DATASOURCE> </DATASOURCES>
a:
<?xml version="1.0" encoding="UTF-8"?> <datasources> <datasource name="canyamo" class="org.licurgo.jdbc.JDBCDataSource"> <pool class="org.licurgo.jdbc.pools.ProxoolPool"> <property name="min-size" value="3"/> <property name="max-size" value="15"/> </pool> <connection> <property name="driver" value="@JDBC_DRIVER@"/> <property name="url" value="@JDBC_URL@"/> <property name="username" value="@JDBC_USER@"/> <property name="password" value="@JDBC_PASSWORD@"/> </connection> </datasource> </datasources> - Ficheros de persistencia:
Este es el paso que más tiempo lleva, aunque no es complejo. Hay que ir modificando todos los ficheros de persistencia de nuestra aplicación. Así que directorio a directorio dentro de "WEB-INF/conf" abrimos los persistence.xml y hacemos los siguientes cambios:
No hay que olvidarse del fichero "canyamo-defs.xml" que contiene la definición del usuario y que ahora pasa a llamarse "licurgo-tables.xml". Es el que usaré de ejemplo, este tiene 2 tablas definidas (users,role)
<?xml version="1.0"?> <!DOCTYPE RECORDDEFS SYSTEM "classpath:/org/oreodata/metadata/recorddefs.dtd"> <RECORDDEFS> <RECORD TYPE="users" PRIMARY_KEY="login" DATASOURCE="canyamo" TABLE_NAME="users"> <FIELD NAME="name" CLASS="&STRING;" REQUIRED="Y" > <PROPERTY KEY="MAX_LENGTH" VALUE="30" /> </FIELD> <FIELD NAME="login" CLASS="&STRING;" REQUIRED="Y" > <PROPERTY KEY="MAX_LENGTH" VALUE="12" /> </FIELD> <FIELD NAME="password" CLASS="&STRING;" > <PROPERTY KEY="MAX_LENGTH" VALUE="25" /> </FIELD> <FIELD NAME="email" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="50" /> </FIELD> <FIELD NAME="lang" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="5" /> </FIELD> <FIELD NAME="roles" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="100" /> </FIELD> <FIELD NAME="date" CLASS="&DATE;" /> <FIELD NAME="lastlogin" CLASS="&DATE;" /> <FIELD NAME="active" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="1" /> </FIELD> <FIELD NAME="online" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="1" /> </FIELD> <!-- The SQL_TYPE="TEXT" is probably specific to MySQL. In MySQL, the maximum length of VARCHAR is 255 characters. For other DBMS's, you may need to replace or simply delete that attribute --> <!-- <FIELD NAME="columns_content" CLASS="&STRING;" SQL_TYPE="TEXT" REQUIRED="N" > <PROPERTY KEY="MAX_LENGTH" VALUE="8000" /> </FIELD> <FIELD NAME="columns_width" CLASS="&STRING;"> <PROPERTY KEY="MAX_LENGTH" VALUE="20" /> </FIELD> --> </RECORD> <RECORD TYPE="role" PRIMARY_KEY="id" DATASOURCE="canyamo" TABLE_NAME="roles"> <FIELD NAME="id" CLASS="&STRING;" REQUIRED="Y" > <PROPERTY KEY="MAX_LENGTH" VALUE="12" /> </FIELD> <FIELD NAME="text" CLASS="&STRING;" REQUIRED="Y" > <PROPERTY KEY="MAX_LENGTH" VALUE="25" /> </FIELD> <FIELD NAME="systemrole" CLASS="&STRING;" REQUIRED="Y" > <PROPERTY KEY="MAX_LENGTH" VALUE="1" /> </FIELD> </RECORD> </RECORDDEFS>
Lo convertimos en:
<?xml version="1.0" encoding="UTF-8"?> <dataobjects> <dataobject name="users" datasource="canyamo" primary-key="login" > </dataobject> <dataobject name="role" datasource="canyamo" primary-key="id" /> </dataobjects>¿Sencillo, no?. Esta simplificación se debe a que Licurgo se encarga de descubrir los campos de las tablas en el arranque de Cáñamo, se acabó el "me equivoqué en una letra, mira que no poner la s, ay! se me olvido cambiar el persistence,..." y demás escusas que ponemos por ser humanos ;).
Otra de las cosas que hay que modificar es si tenemos autonuméricos en este caso añadiremos:
<uid-generator class="org.licurgo.jdbc.uid.SequenceUIDGenerator" type="java.lang.Integer" />dentro del "dataobject" correspondiente.
Bueno ya está bien por hoy, seguro que me dejo cosas pero para comenzar debería valer y además así tengo algo de lo que volver a escribir ;).