Uso de los adaptadores de Sling using-sling-adapters
Sling ofrece un patrón de adaptador para traducir convenientemente los objetos que implementan la interfaz adaptable. Esta interfaz proporciona un método adaptTo() genérico que traduce 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 use-cases
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 subyacenteNode
. -
Creación de acceso directo de objetos que requieren que se pasen objetos de contexto interno.
Por ejemplo,
ResourceResolver
basado en JCR contiene una referencia aJCR Session
de la solicitud, que a su vez es necesaria para muchos objetos que funcionan según esa sesión de solicitud, comoPageManager
oUserManager
. -
Acceso directo a servicios.
Un caso poco frecuente:
sling.getService()
es también sencillo.
Valor devuelto nulo null-return-value
adaptTo()
puede devolver un valor nulo.
Existen varias razones para la devolución nula, entre ellas las siguientes:
- la implementación no admite el tipo de destinatario
- un fabricante de adaptadores que gestione este caso no está activo (por ejemplo, debido a la falta de referencias de servicio)
- error de condición interna
- el servicio no está disponible
Es importante que gestione correctamente el caso nulo. En el caso de las representaciones jsp, puede ser aceptable que jsp falle si el resultado es un fragmento de contenido vacío.
Almacenamiento en caché caching
Para mejorar el rendimiento, las implementaciones pueden almacenar en caché el objeto devuelto por una llamada a 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 una regla general: el objeto podría ser una instancia nueva o una existente. Como tal, significa que no 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.
Funcionamiento how-it-works
Hay varias maneras de implementar Adaptable.adaptTo()
:
-
Por el propio objeto; implementando el método en sí y asignándolo a determinados objetos.
-
Por un
AdapterFactory
, que puede asignar objetos arbitrarios.Los objetos aún deben implementar la interfaz
Adaptable
y deben extenderSlingAdaptable
(que pasa la llamadaadaptTo
a un administrador de adaptadores central).Este método permite vínculos en el mecanismo
adaptTo
para clases existentes, comoResource
. -
Una combinación de ambos.
En el primer caso, los documentos de Java™ pueden indicar qué adaptTo-targets
son posibles. Sin embargo, para subclases específicas como el recurso basado en JCR, esta instrucción no suele ser 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 documentos de Java™. En teoría, es posible acceder a todas las implementaciones de AdapterFactory
desde el tiempo de ejecución del servicio OSGi y ver sus configuraciones "adaptables" (fuentes y destinos), pero no asignarlas entre sí. Al final, depende de la lógica interna, que debe documentarse. De ahí esta referencia.
Referencia reference
Sling sling
El recurso se adapta a:
ResourceResolver se adapta a:
SlingHttpServletRequest se adapta a:
Aún no hay destinos, pero implementa Adaptable y podría utilizarse como origen en un AdapterFactory personalizado.
SlingHttpServletResponse se adapta a:
WCM wcm
Página se adapta a:
El componente se adapta a:
Plantilla se adapta a:
Seguridad security
Autorizable, Usuario y Grupo se adaptan a:
DAM dam
El recurso se adapta a:
Etiquetado tagging
Etiqueta se adapta a:
Otro other
Además, Sling/JCR/OCM también proporciona AdapterFactory
para los objetos OCM personalizados (Asignación de contenido de objeto).