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

Knoten
Wenn dies eine auf einem JCR-Knoten basierende Ressource oder eine JCR-Eigenschaft mit Verweis auf einen Knoten ist.
Property
Wenn dies eine auf einer JCR-Eigenschaft basierende Ressource ist
Item
Wenn dies eine JCR-basierte Ressource ist (Knoten oder Eigenschaft)
Map
Gibt eine Zuordnung der Eigenschaften zurück, wenn dies eine auf einem JCR-Knoten basierende Ressource ist (oder eine andere Ressource, die Wertzuordnungen unterstützt)
ValueMap
Gibt eine benutzerfreundliche Zuordnung der Eigenschaften zurück, wenn dies eine auf einem JCR-Knoten basierende Ressource ist (oder eine andere Ressource, die Wertzuordnungen unterstützt). Dies kann (auf einfachere Weise) auch per
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 von ValueMap, mit der Sie Eigenschaften auf diesem Knoten ändern können
InputStream
Gibt den binären Inhalt einer Datei-Ressource (wenn es eine auf einem JCR-Knoten basierende Ressource ist und der Knotentyp nt:file oder nt:resource lautet; wenn es eine Paket-Ressource ist; Datei-Inhalt, wenn es eine Dateisystemressource ist) oder 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 eine auf einem JCR-Knoten basierende Ressource ist, 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
Doub
Calendar
Value
String[]
Boolean[]
Long[]
Calendar[]
Value[]
Gibt die Werte zurück, wenn es eine auf einer JCR-Eigenschaft basierende Ressource ist (und der Wert passt).
LabeledResource
Wenn es eine auf einem JCR-Knoten basierende Ressource ist
Page
Wenn es eine auf einem JCR-Knoten basierende Ressource ist und der Knoten den Typ cq:Page (oder cq:PseudoPage) hat
Component
Wenn es eine cq:Component-Knotenressource ist
Design
Wenn es ein Design-Knoten ist (cq:Page)
Template
Wenn es eine cq:Template-Knotenressource ist
Blueprint
Wenn es eine cq:Template-Knotenressource ist
Asset
Wenn es eine dam:Asset-Knotenressource ist
Rendition
Wenn es eine dam:Asset-Ausgabedarstellung ist (nt:file unter dem Ordner „rendition“ eines dam:Asset-Elements).
Tag
Wenn es eine cq:Tag-Knotenressource ist
UserManager
Basiert auf der JCR-Sitzung, wenn es eine JCR-basierte Ressource ist und die Person über Berechtigungen zum Zugreifen auf den UserManager verfügt
Authorizable
Die Authorizable-Funktion ist die allgemeine Basisschnittstelle für Benutzerin bzw. Benutzer und Gruppe
User
User ist ein spezieller Fall von Authorizable, der authentifiziert und personifiziert werden kann
SimpleSearch
Sucht unter der Ressource (oder es wird setSearchIn() genutzt), wenn es eine JCR-basierte Ressource ist
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 eine auf einem JCR-Knoten basierende Ressource ist
Config
Wenn es eine cq:ContentSyncConfig-Knotenressource ist
ConfigEntry
Wenn das Element unter einer cq:ContentSyncConfig-Knotenressource angeordnet ist

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
UserManager ermöglicht Zugriff auf autorisierbare Objekte und deren Verwaltung, d. h. Benutzende und Gruppen. Der UserManager ist an eine bestimmte Sitzung gebunden
Authorizable
Die aktuelle Benutzerin bzw. der aktuelle Benutzer
User
Die aktuelle Benutzerin bzw. der aktuelle Benutzer
QueryBuilder
Externalizer
Für das Externalisieren absoluter 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 dies eine Sling Rewriter-Antwort ist

WCM 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 security

Adaption von Authorizable, **User und Group 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 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 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 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.

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2