Utilizzo di adattatori Sling using-sling-adapters
Sling offre un pattern di adattatore per tradurre in modo comodo gli oggetti che implementano l'interfaccia Adaptable. Questa interfaccia fornisce un metodo adaptTo() generico che converte l'oggetto nel tipo di classe passato come argomento.
Ad esempio, per tradurre un oggetto Resource nell’oggetto Node corrispondente, puoi semplicemente effettuare le seguenti operazioni:
Node node = resource.adaptTo(Node.class);
Casi d’uso use-cases
Sono disponibili i seguenti casi d’uso:
-
Ottieni oggetti specifici per l’implementazione.
Ad esempio, un'implementazione JCR dell'interfaccia generica
Resource
fornisce l'accesso al JCR sottostanteNode
. -
Creazione di collegamenti di oggetti che richiedono il passaggio di oggetti contestuali interni.
Ad esempio, il
ResourceResolver
basato su JCR contiene un riferimento alJCR Session
della richiesta, che a sua volta è necessario per molti oggetti che funzioneranno in base alla sessione di richiesta, ad esempioPageManager
oUserManager
. -
Collegamento ai servizi.
Un caso raro -
sling.getService()
è semplice.
Valore restituito nullo null-return-value
adaptTo()
restituisce null.
Le ragioni sono diverse, tra cui:
- l’implementazione non supporta il tipo di target
- un adapter factory che gestisce questo caso non è attivo (ad esempio, a causa di riferimenti di servizio mancanti)
- condizione interna non riuscita
- servizio non disponibile
È importante gestire il caso nullo in modo corretto. Per i rendering JSP potrebbe essere accettabile che l’esecuzione di JSP non riesca se si verifica una parte di contenuto vuota.
Memorizzazione in cache caching
Per migliorare le prestazioni, le implementazioni possono memorizzare nella cache l'oggetto restituito da una chiamata obj.adaptTo()
. Se obj
è lo stesso, l'oggetto restituito è lo stesso.
Questa memorizzazione nella cache viene eseguita per tutti i AdapterFactory
casi basati su.
Tuttavia, non esiste una regola generale: l’oggetto potrebbe essere una nuova istanza o una esistente. Ciò significa che non puoi fare affidamento su entrambi i comportamenti. È quindi importante, soprattutto all'interno di AdapterFactory
, che gli oggetti siano riutilizzabili in questo scenario.
Come funziona how-it-works
È possibile implementare Adaptable.adaptTo()
in vari modi:
-
Dall'oggetto stesso, implementando il metodo stesso e mappando a determinati oggetti.
-
Da un
AdapterFactory
, che può mappare oggetti arbitrari.Gli oggetti devono ancora implementare l'interfaccia
Adaptable
e devono estendereSlingAdaptable
(che trasmette la chiamataadaptTo
a un gestore adapter centrale).Consente gli hook nel meccanismo
adaptTo
per le classi esistenti, ad esempioResource
. -
Una combinazione di entrambi.
Nel primo caso, i documenti Java™ possono indicare le adaptTo-targets
possibili. Tuttavia, spesso questo non è possibile per sottoclassi specifiche, come la risorsa basata su JCR. In quest'ultimo caso, le implementazioni di AdapterFactory
fanno generalmente parte delle classi private di un bundle e quindi non sono esposte in un'API client, né elencate nei documenti Java™. In teoria, sarebbe possibile accedere a tutte le implementazioni di AdapterFactory
dal runtime del servizio OSGi e esaminare le relative configurazioni "adattabili" (origini e destinazioni), ma non mapparle tra loro. Alla fine, questo dipende dalla logica interna, che deve essere documentata. Da qui questo riferimento.
Riferimento reference
Sling sling
La risorsa si adatta a:
ResourceResolver si adatta a:
SlingHttpServletRequest si adatta a:
Ancora nessuna destinazione, ma implementa Adaptable e potrebbe essere utilizzato come origine in un AdapterFactory personalizzato.
SlingHttpServletResponse si adatta a:
WCM wcm
La pagina si adatta a:
Il componente si adatta a:
Il modello si adatta a:
Sicurezza security
Authorizable, User e Group** si adattano a:
DAM dam
Risorsa si adatta a:
Assegnazione dei tag tagging
Tag si adatta a:
Altro other
Inoltre, Sling / JCR / OCM fornisce anche un [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
per gli oggetti OCM personalizzati (Object Content Mapping).