SubscribeOthers avec groupes Webtop

De EjnTricks
Révision de 28 août 2014 à 11:51 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Suite à une question sur le forum powerlink, cette extension a été réalisée afin de pouvoir sélectionner des groupes lors de l'abonnement à un objet pour d'autres utilisateurs. Par défaut, il n'est possible de ne sélectionner que des utilisateurs, autre que l'utilisateur connecté, dans ce composant.

L'objectif de cette extension est donc de pouvoir sélectionner un(des) groupe(s) et d'abonner l'ensemble des utilisateurs de la sélection.

A noter que l'ajout ou suppression d'un utilisateur, dans un des groupes, n'est pas pris en compte. En effet, il serait beaucoup plus compliqué de mettre en place l'abonnement au niveau des groupes. Il faudrait alors modifier le service d'abonnement. De plus, la fonctionnalité de notifications sur les groupes ne fonctionne pas. En effet, ces notifications envoient un mail à l'adresse de l'utilisateur (soit le groupe) abonné sur les objets. Enfin, une personne du groupe pourrait supprimer l'abonnement, qui serait donc plus visible pour tous les autres utilisateurs.


Hand-icon.png Votre avis

Current user rating: 100/100 (1 votes)

 You need to enable JavaScript to vote


Extension version 6.6

Le code explicité dans ce chapitre s'applique pour la version 6.6 de Webtop. Le code est disponible à l'adresse http://www.jouvinio.net/svn/study/branches/documentum/6.6/Webtop/Groups%20selection%20on%20subscribeothers/


Study icon.png Analyse

XML format icon.png Définition action

L'action subscribeothers est définie dans le fichier webtop/webcomponent/config/actions/dm_sysobject_actions.xml avec la configuration suivante:

L'action entraîne donc l'affichage du composant subscribeotherslocator au sein du container subscribeotherslocatorcontainer.

Webtop Container Icon.png Container subscribeotherslocatorcontainer

Le container subscribeotherslocatorcontainer est défini dans le fichier webtop/webcomponent/config/library/subscription/subscribeotherslocator_component.xml avec la configuration suivante:

Ce container est une simple extension du container useronlylocatorcontainer utilisé pour la sélection d'utilisateur uniquement. Il n'y a rien de particulier dans ce container. Il est juste nécessaire de comprendre la prise en compte de la sélection pour la création des abonnements. Ceci s'effectue dans la méthode onOk dont le code est:

A noter le cast du composant inclus en SubscribeOthersLocator . Lors de l'extension de ce composant, il faudra donc hérité de cette classe.


Webtop Component Icon.png Composant subscribeotherslocator

Le composant subscribeotherslocator est défini dans le fichier webtop/webcomponent/config/library/subscription/subscribeotherslocator_component.xml avec la configuration suivante:


Il n'y a rien de particulier au niveau de cette configuration. Les filtres sont définis afin de n'afficher que les utilisateurs, configuration du noeud views. La configuration de flatlist est utilisée afin d'empêcher la navigation dans les éléments, lorsque ceux-ci contiennent des fils.

A noter l'extension du composant useronlylocator, qui entraîne l'impossibilité de sélectionner les éléments "container", soit les groupes.


L'analyse de la classe com.documentum.webcomponent.library.subscription.SubscribeOthersLocator va permettre d'identifier des points à ne pas oublier. Le contenu de la classe est très simple:


Il n'y a donc pas grand chose dans celle-ci, mise à part l'utilisation d'une classe particulière pour la génération de la requête, qui est aussi très simple.

Le code parle de lui même. Lors de la génération de la requête un filtre est ajouté pour ne pas retourner l'utilisation dont la valeur de user_name est égale à USER, soit l'utilisateur connecté.

Ce point est particulièrement important car l'extension doit afficher les groupes également. Le filtre serait donc invalide, puisque le type dm_group ne contient pas l'attribut user_name.


Icon Personnalisation.png Mise en place

Webtop Component Icon.png Extension composant subscribeotherslocator

Une fois l'analyse réalisée, l'extension est assez simple.

XML format icon.png La configuration du composant doit être modifiée ainsi:

Elément configuration Valeur Description
class fr.amexio.ejn.webcomponent.library.subscription.SubscribeOthersWithGroupsLocator Il est nécessaire de modifier la classe d'instance pour mettre en place une requête spécifique.
containerselectable true Il faut permettre la sélection des éléments "container", soit les groupes.
flatlist false Il faut pouvoir entrer dans la composition des groupes.
views ... Configuration des filtres du locator pour afficher les utilisateurs et les groupes.

Ce type de configuration est déjà disponible au sein de Webtop, pour le composant userorgrouplocator dans le fichier webtop/webcomponent/config/library/locator/userorgrouplocator_component.xml. Il va donc suffire de recopier cette configuration.

La configuration est placée dans le fichier webtop/custom/config/webcomponent/library/subscription/subscribeotherslocator_component.xml. Il n'est pas possible d'utiliser la directive component modifies car les différentes modifications à mettre en place se situent dans l'ensemble de la hierarchie de configuration. La configuration devient donc:

Java format icon.png La classe d'instance est modifiée afin de modifier la classe utilisée pour générer la requête. Il ne faut ajouter le filtre sur le nom des utilisateurs uniquement lorsque la clause from de la sous requête est dm_user. L'extension est donc aussi simple que la classe originale.

L'utilisation est exactement la même que le standard, seule la classe utilisée est modifiée.

Par rapport au standard, le filtre n'est ajouté que si la valeur de la clause from est dm_user a. Cette valeur est mise à jour lors de la construction des requêtes dans les fonctions getContainerViewStatement et getRootViewStatement de la classe com.documentum.webcomponent.library.locator.UserOrGroupLocatorQuery. Ces fonctions construisent les deux parties de la requête afin de retourner les groupes et / ou les utilisateurs.


Webtop Container Icon.png Extension container subscribeotherslocatorcontainer

La dernière modification a mettre en place concerne le container, afin qu'il soit capable de transformer les identifiants des groupes sélectionnés par l'identifiant des utilisateurs contenus dans ceux-ci.

XML format icon.png La configuration du composant doit être modifiée ainsi:

Elément configuration Valeur Description
class fr.amexio.ejn.webcomponent.library.subscription.SubscribeOthersWithGroupsLocatorContainer Seul la modification de la classe d'instance est nécessaire.

Contrairement au composant, il est possible d'utiliser la directive component modifies, car les modifications ne concernent des noeuds dans une unique définition. La configuration devient donc:

Java format icon.png La classe d'instance est modifiée afin de convertir les identifiants de groupes en identifiant d'utilisateurs. Ceci doit être réalisé avant la mise en place des abonnements, et donc durant l'exécution de la fonction onOk. Pour cela, le composant contenu est récupéré, comme dans la classe parente, mais avec un casting suffisant pour utiliser les fonctions nécessaires.

La fonction convertGroups est appelée avec le composant. L'ensemble des identifiants sélectionnés, retournés par la fonction getSelections, est parcouru afin d'extraire ceux concernant des groupes et en construisant la valeur pour un filtre dans la clause where avec l'opérateur in.

Une fois le filtre construit, la méthode convertGroupsToUsers est appelée pour exécutée une requête DQL retournant les utilisateurs des groupes, en se basant sur l'attribut i_all_users_names. La requête est du type

select dm_user.r_object_id 
from dm_user, dm_group 
where any dm_group.i_all_users_names = dm_user.user_name and 
dm_group.r_object_id in ( ... ) and 
dm_user.user_name != user

A noter l'utilisation du filtre dm_user.user_name != user afin de ne pas récupérer l'identifiant de l'utilisateur connecté si il se trouve dans un des groupes sélectionnés.

Attention Du fait de l'utilisation de cette requête, il existe une limitation sur le nombre de groupes sélectionnés. L'opérateur in possède une restriction à 1000 éléments, ce qui est acceptable dans ce cas. Qui va sélectionner 1000 groupes ?

Chacun des identifiants retournés est ajouté ensuite dans la sélection du composant.