Usar los adaptadores de Sling

🔗 Slingofrece un patrón de adaptador para traducir convenientemente objetos que implementan la interfaz Adaptable. Esta interfaz proporciona un método genérico adaptTo() que traducirá el objeto al tipo de clase que se pasa como argumento.

Por ejemplo, para traducir un objeto Resource al objeto Node correspondiente, simplemente puede hacer lo siguiente:

Node node = resource.adaptTo(Node.class);

Casos de uso

Hay los siguientes casos de uso:

  • Obtenga objetos específicos de la implementación.

    Por ejemplo, una implementación basada en JCR de la interfaz genérica Resource proporciona acceso al JCR subyacente Node.

  • Creación de accesos directos de objetos que requieren que se pasen objetos de contexto internos.

    Por ejemplo, la ResourceResolver basada en JCR contiene una referencia a la JCR Session de la solicitud, que a su vez es necesaria para muchos objetos que funcionarán en función de esa sesión de solicitud, como PageManager o UserManager.

  • Acceso directo a los servicios.

    Un caso poco frecuente: sling.getService() también es sencillo.

Valor devuelto nulo

adaptTo() puede devolver null.

Esto se debe a varios motivos, entre ellos:

  • la implementación no admite el tipo de destino
  • un adaptador que maneje este caso no está activo (p. ej. debido a la ausencia de referencias de servicio)
  • error en la condición interna
  • el servicio no está disponible

Es importante que gestione las mayúsculas y minúsculas nulas correctamente. Para las renderizaciones jsp, puede ser aceptable que el jsp falle si esto resulta en un fragmento de contenido vacío.

Almacenamiento en caché

Para mejorar el rendimiento, las implementaciones pueden almacenar en caché el objeto devuelto desde una llamada obj.adaptTo(). Si obj es el mismo, el objeto devuelto es el mismo.

Este almacenamiento en caché se realiza para todos los casos basados en AdapterFactory.

Sin embargo, no hay ninguna regla general: el objeto podría ser una instancia nueva o una existente. Esto significa que no puede confiar en ninguno de estos comportamientos. Por lo tanto, es importante, especialmente dentro de AdapterFactory, que los objetos se puedan reutilizar en este escenario.

Cómo funciona

Existen varias maneras de implementar Adaptable.adaptTo():

  • Por el propio objeto; implementar el propio método y asignar a ciertos objetos.

  • Mediante AdapterFactory, que puede asignar objetos arbitrarios.

    Los objetos deben implementar la interfaz Adaptable y deben ampliar SlingAdaptable (que pasa la llamada adaptTo a un administrador central de adaptadores).

    Esto permite vincular al mecanismo adaptTo para las clases existentes, como Resource.

  • Una combinación de ambas.

Para el primer caso, los javadocs pueden indicar qué es posible adaptTo-targets. Sin embargo, para subclases específicas como el recurso basado en JCR, a menudo esto no es posible. En este último caso, las implementaciones de AdapterFactory suelen formar parte de las clases privadas de un paquete y, por lo tanto, no están expuestas en una API de cliente ni están enumeradas en javadocs. Teóricamente, sería posible acceder a todas las implementaciones AdapterFactory desde el tiempo de ejecución del servicio OSGi y observar sus configuraciones "adaptables" (fuentes y destinos), pero no asignarlas entre sí. Al final, esto depende de la lógica interna, que debe documentarse. De ahí esta referencia.

Referencia

Sling

El recurso se adapta a:

Nodo Si se trata de un recurso basado en nodos JCR o de una propiedad JCR que hace referencia a un nodo.
Propiedad Si se trata de un recurso basado en propiedades JCR.
Elemento Si se trata de un recurso basado en JCR (nodo o propiedad).
Asignar Devuelve un mapa de las propiedades, si se trata de un recurso basado en nodos JCR (u otro recurso que admita mapas de valores).
ValueMap Devuelve un mapa práctico de las propiedades, si se trata de un recurso basado en nodos JCR (u otros mapas de valores compatibles con recursos). También se puede lograr (más simplemente) utilizando
ResourceUtil.getValueMap(Resource) (gestiona mayúsculas y minúsculas nulas, etc.).
InheritanceValueMap Extensión de ValueMap que permite tener en cuenta la jerarquía de recursos al buscar propiedades.
MapaValorModificable Extensión del ValueMap, que permite modificar las propiedades de ese nodo.
InputStream Devuelve el contenido binario de un recurso de archivo (si se trata de un recurso basado en nodos JCR y el tipo de nodo es nt:file o nt:resource; si se trata de un recurso de paquete; contenido del archivo si se trata de un recurso del sistema de archivos) o los datos de un recurso de propiedad JCR binario.
URL Devuelve una URL al recurso (URL del repositorio de este nodo si se trata de un recurso basado en nodos JCR; URL del paquete jar si es un recurso de paquete; URL del archivo si se trata de un recurso del sistema de archivos).
Archivo Si se trata de un recurso del sistema de archivos.
SlingScript Si este recurso es una secuencia de comandos (por ejemplo, un archivo jsp) para la que se ha registrado un motor de secuencias de comandos con sling.
Servlet Si este recurso es una secuencia de comandos (por ejemplo, un archivo jsp) para la que se ha registrado un motor de secuencias de comandos con sling o si se trata de un recurso de servlet.






StringBooleanLongDoubleCalendarValueString[]
Boolean[]
Long[]
Calendario[]
Valor[]
Devuelve los valores si se trata de un recurso basado en propiedades JCR (y el valor se ajusta).
EtiquetadoRecurso Si se trata de un recurso basado en nodos JCR.
Página Si se trata de un recurso basado en nodos JCR y el nodo es cq:Page (o cq:PseudoPage).
Componente Si se trata de un recurso de nodo cq:Component.
Diseño Si es un nodo de diseño (cq:Page).
Plantilla Si se trata de un recurso de nodo cq:Template.
Modelo Si se trata de un recurso de nodo cq:Template.
Recurso Si se trata de un recurso de nodo dam:Asset .
Representación Si se trata de una representación dam:Asset (nt:file en la carpeta de representación de dam:Assert)
Etiqueta Si se trata de un recurso de nodo cq:Tag.
UserManager En función de la sesión JCR si se trata de un recurso basado en JCR y el usuario tiene permisos para acceder a UserManager.
Con autorización La Autorizable es la interfaz base común para el usuario y el grupo.
Usuario El usuario es un Autorizable especial que se puede autenticar y suplantar.
SimpleSearch Busca debajo del recurso (o usa setSearchIn()) si es un recurso basado en JCR.
WorkflowStatus Estado del flujo de trabajo para el nodo de carga útil de página/flujo de trabajo dado.
ReplicationStatus Estado de replicación para el recurso dado o su subnodo jcr:content (activado primero).
ConnectorResource Devuelve un recurso de conector adaptado para determinados tipos, si se trata de un recurso basado en nodos JCR.
Configuración Si se trata de un recurso de nodo cq:ContentSyncConfig.
ConfigEntry Si se encuentra debajo de un recurso de nodo cq:ContentSyncConfig.

ResourceResolveradapta a:

Sesión La sesión JCR de la solicitud, si se trata de una resolución de recursos basada en JCR (predeterminada).
PageManager  
ComponentManager  
Diseñador  
AssetManager En función de la sesión JCR, si se trata de una resolución de recursos basada en JCR.
TagManager En función de la sesión JCR, si se trata de una resolución de recursos basada en JCR.
UserManager UserManager proporciona acceso a objetos autorizables y los medios para mantenerlos, es decir, usuarios y grupos. UserManager está enlazado a una sesión en particular.
Con autorización El usuario actual.
Usuario
El usuario actual.
QueryBuilder
Externalizador Para externalizar direcciones URL absolutas, incluso sin el objeto de solicitud.

SlingHttpServletRequestadapta a:

Aún no hay destinos, pero implementa Adaptable y podría utilizarse como fuente en una fábrica de adaptadores personalizada.

SlingHttpServletResponseadapta a:

ContentHandler
(XML)
Si se trata de una respuesta de reescritura de Sling.

WCM

🔗 La página se adapta a:

Medio
Recurso de la página.
EtiquetadoRecurso Recurso etiquetado (= esto).
Nodo Nodo de la página.
... Todo a lo que se puede adaptar el recurso de la página.

🔗 Los componentes se adaptan a:

Medio Recurso del componente.
EtiquetadoRecurso Recurso etiquetado (= esto).
Nodo Nodo del componente.
Todo a lo que se puede adaptar el recurso del componente.

🔗 La plantilla se adapta a:

Recurso
Recurso de la plantilla.
EtiquetadoRecurso Recurso etiquetado (= esto).
Nodo Nodo de esta plantilla.
... Todo a lo que se puede adaptar el recurso de la plantilla.

Seguridad

Autorizable, ​Usuario y ​Grupo se adaptan a:

Nodo Devuelve el nodo principal del usuario/grupo.
ReplicationStatus Devuelve el estado de replicación del nodo principal del usuario/grupo.

DAM

​Assets se adapta a:

Medio Recurso del recurso.
Nodo Nodo del recurso.
Todo a lo que se puede adaptar el recurso del recurso.

Etiquetado

​Target se adapta a:

Medio Recurso de la etiqueta.
Nodo Nodo de la etiqueta.
Todo a lo que se puede adaptar el recurso de la etiqueta.

Otras

Además, Sling / JCR / OCM también proporciona un AdapterFactory para objetos OCM (Object Content Mapping) personalizados.

En esta página