Show Menu
TEMAS×

Uso de adaptadores Sling

Sling ofrece un patrón adapters.html Adapter para traducir convenientemente objetos que implementan la interfaz Adaptable . Esta interfaz proporciona un método adaptableTo() genérico 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);

Use Cases

Existen los siguientes casos de uso:
  • Obtenga objetos específicos de la implementación.
    Por ejemplo, una implementación basada en JCR de la Resource interfaz genérica 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 aplicación basada en JCR ResourceResolver contiene una referencia al 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 el PageManager o UserManager .
  • Acceso directo a servicios.
    Un caso raro - sling.getService() también es simple.

Valor devuelto nulo

adaptTo() puede devolver null.
Esto se debe a varios motivos, entre ellos:
  • la implementación no admite el tipo de objetivo
  • no está activo un generador de adaptador que maneje este caso (p. ej. debido a que faltan referencias de servicio)
  • error en la condición interna
  • el servicio no está disponible
Es importante que gestione el caso nulo con gracia. En el caso de las representaciones jsp, puede ser aceptable que el jsp falle si el resultado es un fragmento de contenido vacío.

Almacenamiento en caché

Para mejorar el rendimiento, las implementaciones pueden almacenar en caché el objeto devuelto por una obj.adaptTo() llamada. Si el obj valor es el mismo, el objeto devuelto es el mismo.
Este almacenamiento en caché se realiza en todos los casos AdapterFactory basados.
Sin embargo, no hay ninguna regla general: el objeto puede ser una instancia nueva o una existente. Esto significa que no se puede confiar en ninguno de los comportamientos. Por lo tanto, es importante, especialmente dentro AdapterFactory , que los objetos se reutilicen en este escenario.

Cómo funciona

Existen varias maneras de Adaptable.adaptTo() implementarlas:
  • Por el objeto mismo; implementar el propio método y asignar a determinados objetos.
  • Por un AdapterFactory `, que puede asignar objetos arbitrarios.
    Los objetos deben seguir implementando la Adaptable interfaz y extenderse SlingAdaptable (lo que pasa la adaptTo llamada a un administrador central de adaptadores).
    Esto permite enganchar el adaptTo mecanismo de las clases existentes, como Resource .
  • Una combinación de ambos.
En el primer caso, los javadocs pueden indicar lo que adaptTo-targets es posible. 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. En teoría, sería posible acceder a todas AdapterFactory las implementaciones 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 ser documentada. De ahí esta referencia.

Referencia

Sling

El recurso se adapta a:
Nodo Si se trata de un recurso basado en nodos JCR o 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 de soporte de recursos). También se puede lograr (más simplemente) utilizando ResourceUtil.getValueMap(Resource) (gestiona mayúsculas y minúsculas nulas, etc.).
HerenciaValueMap Extensión de ValueMap que permite tener en cuenta la jerarquía de recursos al buscar propiedades.
PersistableValueMap Si se trata de un recurso basado en nodos JCR y el usuario tiene permisos para modificar propiedades en ese nodo. Nota: varios mapas persistentes no comparten sus valores.
InputStream Devuelve el contenido binario de un "archivo" nt:resource
AuthorizableResourceProvider org.apache.sling.jackrabbit.usermanager /system/userManager
cq:Page cq:PseudoPage
cq:Component
cq:Page
cq:Template
cq:Page
cq:Tag
cq:Preferences
cq:ContentSyncConfig
cq:ContentSyncConfig
ResourceResolver se adapta a:
Sesión La sesión JCR de la solicitud, si es una resolución de recursos basada en JCR (predeterminada).
PageManager
ComponentManager
Diseñador
AssetManager En función de la sesión de JCR, si se trata de una resolución de recursos basada en JCR.
TagManager En función de la sesión de JCR, si se trata de una resolución de recursos basada en JCR.
UserManager En función de la sesión JCR, si se trata de una resolución de recursos basada en JCR y si el usuario tiene permisos para acceder a UserManager.
Con autorización El usuario actual.
Usuario El usuario actual.
PrivilegeManager
Preferencias Preferencias del usuario actual (basadas en la sesión JCR si se trata de una resolución de recursos basada en JCR).
PreferencesService
PinManager
QueryBuilder
Externalizador Para externalizar direcciones URL absolutas, incluso sin el objeto de solicitud.
Aún no hay destinos, pero implementa Adaptable y se puede usar como origen en un AdapterFactory personalizado.
ContentHandler (XML) Si esta es una respuesta de reescritor inteligente.

WCM

La página se adapta a:
Medio Recurso de la página.
LabledResource Recurso etiquetado (== this).
Nodo Nodo de la página.
... Todo a lo que se puede adaptar el recurso de la página.
El componente se adapta a:
Recurso del componente.
Recurso etiquetado (== this).
Nodo del componente.
...
Todo a lo que se puede adaptar el recurso del componente.
La plantilla se adapta a:
Recurso Node.htmlRecurso de la plantilla.
LabledResource Recurso etiquetado (== this).
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:
Devuelve el nodo principal del usuario o grupo.
Devuelve el estado de replicación del nodo principal del usuario o grupo.

DAM

El recurso se adapta a:
Recurso del recurso.
Nodo del recurso.
...
Todo a lo que se puede adaptar el recurso del recurso.

Etiquetado

La etiqueta se adapta a:
Recurso de la etiqueta.
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](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) para objetos OCM ( Object Content Mapping ) personalizados.