Sling propose un modèle Adaptateur permettant de convertir facilement les objets qui mettent en œuvre l’interface Adaptable. Cette interface fournit une méthode adaptTo() générique qui convertit les objets dans le type de classe qui est transmis comme argument.
Par exemple, pour convertir un objet Resource en objet Node correspondant, vous pouvez simplement procéder comme suit :
Node node = resource.adaptTo(Node.class);
Il existe plusieurs scénarios d’utilisation :
Obtenir des objets spécifiques à l’implémentation.
Par exemple, une implémentation basée sur JCR de l’interface Resource
permet d’accéder à l’objet Node
JCR sous-jacent.
Création de raccourcis d’objets qui nécessitent la transmission d’objets de contexte internes.
Par exemple, le ResourceResolver
basé sur JCR contient une référence à la JCR Session
de la requête qui, à son tour, est nécessaire pour de nombreux objets qui s’exécuteront sur la base de cette session de requête ; PageManager
ou UserManager
, par exemple.
Raccourci vers les services.
Cas peu fréquent : sling.getService()
s’avère également simple.
adaptTo()
peut renvoyer une valeur nulle.
Plusieurs raisons peuvent expliquer cela :
Il est important de traiter ce cas de manière appropriée. Pour les rendus JSP, l’échec de JSP est acceptable si cela se traduit par un élément de contenu vide.
Pour améliorer les performances, les implémentations peuvent mettre en cache l’objet renvoyé par un appel obj.adaptTo()
. Si obj
est identique, l’objet renvoyé l’est également.
Cette mise en cache est exécutée pour tous les scénarios basés sur AdapterFactory
.
Cependant, il n’existe pas de règle absolue : l’objet peut soit être une nouvelle instance, soit une instance existante. Cela signifie que vous ne pouvez pas compter sur un comportement en particulier. Par conséquent, il est important, notamment dans AdapterFactory
, que les objets soient réutilisables dans ce scénario.
Adaptable.adaptTo()
peut être implémenté de différentes façons :
Par l’objet proprement dit ; implémentation de la méthode et mappage sur certains objets.
Par un AdapterFactory
', qui peut mapper des objets arbitraires.
Les objets doivent cependant implémenter l’interface Adaptable
et étendre SlingAdaptable
(qui transmet l’appel adaptTo
à un gestionnaire d’adaptateur central).
Cela autorise les hooks dans le mécanisme adaptTo
pour les classes existantes, comme Resource
.
Une combinaison des deux.
Pour le premier cas, vous pouvez consulter les JavaDocs pour connaître les adaptTo-targets
possibles. Cependant, pour des sous-classes spécifiques, telles que la ressource basée sur JCR, cela s’avère souvent impossible. Dans ce cas, les implémentations de AdapterFactory
font généralement partie des classes privées d’un lot et ne sont donc pas exposées dans une API cliente ni répertoriées dans les JavaDocs. En théorie, il serait possible d’accéder à toutes les implémentations AdapterFactory
à partir de l’exécutable de service OSGi et d’observer leurs configurations « adaptables » (sources et cibles), mais pas de les mapper entre elles. En définitive, cela dépend de la logique interne, qui doit être documentée, d’où cette référence.
Resource s’adapte à :
Node | S’il s’agit d’une ressource basée sur un nœud JCR ou une propriété JCR faisant référence à un nœud. |
Property | S’il s’agit d’une ressource basée sur une propriété JCR. |
Item | S’il s’agit d’une ressource basée sur JCR (nœud ou propriété). |
Map | Renvoie un mappage des propriétés, s’il s’agit d’une ressource basée sur un nœud JCR (ou une autre ressource prenant en charge les mappages de valeurs). |
ValueMap | Renvoie un mappage simple d’emploi des propriétés, s’il s’agit d’une ressource basée sur un nœud JCR (ou une autre ressource prenant en charge les mappages de valeurs). On peut également obtenir ce résultat (plus simplement) en utilisantResourceUtil.getValueMap(Resource) (gestion du cas de valeur nulle, etc.). |
InheritanceValueMap | Extension de ValueMap, ce qui permet la prise en compte de la hiérarchie de ressources lors de la recherche de propriétés. |
PersistableValueMap | S’il s’agit d’une ressource basée sur un nœud JCR et que l’utilisateur est autorisé à modifier des propriétés sur ce nœud. Remarque : Plusieurs mappages persistants ne partagent pas leurs valeurs. |
InputStream | Renvoie le contenu binaire d’un "fichier"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 s’adapte à :
Session | Session JCR de la requête, s’il s’agit d’un résolveur de ressources basé sur JCR (par défaut). |
PageManager | |
ComponentManager | |
Designer | |
AssetManager | Basé sur la session JCR, s’il s’agit d’un résolveur de ressources basé sur JCR. |
TagManager | Basé sur la session JCR, s’il s’agit d’un résolveur de ressources basé sur JCR. |
UserManager | Selon la session JCR, s’il s’agit d’un résolveur de ressources basé sur JCR et si l’utilisateur est autorisé à accéder à UserManager. |
Authorizable | Utilisateur actuel. |
User |
Utilisateur actuel. |
PrivilegeManager | |
Preferences | Préférences de l’utilisateur actuel (en fonction de la session JCR s’il s’agit d’un résolveur de ressources basé sur JCR). |
PreferencesService | |
PinManager | |
QueryBuilder | |
Externalizer | Pour externaliser des URL absolues, même sans l’objet de requête. |
SlingHttpServletRequest s’adapte à :
Pas encore de cible, mais implémente l’interface Adaptable et peut être utilisé comme source dans une AdapterFactory personnalisée.
SlingHttpServletResponse s’adapte à :
ContentHandler (XML) |
S’il s’agit d’une réponse de réécriture sling. |
Page s’adapte à :
Resource |
Ressource de la page |
LabeledResource | Ressource étiquetée (== this). |
Noeud | Nœud de la page. |
… | Tous les éléments auxquels la ressource de la page peut être adaptée. |
Component s’adapte à :
Ressource | Ressource du composant. |
---|---|
LabeledResource | Ressource étiquetée (== this). |
Node | Nœud du composant. |
… | Tous les éléments auxquels la ressource du composant peut être adaptée. |
Template s’adapte à :
Resource |
Ressource du modèle. |
LabeledResource | Ressource étiquetée (== this). |
Noeud | Nœud de ce modèle. |
… | Tous les éléments auxquels la ressource du modèle peut être adaptée. |
Autorisé, Utilisateur et Groupement s'adapter à :
Noeud | Renvoie le nœud racine utilisateur/groupe. |
---|---|
ReplicationStatus | Renvoie l’état de réplication pour le nœud racine utilisateur/groupe. |
Asset s’adapte à :
Ressource | Ressource de l’actif. |
---|---|
Noeud | Nœud de la ressource. |
… | Tous les éléments auxquels la ressource de l’actif peut être adaptée. |
Tag s’adapte à :
Ressource | Ressource de la balise. |
---|---|
Noeud | Nœud de la balise. |
… | Tous les éléments auxquels la ressource de la balise peut être adaptée. |
Sling/JCR/OCM fournit, en outre, un [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
pour les objets OCM (Object Content Mapping) personnalisés.