Slingofrece un patrón de adaptador para traducir convenientemente objetos que implementan la interfaz Adaptable. Esta interfaz proporciona un método genérico adaptableTo() 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);
Existen 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, el ResourceResolver
basado en JCR contiene una referencia al JCR Session
de la solicitud, que a su vez es necesario para muchos objetos que funcionarán en base a esa sesión de solicitud, como PageManager
o UserManager
.
Acceso directo a servicios.
Un caso poco común: sling.getService()
también es sencillo.
adaptTo()
puede devolver null.
Esto se debe a varios motivos, entre ellos:
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.
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 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 de AdapterFactory
, que los objetos se puedan reutilizar en este escenario.
Existen varias maneras de implementar Adaptable.adaptTo()
:
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 interfaz Adaptable
y deben extender SlingAdaptable
(que pasa la llamada adaptTo
a un administrador de adaptadores central).
Esto permite enganchar el mecanismo adaptTo
para las clases existentes, como Resource
.
Una combinación de ambos.
En el primer caso, los javadocs pueden indicar qué adaptTo-targets
son posibles. 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 se exponen en una API de cliente ni se enumeran en javadocs. En teoría, sería posible acceder a todas las AdapterFactory
implementaciones desde el tiempo de ejecución del OSGi servicio y observar sus configuraciones "adaptables" (fuentes y destinatarios), pero no asignarlas entre sí. Al final, esto depende de la lógica interna, que debe ser documentada. De ahí esta referencia.
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 sencillamente) utilizandoResourceUtil.getValueMap(Resource) (maneja 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. |
ModifiedValueMap | Una extensión de 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; jar URL del paquete si se trata de un recurso del paquete; URL de 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 servlet. |
StringBooleanLongDoubleCalendarValueString[] Boolean[] Long[] Calendario[] Valor[] |
Devuelve los valores si se trata de un recurso basado en la propiedad JCR (y el valor se ajusta). |
LabledResource | 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. |
Rendition | Si se trata de una representación dam:Asset (nt:file en la carpeta de representación de un 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 | Autorizable es la interfaz de base común para usuarios y grupos. |
Usuario | El usuario es un usuario con autorización especial que se puede autenticar y suplantar. |
SimpleSearch | Busca debajo del recurso (o utilice setSearchIn()) si se trata de un recurso basado en JCR. |
WorkflowStatus | Estado del flujo de trabajo para el nodo de carga útil de página/flujo de trabajo determinado. |
ReplicationStatus | Estado de replicación para el recurso dado o su subnodo jcr:content (marcado 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 está por debajo de un recurso de nodo cq:ContentSyncConfig . |
ResourceResolverse 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 | UserManager proporciona acceso a los objetos autorizados, es decir, usuarios y grupos, y los medios para mantenerlos. 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. |
SlingHttpServletRequestse adapta a:
Aún no hay destinatarios, pero implementa Adaptable y se puede usar como fuente en un AdapterFactory personalizado.
SlingHttpServletResponsese adapta a:
ContentHandler (XML) |
Si esta es una respuesta de reescritor inteligente. |
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. |
Medio | Recurso del componente. |
---|---|
LabledResource | Recurso etiquetado (== this). |
Nodo | Nodo del componente. |
… | Todo a lo que se puede adaptar el recurso del componente. |
Los templarios se adaptan a:
Recurso |
Recurso de la plantilla. |
LabledResource | Recurso etiquetado (== this). |
Nodo | Nodo de esta plantilla. |
... | Todo a lo que se puede adaptar el recurso de la plantilla. |
Autorizable, Usuario y Grupo se adaptan a:
Nodo | Devuelve el nodo principal del usuario o grupo. |
---|---|
ReplicationStatus | Devuelve el estado de replicación del nodo principal del usuario o grupo. |
El recurso se adapta a:
Medio | Recurso del recurso. |
---|---|
Nodo | Nodo del recurso. |
… | Todo a lo que se puede adaptar el recurso del recurso. |
Las etiquetas se adaptan a:
Medio | Recurso de la etiqueta. |
---|---|
Nodo | Nodo de la etiqueta. |
… | Todo a lo que se puede adaptar el recurso de la etiqueta. |
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.