Använda delningsadaptrar using-sling-adapters
Sling erbjuder ett adaptermönster för att enkelt översätta objekt som implementerar gränssnittet Adaptable. Det här gränssnittet tillhandahåller en generisk customiTo()-metod som översätter objektet till den klasstyp som skickas som argument.
Om du till exempel vill översätta ett Resource-objekt till motsvarande Node-objekt kan du bara göra följande:
Node node = resource.adaptTo(Node.class);
Användningsexempel use-cases
Det finns följande användningsområden:
-
Få implementeringsspecifika objekt.
En JCR-baserad implementering av det generiska
Resource
-gränssnittet ger till exempel åtkomst till den underliggande JCRNode
. -
Skapa genvägar för objekt som kräver att interna kontextobjekt skickas.
Den JCR-baserade
ResourceResolver
innehåller till exempel en referens till begäransJCR Session
som i sin tur behövs för många objekt som ska fungera baserat på den begärandesessionen, till exempelPageManager
ellerUserManager
. -
Genväg till tjänster.
Ett sällsynt fall -
sling.getService()
är också enkelt.
Null-returvärde null-return-value
adaptTo()
returnerar null.
Det finns olika orsaker till detta, bland annat:
- implementeringen saknar stöd för måltypen
- en adapterfabrik som hanterar det här ärendet är inte aktivt (till exempel på grund av att det saknas tjänstreferenser)
- internt villkor misslyckades
- tjänsten är inte tillgänglig
Det är viktigt att du hanterar skiftläget null på ett smidigt sätt. Vid jsp-återgivning kan det vara acceptabelt att jsp misslyckas om det resulterar i en tom del av innehållet.
Cachning caching
För att förbättra prestanda kan implementeringar cachelagra objektet som returneras från ett obj.adaptTo()
-anrop. Om obj
är samma är det returnerade objektet detsamma.
Den här cachningen utförs för alla AdapterFactory
-baserade fall.
Det finns dock ingen allmän regel - objektet kan vara antingen en ny eller en befintlig instans. Det innebär att du inte kan förlita dig på något av beteendena. Därför är det viktigt, särskilt i AdapterFactory
, att objekt kan återanvändas i det här scenariot.
Så här fungerar det how-it-works
Det finns olika sätt att implementera Adaptable.adaptTo()
:
-
Efter själva objektet, implementera själva metoden och mappa till vissa objekt.
-
Med en
AdapterFactory
, som kan mappa godtyckliga objekt.Objekten måste fortfarande implementera gränssnittet
Adaptable
och måste utökaSlingAdaptable
(vilket skickar anropetadaptTo
till en central adapterhanterare).Detta tillåter kopplingar till
adaptTo
-mekanismen för befintliga klasser, till exempelResource
. -
En kombination av båda.
I det första fallet kan Java™-dokumenten ange vad adaptTo-targets
är möjligt. Detta är dock ofta inte möjligt för vissa underklasser, t.ex. JCR-baserade resurser. I det senare fallet är implementeringar av AdapterFactory
vanligtvis en del av de privata klasserna i ett paket och exponeras därför inte i ett klient-API och inte heller listas i Java™-dokument. Teoretiskt sett skulle det vara möjligt att komma åt alla AdapterFactory
-implementeringar från OSGi-tjänstmiljön och titta på deras"adaptable" (sources and target)-konfigurationer, men inte att mappa dem till varandra. I slutändan beror detta på den interna logiken, som måste dokumenteras. Därför refererar vi till detta.
Referens reference
Sling sling
Resursen anpassas till:
ResourceResolver anpassas till:
SlingHttpServletRequest anpassas till:
Inga mål ännu, men implementerar Adaptable och kan användas som källa i en anpassad AdapterFactory.
SlingHttpServletResponse anpassas till:
WCM wcm
Sidan anpassas till:
Komponenten anpassas till:
Mall anpassas till:
Dokumentskydd security
Behörighetsbar, Användare och Grupp** kan anpassas till:
DAM dam
Resursen anpassas till:
Taggar tagging
Tagg anpassas till:
Övriga other
Dessutom innehåller Sling/JCR/OCM även [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
för anpassade OCM-objekt (Object Content Mapping).