Utilizzo di adattatori Sling

🔗 Slingoffra un modello Adapter per tradurre 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 all'oggetto Node corrispondente, è sufficiente eseguire le operazioni seguenti:

Node node = resource.adaptTo(Node.class);

Casi d'uso

Esistono i seguenti casi d’uso:

  • Ottenere oggetti specifici per l’implementazione.

    Ad esempio, un'implementazione basata su JCR dell'interfaccia generica Resource fornisce l'accesso al JCR sottostante Node.

  • Creazione rapida di oggetti che richiedono il passaggio di oggetti contestuali interni.

    Ad esempio, il modello basato su JCR ResourceResolver contiene un riferimento al JCR Session della richiesta, che a sua volta è necessario per molti oggetti che funzioneranno in base alla sessione di richiesta, come il PageManager o UserManager.

  • Collegamento ai servizi.

    Un caso raro - sling.getService() è anche semplice.

Valore restituito Null

adaptTo() può restituire null.

Ci sono varie ragioni per questo, tra cui:

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

È importante gestire il caso null in modo corretto. Per i rendering jsp potrebbe essere accettabile che jsp non riesca se questo si traduce in un contenuto vuoto.

Memorizzazione in cache

Per migliorare le prestazioni, le implementazioni sono libere di memorizzare nella cache l'oggetto restituito da una chiamata obj.adaptTo() . Se il valore obj è lo stesso, l'oggetto restituito è lo stesso.

Questa memorizzazione in 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 puoi affidarti a entrambi i comportamenti. Pertanto è importante, soprattutto all'interno di AdapterFactory, che gli oggetti siano riutilizzabili in questo scenario.

Come funziona

Sono disponibili diversi modi per implementare Adaptable.adaptTo():

  • dall'oggetto stesso; implementazione del metodo stesso e mappatura a determinati oggetti.

  • Da un AdapterFactory, che può mappare oggetti arbitrari.

    Gli oggetti devono comunque implementare l'interfaccia Adaptable e devono estendere SlingAdaptable (che passa la chiamata adaptTo a un gestore di adattatori centrali).

    Questo consente di inserire gli hook nel meccanismo adaptTo per le classi esistenti, ad esempio Resource.

  • Una combinazione di entrambi.

Per il primo caso, i javadocs possono indicare le adaptTo-targets possibili. Tuttavia, per sottoclassi specifiche come la risorsa basata su JCR, spesso questo non è possibile. In quest'ultimo caso, le implementazioni di AdapterFactory fanno tipicamente parte delle classi private di un bundle e quindi non sono esposte in un'API client, né sono elencate in javadocs. Teoricamente, sarebbe possibile accedere a tutte le AdapterFactory implementazioni dal runtime di servizio OSGi e guardare le loro configurazioni "adaptables" (origini e destinazioni), ma non mapparle tra di loro. Alla fine, questo dipende dalla logica interna, che deve essere documentata. Da qui questo riferimento.

Riferimento

Sling

La risorsa si adatta a:

Nodo 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 JCR-property.
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 un nodo JCR (o di altre risorse che supportano le mappe dei valori).
ValueMap Restituisce una mappa pratica delle proprietà, se si tratta di una risorsa basata su un nodo JCR (o di altre risorse che supportano le mappe dei valori). Può essere ottenuto anche (più semplicemente) utilizzando
ResourceUtil.getValueMap(Resource) (gestisce le lettere maiuscole, ecc.).
EreditarietàValueMap Estensione di ValueMap che consente di tenere conto della gerarchia delle risorse quando si cercano le proprietà.
PersistableValueMap Se si tratta di una risorsa basata su nodo JCR e l'utente dispone delle autorizzazioni per modificare le proprietà su quel 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

ResourceResolversi adatta a:

Sessione La sessione JCR della richiesta, se si tratta di un risolutore di risorse basato su JCR (predefinito).
PageManager
ComponentManager
Designer
AssetManager Basato sulla sessione JCR, se si tratta di un risolutore di risorse basato su JCR.
TagManager Basato sulla 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 Utente corrente.
User
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
Esternalizzatore Per esternalizzare gli URL assoluti, anche con l'oggetto di richiesta.

SlingHttpServletRequestts si adatta a:

Nessuna destinazione, ma implementa Adattabile e può essere utilizzato come origine in un AdapterFactory personalizzato.

SlingHttpServletResponsesi adatta a:

ContentHandler
(XML)
Se si tratta di una risposta sling rewriter.

WCM

Pageadapts to:

Risorsa
Risorsa della pagina.
LabeledResource Risorsa con etichetta (== this).
Nodo Nodo della pagina.
... Tutto ciò a cui la risorsa della pagina può essere adattata.

I componenti si adattano a:

Risorsa Risorsa del componente.
LabeledResource Risorsa con etichetta (== this).
Nodo Nodo del componente.
Tutto ciò a cui può essere adattata la risorsa del componente.

I modelli si adattano a:

Risorsa
Risorsa del modello.
LabeledResource Risorsa con etichetta (== this).
Nodo Nodo di questo modello.
... Tutto ciò a cui può essere adattata la risorsa del modello.

Sicurezza

Autorizzabile, Utente e Gruppo si adattano a:

Nodo Restituisce il nodo principale utente/gruppo.
ReplicationStatus Restituisce lo stato di replica per il nodo home utente/gruppo.

DAM

Le risorse si adattano a:

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

Assegnazione tag

I tag si adattano a:

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

Altro

Inoltre, Sling / JCR / OCM fornisce anche un [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) per oggetti COM personalizzati (Mappatura del contenuto degli oggetti).

In questa pagina