Programar envío de suscripciones en los publicadores de contenido

Uso de expresiones regulares para el envío de suscripciones

Hace unas semanas surgió la necesidad de poder establecer una hora fija y concreta en la que se enviase un correo con los nuevos contenidos generados en un publicador de contenidos mediante la funcionalidad de suscripciones.

Esto nos llevó a indagar si era viable realizar esta modificación de una manera sencilla.

Qué se ejecuta y cómo

El primer paso fue acceder a la administración de Liferay y ver si en la configuración de sistema, instancia, etc. existía alguna forma OOTB de establecer una expresión regular para el envío de suscripciones:

Al detallarse claramente en la información del campo "Intervalo de comprobación" que en esta configuración solamente se podía establecer un número de horas, seguimos los siguientes pasos:

1. Identificar el método que ejecuta la comprobación de nuevos activos en un publicador de contenidos. En este caso, como se puede observar en la siguiente imagen, el "culpable" es el componente "CheckAssetEntryMessageListener".

2. Dentro de la clase anterior se puede ver como se crea un trigger mediante el número de horas establecido como configuración de sistema del publicador de activos mediante el campo "Intervalo de comprobación" y la unidad de tiempo, que en este caso son HORAS.

Trigger trigger = _triggerFactory.createTrigger(className, className, null, null, assetPublisherWebConfiguration.checkInterval(), TimeUnit.HOUR);

En resumen, se comprueba si existen nuevos contenidos cada X horas, siendo X el valor establecido en el campo "Intervalo de comprobación".

¡Al lío!

Ahora, una vez identificado el problema, lo que necesitamos es saber cómo modificar este comportamiento y que sea de la forma menos intrusiva y sencilla posible. Para ello:

1. Siguiendo la misma lógica planteada en el componente "CheckAssetEntryMessageListener" si observamos las opciones de paso de parámetros que permite el método "createTrigger" vemos cómo se puede utilizar una expresión regular (cron expression):

2. Añadir el componente "CheckAssetEntryMessageListener" a la lista negra, ya que lo que haremos será crear un componente personalizado y prácticamente similar pero modificando los parámetros de entrada del método "createTrigger". Para ello utilizaremos el fichero de configuración "com.liferay.portal.component.blacklist.internal.ComponentBlacklistConfiguration.config" y lo añadiremos a la ruta correspondiente "@liferay_home@/osgi/configs" con el siguiente contenido:

blacklistComponentNames=[ \
  "com.liferay.asset.publisher.web.internal.messaging.CheckAssetEntryMessageListener", \
  ]


3. Una vez hemos bloqueado, parado, ..... el componente "CheckAssetEntryMessageListener" necesitamos crear nuestro componente personalizado.

3.1. Creamos un módulo de tipo API, por ejemplo, que es uno de los más básicos.

3.2. Añadimos las dependencias necesarias en el fichero "build.gradle", a tener en cuenta estas 5 adicionales:

compileOnly group: "com.liferay", name: "com.liferay.asset.publisher.api"
compileOnly group: "com.liferay", name: "com.liferay.asset.publisher.web"
compileOnly group: "com.liferay", name: "com.liferay.petra.string"
compileOnly group: "com.liferay", name: "com.liferay.portal.configuration.metatype.api"
compileOnly group: "biz.aQute.bnd", name: "biz.aQute.bndlib", version: "3.1.0"

3.3. Creamos un nuevo componente, por ejemplo "CustomCheckAssetEntryMessageListener", y copiamos el código del componente principal "CheckAssetEntryMessageListener".

3.3.1. Ahora necesitamos modificar tres puntos clave para que nuestro componente personalizado sea 100% funcional y no dependa del componente principal:

3.3.2. ConfigurationPid: Creamos una nueva clase de configuración (p.e. "CustomAssetPublisherWebConfiguration")  en la que vamos a establecer un campo para añadir la expresión regular que posteriormente utilizaremos para crear el trigger y lanzar la comprobación de nuevos activos. Una vez creada, establecemos dicha configuración como configurationPid de nuestro nuevo componente:

3.3.3. Recuperar la configuración personalizada: Después de crear la nueva configuración y añadirla en las propiedades de nuestro nuevo componente, es necesario hacer referencia a esta y recuperarla para obtener la expresión regular que se establecerá como configuración de sistema. Para ello basta con cambiar en las primeras líneas del método "activate" la clase AssetPublisherWebConfiguration utilizada por el componente principal por nuestra nueva configuración CustomAssetPublisherWebConfiguration o como le hayáis llamado.

3.3.4. Método createTrigger: Por último quedaría por modificar el paso de parámetros para el método createTrigger para pasarle una expresión regular en vez de utilizar el número de horas y la unidad de tiempo.

4. El próximo paso sería compilar y desplegar el componente para comprobar que todo ha ido correctamente.............. ¡OH WAIT!. Vemos que al desplegar el módulo e intentar arrancar nos indica que existe una dependencia a la clase interna "com.liferay.asset.publisher.web.internal.messaging.AssetEntriesCheckerUtil" que es la que realmente se encarga de obtener las entradas/activos. ¿Cómo podríamos solucionar esto?

Pues bien, para solucionar este error vamos a seguir un post muy interesante escrito por David H Nebinger en el que se indica de qué manera proceder y mediante el cual dejaremos expuesto/exportaremos el paquete necesario "com.liferay.asset.publisher.web.internal.messaging" dentro del módulo "asset-publisher-web" para solventar el error. Para más información sobre cómo realizar este paso:

https://liferay.dev/blogs/-/blogs/fixing-module-package-access-modifiers

5. Por último, y una vez desplegado el "fix" del error para el paquete interno del modulo asset-publisher-web, desplegamos de nuevo nuestro módulo y una vez arrancado, accediendo a la configuración de sistema, estableceremos nuestra expresión regular personalizada.


 

Conclusión

De esta forma podemos establecer el envío de suscripciones a una hora precisa que cualquier usuario con permisos de acceso a la configuración del sistema puede establecer mediante una expresión regular.

Agradecer a Jorge Díaz por su gran labor de soporte y gestión para incluir esta funcionalidad en futuras versiones:

¡Sí! a partir de la versión 7.4 se podrá programar el envío de notificaciones para las suscripciones de los asset publisher.
Blogs