Buscar
  • Juan Ayala

Haciendo AEM Groovy Sin El Console

Recientemente yo estaba investigando sobre el manejo de errores en AEM. Encontré esta página de documentación de Sling. Cosas bastante estándar excepto por la última línea.

Thus to overwrite the default error handler servlet provide a servlet or script for the default extension, for example /apps/sling/servlet/errorhandler/default.groovy.

Un script de Groovy, en el contexto de Sling. ¿Estaba mal la documentación? ¿Querían escribir jsp en lugar de groovy? Me puse a investigar un poco.


Al final de esta publicación, estarás escribiendo lo siguiente en Groovy

  • Componentes OSGi, es decir, servlets, servicios y modelos de Sling.

  • Scripts que Sling puede resolver y ejecutar.

  • Plantillas GString que Sling puede resolver y representar.

Los Antecedentes


Durante años he asociado Groovy con AEM Groovy Console. Si buscas en Google "aem groovy script", te bombardearán con la Groovy Console. Ahora intenta con "sling groovy script". Son dos cosas diferentes.


Encontré este documento archivado en "Cosas antiguas". Como se indica, puede desplegar el groovy-all jar en Felix. Tiene un motor scripts GroovyScriptEngineFactory. Sling lo usará para ejecutar scripts de Groovy. De hecho, esto es lo que está haciendo AEM Groovy Console. Echa un vistazo a su archivo app/pom.xml. Ahí están incrustando groovy-all, versión 2.4.15.


Sling también tiene soporte para otros motores de plantillas. Ya sabes lo habitual, JSP y HTL. También es compatible con Thymeleaf, FreeMaker y Groovy GString.


Por lo tanto, aunque Sling es compatible con scripts y plantillas de Groovy, AEM no lo incluye. Así es como podemos volver a colocarlo.


Desplegando el Groovy 3.0


Como mencioné, Groovy Console viene con Groovy 2.4. Esa versión se ha convertido en 2.5 y 3.0. La versión 4.0 aún está en desarrollo. Entonces 3.0.9 es la última versión estable a partir de enero de 2022.


Desafortunadamente, no es tan simple delplegar 3.0 como fue en 2.4. A partir de 2.5 no existe un paquete único. Solo un POM con referencias a los paquetes de subproyectos. Tendremos que desplegar el paquete principal de Groovy, sus fragmentos y dependencias según sea necesario. Estoy usando un proyecto de arquetipo AEMaaCS para los próximos ejemplos.


Actualice el archivo all/pom.xml. Agregue lo siguiente a la sección <dependencias>

And embed the following bundles

Eso es todo. Al menos por ahora. Solo estoy incorporando los módulos JSON y Templates . Si necesita algo más, deberá incrustarlo junto con sus dependencias.


Compilando Groovy


Groovy puede ser compilado o interpretado en tiempo de ejecución. Usaremos el Groovy Maven Plugin para compilar el código en el paquete principal. Agregue esto a la configuración del plugin en core/pom.xml.

Además, dado que escribirá Groovy, deberá agregar una dependencia en el mismo core/pom.xml.

La versión groovy-eclipse-batch rastrea la versión de Groovy que estamos usando. Para resolver eso, deberá agregar lo siguiente a su pom.xml

Y eso es. Está listo para comenzar a escribir servicios, modelos, servlets y filtros como lo haría con Java. Cree una nueva carpeta de código en el paquete principal core/src/main/groovy. Luego cree un nuevo paquete com.mysite.core.groovy con un archivo package-info.groovy para que se exporte

y un Sling Servlet, utilizando anotaciones OSGi R7. Aquí hay un servlet que preparé para buscar activos sin referencia


Scripts de Groovy


Por supuesto, una de las características más importantes de Groovy es su capacidad para compilar en tiempo de ejecución. Necesitaremos un motor de secuencias de comandos y una fábrica. Groovy ya tiene una implementación JSR-223. GroovyScriptEngineFactory funcionó bien en 2.4. Ya no se comporta bien en 2.5 y 3.0. Lo más probable es que el cargador de clases que está utilizando no pueda encontrar clases en los paquetes de fragmentos.


En lugar de usar eso, aquí está mi implementación (en Groovy)

Puede verificar que se cargó correctamente consultando la consola de Script Engines. Ahora, cada vez que Sling encuentra un script que necesita ejecutar, obtendrá un motor de scripts de la fábrica. El motor de scripts lo compilará utilizando GroovyShell y luego lo ejecutará.

​⚠️ Mi motor de script y las implementaciones de fábrica son muy simples. Aquí hay otros ejemplos de motores de scripts a los que puede hacer referencia en caso de que tenga problemas.

To test it out, go to CRX/DE and create a new file at /apps/sling/OrderedFolder/unref-assets-script.json.GET.groovy. It will do the same thing as the compiled servlet.


Plantillas de Groovy


Al igual que los scripts de Groovy, las plantillas requieren un motor y una fábrica de scripts. Y ambos se ejecutan en tiempo de ejecución. La diferencia es que un script es un programa que se compila y ejecuta. Una plantilla tiene variables y scriptlets que se expanden y reemplazan para generar el resultado final.


Eche un vistazo al paquete Groovy Scripting Support que desplagamos. Tiene un motor de scripts que utilizará GStringTemplateEngine. Para probarlo, cree un nuevo archivo en /apps/sling/OrderedFolder/unref-assets-template.json.GET.gst.


Conclusion


En esta publicación, no intento decir que debe cambiar a Groovy en su proyecto AEM. Hay muchos pros y contras en los que deberá pensar según su proyecto y equipo. En cambio, te estoy mostrando cómo podrías hacerlo si quisieras.


De las 3 formas en que puedes usar Groovy, compilar es la más útil. De hecho, planeo usarlo en mi próximo nuevo proyecto. Puede que haya algunos obstáculos que superar. Siempre hay algunos obstáculos 🤨


El scripting puede tener sus aplicaciones. Mi única preocupación es que el motor de scripts y la fábrica pueden necesitar algunos ajustes. Y es posible que tenga que resolver las preguntas que surjan. Por ejemplo, ¿puede hacer referencia a otro script?


Por otro lado, las plantillas... son bastante inútiles con el motor de plantillas GString. Es más o menos como JSP. Peor. No encuentro documentación ni ejemplos. Parece que su intención es para aplicaciones simples, por ejemplo, plantillas de correo electrónico. Groovy tiene otros motores de plantillas como MarkupTemplateEngine. Una prueba para usted sería crear un motor de script y una fábrica para conectarlo.

8 visualizaciones0 comentarios