Bonjour à Tous et à Toutes,J'utilise actuellement...

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

Bonjour à Tous et à Toutes,J'utilise actuellement...

Bonjour à Tous et à Toutes,

J'utilise actuellement Alfresco 2.0 sous windows avec Mysql,Tomcat 5.5 et le JDK 1.5

J'ai créé une nouvelle classe qui hérite de la classe
org.alfresco.repo.dictionary.constraint.ListOfValuesConstraint
Cette classe me permet d'aller chercher dans une nouvelle instance mysql les données contenues dans une table, mettre ces données dans une ArrayList et de passer cette liste à la méthode
setAllowedValues
de la classe héritée. De cette manière je peux bénéficier d'une contrainte de type LIST dynamique. Voici le code de ma classe

package be.test.alfresco.constraint;

import java.sql.Connection;
import java.util.ArrayList;

import org.alfresco.repo.dictionary.constraint.ListOfValuesConstraint;
import org.apache.commons.logging.Log;[quote]import org.apache.commons.logging.LogFactory;

import be.test.alfresco.utility.db.DbUtils;
import be.test.alfresco.utility.db.SqlHelper;

public class ListCiviliteConstraint extends ListOfValuesConstraint {
   private static Log logger = LogFactory.getLog("be.nsi.alfresco.constraint.DbUtils");
   
   public ListCiviliteConstraint() {
      super();
      super.setAllowedValues(getCivilite());
   }
   
   /**
    * Va rechercher la liste des Civilites dans la base de donnée
    * @return la liste des Civilites
    */
   private ArrayList getCivilite(){
      ArrayList civilites=null;
      Connection conn=null;
      
      try {
         conn = DbUtils.getDbConnection();
         civilites = SqlHelper.getAllCivilitesType(conn);
          DbUtils.closeDbConnection(conn);
      } catch (Exception e) {
         logger.error(e.getMessage());
      }[/quote]
return civilites;
   }

}
Aprés avoir testé (avec une classe test) cette classe tout fonctionne correctement.

C'est maintenant que cela ce complique Smiley Happy

J'ai un fichier customModel.xml dans lequel :

Je défini ma contrainte comme ceci

<constraints>
      [b]<constraint name="Identification:ctrCivilite" type="be.test.alfresco.constraint.ListCiviliteConstraint">
      </constraint>[/b]
   </constraints>
J’applique cette contrainte sur un custom aspect
<aspect name="Identification:Personne">
         <title>Identification Personne</title>

         <properties>
            <property name="Identification:Civilite">
               <title>Civilite</title>

               <type>d:text</type>

               <constraints>
                  [b]<constraint ref="Identification:ctrCivilite" />[/b]
               </constraints>
                ………
            </property>
Je génère un jar avec mes nouvelles classes que je place dans le répertoire
webappsalfrescoWEB-INFlib
de tomcat

Je démarre Alfresco et la j'obtiens le message suivant dans le log file
org.alfresco.service.cmr.dictionary.DictionaryException: Constraint type 'be.test.alfresco.constraint.ListCiviliteConstraint' on constraint 'Identification:ctrCivilite' is not a well-known type or a valid Constraint implementation
   at org.alfresco.repo.dictionary.M2ConstraintDefinition.resolveInternal(M2ConstraintDefinition.java:176)
   at org.alfresco.repo.dictionary.M2ConstraintDefinition.resolveDependencies(M2ConstraintDefinition.java:117)
   at org.alfresco.repo.dictionary.CompiledModel.<init>(CompiledModel.java:107)
On dirait que ma nouvelle classe n'a pas été correctement déployée.

Si quelqu'un à une idée il est le bien venu Smiley Wink

Merci d'avance
12 Replies
xantrax
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Comme on dit on est jamais mieux servit que ……….

Voici la solution

1. Modier le fichier customModel.xml

   <constraints>
      <constraint name="Identification:ctrCivilite" type="be.nsi.alfresco.constraint.ListCiviliteConstraint">
   <parameter name="allowedValues">
      <list>
      </list>
   </parameter>
   <parameter name="caseSensitive"><value>true</value></parameter>
      </constraint>
En effet comme on herite de la classe org.alfresco.repo.dictionary.constraint.ListOfValuesConstraint on herite aussi de ces propriétés!!!!

Ensuite il n'y aplus qu'a redefinir les méthodes getAllowedValues (peut être pas obligatoire) et setAllowedValues

Voici le nouveau code de ma classe

package be.test.alfresco.constraint;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import org.alfresco.repo.dictionary.constraint.ListOfValuesConstraint;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import be.nsi.alfresco.utility.db.DbUtils;
import be.nsi.alfresco.utility.db.SqlHelper;

public class ListCiviliteConstraint extends ListOfValuesConstraint {
   private static Log logger = LogFactory.getLog("be.nsi.alfresco.constraint.DbUtils");
   
   public ListCiviliteConstraint() {
      super();
      logger.debug("Appel supperConstructeur");
      //setAllowedValues(getCivilite());
   }
   
   
    public List<String> getAllowedValues()
    {
       
       logger.debug("getAllowedValues ");
        return super.getAllowedValues();
    }
   
    public void setAllowedValues(List allowedValues)
    {
       
       if (allowedValues == null)
       {
          allowedValues=getCivilite();
       }
       logger.debug("setAllowedValues Avant super.set");
       super.setAllowedValues(allowedValues) ;
       logger.debug("setAllowedValues Aprés super.set");
    }
   
   /**
    * Va rechercher la liste des Civilites dans la base de données
    * @return la liste des Civilites
    */
   private ArrayList<String> getCivilite(){
      ArrayList<String> civilites=null;
      Connection conn=null;
      
      try {
         conn = DbUtils.getDbConnection();
         civilites = SqlHelper.getAllCivilitesType(conn);
          DbUtils.closeDbConnection(conn);
      } catch (Exception e) {
         logger.error(e.getMessage());
      }

      return civilites;
   }

}
et voila…
huberd
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Bonjour, je suis nouveau dans le développement Java et la mise en place d'Alfresco et suis très intéressé par ton exemple mais ne connaissant pas java je ne vois pas comment tu as écris les routines be.nsi.alfresco.utility.db.DbUtils et
be.nsi.alfresco.utility.db.SqlHelper qui contiennent les fonctions de connexion à la base de donnée ainsi que la fonction qui te retourne la liste des enregistrements qui constitue ta liste de civilité. Serait-il possible de mettre en ligne également les 2 imports en questions ?
Je te remercie d'avance.

Dans mon cas de figure, je souhaite développer dans un même aspect 3 listes qui sont conditionnées entre elles. Le choix sur la première doit réaliser un filtre automatique sur la seconde, quand à la troisième aucun filtre ne doit être mis en place et doit  afficher tous ses éléments. Je souhaite également grâce à ton exemple rendre ces liste dynamiques grâce à une base de données mySQL.

Je cherche également à faire en sorte qu'une fois ces choix validés, l'utilisateur ne puisse plus interagir sur les listes.

D'avance Merci.
huberd
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Comme on dit, on est jamais mieux servit que par soit même.

Bon j'ai fini par trouver comment écrire le code des 2 routines, et cela m'a permis d'y voir un peu plus claire dans le développement Java. Si cela interesse quelqu'un….
remi_8250
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Bon j'ai fini par trouver comment écrire le code des 2 routines, et cela m'a permis d'y voir un peu plus claire dans le développement Java. Si cela interesse quelqu'un….
Bonjour Huberd,

J'ai approximativement le même besoin que toi (listes conditionés entre elles), et je me perd un peu dans le développement Java, pourrais-je avoir quelques pistes ?

Pour l'instant je bloque sur la façon de récupérer la valeur d'une liste, afin de l'utiliser dans la contrainte de l'autre… Smiley Sad

Merci d'avance
huberd
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Comment fais-tu pour te connecter à la base de données ?
Codes-tu en dur les login et mot de passe dans ton code source ou utilises-tu le fichier de configuration d'Alfresco ?
Concernant la génération de liste dynamlique en fonction des choix de la précédente, j'ai bien peur que cela ne soit pas possible, car le code Java est executé une seule fois au démarrge de Tomcat (ou JBoss) et charge les fichiers models en mêmeoire avec les listes.

Si quelqu'un à une solution, je pense que remi et moi même serons tous les 2 preneurs Smiley Wink
jaick
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Bonjour Huberd,

Etant aussi débutant dans l'univers Java, je souhaiterais vivement que tu mettes en ligne les 2 routines pour la connexion à la db.
En effet je souhaite créer une liste deroulante qui cherche ses valeures dans une table mysql.
Pour ma part je code en dur login et password…

Merci beaucoup :-)
jaick
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Bonjour,

Excusez moi d'etre impatient, mais je souhaitais vraiment mettre en place cette fameuse liste et là je seche énormement…
Si quelqu un pouvait répondre à mon appel…
Merci d avance
xantrax
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Salut à Tous,

Voici mes classes DbUtils et SQLHelper.
En fait dans ces deux classes je définis des méthodes statiques de maniére à pouvoir appeler leurs méthodes sans les instancier. Pour me connecter à la db j'utilise jdbc. C'est pas trés joli, la meilleure solution pour moi étant de profiter de spring et d'hibernate. Mais bon pour le moment jdbc me permet de faire des tests assez rapidement.

public class DbUtils{
   
   public static Connection getDbConnection()throws Exception{
      Connection conn = null;
      
      try{
         
         String url = "jdbc:mysql://localhost/nouvelleInstance";
         String user = "nouveauUser";
         String password = "nouveau mot de passe";
         String driver = "org.gjt.mm.mysql.Driver";
         
         //Charger le driver
         Class.forName(driver).newInstance();
         //se connecter
         conn = DriverManager.getConnection(url,user,password);
         
         return conn;
      }catch(Exception e){
         throw new Exception(e.getMessage());
      }
      
   }
   
   public static void closeDbConnection(Connection conn)throws Exception
   {
      
      try {
         conn.close();
      } catch (SQLException e) {
         throw new Exception(e.getMessage());
      }
   }
   
}
public class SqlHelper {
   
    public static ArrayList<String> getAllCivilitesType(Connection conn)throws Exception{
      Statement stmt = null;
      String requete;
      ResultSet rs = null;
      ArrayList<String> listCivilites = new ArrayList<String>();
      
      try {
         stmt=conn.createStatement();
         requete = "SELECT TYPE FROM CIVILITES";
         rs = stmt.executeQuery(requete);
         while(rs.next()){
            listCivilites.add(rs.getString("TYPE"));
         }
         return listCivilites;
      }catch (SQLException e) {
         throw new Exception(e.getMessage());
      }
      finally{
         try {
            rs.close();
            stmt.close();
         } catch (SQLException e) {
            throw new Exception(e.getMessage());
         }
         
      }
   }
   
}
CIVILITES est une nouvelle table de ma nouvelle instance mysql et contient une colonne TYPE
Voila. Bonne chance Smiley Wink
jaick
Member II

Re: Bonjour à Tous et à Toutes,J'utilise actuellement...

Salut Xavier,

Un grand merci à toi, ça marche au poil !  Smiley Very Happy