Sling ofrece un Patrón de adaptador para traducir convenientemente los objetos que implementan la variable Adaptable interfaz. Esta interfaz proporciona un adaptTo() método 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 del Resource
La interfaz de 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
contiene una referencia al JCR Session
, que a su vez es necesario para muchos objetos que funcionarán en función de esa sesión de solicitud, como el PageManager
o UserManager
.
Acceso directo a los servicios.
Un caso poco frecuente: sling.getService()
también es simple.
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 un obj.adaptTo()
llamada a . Si la variable obj
es el mismo, el objeto devuelto es el mismo.
Este almacenamiento en caché se realiza para todas las AdapterFactory
casos basados en .
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 AdapterFactory
, que los objetos se pueden reutilizar en este escenario.
Hay varias maneras de que Adaptable.adaptTo()
se puede implementar:
Por el propio objeto; implementar el propio método y asignar a ciertos objetos.
De AdapterFactory
, que puede asignar objetos arbitrarios.
Los objetos deben implementar la variable Adaptable
interfaz y debe ampliar SlingAdaptable
(que pasa el adaptTo
a un administrador central de adaptadores).
Esto permite los enlaces en la variable adaptTo
mecanismo para las clases existentes, como Resource
.
Una combinación de ambas.
Para 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
normalmente forman 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 las AdapterFactory
implementaciones de OSGi tiempo de ejecución del servicio y observe sus configuraciones "adaptables" (fuentes y destinos), pero no para asignarlas entre sí. Al final, esto depende de la lógica interna, que debe documentarse. De ahí esta referencia.
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. |
MapaValorModificable | Una extensión de la variable ValueMap, que le permite modificar 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. |
Cadena Booleano Largo Duplicado Calendario Valor String[] Booleano[] 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 un cq:Page (o cq:PseudoPage ). |
Componente | Si es un cq:Component recurso de nodo. |
Design | Si es un nodo de diseño (cq:Page ). |
Plantilla | Si es un cq:Template recurso de nodo. |
Modelo | Si es un cq:Template recurso de nodo. |
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 es un cq:Tag recurso de nodo. |
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 es un cq:ContentSyncConfig recurso de nodo. |
ConfigEntry | Si está por debajo de un cq:ContentSyncConfig recurso de nodo. |
ResourceResolver se adapta 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 | 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 con el objeto de solicitud . |
SlingHttpServletRequest se adapta a:
Aún no hay destinos, pero implementa Adaptable y podría utilizarse como fuente en una fábrica de adaptadores personalizada.
SlingHttpServletResponse se adapta a:
ContentHandler (XML) |
Si se trata de una respuesta de reescritura de Sling. |
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. |
Componente se adapta a:
Recurso | Recurso del componente. |
---|---|
EtiquetadoRecurso | Recurso etiquetado (= esto). |
Nodo | Nodo del componente. |
… | Todo a lo que se puede adaptar el recurso del componente. |
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 adaptarse a:
Nodo | Devuelve el nodo principal del usuario/grupo. |
---|---|
ReplicationStatus | Devuelve el estado de replicación del nodo principal del usuario/grupo. |
Activo se adapta a:
Recurso | Recurso del recurso. |
---|---|
Nodo | Nodo del recurso. |
… | Todo a lo que se puede adaptar el recurso del recurso. |
Etiqueta se adapta 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
para OCM personalizado (Asignación de contenido de objeto).