jueves, 19 de diciembre de 2019

¿C贸mo Sling resuelve las peticiones Http?

Para entender c贸mo Sling resuelve las peticiones Http vamos a seguir un ejemplo b谩sico que consta de la creaci贸n de un componente que va a ser renderizado en nuestro navegador.
Photo by Hello I'm Nik 馃嚞馃嚙 on Unsplash

Antes de esto vale la pena destacar que al ser Sling un web framework orientado a recursos, toda petici贸n Http debe apuntar a un recurso (ya sea un nodo JCR, un archivo o una base de datos), por lo tanto, si al momento de resolver la petici贸n http Sling  no encuentra un recurso para esa petici贸n, devolver谩 un error 404 indicando que el recurso no se encuentra disponible.

Una vez explicado esto  procedamos con la creacion de nuestro ejmplo, para esto vamos a usar CRXDE-Lite, el cual es un entorno de desarrollo o un visualizar de nodos JCR que AEM trae integrado.
Podemos acceder a este desde la pagina de inicio de AEM, ingresando a localhost  (http://localhost:4502/aem/start.html), luego hacemos clic en el icono de herramientas, luego clic en General y finalmente clic en la tarjeta CRXDE-Lite, como se muestra en la siguiente imagen:




o simplemente digitamos en nuestro navegador: http://localhost:4502/crx/de/index.jsp#, esto nos llevara a una pagina como la que se muestra a continuaci贸n:




















Una vez aqu铆, procedemos a crear una carpeta la cual contendr谩 nuestro ejemplo, para esto expandimos el nodo apps, hacemos clic derecho y luego en crear nuevo folder,  y le ponemos el nombre miejemplo:





































Realizando este mismo proceso, vamos a crear varias  carpetas mas dentro de la carpeta miejemplo, primero creamos la template, luego  creamos carpeta components, dentro de esta creamos la carpeta structure, y la carpeta con el nombre content, nos quedar铆a algo as铆, (RECUERDA DALER CLIC EN SAVE ALL UNA VEZ HAGAS TUS CAMBIOS):
->miejemplo
       -> componentes
            -> structure
             -> content
      -> template



Una vez creamos la estructura de nuestras carpetas, procedemos a crear nuestro componente, para esto hacemos clic derecho sobre la carpeta structure, luego clic en crear, crear component:


Procedemos a llenar la information que nos solicita:
En Label: ponemos mipagina, la cual sera el nombre del node JCR
En Title: para simplicidad ponemos mipagina
En Descipction: ponemos una breve descripci贸n de nuestro component y
Finalmente en Super Type ponemos el component que se va a renderizar en nuestra pagina web que en este caso es un componete page del core wcm/foundation de AEM 


Finalmente nos quedar谩 algo como se muestra en la siguiente imagen:


Como podemos observar CRXDE nos crea por defecto un scritp jsp con el mismo nombre de nuestro componente. Adobe a partir de las nuevas versiones de AEM introdujo HTL como  nuevo lenguaje de programaci贸n para la creaci贸n de los componentes, es bueno seguir esta recomendaci贸n por lo tanto procedemos a renombrar este archivo mipagina.jsp a mipagina.html, y  reemplazamos su contenido por el siguiente:

<html>
<head>
    </head>
    <body>
    <h1>Hola desde el componete mipagina en AEM</h1>
    </body>
</html>



Para poder renderizar nuestro componente necesitamos crear un nodo que apunte a nuestro componente, para esto vamos a la carpeta content en la raiz de CRXDE-Lite, y creamos un nuevo nodo como lo indica la siguiente imagen:


Hay que recordar que toda petici贸n http debe estar mapeada a un recurso en AEM, por esto es necesario indicarle al nodo que acabamos de crear que el componente que va a renderizar es el componente mipagina, esto lo hacemos asignandole a la propiedad sling:resourceType la ruta de nuestro componente  mipagina (/apps/miejemplo/components/structure/mipagina):



Una vez hecho esto, podemos ver nuestro componente renderizado en el navegador,  para esto, vamos a  nuestro navegador y en nuestra instancia local de AEM le agregamos la ruta del nodo que creamos previamente, agregandole la extension que queremos renderizar /content/muestramipagina.html que en este caso es .html, nuestra ruta final quedar铆a de la siguiente manera:  http://localhost:4502/content/muestramipagina.html

Y es de as铆 como finalmente podemos ver nuestro componente renderizado:
























Una vez tenemos listo nuestro componentes, vamos a explicar como sling resuelve estas peticiones a trav茅s de una series de pasos:
  1. Primero Sling descompone la URL(http://localhost:4502/content/muestramipagina.html)
    • primero determina el protocolo http
    • luego el  host y el puerto localhost:4502
    • luego la ruta del nodo en la carpeta content content/muestramipagina
    • Si hay selectores extrae los selectores, en este caso no tenemos selectores pero si los hubiera seria todo lo que hay antes de la extension .html y despu茅s de content/muestramipagina, ser铆a algo como: content/muestramipagina.selector1.selector2.html
    • y por ultimo la extension, cabe destacar que aparte de la extension pueden haber sufijos y parametros de la forma content/muestramipagina.selector1.selector2.html/sf1?id=123
  2. Seguido de esto Sling  buscar铆a una URL o Servlet que redireccionar铆a nuestra petici贸n pero como este no es el caso pasamos al siguiente paso
  3. El cual seria buscar el nodo indicado en la URL el cual ser铆a content/muestramipagina
  4. Si el nodo existe Sling procede a resolver el recurso solicitado usando la propiedad sling:resourceType
  5. Finalmente Sling procede a resolver el script de renderizado e imprimirlo en nuestro navegador, para este caso ser铆a el script por defecto mipagina.html
En resumen, estos son los pasos b谩sicos que lleva a cabo Sling  para resolver las peticiones Http, falta mencionar el caso cuando hay selectores, este caso lo veremos en futuros pots.

Muchas gracias por su atenci贸n, sientanse libres de corregirme cualquier error o solicitarme alguna mejora.

Lecturas recomendadas

  1. ¿Que es AEM?
  2. ¿Que es un Componente en AEM?
  3. ¿Que es un Template en AEM?
  4. Arquitectura de AEM



mi茅rcoles, 18 de diciembre de 2019

¿Que es un Template en AEM?

Template en AEM son los modelos predise帽ados que creamos de nuestras paginas web, estan compuesto por componentes y son usados esencialmente para crear paginas web y para construir el contenido inicial en un proyecto AEM.

Photo by Tim Arterbury on Unsplash

















Algunos atributos y propiedades que podemos encontrar al momento de crear un componente son las siguientes:

  • label: esta propiedad representa el nombre del template 
  • sling:resourceType : define el componente que se va a renderizar y obligatorio asignar esta propiedad en cada nuevo template que crear
  • jcr:title : esta propiedad representa el titulo que el analista encargado de authoring ve al momento de crear una nueva pagina
  • jcr: description : es usado normalmente como documentaci贸n del template o para de describir la funcionalidad del componente
  • ranking: Define el orden en el que un template se ver谩 en AEM
  • allowedPaths:  en esta propiedad podemos agregar la rutas jcr en las cuales el template podr谩 ser utilizado
Lecturas recomendadas

martes, 17 de diciembre de 2019

¿Que es un Componente en AEM?

Components en AEM son unidades  modulares y reusables  que implementan funcionalidades o l贸gica especifica para renderizar un sitio web,  los componentes en AEM no son mas que nodos JCR que estan compuestos por una series de scripts (.java, .jsp, .js, .html) los cuales  realizan una tarea especifica con base en ciertas propiedades que podemos parametrizar cuando creamos cada componente.
Photo by Robin Glauser on Unsplash



















Una de las propiedades mas importantes al crear un component en AEM es la propiedad sling:resourceType la cual nos indica el componente que se va a renderizar en nuestra pagina web, por lo general en esta propiedad indicamos componentes core por defecto que AEM trae predise帽ados tales como: breadcrumb, text, tabs, carousel etc. 
Cabe destacar que cada desarrollador puede crear sus componentes personalizados con base en estas propiedades, modificando el script por defecto de cada componente.

Para tener una idea de como se ve un componente en AEM podemos echar un vistazo a los componentes core que AEM trae por defecto en la siguiente ruta: core/wcm/components

































Como podemos observar, cada componente pose ciertos scripts que pueden ser modificados para proveer la funcionalidad que se requiera, por lo general estos scripts son tel tipo html, javascript y archivos java servlet, adicionalmente cada componente pose una series de nodos anidados como podemos ver en la imagen los cuales son los cq:dialog y los ca:design_dialog, los cuales nos sirven para definir ciertas propiedades que el usuario de Authoring puede definir en nuestro componente.

As铆, estos serian los componentes que ver铆amos renderizados en nuestra paginas web, o que el analista encargado de realizar el Authoring tendr铆a disponible para crear los templates que luego se utilizan en la creaci贸n de las paginas web.


lunes, 16 de diciembre de 2019

Arquitectura de AEM

Para entender la arquitectura de AEM debemos primero definir que es Granite:
Granite es un conjunto de tecnolog铆as de Adobe con la que esta construida AEM, es com煤nmente llamada "Open web stack", aunque Granite tenga la palabra open, esto no quiere decir que sea un proyecto open source,  al ser un proyecto compuesto de diferentes tecnolog铆as Granite es solo abierto para desarrollo.




















As铆 pues, podemos definir a Granite como una plataforma modular que ofrece ciertas funcionalidades dentro de las cuales podemos destacar las siguientes:
  • Granite Ofrece un Application Launcher
  • Esta compuesto por el framework OSGi, el cual nos provee un conjunto de servicios para el desarrollo de nuestra aplicaciones en AEM
  • Hace uso de Java Content Repository o JCR a traves de Apache jackrabbit oak
  • Y del framework Apache Sling  para el mapeo de las peticiones http con los contenidos JCR 
La definici贸n de Granite puede llegar a ser confusa ya que muchas fuentes solamente explican el framework OSGi como base de AEM, pero como podemos observar Granite es el compendio de todas las tecnolog铆as que AEM usa.

La siguiente imagen nos puede ilustrar en mas detalle lo que es Granite, donde podemos ver que Granite es b谩sicamente todas las tecnolog铆as core en las que AEM esta basada:





















(Imagen tomada del curso Develop Websites and Components in Adobe Experience Manager (Tyler Mynard):https://app.pluralsight.com/library/courses/develop-websites-components-aem/table-of-contents )

Una vez que tenemos claro lo que es Granite, podemos seguir con la definici贸n de la arquitectura de AEM y las tecnolog铆as en las que esta basada.


(Imagen tomada del curso Develop Websites and Components in Adobe Experience Manager (Tyler Mynard):https://app.pluralsight.com/library/courses/develop-websites-components-aem/table-of-contents )

AEM usa OSGi framework de manera transversal, el cual es un conjunto de componentes Java din谩micos llamados Bundles, los cuales pueden ser  independientemente instalados, desinstalados, inicializados y detenidos en tiempo de ejecuci贸n  sin reiniciar o incluso sin detener la aplicaci贸n.

JCR y Apache Sling son los otros importantes m贸dulos en los cuales esta basado AEM. JCR o Java Content Repository es una base de datos que soporte almacenamiento estructurado y no estructurado de datos, AEM usa Apache jackrabbit oak como implementaci贸n de la especificaci贸n JCR para almacenar todo su contenido. Por otro lado para la resoluci贸n de las peticiones http AEM usa Apache Sling el cual como se mencion贸 anteriormente es un framework web, que en terminos generales mapea cada peticion http con un nodo JCR en AEM.

El proceso de resoluci贸n de Sling se escapa del 谩mbito de este post, y para mantener este post corto, en pr贸ximas entradas explicaremos los pasos que Sling lleva a cabo para la resoluci贸n, mapeo y renderizado de una petici贸n http.

Lecturas recomendadas:
  1. ¿Que es AEM?
  2. ¿Que es un Componente en AEM?
  3. ¿Que es un Template en AEM?
  4. ¿C贸mo Sling resuelve las peticiones Http?



jueves, 12 de diciembre de 2019

¿Que es AEM?


AEM o Adobe Experience Manager es un administrador de contenidos empresarial que nos permite desarrollar aplicaciones web y servicios de manera 谩gil y r谩pida, AEM inicialmente fue desarrollado por la empresa Day y adquirido por Adobe en el a帽o 2010, desde entonces AEM ha ido evolucionando, agregando nuevas funcionalidades que hacen de AEM una herramienta imprescindible a la hora de administrar contenidos en entornos empresariales.

Photo by Florian Klauer on Unsplash

Una de las preguntas mas curiosas que han surgido desde la compra de la compa帽铆a Day por parte de Adobe   ha sido la siguiente: si AEM es un administrador de contenidos, ¿no deber铆a de llamarse ACM?, para responder a esta pregunta  hay que decir que AEM no solo es un administrador de contenidos, AEM se encarga de administrar toda la experiencia de un usuario desde que inicia sesi贸n en un sitio web AEM hasta que deja  el sitio web.

AEM logra esto ofreciendo un conjunto de herramientas que permite llegar a conocer a los usuarios que visitan un sitio web, para de este modo poder personalizar el contenido que este usuario experimenta, un ejemplo de esto lo podemos ver en muchos sitios web de Retail, donde cada usuario experimenta un contenido diferente con base en sus gusto y preferencias.





Como se mencion贸 anteriormente previo al 2010 AEM que para ese entonces se llamaba CQ (Comuniqu茅) fue adquirido por Adobe, desde entonces han habido varios cambios, tales como cambio de nombre, inclusion de nuevas funcionales, cambio de imagen entre otras cosas, esta es la raz贸n por la que previo a AEM 5.5 no se encuentra mucha informaci贸n en la web ya que esta version y las version previas tenian el nombre de CQ, inclusive muchos de los paquetes core base de AEM tiene el nombre de com.day.cq.*.

La siguiente imagen nos muestra una breve linea de tiempo de los cambios en AEM:
(Imagen tomada del curso aem-developer-fundamentals (Stephanie Adams):https://app.pluralsight.com/library/courses/aem-developer-fundamentals/table-of-contents )

AEM provee ciertas capacidades con las cuales se pueden llevar a cabo las tareas  que demandan la personalizaci贸n y la administraci贸n de contenidos a nivel empresarial, como podemos ver en la siguiente imagen, estas capacidades se  pueden resumir en las siguientes:
  • Sites (Sitios web)
  • Assets
  • Forms 
  • Screens
  • LiveFyre
  • Foundations
  • Communities


Pagina de inicio de AEM localhost

En sintesis, AEM no solo es un content manager, con AEM podemos gestionar toda la experiencia de usuario en un sitio web, AEM nos permite crear y gestionar todo el contenido de un sitio web  haciendo uso de las  capacidades anteriormente mencionadas, con las cuales podemos llegar a construir sitios web robustos, escalables, personalizables y  f谩ciles de administrar.



Lecturas recomendadas:
  1. Arquitectura de AEM
  2. ¿Que es un Componente en AEM?
  3. ¿Que es un Template en AEM?
  4. ¿C贸mo Sling resuelve las peticiones Http?






lunes, 9 de diciembre de 2019

How to create a project using Spring Boot?


As mentioned in previous posts, Spring Boot is a Framework that allows as to accelerate our development, helping us with some configurations, in this post we will see how we can take advantage of these automatic configurations creating a simple application using Spring Initializr





















If you don't not what Spring Boot is, I recommend you to go to (What is Spring Boot?) and read a brief introduction about Spring Boot.


We have multiples opciones to create a project using Spring Boot: the fisrts one is using the web version of Spring Intializr, the second one through an IDE like Spring Tool Suite (STS) or Intelij and the third using the CLI or command line interface, we are gooign to learn how to create a project using de web version of Spring Initializr and using de STS IDE

In order to maintain this posts as simple as posible we are goin to create a simple project that stores product information in a Mysql data base

Let's start by creating project using Spring Initializar:


  1. First we need to access to the web version of Spring Initialize through this link (Spring initializr,) o searching Spring initializr in Goole, you will see a page like the one shown in the following image:




















One you are in the Spirng Intiliazr page, you have to fill some fileds request by the tool:
  • Choose Maven Project as dependency manager
  • Choose the latest stable version of Spring Boot, in this case V 2.2.2
  • In the project metadata option fill the fill the following fields:
    • Group Idco.com.bateacode.products
    • Artifac Id (nombre de nuestra aplicaci贸n) ingresamos: approducts
  • Finally choose the dependencies: Spring webThymeleaf y Spring Data JPA,
as shown in the following image:


One you have completed the by the Spring Innitializr tool, you have to clic on Generate Button to generar the project:
This tool will generate a Zip file, unzip the file in the STS workspace 
To import the project in Spring STS you have to follow the next steps:

Open Spring STS, Click in File, the click in Import, choose the option Existing Maven Prorject and Finally clic in the Next button:




Choose the path of the project you have downloaded from Spring web Intializr, clicking in the Brose button:



Finally clic in the Finish button to import the maven project:

this image show the structure of our project:

2. The second option to create a project using Spring Boot is through some IDE, we are goin tho show how to perform this task using Spirng STS IDE:

Open STS, choose File, click in New, then clic in Spring Starter Project:
you will see a windows where you can fill the fields to create the project, if you notice this fields are almost the same that we filled in the web version of Spring Initializr:


The next step is to choose the dependency, you can search those dependencies in the search field and then add it to the project:

Finally click in the Finish button, and then you can see the project structure:

As you can see, creating a project using Spring Intializr is simple and straightforward, Spring Boot manage some dependencies  for us and automate some task that we will explain in future posts, additionally we are goin to  incremental develop our simple products app, so stay tuned for future posts.









domingo, 8 de diciembre de 2019

¿C贸mo crear un proyecto usando Spring Boot?


Como se explic贸 en posts anteriores, Spring Boot es un framework que nos permite acelerar nuestro desarrollo de aplicaciones Java, ayud谩ndonos con ciertas configuraciones, en esta entrada vamos a ver como podemos tomar ventajas de estas configuraciones autom谩ticas y crear un proyecto haciendo uso de Spring Initializr




















Si no sabes que es Spring Boot te recomiendo que vayas a este enlace (¿Que es Spring boot?)  y leas una breve introducci贸n acerca de Spring Boot.

Para crear una aplicaci贸n con Spring boot tenemos m煤ltiples opciones:

  • la primera option es usar la versi贸n web de Spring Initializr.
  • la segunda utilizando alg煤n IDE como Spring Tool Suite (STS) o Intellij, y finalmente  
  • con la herramienta de linea de comando de Spring Boot (CLI). 
En esta entrega vamos a aprender a crear nuestro proyecto usando la versi贸n web de Spring initializr y usando el IDE STS.

En aras de mantener simple esta entrega vamos a crear una aplicaci贸n sencilla que almacena productos en una base de datos Mysql.

Comencemos entonces creando nuestra aplicaci贸n usando Spring initializr:

  1. Accedemos al siguiente enlace de Spring initializr, o podemos escribir en Google Spring Initializr y elegir la primera opci贸n que nos recomienda Google, esto nos llevara a la pagina https://start.spring.io/ como se muestra en la siguiente imagen:

Una vez all铆 procedemos a completar los campos que la herramienta nos solicita:
  • Elegimos Maven Project como gestionador de dependencias
  • En la opci贸n Laguange elegimos Java
  • En la opci贸n Spring Boot, elegimos la ultima versi贸n estable para esta caso la versi贸n 2.2.2
  • En la opci贸n project metadata procedemos a completar los  siguientes campos:
    • Group Id (nombre de nuestros paquetes), para este caso ingresamos: co.com.bateacode.products
    • Artifac Id (nombre de nuestra aplicaci贸n) ingresamos: approducts
  • Por ultimo procedemos a agregar las diferentes dependencias que nuestra aplicaci贸n va a utilizar: Spring web, Thymeleaf y Spring Data JPA, como se muestra en la siguiente imagen:


Una vez completada la informaci贸n requerida, procedemos a hacer clic en el bot贸n Generar:
Spring Initializr generar谩 un archivo comprimido que procedemos a descomprimir en nuestro workspace:
Luego de haber descomprimido nuestro archivo procedemos a importarlo en nuestro IDE de la siguiente manera: 
Abrimos Spring STS, hacemos clic de File, luego en Import y elegimos la opci贸n Existing Maven Projects y hacemos clic en el boton Next:





Elegimos la ubicaci贸n de nuestro proyecto en el explorador de archivos haciendo clic en el boton Browse:


Elegimos nuestro proyecto y hacemos clic en el boton Open:
Finalmente importamos nuestro proyecto haciendo clic en boton Finish:

La siguiente imagen muestra la estructura de nuestro:

2. A continuaci贸n muestro los pasos para crear nuestro proyecto usando el IDE STS

En STS vamos a la opci贸n File, luego hacemos clic en la opci贸n New y elegimos Spring Starter Project:
Esto nos lleva a la siguiente ventana, donde podemos llenar la informaci贸n de nuestro proyecto, como pueden observar es la mismo informaci贸n que llenamos en la opci贸n web de Spring Initializr:


Una vez completa esta informaci贸n hacemos clic en el boton Next, donde podemos elegir las dependencias de nuestro proyecto, en el buscador podemos escribir el nombre de la dependencia y elegir la dependencia que vamos a agregar, como se muestra en la siguiente imagen:

Finalmente hacemos clic en Finish y tenemos la estructura de nuestro proyecto creado:



Como pueden ver, crear un proyecto usando Spring Intializr es muy simple, Spring Boot gestiona algunas dependencias por nosotros y automatiza algunas tareas que explicaremos en publicaciones futuras, adem谩s vamos a desarrollar gradualmente nuestra aplicaci贸n de productos, as铆 que est茅 atento para futuras publicaciones.