Verwenden von Sling-Adaptern

Letzte Aktualisierung: 2023-10-17

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

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 die JCR Session der Anfrage, die wiederum für viele Objekte benötigt wird, deren Ausführung von dieser Anfragesitzung abhängig ist, wie PageManager oder UserManager.

  • Direkte Verknüpfung mit Services.

    Dies ist ein seltener Fall, da sling.getService() bereits eine einfache Möglichkeit darstellt.

NULL-Rückgabewert

adaptTo() Kann Null zurückgeben.

Es gibt verschiedene Gründe für die Rückgabe von Null, darunter die folgenden:

  • die Implementierung unterstützt den Zieltyp nicht
  • eine Adapter-Factory, 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 JSP-Renderings kann es akzeptabel sein, die JSP fehlschlagen zu lassen, wenn dies zu einem leeren Inhaltselement führt.

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. Daher können Sie sich auf keines der beiden Verhalten verlassen. Es ist also – vor allem innerhalb von AdapterFactory – wichtig, dass Objekte bei diesem Szenario wiederverwendet werden können.

Funktionsweise

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 und SlingAdaptable (übergibt den adaptTo-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 Ressourcenklasse, ist dies häufig nicht möglich. Da Implementierungen von AdapterFactory im letzteren Fall normalerweise Teil der privaten Klassen eines Pakets 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-Dienstlaufzeit zuzugreifen und sich die Konfigurationen der „adaptierbaren Elemente“ (Quellen und Ziele) anzusehen, diese aber nicht einander zuzuordnen. Letztlich hängt es von der internen Logik ab, die dokumentiert werden muss. Daher dieser Verweis.

Verweis

Sling

Adaption von Resource für:

Knoten Wenn es sich um eine auf einem JCR-Knoten basierende Ressource oder eine JCR-Eigenschaft mit Verweis auf einen Knoten handelt
Eigenschaft Wenn es sich um eine auf einer JCR-Eigenschaft basierende Ressource handelt
Element Wenn es sich um eine JCR-basierte Ressource handelt (Knoten oder Eigenschaft)
Zuordnung Gibt eine Zuordnung der Eigenschaften zurück, wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt (oder eine andere Ressource, die Wertzuordnungen unterstützt)
ValueMap Gibt eine benutzerfreundliche Zuordnung der Eigenschaften zurück, wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt (oder eine andere Ressource, die Wertzuordnungen unterstützt). Dies kann (auf einfachere Weise) auch mithilfe von
ResourceUtil.getValueMap(Resource) (zur Verarbeitung von Null-Fällen usw.) erreicht werden.
InheritanceValueMap Erweiterung von ValueMap, mit der beim Suchen nach Eigenschaften die Hierarchie der Ressourcen berücksichtigt werden kann
ModifiableValueMap Eine Erweiterung der ValueMap, mit dem die Eigenschaften dieses Knotens geändert werden können
InputStream Gibt den binären Inhalt einer Dateiressource zurück (wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt und der Knotentyp nt:file oder nt:resource lautet; wenn es eine Bundle-Ressource ist; Dateiinhalt, wenn es sich um eine Dateisystemressource handelt). Oder gibt die Daten einer binären JCR-Eigenschaftsressource zurück.
URL Gibt eine URL für die Ressource zurück (Repository-URL dieses Knotens, wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt; eine JAR-Paket-URL, wenn es eine Paket-Ressource ist, oder eine Datei-URL, wenn es eine Dateisystemressource ist)
File Wenn es eine Dateisystemressource ist
SlingScript Wenn diese Ressource ein Skript ist (z. B. eine JSP-Datei), für das eine Scripting-Engine bei Sling registriert ist
Servlet Wenn diese Ressource ein Skript ist (z. B. eine JSP-Datei), für das eine Scripting-Engine bei Sling registriert ist, oder wenn es eine Servlet-Ressource ist
String
Boolean
Long
Double
Calendar
Value
String[]
Boolean[]
Long[]
Calendar[]
Value[]
Gibt die Werte zurück, wenn es sich um eine auf einer JCR-Eigenschaft basierende Ressource handelt (und der Wert passt)
LabeledResource Wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt
Seite Wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt und der Knoten den Typ cq:Page (oder cq:PseudoPage) hat
Komponente Wenn es sich um eine cq:Component-Knotenressource handelt
Design Wenn es sich um einen Design-Knoten handelt (cq:Page)
Vorlage Wenn es sich um eine cq:Template-Knotenressource handelt
Blueprint Wenn es sich um eine cq:Template-Knotenressource handelt
Asset Wenn es sich um eine dam:Asset-Knotenressource handelt
Rendition Wenn es sich um eine dam:Asset-Ausgabedarstellung handelt (nt:file unter dem Ordner „rendition“ eines dam:Asset).
Tag Wenn es sich um eine cq:Tag-Knotenressource handelt
UserManager Basiert auf der JCR-Sitzung, wenn es sich um eine JCR-basierte Ressource handelt und die Benutzenden über Berechtigungen zum Zugreifen auf den UserManager verfügen
Authorizable Die Authorizable-Funktion ist die allgemeine Basisschnittstelle für Benutzende und Gruppen
User User ist ein spezieller Fall von Authorizable, der authentifiziert und personifiziert werden kann
SimpleSearch Sucht unter der Ressource (oder verwenden Sie setSearchIn()), wenn es sich um eine JCR-basierte Ressource handelt
WorkflowStatus Workflow-Status für den jeweiligen Seiten-/Workflow-Payload-Knoten
ReplicationStatus Replikationsstatus für die jeweilige Ressource oder den zugehörigen Unterknoten „jcr:content“ (wird zuerst geprüft)
ConnectorResource Gibt eine angepasste Connector-Ressource für bestimmte Typen zurück, wenn es sich um eine auf einem JCR-Knoten basierende Ressource handelt
Config Wenn es sich um eine cq:ContentSyncConfig-Knotenressource handelt
ConfigEntry Wenn es unter einer cq:ContentSyncConfig-Knotenressource liegt

Adaption von ResourceResolver für:

Session Die JCR-Sitzung der Anfrage, wenn es sich um einen JCR-basierten Ressourcenauflöser handelt (Standard)
PageManager  
ComponentManager  
Designer  
AssetManager Basierend auf der JCR-Sitzung, wenn es sich um einen JCR-basierten Ressourcenauflöser handelt
TagManager Basierend auf der JCR-Sitzung, wenn es sich um einen JCR-basierten Ressourcenauflöser handelt
UserManager Der UserManager ermöglicht Zugriff auf und die Verwaltung von autorisierbaren Objekten, d. h. Benutzenden und Gruppen. Der UserManager ist an eine bestimmte Sitzung gebunden
Authorizable Die aktuelle Benutzerin bzw. der aktuelle Benutzer
Benutzer
Die aktuelle Benutzerin bzw. der aktuelle Benutzer
QueryBuilder
Externalizer Für das Externalisieren von absoluten URLs, auch ohne das Anforderungsobjekt

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:

ContentHandler
(XML)
Wenn es eine Sling Rewriter-Antwort ist

WCM

Adaption von Page für:

Resource
Ressource der Seite.
LabeledResource Bezeichnete Ressource (== this).
Knoten Knoten der Seite.
... Alle Elemente, für die die Ressource der Seite adaptiert werden kann.

Adaption von Component für:

Resource Ressource der Komponente.
LabeledResource Bezeichnete Ressource (== this).
Node Knoten der Komponente.
Alle Elemente, für die die Ressource der Komponente adaptiert werden kann.

Adaption von Template für:

Resource
Ressource der Vorlage.
LabeledResource Bezeichnete Ressource (== this).
Knoten Knoten dieser Vorlage.
... Alle Elemente, für die die Ressource der Vorlage adaptiert werden kann.

Sicherheit

Adaption von Autorisierbar, Benutzer und Gruppe für:

Node Gibt den Stammknoten des Benutzers/der Gruppe zurück.
ReplicationStatus Gibt den Replizierungsstatus für den Stammknoten des Benutzers/der Gruppe zurück.

DAM

Adaption von Asset für:

Resource Ressource des Assets.
Node Knoten des Assets.
Alle Elemente, für die die Ressource des Assets adaptiert werden kann.

Tagging

Adaption von Tag für:

Resource Ressource des Tags.
Node Knoten des Tags.
Alle Elemente, für die die Ressource des Tags adaptiert werden kann.

Andere

Über Sling/JCR/OCM wird außerdem eine AdapterFactory für anwenderdefinierte OCM-Objekte (Object Content Mapping) bereitgestellt.

Auf dieser Seite