Je suis en train d'essayer de créer un type document...

cancel
Showing results for 
Search instead for 
Did you mean: 
serv
Member II

Je suis en train d'essayer de créer un type document...

Bonjour,

Je suis en train d'essayer de créer un type document n'ayant aucun rapport avec le contentModel.
J'ai donc défini mon propre modèle mais j'ai l'impression que dans les dossiers déjà existants (de type cm:folder) on ne peut créer que des objets dérivant du contentModel. Ai-je raison ?

En effet, je me pose cette question car j'essaie de créer un type auteur qui appartient à une bibliotheque.
La définition de mon modèle est la suivante :
<type name="my:biblio">
         <title>Biblio</title>
         <parent>sys:base</parent>
         <archive>true</archive>
         <associations>
            <child-association name="my:contains">
               <source>
                  <mandatory>false</mandatory>
                  <many>true</many>
               </source>
               <target>
                  <class>sys:base</class>
                  <mandatory>false</mandatory>
                  <many>true</many>
               </target>
               <duplicate>false</duplicate>
            </child-association>
         </associations>
      </type>
       
     <type name="my:auteur">
         <title>Auteur</title>
         <parent>my:biblio</parent>
         <properties>
            <property name="my:nom">
               <type>d:text</type>
            </property>
         <property name="my:prenom">
               <type>d:text</type>
            </property>
       </properties>
     </type>
Quand j'essaie de créer mon noeud avec l'appel suivant :
this.nodeService.createNode(biblio,
            BibliothequeModel.CHILD_ASSOC_CONTAINS, QName.createQName("auteur"),
            BibliothequeModel.TYPE_AUTEUR, props);
j'obtient l'erreur :
Found 1 integrity violations:
The association source type is incorrect:
   Association: Association[ class=ClassDef[name={my.new.model}biblio], name={my.new.model}contains, target class={http://www.alfresco.org/model/system/1.0}base, source role=null, target role=null]
   Required Source Type: {my.new.model}biblio
   Actual Source Type: {http://www.alfresco.org/model/content/1.0}folder
Est-ce que cela vient bien du problème précédent ?

Merci
15 Replies
rivarola
Active Member

Re: Je suis en train d'essayer de créer un type document...

Bonjour,

Ce n'est pas vraiment que dans un cm:folder tu ne peux créer que des objets dérivant du contentModel, c'est plutôt que tu es obligé pour ajouter un noeud d'utiliser une child-association disponible sur le cm:folder.
La tu n'as pas trop le choix, il n'y a que cm:contains.

Quel est le type du noeud biblio dans ton exemple ? S'il s'agit d'un cm:folder, alors la ligne de code devrait être :
this.nodeService.createNode(biblio,
                ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI , "auteur"),
                BibliothequeModel.TYPE_AUTEUR, props);
Si ton noeud biblio est de type my:biblio, il y a effectivement un problème, mais ça voudrait dire qu'avant ce problème tu as déjà réussi à ajouter ta biblio dans un cm:folder, ce qui ne semble pas le cas vu ce que tu dis avant.
serv
Member II

Re: Je suis en train d'essayer de créer un type document...

Merci pour la réponse, ça confirme ce que je pensais.

En effet, je n'ai pas réussi à créer de noeuds de type 'my:biblio' ou 'my:auteur' tels que je les avais défini.
Je vais donc modifier mon modèle en conséquence et faire dériver mes objets de cm:content.

A+
Servane
rivarola
Active Member

Re: Je suis en train d'essayer de créer un type document...

Ce n'est pas ce que je voulais dire. Tu n'est pas obligé de créer un type fils de cm:content, tu es simplement obligé d'utiliser la child-association cm:contains pour ajouter un descendant à un cm:folder. Ce descendant peut être n'importe quel type héritant de sys:base, donc ton my:biblio fera l'affaire (en tout cas dans une version 2.x du modèle, je ne sais pas pour le 1.4).

Quel est le type du noeud biblio dans ton exemple ?
serv
Member II

Re: Je suis en train d'essayer de créer un type document...

Ok. Je comprends.

Mon noeud biblio est effectivement de type cm:folder.

Je crée mon nouvel auteur (de type sys:base) avec le code suivant :
this.nodeService.createNode(biblio,
                ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI , "auteur"),
                BibliothequeModel.TYPE_AUTEUR, props);
mais après, mon noeud n'est pas reconnu comme étant un BibliothequeModel.TYPE_AUTEUR.

Ce que je veux dire, c'est que si j'invoque :

//nodeRef est l'auteur créé précédemment
QName type2 = this.nodeService.getType(nodeRef);

         // make sure the type is defined in the data dictionary
         TypeDefinition typeDef = this.dictionaryService.getType(type2);
j'obtiens un NullPointerException sur type2.
Je ne comprends pas ce que je dois faire au final pour enregistrer mon auteur en type my:auteur.
rivarola
Active Member

Re: Je suis en train d'essayer de créer un type document...

Bonjour,

Le meilleur moyen de déboguer ce genre de problèmes est d'utiliser le browser de noeuds qui est présent dans l'interface d'admin du Web-Client. Tu peux rapidement arriver aux noeuds que tu as créé par API et voir leur type, leurs aspects et la valeur de leurs propriétés. Souvent on se rend compte que le noeud est bon dans le repository mais que c'est notre manière de le vérifier, voire de le récupérer, par API qui n'est pas bonne.
serv
Member II

Re: Je suis en train d'essayer de créer un type document...

Merci pour l'information à propos du navigateur de noeud. Il m'a été très utile.

J'arrive maintenant parfaitement à créer mes auteurs et mes livres et à y accéder via l'interface web.
Il me reste cependant un problème : un auteur ne peut être lié (via une child-association) qu'à un livre. Après cela, l'auteur ne peut plus être utilisé sinon, j'ai une erreur d'échec d'intégrité où on me dit que la multiplicité entre un livre et un auteur est de 1..1 :
Found 1 integrity violations:
The association parent multiplicity has been violated:
   Association: Association[ class=ClassDef[name={my.new.model}livre], name={my.new.model}auteurs, target class={my.new.model}auteur, source role=null, target role=null]
   Required parent Multiplicity: 1..1
   Actual parent Multiplicity: 2
Je mets pour rappel la définition de mon modèle :
   <types>
<type name="my:livre">
         <title>Livre</title>
         <parent>cm:content</parent>
         <properties>
            <property name="my:titre">
               <type>d:text</type>
            </property>
            <property name="my:categorie">
               <type>d:category</type>
            </property>
         </properties>
       <associations>
            <child-association name="my:auteurs">
               <target>
                  <class>my:auteur</class>
                  <mandatory>false</mandatory>
                  <many>true</many>
               </target>
            </child-association>           
         </associations>
      </type>
    
     <type name="my:auteur">
         <title>Auteur</title>
         <parent>sys:base</parent>
         <properties>
            <property name="my:nom">
               <type>d:text</type>
            <constraints>
            <constraint type="LENGTH">
                    <parameter name="minLength"><value>0</value></parameter>
                    <parameter name="maxLength"><value>10</value></parameter>
                 </constraint>
              </constraints>
            </property>
         <property name="my:prenom">
               <type>d:text</type>
            <constraints>
            <constraint type="LENGTH">
                    <parameter name="minLength"><value>5</value></parameter>
                    <parameter name="maxLength"><value>10</value></parameter>
                 </constraint>
              </constraints>
            </property>
       </properties>
     </type>
    </types>
Comment est-ce que je peux pallier à ce problème ? Est-ce que ça vient de la définition du modèle ?
serv
Member II

Re: Je suis en train d'essayer de créer un type document...

C'est bon, j'ai trouvé…
Il suffisait de modifier la child-association comme suit :
<type name="my:livre">
         <title>Livre</title>
         <parent>cm:content</parent>
         <properties>
            <property name="my:titre">
               <type>d:text</type>
            </property>
            <property name="my:categorie">
               <type>d:category</type>
            </property>
         </properties>
       <associations>
            <child-association name="my:auteurs">
            <source>
                  <mandatory>false</mandatory>
                  <many>true</many>
               </source>
               <target>
                  <class>my:auteur</class>
                  <mandatory>false</mandatory>
                  <many>true</many>
               </target>
            </child-association>           
         </associations>
      </type>
serv
Member II

Re: Je suis en train d'essayer de créer un type document...

Je suis toujours sur le même sujet, mais le problème est différent.
Je cherche à customizer l'affichage des détails de mon livre. Actuellement, les auteurs sont affichés sous la forme : /company_home/Brouillons/Machin.
J'aimerais que seul 'Machin' soit affiché à l'écran. Je suppose que pour cela je dois créer un converter.
J'ai donc créé un converter qui implémente les 2 méthodes :
public String getAsString(FacesContext context, UIComponent component, Object value)
         throws ConverterException

public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException
Cependant, l'affichage ne change pas et je n'ai aucune exception.
J'ai déclaré mon converter dans le modèle, au niveau de la child-association my:auteurs.

Quelqu'un saurait-il d'où vient le problème ou même s'il y a d'autres méthodes à implémenter ?

Merci
bmagnier
Member II

Re: Je suis en train d'essayer de créer un type document...

Bonjour

Je reviens juste sur la phrase :
J'ai déclaré mon converter dans le modèle, au niveau de la child-association my:auteurs.
Si je ne m'abuse, l'utilisation des converters se fait via les fichiers de configuration du client Web (http://wiki.alfresco.com/wiki/Displaying_Custom_Metadata#Converters). Pourriez-vous nous montrer la configuration que vous avez mise en place ?

Bertrand.