We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

Java: Obtenir les contenus liés à une publication?

Eugène Youki · on 9/30/05 at 3:31 PM

Bonjour,

J'ai un objet Publication et souhaite à partir de celui-ci obtenir l'ensemble des contenus liés (parcours en profondeur des autres publications liées, tel que défini dans l'éditeur de types). Comment puis-je m'y prendre en Java? Merci de votre aide.

Eugène Youki

29 pts
Olivier Dedieu · on 10/1/05 at 10:59 AM

Tout dépend du type de liaison qui existe entre les objets.

Liaison descendante

Prenons l'exemple d'une publication p0 qui pointe les publication p1 et p2 au travers de ses champs champP1 et champP2.

Pour accéder à p1 et p2 depuis p0 vous pouvez écrire :

Publication p1 = p0.getChampP1();
Publication p2 = p0.getChampP2();

Pour obtenir l'ensemble des publications pointés par p0, vous pouvez aussi utiliser la méthode getLinkDataSet() :

Set pubSet = p0.getLinkDataSet(Publication.class);

Liaison ascendante

Prenons maintenant l'exemple où p1 et p2 pointent p0 au travers d'un champ "top". La méthode getLinkIndexedDataSet() permet de retrouver l'ensemble des publications pointant p0 :

Set pubSet = p0.getLinkIndexedDataSet(Publication.class);

Pour être plus précis, il est possible d'obtenir uniquement les publications pointant p0 au travers d'un champ "top"

Set pubSet = p0.getLinkIndexedDataSet(Publication.class, "top");

Si on a pris soins lors de la définition des types de p1 et p2 de préciser que le champ "top" était un lien "parent" alors on dispose de nouvelles méthodes pour parcourir l'ensemble des descendants de la publication p0 de façon arborescente :

// Obtenir les fils de p0
Set childrenSet = p0.getTreeChildrenSet();

// Connaître le parent de p1 (c'est-à-dire p0)
Publication parent = p1.getTreeParent();

// Déterminer si p1 est un noeud ou une feuille
boolean isNode = p1.isTreeNode();
boolean isLeaf = p1.isTreeLeaf();

// Supprimer tous les descendants de p0
p0.removeAllDescendants(loggedMember, new HashMap());

2 pts
Eugène Youki · on 10/4/05 at 3:16 PM

Merci pour votre aide!

Je m'intéresse à la liaison descendante. Votre méthode ne marche que si l'on connaît de manière nominative les classes filles de la publication en question, ie si l'on a p1 une publication de classe Video et p2 une publication de classe Image, on peut effectivement parcourir la descendance comme vous l'indiquez :

Publication p1 = p0.getVideo();
Publication p2 = p1.getImage();

ou encore :

Set pubSet = p0.getLinkDataSet(Video.class); (pour les vidéos, la clé de hachage de linkDataSet devant être la classe feuille en question)

Mais n'y a t'il pas un moyen de parcourir le tout sans connaître à priori la hiérarchie des types de publications? (je voudrais appliquer un traitement à chaque classe qui étend Publication dans la hiérachie, mais sans avoir à connaître son type).

0 pts
Olivier Dedieu · on 10/4/05 at 4:46 PM

Il suffit de demander toutes les pointeurs de types Publication (ou même plutôt de type Content). Dans ce cas, la méthode getLinkDataSet() renvoit tous les contenus (article, vidéo, ...) pointés par la publication.

Par exemple pour ajouter une catégories à tous les contenus pointés par p0 (en utilisant l'API JCMS 5.0) :

for(Iterator it = p0.getLinkDataSet(Content.class).iterator(); it.hasNext();) {
 Publication itPub = (Publication)it.next();
 Publication copy = (Publication)itPub.clone();
 copy.addCategory(cat);
 copy.performUpdate(mbr);
}

1 pt
Eugène Youki · on 10/4/05 at 5:42 PM

Ok. J'utilise JCMS 4.1.1. Mon problème vient du fait que je ne récupère rien en appelant:

p0.getLinkDataSet(Content.class) ou p0.getLinkDataSet(Publication.class),

Il n'y a que quand j'indique nominément la classe feuille (ex: getLinkDataSet(Video.class)) que j'obtiens l'ensemble des publication liées, mais seulement pour la classe Video. Or je cherche à obtenir toutes les publications liées, quelque soit la classe feuille.

Est-ce que l'API JCMS 4.1.1 le permet? Merci pour votre aide!

0 pts
Olivier Dedieu · on 10/4/05 at 6:24 PM

Helas, non !

Effectivement avec JCMS 4.1.1 on ne peut qu'accèder aux liens d'un type précis. La méthode getLinkDataSet() a été améliorée avec JCMS 5.0.2 pour supporter le passage de super classes telles que Publication ou Content.

Donc dans votre cas, cette méthode ne sera d'aucun secours. Il vous reste la piste des API d'introspection java (java.lang.reflect) qui permettent d'itérer sur les champs d'un objet afin d'en connaître le type (eg. instanceof Publication).

Quelques liens sur cette API :

1 pt
Mathieu DOMER · on 9/22/09 at 3:33 PM

Bonjour,

Sur JCMS 6.0.1, est-ce que getLinkIndexedDataSet fonctionne aussi avec les contenus en base de données ou les formulaires ?

0 pts
Mathieu DOMER · on 9/22/09 at 4:01 PM

Apparement non, nous avons dû utiliser : HibernateUtil.query.

Est-ce la bonne méthode ?

0 pts
Olivier Dedieu · on 9/22/09 at 4:18 PM

La méthode getLinkIndexedDataSet() ne travaille que sur les données du Store.

Pour les données en DB, il faut effectivement passer par l'une des méthode HibernateUtil.query(...).

Exemple pour ressortir toutes les avis (Review) publiés par l'admin (j_2) triés par ordre décroissant de date de création :

List<Review> list = HibernateUtil.query(Review.class, DBConstants.AUTHOR_ID_FIELD, "j_2", "cdate desc");

2 pts
Mathieu DOMER · on 9/22/09 at 6:10 PM

Merci Olivier pour cet éclaircissement.

0 pts