jueves, 12 de julio de 2012

Acceder a un JournalArticle para recuperar sus datos

Hoy he encontrado una forma de acceder a los datos de un JournalArticle. Por medio de instanciar el servicio y realizar la llamada correspondiente al método para que me devuelva dicho objeto con los valores que necesito.

##Recuperar los datos del journal article tales como la plantilla y la estructura en la que se basa (por ejemplo)

#set ($jaService = $serviceLocator.findService("
com.liferay.portlet.journal.service.JournalArticleLocalService"))
#set ($JArticle = $jaService.getArticle($getterUtil.getLong($groupId), $reserved-article-id.data, $getterUtil.getDouble($reserved-article-version.data)))

A partir de $JArticle. podremos recuperar y utilizar los diferentes métodos que se ven en la clase JournarArticleWrapper y utilizarlos a gusto para recuperar los valores que necesitemos.

Por ejemplo:

$JArticle.getTemplateId()
$JArticle.getStructureId()

Como se puede ver es bastante simple, lo que no quita que haya sido un poco engorrosa la tarea.
Hay que tener en cuenta los objetos reservados de velocity para los journal articles ya que los utilizamos como parámetros para recuperar el JournalArticle, al igual que los objetos de velocity para parsear a long o Double los valores dados.
Estos objetos los encontré en la wiki de liferay sobre las variables de velocity referidas a los articles y en esta otra entrada en un listado mas extenso, otras clases que van a ser de gran utilidad, páginas que son de gran ayuda al igual que el foro.

Más adelante daré un ejemplo sobre la utilidad dada a esto.
Comentarios, dudas, sugerencias, CORRECCIONES, siempre son bienvenid@s!

martes, 10 de julio de 2012

Acceder a un fichero subido a una Document Library

Para aquellos que como yo están trabajando con la "parte CMS" de Liferay 6.1.0 (aclaro siempre la versión porque las diferentes versiones suelen conllevar algunos cambios) y necesitan mostrar en un contenido web (o WebContent) un campo definido en la estructura (XSD-XML) como "document_library" hoy he encontrado una forma para acceder al elemento (DLFileEntry). Cabe destacar que en la estacada final me ayudó un compañero, asi como también en el proceso de razonamiento de los pasos a seguir cuando estamos trabajando con los CMS Templates.

Bueno basta de parrafadas y a lo importante!!!

Subimos un documento a la Document Library, a través del portlet o desde la administración de liferay.
No solicitará el Titulo o Title (Este valor se utiliza como clave para identificar al documento entonces deberá ser único por cada carpeta de la librería), supongamos que escribimos como titulo el valor "titulo del documento"
Una vez subido y publicado el documento podremos utilizarlo desde nuestro contenido web que poseerá una estructura con un campo como el siguiente

<dynamic-element name="DOCUMENTO" type="document_library" index-type="" repeatable="false"/>

Sabemos que:

Si hacemos $DOCUMENTO.data el resultado será la url (sin el host) del documento:

/documents/12004/0/titulo+del+documento


La url que nos presenta significa lo siguiente:

* documents            --> Directorio donde se alojan los documentos
* 12004                --> Group ID
* 0                    --> Folder ID
* titulo+del+documento --> Título asignado al subir el documento a la librería (e identificador único del documento)

para recuperar cada una de las partes haremos un split de aquellas que nos interesan:



por lo que tendremos en cada una de las variables definidas los valores por separado para utilizarlos en la llamada a el método que necesitemos

Para poder recuperar el DLFileEntry (DocumentLibraryFileEntry) vamos a hacer uso del serivicio:

com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryPersistence

por lo tanto lo instanciamos de la siguiente forma:


#set ($dlService = $serviceLocator.findService("com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryPersistence"))


Una vez instanciado el servicio lo que hacemos es recuperar el fichero por medio del método fetchByG_F_T(long groupId, long folderId, String title)

#set ($document = $dlService.fetchByG_F_T($gid,$fid,$fileTitle))

y ahora en el objeto $document contaremos con los metodos necesarios para recuperar los valores que queramos (ver clase DLFileEntry) como por ejemplo la descripción.

Como mención final cabe destacar lo curioso que es el hecho de que la url del documento se genere con el titulo que le hayamos asignado al subirlo a la document library.

Ya saben, consultas, dudas y sugerencias son bienvenidas!

domingo, 8 de julio de 2012

Buenas prácticas para trabajar con Liferay

Tengo un compañero de trabajo que sabe mucho de Liferay, pero sabe mucho de las tripas como decimos por ahí, quizá no tanto de la parte CMS de Liferay, aún así, es muy resolutivo y siempre dispuesto a echar una mano en lo que haga falta. Ahora que también se pelea un poco con la parte de CMS seguro que se le da mejor.
Como tributo yo voy a apuntar algunos de sus consejos para trabajar con Liferay.

"Descárgate las fuentes de Liferay y ponlas en un Eclipse como un proyecto nuevo así podrás ver las clases, los métodos y aprender como funciona, cómo y de de dónde se pueden recuperar las cosas..." (Todo esto con un acento español claramente)

Dicho y hecho, descargadas las fuentes, descomprimido el zip y en cuestión de minutos ya estaba mirando las clases, métodos y lo que hiciera falta!!

Liferay 6.1.0 con JBoss 7.0.2 Bundle (Postgresql 8.4)

Desconforme con no haber podido hacer funcionar la instalación de OpenCms y aún más con no encontrar información sobre la excepción que me está dando, me dispongo a instalar el bundle de Liferay 6.1.0 con JBoss 7 asi lo tengo montado para cuando quiera inventar algo o intentar hacer alguna cosa aca en casa.
Para ello las siguientes herramientas:
  • Ubuntu 12.04 como siempre! 
  • PostgreSql 8.4
  • Bundle de Liferay con JBoss 7.0.2 (Descargado de sourceforge)
  • Un poco menos de paciencia que para la instalación de OpenCms porque ya lo hemos visto funcionando... o hubo problemas con jpa tambien... :S
Bien el bundle tardará un poco en descargar, lo que es normal en sourceforge, o al menos para mi lo es, asi que mientras tanto, nos preparamos un directorio como para tener nuestro bundle bien localizado. El directorio sera /opt/ como no podía ser de otra forma.
Pero hey! ya que estamos podemos ir creando la base de datos ¿no? Pues eso, a crear la base de datos que utilizaremos, aunque el bundle ya viene con una hsql por defecto, no está mal la idea de trabajar sobre un PostgreSql y asi tener todas las bases de datos juntas.
Entonces a crear la base de datos.
Accedemos a postgres y ejecutamos las 3 sentencias siguientes:

  1. postgres=# create user liferay with password 'liferay';
    CREATE ROLE
  2. postgres=# create DATABASE lportal with owner liferay;
    CREATE DATABASE
  3. postgres=# grant ALL privileges on database lportal to liferay;
    GRANT
Una vez realizado esto ya tendremos nuestra base de datos para que la instalación de liferay vuelque los datos.

Al parecer ya se descargó del todo así que toca descomprimir y copiar a /opt/ como siempre, a la hora de descomprimir lo alojamos en  /tmp/, hacemos el unzip y nos creará una carpeta que copiaremos a /opt/.
Dentro de la carpeta tendremos ya todo prácticamente listo para trabajar.

Como es un bundle para trabajar en local y hacer pruebas y aprender yo personalmente (NO RECOMENDABLE) paso un poco de los permisos de usuario del sistema y cambio el propietario de todo el directorio (y subdirectorios del bundle) haciendo un

"chown -R usuario:usuario liferay-portal-6.1.0-ce-ga1/"

Luego de hacer esto iniciamos el JBoss con el script standalone.sh y al finalizar nos aparecerá en nuestra ventana del navegador la configuración.

Aca indicaremos los datos que queramos y en la parte de la base de datos indicaremos que vamos a usar otra que no es la HSQL por defecto, tambien le indicaremos el nombre de la base de datos que está indicado al final de la cadena de conexión (lportal) y el usuario y contraseña que vamos a usar y que fue definido previamente. En el ejemplo pusimos liferay con contraseña liferay.

Si todo terminó bien nos mostrará un mensaje y ya podremos utilizar nuestra instalación de liferay.

Esto fue fácil, no tiene muchas complicaciones, pero bueno, hay que hacerlo y pueden surgir algunos problemas que siempre se pueden arreglar.


Instalación de OpenCms 8 (8.0.4) en JBoss 7 (7.1.1)

Tuve un fin de semana extraño, me desperté temprano el sábado luego de haber pasado un viernes de cumpleaños y como venía maquinando la idea de hacerle una web a mi madre (que tanto la pide) me dispuse a instalar y configurar correctamente Joomla, mas que nada porque lo desconozco totalmente y si saliera algún día la posibilidad de hacer una web a algún conocido me podría ser de ayuda, ya que dicen por ahí que es bastante simple...
Pero eso lo contaré otro día, ahora estamos con otra cosa, la gran lucha, la lucha de las instalaciones.
Recordé que mi compañero de trabajo (compañero y mentor he de decir), me comentó que intentaríamos a la brevedad pasar a utilizar OpenCms 8, yo como de costumbre estuve reticente a la idea, pero luego meditándolo un poco me di cuenta que la idea no es tan descabellada, supuestamente cada versión nueva de un producto va a mejor y nosotros lo haremos con ella.
Entonces, sin un plan a la vista mas que escaparme a andar con el longboard, dormir una siesta o mirar una "peli" me dispuse a arriesgarme e instalar JBoss 7 y OpenCms 8, sabía que no sería fácil y de hecho a día de hoy no lo es pero no por eso voy a dejar de apuntar mis avances por aca.
Por eso, aca van los pasos realizados para que aparezca, al menos, el setup de instalación de OpenCms.

Herramientas:
  • Ubuntu 12.04
  • Java 1.6 (los pasos estan descritos aca aunque habrá que buscar la versión adecuada ya que el "wget" no funciona)
  • Base de datos PostgreSql 8.4 (desde los repositorios de ubuntu)
  • OpenCms 8.0.4 (OpenCms 8.0.4)
  • JBoss 7.1.1 (JBoss 7.1.1 Final)
  • Ganas y paciencia para suplir el desconocimiento.
Teniendo instalada la versión de Java y PostgreSql que vamos a obviar descargamos el paquete de JBoss.

Instalación de JBoss:

Descargamos JBoss y lo descomprimimos en donde nos guste, para los ejemplos utilizaremos la carpeta "/tmp/"
Al descomprimirlo nos quedará un directorio tal que será :

"/tmp/jboss-as-7.1.1.Final/"

lo copiamos a /opt/ asi nuestra ruta será /opt/jboss-as-7.1.1.Final/ y como no me gusta escribir toooooodo el nombre del directorio de JBoss lo simplificamos con un enlace simbólico desde /opt/ (ln -s /opt/jboss-as-7.1.1.Final/ /opt/jboss)

Una vez realizado esto podremos acceder a la home de JBoss haciendo cd /opt/jboss para que sea mas comodo todo.

Una de las cosas (tantas) que han cambiado en JBoss 7 respecto a la 4 (creo que era la que usaba) es la carpeta de despliegue, que ya no esta mas en .../server/default/deploy/ sino que ahora se ubica en "/opt/jboss/standalone/deployments"
directorio a tener en cuenta porque ahi es donde ubicaremos nuestro war de OpenCms.

Instalación de OpenCms:


Como muchos ya saben (otros quizá no) para desplegar OpenCms en JBoss necesitamos alojarlo en el directorio de despliegue (ahora deployments) como una carpeta y no como un fichero/paquete war, por ello, una vez descargado OpenCms lo descomprimimos en /tmp/ esto nos va a dejar una serie de archivos de los que nos interesa solo "opencms.war" el cual renombraremos a "opencms8.war", lo  descomprimiremos otra vez y asi tendremos la carpeta opencms la cual renombraremos ahora si como "opencms.war" y la moveremos al directorio de despliegues de JBoss antes mencionado. Esto nos dejará un directorio dentro de JBoss asi:
"/opt/jboss/standalone/deployments/opencms.war/"
y dentro haciendo un "ls" deberemos tener los 3 subdirectorios:
"META-INF",  "setup" y "WEB-INF".

Hecho esto no está todo dicho, hay que crear la base de datos.
Para ello vamos a una consola y accedemos a postgres y creamos el usuario y la base de datos donde se alojarán las tablas de OpenCms.

  1. create user opencms with password 'opencms';
  2. create DATABASE opencms with owner opencms;
  3. grant ALL privileges on database opencms to opencms;

Una vez realizados estos pasos ya tenemos la base de datos creada para comenzar con la instalación de OpenCms 8.

PERO

han ocurrido una serie de problemas a la hora de iniciar y no ha sido posible acceder al setup de OpenCms. Ahora es cuando aparecen los cambios interesantes.

Hay que crear en JBoss 7 un modulo de openjpa, me basé en la información de este post el cual recomiendo leer si hay alguna duda, yo resumiré los pasos empleados.

  • Descargar openjpa 2.2.0 desde el sitio de apache
  • Crear una carpeta nueva (modulo nuevo) en el directorio de modulos de JBoss para apache (/opt/jboss/modules/org/apache/) llamada openjpa la cual contara con un subdirectorio main. En ese subdirectorio creamos un fichero module.xml vacio. Creo que con un "tree" estará mas claro
/opt/jboss/modules/org/apache/
├── openjpa
│   └── main
│       ├── module.xml
│       ├── openjpa-all-2.2.0.jar
│       ├── serp-1.13.1.jar

  • Descomprimir el zip en /tmp/ y como vemos en el árbol anterior copiamos el fichero /tmp/apache-openjpa-2.2.0/openjpa-all-2.2.0.jar  dentro del directorio main y el fichero serp-1.13.1.jar que estara dentro de /tmp/apache-openjpa-2.2.0/lib/serp-1.13.1.jar tambien irá dentro del directorio main de nuestro modulo
  • Editamos el fichero module.xml y agregaremos lo siguiente:

Con eso tendremos la parte de JBoss cubierta, pero, como siempre hay un pero, deberemos también que realizar unos cambios en el fichero de persistencia de  nuestro OpenCms. Por lo tanto, nos vamos a nuestro fichero persistence.xml (/opt/jboss/standalone/deployments/opencms.war/WEB-INF/classes/META-INF/) de OpenCms, y lo editamos.
En el bloque de <properties> agregaremos las siguientes:


 Y asi podremos acceder a la instalación de OpenCms a través de nuestro navegador una vez hayamos arrancado correctamente JBoss en nuestra url "localhost:8080/opencms/setup"

Indicaremos los valores previamente definidos para la base de datos e indicaremos los modulos que queramos instalar. Ahi es cuando se ha detenido mi progreso ya que OpenCms crea las tablas en mi base de datos pero cuando quiere conectarse para volcar los contenidos no lo consigue con el siguiente error:

20:13:12,663 INFO  [org.opencms.init] (OpenCms: Setup workplace import) . Wait for DB          : opencms:default (jdbc:postgresql://localhost:5432/opencms), attempt 1, wait 5,000 ms.

y asi hasta los 10 intentos configurados en opencms.properties sin exito, el log de instalacion muestra que el error ha sido:

27:    Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/opencms

pero no he sido capaz ya que en el lib de opencms cuento con el jar correspondiente a postgres y aunque lo he copiado al lib del servidor sigue fallando. Podremos finalizar la instalación pero no se ha instalado nada.

Por eso, de momento, esto está pendiente, de hecho cuando logre la instalación completa modificaré este post asi que si te interesa, ya sabes, a seguirlo! y si sabes como solucionar este problema! Comenta!!!