Verwenden von Sling-Adaptern

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.

Sie können beispielsweise einfach wie folgt vorgehen, um ein Ressourcenobjekt in das entsprechende Knotenbjekt zu übersetzen:

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

Nutzungsszenarien

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 Anforderung, die wiederum für viele Objekte benötigt wird, deren Ausführung von dieser Anforderungssitzung abhängig ist, z. B. PageManager oder UserManager.

  • Direkte Verknüpfung mit Diensten.

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

NULL-Rückgabewert

adaptTo() kann NULL zurückgeben.

Hierfür gibt es verschiedene Gründe, z. B.:

  • Die Implementierung unterstützt den Zieltyp nicht.
  • Eine Adapter-Factory zur Verarbeitung dieses Falls ist nicht aktiv (z. B. aufgrund von fehlenden Dienstverweisen)
  • Fehler für interne Bedingung
  • Dienst ist nicht verfügbar

Es ist wichtig, dass Sie den NULL-Fall ordnungsgemäß verarbeiten. Für das JSP-Rendering kann es zulässig sein, dass für JSP ein Fehler auftritt, 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 aber keine allgemeine Regel. Bei dem Objekt kann es sich entweder um eine neue oder eine vorhandene Instanz handeln. Dies bedeutet, dass Sie sich nicht auf eines der Verhalten verlassen können. 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.

  • Durch ein AdapterFactory", das beliebige Objekte zuordnen kann.

    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 javadocs 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 Pakets sind, werden sie nicht per Client-API verfügbar gemacht und auch nicht in javadocs 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. Dies hängt letztendlich von der internen Logik ab, die dokumentiert werden muss. Dies ist der Grund für diesen Verweis.

Verweis

Sling

Adaptierung von Resource für:

Node 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.
PersistableValueMap Wenn dies eine auf einem JCR-Knoten basierende Ressource ist und der Benutzer über Berechtigungen zum Ändern von Eigenschaften auf diesem Knoten verfügt.
Hinweis: Bei mehreren beibehaltbaren Zuordnungen werden die Werte nicht gemeinsam genutzt.
InputStream Gibt den binären Inhalt einer "Datei"zurücknt: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

Adaption von ResourceResolver für:

Session Die JCR-Sitzung der Anforderung, 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 Auf Basis der JCR-Sitzung, wenn es sich um einen JCR-basierten Ressourcenauflöser handelt und der Benutzer über die Berechtigung zum Zugriff auf UserManager verfügt.
Authorizable Der aktuelle Benutzer.
User
Der aktuelle Benutzer.
PrivilegeManager
Preferences Voreinstellungen des aktuellen Benutzers (basierend auf der JCR-Sitzung, wenn es sich um einen JCR-basierten Ressourcenauflöser handelt).
PreferencesService
PinManager
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 dies 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:

Ressource 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.
LabelResource Bezeichnete Ressource (== this).
Knoten Knoten dieser Vorlage.
... Alle Elemente, für die die Ressource der Vorlage adaptiert werden kann.

Sicherheit

Autorisierbare, Benutzer- und Gruppenanpassung an:

Knoten 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:

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

Tagging

Adaption von Tag für:

Ressource Ressource des Tags.
Knoten 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](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) für benutzerdefinierte OCM-Objekte (Object Content Mapping) bereitgestellt.

Auf dieser Seite

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free