Después del post del 09/10 que nos trajo David sobre Workflows en Liferay, en el que nos hacía una primera aproximación a las definiciones de nuevos flujos de trabajo en nuestro portal, en este post quiero explicaros qué pasos debéis seguir para utilizar Workflows sobre una entidad que hayáis creado en vuestro service.xml.
Deberéis tener instalado Kaleo, el motor de Workflows más común en Liferay. A continuación, seguid los siguientes pasos:
1.- Crear una clase que extienda la clase com.liferay.portal.kernel.workflow.BaseWorkflowHandler, en la que implementaremos los métodos necesarios (los no implementados) de la clase base: getClassName, getType y updateStatus. El método más importante es este último, que es el que ejecutaremos desde nuestra definición de workflow en los puntos en los que se deba cambiar el estado del objeto sobre el que estamos aplicando el workflow.
12345678910111213141516 | public Articulo updateStatus( int status, Map<String, Serializable> workflowContext) throws PortalException, SystemException { long resourcePrimKey = GetterUtil.getLong( (String)workflowContext.get( WorkflowConstants.CONTEXT_ENTRY_CLASS_PK)); ServiceContext serviceContext = (ServiceContext)workflowContext.get( WorkflowConstants.CONTEXT_SERVICE_CONTEXT); long userId = serviceContext.getUserId(); Articulo res = ArticuloLocalServiceUtil.updateStatus( userId, resourcePrimKey, status, serviceContext); return res; } |
2.- Crear la función updateStatus en el servicio local de nuestra entidad.
3.- Crear una instancia de workflow cada vez que creamos una nueva entrada de nuestra entidad. Recordar también eliminar la instancia de workflow cuando borremos el elemento.
123 | WorkflowHandlerRegistryUtil.startWorkflowInstance( companyId, groupId, userId, Articulo. class .getName(), resourcePrimKey, articulo, serviceContext); |
12 | workflowInstanceLinkLocalService.deleteWorkflowInstanceLinks( companyId, groupId,Articulo. class .getName(), articulo.getResourcePrimKey()); |
4.- Incluir el elemento <workflow-handler> en el archivo liferay-portlet.xml de nuestro portlet indicando la clase que hemos creado en el punto 1.
5.- En el control panel hay que recordar asignar nuestra definición de workflow como workflow por defecto.
Y con esto ya tendríamos nuestro sistema de workflow configurado y listo para funcionar.
Espero que os sea de ayuda!