Slingoffer un Adapter trasforma in modo conveniente gli oggetti che implementano l'interfaccia Adaptable. Questa interfaccia fornisce un metodo generico adaptTo() che tradurrà l'oggetto nel tipo di classe passato come argomento.
Ad esempio, per tradurre un oggetto Resource in un oggetto Node corrispondente, è sufficiente eseguire le operazioni seguenti:
Node node = resource.adaptTo(Node.class);
Esistono i seguenti casi di utilizzo:
Ottenete oggetti specifici per l'implementazione.
Ad esempio, un'implementazione basata su JCR dell'interfaccia generica Resource
fornisce l'accesso al JCR sottostante Node
.
Creazione di collegamenti per oggetti che richiedono il passaggio di oggetti contestuali interni.
Ad esempio, l'elemento ResourceResolver
basato su JCR contiene un riferimento all'elemento JCR Session
della richiesta, che a sua volta è necessario per molti oggetti che funzioneranno in base alla sessione di richiesta, ad esempio PageManager
o UserManager
.
Collegamento ai servizi.
Un caso raro - sling.getService()
è anche semplice.
adaptTo()
può restituire null.
I motivi di tale scelta sono diversi, tra cui:
È importante gestire il caso nullo in modo corretto. Per i rendering jsp potrebbe essere accettabile che il jsp non riesca se si traduce in una parte vuota del contenuto.
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 casi basati su AdapterFactory
.
Tuttavia, non esiste una regola generale: l'oggetto potrebbe essere una nuova istanza o una esistente. Ciò significa che non potete fare affidamento su entrambi i comportamenti. È quindi importante, soprattutto all'interno di AdapterFactory
, che gli oggetti siano riutilizzabili in questo scenario.
Esistono diversi modi in cui Adaptable.adaptTo()
può essere implementato:
dall'oggetto stesso; implementazione del metodo stesso e mappatura a determinati oggetti.
Tramite un elemento AdapterFactory
`, che può mappare oggetti arbitrari.
Gli oggetti devono comunque implementare l'interfaccia Adaptable
ed estendere SlingAdaptable
(che trasmette la chiamata adaptTo
a un gestore di adattatori centrali).
Questo consente di inserire i ganci nel meccanismo adaptTo
per le classi esistenti, ad esempio Resource
.
Una combinazione di entrambi.
Per il primo caso, javadocs può indicare quali adaptTo-targets
sono possibili. Tuttavia, per sottoclassi specifiche come la risorsa basata su JCR, spesso ciò non è possibile. 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é sono elencate in javadocs. In teoria, sarebbe possibile accedere a tutte le AdapterFactory
implementazioni dal runtime di OSGi servizio e vedere le relative configurazioni "adaptables" (origini e destinazioni), ma non mapparle l'una sull'altra. Alla fine, questo dipende dalla logica interna, che deve essere documentata. Di qui il riferimento.
Adattamento risorsa a:
Node | Se si tratta di una risorsa basata su nodo JCR o di una proprietà JCR che fa riferimento a un nodo. |
Proprietà | Se si tratta di una risorsa basata su proprietà JCR. |
Elemento | Se si tratta di una risorsa basata su JCR (nodo o proprietà). |
Mappa | Restituisce una mappa delle proprietà, se si tratta di una risorsa basata su nodo JCR (o di altre mappe dei valori di supporto delle risorse). |
ValueMap | Restituisce una mappa pratica delle proprietà, se si tratta di una risorsa basata su nodo JCR (o di altre mappe di valore di supporto delle risorse). Può essere anche ottenuto (più semplicemente) utilizzando ResourceUtil.getValueMap(Resource) (gestisce maiuscole/minuscole, ecc.). |
EreditanceValueMap | Estensione di ValueMap che consente di tenere conto della gerarchia delle risorse nella ricerca delle proprietà. |
PersistableValueMap | Se si tratta di una risorsa basata su nodo JCR e l'utente dispone delle autorizzazioni necessarie per modificare le proprietà su tale nodo. Nota: più mappe persistenti non condividono i loro valori. |
InputStream | Restituisce il contenuto binario di un "file"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 |
ResourceResolverts si adatta a:
Sessione | La sessione JCR della richiesta, se si tratta di un risolutore di risorse basato su JCR (predefinito). |
PageManager | |
ComponentManager | |
Designer | |
AssetManager | In base alla sessione JCR, se si tratta di un risolutore di risorse basato su JCR. |
TagManager | In base alla sessione JCR, se si tratta di un risolutore di risorse basato su JCR. |
UserManager | In base alla sessione JCR, se si tratta di un risolutore di risorse basato su JCR e se l'utente dispone delle autorizzazioni per accedere a UserManager. |
Autorizzabile | L’utente corrente. |
User |
L’utente corrente. |
PrivilegeManager | |
Preferenze | Preferenze dell’utente corrente (basate sulla sessione JCR, se si tratta di un risolutore di risorse basato su JCR). |
PreferencesService | |
PinManager | |
QueryBuilder | |
Externalizer | Per esternalizzare gli URL assoluti, anche con l'oggetto di richiesta. |
SlingHttpServletRequests si adatta a:
Nessuna destinazione ancora, ma implementa Adattabile e potrebbe essere utilizzato come origine in un AdapterFactory personalizzato.
SlingHttpServletResponsesi adatta a:
ContentHandler (XML) |
Se si tratta di una risposta sling rewriter. |
Pageadts si adatta a:
Risorsa |
Risorsa della pagina. |
LabeledResource | Risorsa con etichetta (== this). |
Node | Nodo della pagina. |
... | Tutto ciò a cui è possibile adattare la risorsa della pagina. |
Componenti si adattano a:
Risorsa | Risorsa del componente. |
---|---|
LabeledResource | Risorsa con etichetta (== this). |
Node | Nodo del componente. |
… | Tutto ciò a cui la risorsa del componente può essere adattata. |
Modello adattabile a:
Risorsa |
Risorsa del modello. |
LabeledResource | Risorsa con etichetta (== this). |
Node | Nodo di questo modello. |
... | Tutto ciò a cui può essere adattata la risorsa del modello. |
Autorizzabili, utenti e gruppi di utenti possono:
Node | Restituisce il nodo principale utente/gruppo. |
---|---|
ReplicationStatus | Restituisce lo stato di replica per il nodo principale utente/gruppo. |
Le risorse si adattano a:
Risorsa | Risorsa della risorsa. |
---|---|
Node | Nodo della risorsa. |
… | Tutto ciò a cui la risorsa della risorsa può essere adattata. |
I tag si adattano a:
Risorsa | Risorsa del tag. |
---|---|
Node | Nodo del tag. |
… | Tutto ciò a cui la risorsa del tag può essere adattata. |
Inoltre Sling / JCR / OCM fornisce un [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
per gli oggetti OCM personalizzati (Object Content Mapping).