Verwenden von Sling-Adaptern using-sling-adapters
Mit Sling wird ein Adaptermuster zum bequemen Übersetzen von Objekten bereitgestellt, die zum Implementieren der Adaptable-Schnittstelle verwendet werden. Diese Schnittstelle stellt eine generische adaptTo()-Methode bereit, mit der das Objekt in den Klassentyp übersetzt wird, der als Argument übergeben wird.
Um zum Beispiel ein Ressourcenobjekt in das entsprechende Knotenobjekt zu übersetzen, können Sie einfach wie folgt vorgehen:
Node node = resource.adaptTo(Node.class);
Anwendungsfälle use-cases
Es gibt die folgenden Nutzungsszenarien:
-
Rufen Sie spezifische Objekte für die Implementierung ab.
Eine JCR-basierte Implementierung der generischen
Resource
-Schnittstelle ermöglicht beispielsweise Zugriff auf das zugrunde liegende JCR-Node
-Element. -
Erstellung von direkten Verknüpfungen für Objekte, für die interne Kontextobjekte übergeben werden müssen.
Der JCR-basierte
ResourceResolver
enthält beispielsweise einen Verweis auf dieJCR Session
der Anfrage, die wiederum für viele Objekte benötigt wird, deren Ausführung von dieser Anfragesitzung abhängig ist, z. B.PageManager
oderUserManager
. -
Direkte Verknüpfung mit Services.
Dies ist ein seltener Fall, da
sling.getService()
bereits eine einfache Möglichkeit darstellt.
NULL-Rückgabewert null-return-value
adaptTo()
gibt null zurück.
Dafür gibt es verschiedene Gründe, unter anderem:
- die Implementierung unterstützt den Zieltyp nicht
- eine Adapterfabrik, die diesen Fall verarbeitet, ist nicht aktiv (z. B. aufgrund fehlender Dienstverweise).
- interne Bedingung fehlgeschlagen
- Service ist nicht verfügbar
Es ist wichtig, dass Sie den Null-Fall angemessen behandeln. Für das JSP-Rendering kann es zulässig sein, dass für JSP ein Fehler auftritt, wenn es zu einem leeren Inhaltselement führt.
Caching caching
Zur Verbesserung der Leistung dürfen Implementierungen das Objekt zwischenspeichern, das über einen obj.adaptTo()
-Aufruf zurückgegeben wird. Wenn das obj
gleich ist, ist auch das zurückgegebene Objekt dasselbe.
Diese Zwischenspeicherung wird für alle auf AdapterFactory
basierenden Fälle durchgeführt.
Es gibt jedoch keine allgemeine Regel – das Objekt kann entweder eine neue oder eine vorhandene Instanz sein. Dies bedeutet, dass Sie sich nicht auf eines der beiden Verhalten verlassen können. Es ist also – vor allem innerhalb von AdapterFactory
– wichtig, dass Objekte bei diesem Szenario wiederverwendet werden können.
Funktionsweise how-it-works
Es gibt verschiedene Möglichkeiten, Adaptable.adaptTo()
zu implementieren:
-
Über das Objekt selbst. Die eigentliche Methode wird implementiert. Anschließend erfolgt die Zuordnung zu bestimmten Objekten.
-
Über ein
AdapterFactory
, mit dem zufällige Objekte zugeordnet werden können.Die Objekte müssen trotzdem noch die
Adaptable
-Schnittstelle implementieren undSlingAdaptable
(übergibt denadaptTo
-Aufruf an einen zentralen Adapter-Manager) erweitern.Dies ermöglicht die Verwendung von Hooks für den
adaptTo
-Mechanismus für vorhandene Klassen, z. B.Resource
. -
Eine Kombination beider Vorgehensweisen.
Im ersten Fall kann über Java™ Docs angegeben werden, welche adaptTo-targets
möglich sind. Für bestimmte Unterklassen, z. B. die JCR-basierte Resource-Klasse, ist dies häufig nicht möglich. Da Implementierungen von AdapterFactory
im letzteren Fall normalerweise Teil der privaten Klassen eines Bundles sind, werden sie nicht per Client-API verfügbar gemacht und auch nicht in Java™ Docs aufgeführt. Theoretisch wäre es möglich, auf alle AdapterFactory
-Implementierungen über die OSGi-Service-Laufzeit zuzugreifen und sich die Konfigurationen der „adaptierbaren Elemente“ (Quellen und Ziele) anzusehen, diese aber nicht einander zuzuordnen. Letztlich hängt dies von der internen Logik ab, die dokumentiert werden muss. Daher dieser Verweis.
Verweis reference
Sling sling
Adaption von Resource für:
Adaption von ResourceResolver für:
Adaptierung von SlingHttpServletRequest für:
Es sind noch keine Ziele vorhanden, aber „Adaptable“ wird implementiert und kann als Quelle in einer benutzerdefinierten „AdapterFactory“ verwendet werden.
Adaptierung von SlingHttpServletResponse für:
WCM wcm
Adaption von Page für:
Adaption von Component für:
Adaption von Template für:
Sicherheit security
Adaption von Authorizable, **User und Group für:
DAM dam
Adaption von Asset für:
Tagging tagging
Adaption von Tag für:
Andere other
Über Sling/JCR/OCM wird außerdem eine [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
für benutzerdefinierte OCM-Objekte (Object Content Mapping) bereitgestellt.