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 5My (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 java.io.Serializable;
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() {
super.setCaseSensitive(false);
this.loadDB();
}
public List<String> getAllowedLabels() {
return this.allowedLabels;
}
public void setAllowedLabels(List<String> allowedLabels) {
this.allowedLabels=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 = "org.gjt.mm.mysql.Driver";
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;
Class.forName(driverName);
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 (rs.next()) {
av.add(rs.getString("code"));
al.add(rs.getString("label"));
}
}
catch (Exception e) {}
super.setAllowedValues(av);
this.setAllowedLabels(al);
}
}
My example model is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<model name="test:test" xmlns="http://www.alfresco.org/model/dictionary/1.0">
<description></description>
<author>Contezza InformatieManagement</author>
<version>0.1</version>
<imports>
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
<import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" />
</imports>
<namespaces>
<namespace uri="http://www.contezza.nl/model/test/1.0" prefix="test" />
</namespaces>
<constraints>
<constraint name="test:CodeLabel" type="org.contezza.customConstraints.ListOfValuesQueryConstraint">
<parameter name="allowedValues">
<list>
</list>
</parameter>
<parameter name="caseSensitive"><value>true</value></parameter>
</constraint>
</constraints>
<types>
<type name="test:codecontent">
<title>Contenu étendu</title>
<parent>cm:content</parent>
<properties>
<property name="test:codestr">
<title>Code str</title>
<type>d:text</type>
<constraints>
<constraint ref="test:CodeLabel" />
</constraints>
</property>
</properties>
</type>
</types>
</model>