AnsweredAssumed Answered

Custom Constraint

Question asked by kbonnet on Mar 26, 2008
Latest reply on Nov 22, 2012 by sharifu
I'm a total newbie on the area of java. Nevertheless i wanted to try to create a custom constraint which implements databaselookups for a pick list. I found an example here on the forum.

I was able to get the java code compiled with javac against the Alfresco SDK. The result was a compiled .class file. I was not sure where to put it, so i put it in a new "classes" directory in my extensions root.

Next i created a test model, again based on the example i found, and i set the "type" parameter to my package name in the java code, extended with the name of the public class in the java code. In my case "org.contezza.customConstraints.ListOfValuesQueryConstraint".

Of course it did something wrong. When i try to deploy the model (it's a dynamic model in the data dictionary/models folder) i get the error message in the logging "Constraint type 'org.contezza.customConstraints.ListOfValuesQueryConstraint' on constraint 'test:CodeLabel' is not a well-known type or a valid Constraint implementation".

Because i was able to compile the java code against the SDK without error, i think this error has to do with the place i put the class file in. Can anyone give me a push into the right direction?

My environment is:
- Ubuntu 7.04
- Tomcat 5.5
- JDK 1.5
- MySQL 5

My (example) java code is as follows:

package org.contezza.customConstraints;

import java.util.ArrayList;
import java.util.List;
import java.sql.*;
//import org.alfresco.i18n.I18NUtil;
import org.alfresco.repo.dictionary.constraint.ListOfValuesConstraint;
import org.alfresco.web.bean.generator.BaseComponentGenerator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.faces.model.SelectItem;

public class ListOfValuesQueryConstraint extends ListOfValuesConstraint implements Serializable {

   private static Log logger = LogFactory.getLog(BaseComponentGenerator.class);

   private static final long serialVersionUID=1;

   private List<String> allowedLabels;

   public void setAllowedValues(List allowedValues) {}
   public void setCaseSensitive(boolean caseSensitive) {}

   public void initialize() {

   public List<String> getAllowedLabels() {
      return this.allowedLabels;

   public void setAllowedLabels(List<String> allowedLabels) {

    public List<SelectItem> getSelectItemList() {
      List<SelectItem> result = new ArrayList<SelectItem>(this.getAllowedValues().size());
      for(int i=0;i<this.getAllowedValues().size();i++) {
         result.add(new SelectItem((Object)this.getAllowedValues().get(i),this.allowedLabels.get(i)));
      return result;

    protected void loadDB() {

       String driverName = "";
        String serverName = "localhost";
        String mydatabase = "alfresco";
        String username = "alfresco";
        String password = "alfresco";

        List<String> av = new ArrayList<String>();
        List<String> al=new ArrayList<String>();

        try {
           Connection connection = null;
            String url = "jdbc:mysql://" + serverName +  "/" + mydatabase;
            connection = DriverManager.getConnection(url, username, password);
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("select code,label from codelabel");
            while ( {
        catch (Exception e) {}


My example model is as follows:

<?xml version="1.0" encoding="UTF-8"?>

<model name="test:test" xmlns="">
   <author>Contezza InformatieManagement</author>
      <import uri="" prefix="d" />
      <import uri="" prefix="cm" />
      <namespace uri="" prefix="test" />

   <constraint name="test:CodeLabel" type="org.contezza.customConstraints.ListOfValuesQueryConstraint">
      <parameter name="allowedValues">
   <parameter name="caseSensitive"><value>true</value></parameter>
      <type name="test:codecontent">
         <title>Contenu étendu</title>
            <property name="test:codestr">
               <title>Code str</title>
                  <constraint ref="test:CodeLabel" />