jueves, 30 de abril de 2009

Acceder a servicios de Liferay desde plantilla de velocity

Existe 2 opciones

La primera necesita:
  1. Usando el "liferay-ext", modificar el fichero "portal_ext.proporties" y cambiar la entrada: "journal.template.velocity.restricted.variables= " es decir no debe tener valor o al menos no contener "serviceLocator" con ello tendremos una variable que nos permite acceder a servicios de Liferay.
  2. Si deseamos acceder a un servicio propio deberemos crearlo e insertalo usando "liferay-ext"
  3. Finalmente para acceder: desde dentro de la plantilla:

    #set ($tagsService = $serviceLocator.findService("com.liferay.portlet.tags.service.TagsAssetLocalService"))
    #set ($journalArticleResourceService = $serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleResourceLocalService"))



    #set ($longGroupId = $getterUtil.getLong($groupId))
    #set ($articleResourcePK = $journalArticleResourceService.getArticleResourcePrimKey($longGroupId, $reserved-article-id.data))
    #set ($tagsAsset = $tagsService.getAsset("com.liferay.portlet.journal.model.JournalArticle", $articleResourcePK))
    #set ($tagsEntries = $tagsAsset.getEntries())

    Tags:
    #foreach( $entry in $tagsEntries )
    #set ($tag = $entry.getName())
    #if($velocityCount!=1), #end
    $tag
    #end

Con esa plantilla accemos a todos los tags del artículo actual y los escribimos.

La segunda alternativa no requiere modificar el fichero "portal_ext.properties" y consiste en:

#set ($tagsService = $portal.getClass().forName("com.liferay.portlet.tags.service.TagsAssetLocalServiceUtil").getMethod("getService", null).invoke(null, null))
#set ($journalArticleResourceService = $portal.getClass().forName("com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil").getMethod("getService", null).invoke(null, null))

Con ello accedemos también a los servicios.


Otro ejemplo, acceder al usuario que escribio el artículo e imprimir su nombre

#set ($userService = $serviceLocator.findService("com.liferay.portal.service.UserLocalService"))
#set ($user = $userService.getUserById($getterUtil.getLong($reserved-article-author-id.getData())))
$user.getScreenName()



Ejemplo propio


#set ($museumService = $serviceLocator.findService("com.muvac.service.MuseumLocalService"))


#set ($museum= $museumService.findById($museo.data))




Autor: ${autor.data}
Museo: ${museo.data}


Datos del museo

$museum.name
$museum.description

miércoles, 18 de marzo de 2009

Documentación sobre JSF y otros

Framework AME (Endesa)
MADEJA (Junta de Andalucía), apartado sobre JSF.

Editores de imágenes javascript

Pixastic (opensource)

Ubiquity (aún sólo una idea)



Picnik (comercial, sólo puede usarse a través de la Web no como librería). No es javascript sino flash.
Sumo (comercial, Web) No es javascript sino flash.
Aviary (comercial, Web, flash)

"Memory leaks" en Java

How to Fix Memory Leaks in Java
Depurar fugas de memoria en Java (Tomcat)

jueves, 4 de septiembre de 2008

Transacciones en lectura/escritura de ficheros

Cuanto tiempo llevaba esperando por algo asi :).

JBoss Transactional File I/O

JBoss ha publicado este interesante API para llevar el mundo de las transacciones XA (transacciones distribuidas) a las operaciones con ficheros. El API vuelve posible que las lecturas/escrituras que realizes sobre ficheros o directorios en el filesystem puedan ser englobadas dentro de transacciones distribuidas, de la misma forma que una operación a base de datos o a una cola/tópico JMS.

La librería soporta que múltiples JVMs realizen transacciones concurrentes sobre ficheros y que una transacción pueda distribuirse en múltiples JVMs.

Además, cumple los estándares J2EE (como JTA) y de WS-* (como WS-Coordination) para transacciones. (texto copiado literalmente de JavaHispano, en este post)




La verdad es que hace mucho que existía algo similar Apache Commons Transaction, pero el proyecto lleva mucho tiempo "aparentemente" parado. Esa segunda versión con tantas supuestas mejoras no termina de llegar. Además se inventan un API para las transacciones y no usan para nada JTA.