Show Menu
THEMEN×

Verwenden von Sling-Adaptern

Mit Sling wird ein Adaptermuster zum bequemen Übersetzen von Objekten bereitgestellt, die zum Implementieren der Adaptable -Schnittstelle verwendet werden. This interface provides a generic adaptTo() method that will translate the object to the class type being passed as the argument.
Sie können beispielsweise einfach wie folgt vorgehen, um ein Ressourcenobjekt in das entsprechende Node-Objekt zu übersetzen:
Node node = resource.adaptTo(Node.class);

Nutzungsszenarien

Es gibt die folgenden Nutzungsszenarien:
  • Rufen Sie spezifische Objekte für die Implementierung ab.
    For example, a JCR-based implementation of the generic Resource interface provides access to the underlying JCR Node .`
  • Erstellung von direkten Verknüpfungen für Objekte, für die interne Kontextobjekte übergeben werden müssen.
    For example, the JCR-based ResourceResolver holds a reference to the request's JCR Session , which in turn is needed for many objects that will work based on that request session, such as the PageManager or UserManager .
  • Direkte Verknüpfung mit Diensten.
    A rare case - sling.getService() is simple as well.

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

To improve performance, implementations are free to cache the object returned from a obj.adaptTo() call. Wenn das obj -Element 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 – vor allem innerhalb von AdapterFactory – also wichtig, dass Objekte bei diesem Szenario wiederverwendet werden können.

Funktionsweise

There are various ways that Adaptable.adaptTo() can be implemented:
  • Über das Objekt selbst. Die eigentliche Methode wird implementiert und dann erfolgt die Zuordnung zu bestimmten Objekten.
  • By an AdapterFactory `, which can map arbitrary objects.
    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 Bundles 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 es sich um eine JCR-Node-basierte Ressource oder eine JCR-Eigenschaft handelt, die auf einen Knoten verweist.
Eigenschaft 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). Can also be achieved (more simply) by using ResourceUtil.getValueMap(Resource) (handles null case, etc.).
InheritanceValueMap Extension of ValueMap which allows the hierarchy of resources to be taken into account when looking for properties.
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ück nt:resource
AuthorizableResourceProvider org.apache.sling.jackrabbit.usermanager /system/userManager
cq:Page cq:PseudoPage
cq:Component
cq:Page
cq:Template
cq:Page
cq:Tag
cq:Preferences
cq:ContentSyncConfig
cq:ContentSyncConfig
**ResourceResolver ** passt sich an:
Sitzung 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.
Autorisierter 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

Adaptierung von **Page ** für:
Ressource Ressource der Seite.
LabeledResource Bezeichnete Ressource (== this).
Node Knoten der Seite.
... Alles, woran die Ressource der Seite angepasst werden kann.
Adaptierung von **Component ** für:
Ressource der Komponente.
Bezeichnete Ressource (== this).
Knoten der Komponente.
...
Alles, woran die Ressource der Komponente angepasst werden kann.
Adaptierung von **Template ** für:
Ressource Node.htmlRessource der Vorlage.
LabeledResource Bezeichnete Ressource (== this).
Node Knoten dieser Vorlage.
... Alles, an das die Vorlagenressource angepasst werden kann.

Sicherheit

Adaptierung von **Authorizable ** , User und **Group ** für:
Gibt den Stammknoten des Benutzers/der Gruppe zurück.
Gibt den Replizierungsstatus für den Stammknoten des Benutzers/der Gruppe zurück.

DAM

**Asset ** passt sich an:
Ressource des Assets.
Knoten des Assets.
...
Alles, woran die Ressource des Assets angepasst werden kann.

Tagging

**Tag ** passt sich an:
Ressource des Tags.
Knoten des Tags.
...
Alles, woran die Ressource des Tags angepasst 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.