Uso de adaptadores Sling using-sling-adapters
O Sling oferece um Padrão de adaptador para traduzir convenientemente objetos que implementam a interface Adaptável. Esta interface fornece um método adaptTo() genérico que traduz o objeto para o tipo de classe que está sendo passado como argumento.
Por exemplo, para traduzir um objeto Resource para o objeto Node correspondente, você pode simplesmente fazer:
Node node = resource.adaptTo(Node.class);
Casos de uso use-cases
Existem os seguintes casos de uso:
-
Obter objetos específicos de implementação.
Por exemplo, uma implementação baseada em JCR da interface genérica
Resource
fornece acesso ao JCR subjacenteNode
. -
Criação de atalhos de objetos que exigem que objetos de contexto interno sejam passados.
Por exemplo, o
ResourceResolver
baseado em JCR contém uma referência aoJCR Session
da solicitação, que por sua vez é necessária para muitos objetos que funcionarão com base nessa sessão de solicitação, como oPageManager
ouUserManager
. -
Atalho para serviços.
Um caso raro -
sling.getService()
também é simples.
Valor de retorno nulo null-return-value
adaptTo()
retorna nulo.
Há várias razões para isso, incluindo:
- a implementação não dá suporte ao tipo de destino
- uma fábrica de adaptadores que lida com esse caso não está ativa (por exemplo, devido a referências de serviço ausentes)
- falha na condição interna
- serviço não disponível
É importante que você lide com o caso nulo normalmente. Para renderizações jsp, pode ser aceitável que o jsp falhe se isso resultar em um conteúdo vazio.
Armazenamento em cache caching
Para melhorar o desempenho, as implementações estão livres para armazenar em cache o objeto retornado de uma chamada obj.adaptTo()
. Se o obj
for o mesmo, o objeto retornado será o mesmo.
Este cache é executado para todos os casos baseados em AdapterFactory
.
No entanto, não há uma regra geral: o objeto pode ser uma nova instância ou uma existente. Isso significa que você não pode confiar em nenhum dos comportamentos. Portanto, é importante, especialmente dentro de AdapterFactory
, que os objetos sejam reutilizáveis nesse cenário.
Como funciona how-it-works
Há várias maneiras de implementar o Adaptable.adaptTo()
:
-
Pelo próprio objeto; implementando o próprio método e mapeando para determinados objetos.
-
Por um
AdapterFactory
, que pode mapear objetos arbitrários.Os objetos ainda devem implementar a interface
Adaptable
e devem estenderSlingAdaptable
(que passa a chamadaadaptTo
para um gerenciador de adaptador central).Isso permite ganchos no mecanismo
adaptTo
para classes existentes, comoResource
. -
Uma combinação de ambos.
Para o primeiro caso, os documentos Java™ podem indicar o que adaptTo-targets
é possível. No entanto, para subclasses específicas, como o Recurso baseado em JCR, geralmente isso não é possível. No último caso, as implementações de AdapterFactory
normalmente fazem parte das classes privadas de um pacote e, portanto, não são expostas em uma API cliente, nem listadas em documentos Java™. Teoricamente, seria possível acessar todas as implementações de AdapterFactory
do tempo de execução do serviço OSGi e examinar suas configurações (fontes e destinos) "adaptáveis", mas não mapeá-las entre si. No final, isso depende da lógica interna, que deve ser documentada. Daí esta referência.
Referência reference
Sling sling
Recurso adapta-se a:
ResourceResolver adapta-se a:
SlingHttpServletRequest adapta-se a:
Ainda sem destinos, mas implementa Adaptable e pode ser usado como origem em um AdapterFactory personalizado.
SlingHttpServletResponse adapta-se a:
WCM wcm
Página adapta-se a:
O componente se adapta a:
Modelo adapta-se a:
Segurança security
Autorizável, Usuário e Grupo** adaptam-se a:
DAM dam
O ativo se adapta a:
Marcação com tags tagging
A marca se adapta a:
Outro other
Além disso, o Sling/JCR/OCM também fornece um [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
para objetos OCM personalizados (Mapeamento de conteúdo de objeto).