Utilizzo di adattatori Sling

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);

Casi di utilizzo

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.

Valore restituito Null

adaptTo() può restituire null.

I motivi di tale scelta sono diversi, tra cui:

  • l'implementazione non supporta il tipo di destinazione
  • un gestore di schede che gestisce questo caso non è attivo (ad esempio a causa di riferimenti di servizio mancanti)
  • condizione interna non riuscita
  • il servizio non è disponibile

È 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.

Cache

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.

Come funziona

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.

Riferimento

Sling

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
AuthorizableResourceProviderorg.apache.sling.jackrabbit.usermanager/system/userManager
cq:Pagecq: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.

WCM

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.

Sicurezza

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.

DAM

Le risorse si adattano a:

Risorsa Risorsa della risorsa.
Node Nodo della risorsa.
Tutto ciò a cui la risorsa della risorsa può essere adattata.

Assegnazione tag

I tag si adattano a:

Risorsa Risorsa del tag.
Node Nodo del tag.
Tutto ciò a cui la risorsa del tag può essere adattata.

Altro

Inoltre Sling / JCR / OCM fornisce un [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) per gli oggetti OCM personalizzati (Object Content Mapping).

In questa pagina