🔗 Slingofrece un patrón 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);
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.
adaptTo()
puede devolver null.
Esto se debe a varios motivos, entre ellos:
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.
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.
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.
🔗 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) utilizandoResourceUtil.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. |
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 |
🔗 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 | |
Designer | |
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 | 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). |
Servicios de preferencias | |
PinManager | |
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. |
🔗 La página se adapta a:
Resource |
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:
Recurso | 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:
Resource |
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. |
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. |
🔗 Assets se adapta a:
Recurso | Recurso del recurso. |
---|---|
Nodo | Nodo del recurso. |
… | Todo a lo que se puede adaptar el recurso del recurso. |
🔗 Tagadapta a:
Recurso | 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 personalizados (Object Content Mapping).