Custom model non valide avec déclaration de contrainte

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

Custom model non valide avec déclaration de contrainte

Bonjour,

je suis confronté à un problème curieux. Je fais du Alfresco depuis environ 3 semaines, et pour ce faire j'utilise le livre "Alfresco Developer Guide". De plus, je lis ce forum, et son équivalent Anglo-saxo.

Pour mon problème, j'ai voulu ajouter une contrainte sur une propriété (valeur devant appartenir à une liste). J'ai suivi scrupuleusement mon livre, en ajoutant ceci entre les balises "namespaces" et "types" :

   <constraints>
      <constraint name="fws:duStateList" type="LIST">
         <parameter name="allowedValues">
            <list>
               <value>Draft</value>
               <value>Created</value>
               <value>Validated</value>
            </list>
         </parameter>
      </constraint>
   </constraints>

Le déploiement me donne l'erreur suivante :
15:44:09,653 INFO  [org.alfresco.config.xml.XMLConfigService$PropertyConfigurer] Loading properties file from class path resource [alfresco/file-servers.properties]
15:44:27,538 ERROR [org.springframework.web.context.ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fws.dictionaryBootstrap' defined in file [C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\extension\fws-model-context.xml]: Invocation of init method failed; nested exception is org.alfresco.service.cmr.dictionary.DictionaryException: Could not import bootstrap model alfresco/extension/model/fwsModel.xml
Caused by: org.alfresco.service.cmr.dictionary.DictionaryException: Could not import bootstrap model alfresco/extension/model/fwsModel.xml
   at org.alfresco.repo.dictionary.DictionaryBootstrap.initDictionary(DictionaryBootstrap.java:147)
   at org.alfresco.repo.dictionary.DictionaryBootstrap.bootstrap(DictionaryBootstrap.java:108)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1240)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1205)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1171)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:425)
   at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
   at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:244)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:187)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
   at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:830)
   at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:719)
   at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
   at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
   at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
   at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
   at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
   at org.apache.catalina.core.StandardService.start(StandardService.java:516)
   at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
   at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
   at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.alfresco.service.cmr.dictionary.DictionaryException: Failed to parse model
   at org.alfresco.repo.dictionary.M2Model.createModel(M2Model.java:99)
   at org.alfresco.repo.dictionary.DictionaryBootstrap.initDictionary(DictionaryBootstrap.java:142)
   … 42 more
Caused by: org.jibx.runtime.JiBXException: Expected end tag, found start tag "{http://www.alfresco.org/model/dictionary/1.0}property" (line 113, col 54)
   at org.jibx.runtime.impl.UnmarshallingContext.toEnd(UnmarshallingContext.java:548)
   at org.jibx.runtime.impl.UnmarshallingContext.parsePastEndTag(UnmarshallingContext.java:805)
   at org.alfresco.repo.dictionary.M2Class.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2binding_unmarshal_1_0(M2Class.java)
   at org.alfresco.repo.dictionary.M2Type.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2binding_unmarshal_2_0(M2Type.java)
   at org.alfresco.repo.dictionary.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2bindingM2Type_access.unmarshal()
   at org.alfresco.repo.dictionary.JiBX_MungeAdapter.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2binding_unmarshal_1_4()
   at org.alfresco.repo.dictionary.M2Model.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2binding_unmarshal_1_0(M2Model.java)
   at org.alfresco.repo.dictionary.JiBX_root_projects_repository_source_java_org_alfresco_repo_dictionary_m2bindingM2Model_access.unmarshal()
   at org.jibx.runtime.impl.UnmarshallingContext.unmarshalElement(UnmarshallingContext.java:2515)
   at org.jibx.runtime.impl.UnmarshallingContext.unmarshalDocument(UnmarshallingContext.java:2675)
   at org.alfresco.repo.dictionary.M2Model.createModel(M2Model.java:94)
   … 43 more
15:44:44,803 INFO  [org.alfresco.web.site.FrameworkHelper] Successfully Initialized Web Framework
15:44:53,545 INFO  [org.alfresco.web.scripts.DeclarativeRegistry] Registered 67 Web Scripts (+0 failed), 71 URLs
15:44:53,545 INFO  [org.alfresco.web.scripts.AbstractRuntimeContainer] Initialised Presentation Web Script Container (in 1837.0349ms)
15:45:56,230 INFO  [org.alfresco.web.scripts.DeclarativeRegistry] Registered 101 Web Scripts (+0 failed), 105 URLs
15:45:56,240 INFO  [org.alfresco.web.scripts.AbstractRuntimeContainer] Initialised WebFramework Web Script Container (in 62617.535ms)
15:45:56,450 INFO  [org.alfresco.web.site.FrameworkHelper] Successfully Initialized Web Framework


Si j'ai bien compris l'erreur, mon fichier de modèle customisé n'est pas valide. Je me suis donc mis en chasse du schéma de validation, que j'ai trouvé dans Alfesco "modelSchema.xsd" dans "C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\model", et je découvre que celui-ci ne permet pas de déclarer d'élément "constraints". D'ailleurs, l'élément "constraints" n'est pas non plus autorisé dans les éléments "property".

Pourtant, j'ai vu de nombreux exemples de la sorte.

Je suis sous Windows XP, et j'utilise Alfresco Labs 3c (last stable à l'instant t).

Est-ce que le modèle de déclaration des contraintes aurait évolué ?

Merci par avance pour votre aide.
6 Replies
christophes
Member II

Re: Custom model non valide avec déclaration de contrainte

Je crois que ta syntax XML n'est pas correcte. Cela devrait être quelque chose comme :
            <property name="prefix:nomMetadonnee">
               <type>d:text</type>
               <constraints>
                  <constraint type="LIST">
                     <parameter name="allowedValues">
                        <list>
                           <value>valeur1</value>
                           <value>valeur2</value>
                           <value>valeur3</value>
                           <value>valeur4</value>
                        </list>
                     </parameter>
                  </constraint>
               </constraints>
            </property>
J'utilise ce genre de contraintes dans mon Alfresco en version 2.2.1 et je suppose que c'est toujours correct dans les versions supérieures.

Christophe
cviaud
Member II

Re: Custom model non valide avec déclaration de contrainte

En fait, dans l'extrait de mon modèle, je n'ai indiqué que la déclaration de la contrainte générale.

J'ai aussi le code suivant, pour déclarer d'utiliser cette contrainte

      <type name="fws:dataUnit">
         <title>FWS Data Unit</title>
         <parent>fws:document</parent>

         <properties>
            <property name="fws:duRevision">
               <title>Revision number</title>
               <type>d:int</type>
               <protected>false</protected>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>1</default>
            </property>
            <property name="fws:duState">
               <type>d:text</type>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>Draft</default>
               <constraints>
                  <constraint ref="fws:duStateList" />
               </constraints>
            </property>
         </properties>
         <mandatory-aspects>
            <aspect>cm:versionable</aspect>
         </mandatory-aspects>
      </type>

Mais au parsing avec le schema, j'ai des erreurs aux deux endroits.

De toute façon, le schema ne déclare aucun elements "constraint" ou "constraints"
christophes
Member II

Re: Custom model non valide avec déclaration de contrainte

Essaye déjà de changer ton XML pour le faire correspondre à l'exemple que je t'ai donné et validé ainsi ma solution. Je suis à peu près sûr que ton erreur vient de ta syntaxe XML.

Christophe
cviaud
Member II

Re: Custom model non valide avec déclaration de contrainte

J'ai testé la déclaration suivant :

<type name="fws:dataUnit">
         <title>FWS Data Unit</title>
         <parent>fws:document</parent>

         <properties>
            <property name="fws:duRevision">
               <title>Revision number</title>
               <type>d:int</type>
               <protected>false</protected>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>1</default>
            </property>
            <property name="fws:duState">
               <type>d:text</type>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>Draft</default>
               <constraints>
                  <constraint type="LIST">
                     <parameter name="allowedValues">
                        <list>
                           <value>Draft</value>
                           <value>Created</value>
                           <value>Validated</value>
                        </list>
                     </parameter>
                  </constraint>
               </constraints>
            </property>
         </properties>
         <mandatory-aspects>
            <aspect>cm:versionable</aspect>
         </mandatory-aspects>
      </type>

Effectivement, ce code fonctionne. C'est déjà un pas de fait en avant, et merci pour cela.

Néanmoins, ce que je ne comprends pas, c'est que je ne puisse utiliser des exemples de code que j'ai trouvé à la fois sur le net (dans ce forum ou son équivalent anglophone) et dans mon livre (qui est très récent). Je vais essayer de fouiller un peu. Je repasse si j'en apprend plus.
michel
Member II

Re: Custom model non valide avec déclaration de contrainte

Bonjour,

Effectivement, ça me parait bizarre…

Regarde le fichier bpmModel.xml (Qui se trouve dans tomcat/webapps/alfresco/WEB-INF/classes/alfresco/model/bpmModel.xml) pour t'en inspirer Smiley Happy

Ce fichier définit des contraintes en débuts puis les utilises, donc ça doit être réalisable…

Bien à toi.

Michel.
cviaud
Member II

Re: Custom model non valide avec déclaration de contrainte

Je vais aller voir ton fichier.

Sinon, après une bonne semaine de prise de tête, ça a finit par fonctionner. Le jour où je pose ma question, bien sur !

Je ne suis pas bien sur de savoir quel était le problème, mais je vous livre tout de même mon code.

   <!– Introduction of new namespaces defined by this model –>
   <namespaces>
      <namespace uri="http://www.fws.si.c-s.fr/model/content/1.0"
         prefix="fws" />
   </namespaces>


   <constraints>
      <constraint name="fws:duStateList" type="LIST">
         <parameter name="allowedValues">
            <list>
               <value>Draft</value>
               <value>Created</value>
               <value>Validated</value>
            </list>
         </parameter>
      </constraint>
   </constraints>

   <types>
      <type name="fws:dataUnit">
         <title>FWS Data Unit</title>
         <parent>fws:document</parent>

         <properties>
            <property name="fws:duRevision">
               <title>Revision number</title>
               <type>d:int</type>
               <protected>true</protected>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>1</default>
            </property>
            <property name="fws:duState">
               <type>d:text</type>
               <protected>true</protected>
               <mandatory>true</mandatory>
               <multiple>false</multiple>
               <default>Draft</default>

               <constraints>
                  <constraint ref="fws:duStateList" />
               </constraints>


            </property>
         </properties>
         <mandatory-aspects>
            <aspect>cm:versionable</aspect>
            <!–
               <properties> <property name="cm:initialVersion">false</property>
               <property name="cm:autoVersion">false</property> </properties>
            –>
         </mandatory-aspects>
      </type>
   </types>

Encore merci pour vos réponses.