package org.yawlfoundation.yawl.resourcing.codelets;
import java.util.List;
import java.util.ArrayList;
import java.net.URL;
import java.util.HashMap;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.yawlfoundation.yawl.elements.data.YParameter;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
public class OpenERPCodelet extends AbstractCodelet {
public static XmlRpcClient createXMLRPCClient(String host, int port, String intrface) {
XmlRpcClient xmlrpcclnt = new XmlRpcClient();
XmlRpcClientConfigImpl xmlrpcConfig = new XmlRpcClientConfigImpl();
// xmlrpcConfig.setEnabledForExtensions(true);
try {
xmlrpcConfig.setServerURL(new URL("http",host,port,"/xmlrpc/" + intrface));
} catch (Exception e) {
Logger l = Logger.getLogger(OpenERPCodelet.class);
l.setLevel(Level.ALL);
l.error("Exception while setting server URL: " + e.getMessage());
return null;
}
xmlrpcclnt.setConfig(xmlrpcConfig);
return xmlrpcclnt;
}
public int OpenERPConnect(String url, Integer port, String db, String uname, String pwd)
{
XmlRpcClient client = createXMLRPCClient(url, port, "common");
try {
//Connect
Object id = client.execute("login", new Object[] {db,uname,pwd});
if (id instanceof Integer)
return (Integer)id;
return -1;
}
catch (Exception e)
{
Logger l = Logger.getLogger(OpenERPCodelet.class);
l.setLevel(Level.ALL);
l.error("Exception while logging in to OpenERP: " + e.getMessage());
return -3;
}
}
public OpenERPCodelet(){
super();
setDescription("This codelet accesses an OpenERP system using XML-RPC.
" +
"Inputs: URL (string), Port (integer), Database (string), Username (string), Password (string), Object (string), Method (string), Parameters (ParameterType)
" +
"Outputs: Result (ResultType) - depends on object and method
" +
"The <Parameters> (ParameterType) element must contain method parameters appropriate for the object and method");
}
public Element OpenERPSearch(Element parameters, String url, int port, String db, String uname, String pwd, String object) {
Logger l = Logger.getLogger(OpenERPCodelet.class);
l.setLevel(Level.ALL);
l.info("OpenERPSearch");
Element result = new Element("Result");
Element searchParams = parameters.getChild("SearchParameters");
if (searchParams == null)
return result.addContent(new Element("Error").addContent("Error: No search parameters supplied."));
int uid = OpenERPConnect(url, port, db, uname, pwd);
l.debug("OpenERPConnect returned " + uid);
if (uid < 0)
return result.addContent(new Element("Error").addContent("Error: Could not login to OpenERP"));
XmlRpcClient client = createXMLRPCClient(url, port, "object");
Element criteriaList = searchParams.getChild("CriteriaList");
List searchCriteria = criteriaList.getChildren("SearchCriterion");
Object[] crit = new Object[searchCriteria.size()];
for (int i = 0; i < searchCriteria.size(); i++) {
Element searchCriterion = searchCriteria.get(i);
Object Value;
Value = new String(searchCriterion.getChild("Value").getValue());
if (searchCriterion.getChild("Type") != null) {
if (searchCriterion.getChild("Type").getValue().equals("integer"))
Value = new Integer(searchCriterion.getChild("Value").getValue());
if (searchCriterion.getChild("Type").getValue().equals("long"))
Value = new Integer(searchCriterion.getChild("Value").getValue());
if (searchCriterion.getChild("Type").getValue().equals("float"))
Value = new Double(searchCriterion.getChild("Value").getValue());
if (searchCriterion.getChild("Type").getValue().equals("double"))
Value = new Double(searchCriterion.getChild("Value").getValue());
if (searchCriterion.getChild("Type").getValue().equals("boolean"))
Value = new Boolean(searchCriterion.getChild("Value").getValue());
}
crit[i] = new Object[] { searchCriterion.getChild("Argument").getValue(), searchCriterion.getChild("Operator").getValue(), Value };
l.debug("Added criterion ( " + searchCriterion.getChild("Argument").getValue() + " // " + searchCriterion.getChild("Operator").getValue() + " // " + Value + " // " + Value.getClass().getName() + " )");
}
Object[] params;
if (searchParams.getChild("Offset") != null)
if (searchParams.getChild("Limit") != null) {
params = new Object[8];
params[6] = new Integer(searchParams.getChild("Offset").getValue());
params[7] = new Integer(searchParams.getChild("Limit").getValue());
l.debug("Offset " + params[6] + " Limit " + params[7]);
} else {
params = new Object[7];
params[6] = new Integer(searchParams.getChild("Offset").getValue());
l.debug("Offset " + params[6]);
}
else {
if (searchParams.getChild("Limit") != null) {
params = new Object[8];
params[6] = new Integer(0);
params[7] = new Integer(searchParams.getChild("Limit").getValue());
l.debug("Offset " + params[6] + " Limit " + params[7]);
} else {
params = new Object[6];
l.debug("No Offset or Limit ");
}
}
params[0] = db;
params[1] = uid;
params[2] = pwd;
params[3] = object;
params[4] = "search";
params[5] = crit;
Object[] ids;
try {
ids = (Object[])client.execute("execute", params);
} catch (Exception e) {
l.error("Error while executing search: " + e.getMessage());
return result.addContent(new Element("Error").addContent("Error while executing search: " + e.getMessage()));
}
l.debug("Found " + ids.length + " records");
Element searchResults = new Element("SearchResults");
Element IDlist = new Element("IDList");
searchResults.addContent(IDlist);
result.addContent(searchResults);
for (int i=0; i fieldValuePairs = fieldValuePairList.getChildren("FieldValuePair");
HashMap hm = new HashMap();
for (int i = 0; i < fieldValuePairs.size(); i++) {
Element fieldValuePair = fieldValuePairs.get(i);
Object Value;
Value = new String(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type") != null) {
if (fieldValuePair.getChild("Type").getValue().equals("integer"))
Value = new Integer(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("long"))
Value = new Integer(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("float"))
Value = new Double(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("double"))
Value = new Double(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("boolean"))
Value = new Boolean(fieldValuePair.getChild("Value").getValue());
}
hm.put( fieldValuePair.getChild("Field").getValue(), Value );
l.debug("Added HashMap Entry (" + fieldValuePair.getChild("Field").getValue() + " // " + Value + " // " + Value.getClass().getName() + ")");
}
Object[] params = new Object[6];
params[0] = db;
params[1] = uid;
params[2] = pwd;
params[3] = object;
params[4] = "create";
params[5] = hm;
Object id;
try {
id = client.execute("execute", params);
} catch (Exception e) {
l.error("Error while executing create: " + e.getMessage());
return result.addContent(new Element("Error").addContent("Error while executing create: " + e.getMessage()));
}
Element createResults = new Element("CreateResults");
Element IDelement = new Element("ID");
IDelement.addContent(id.toString());
createResults.addContent(IDelement);
result.addContent(createResults);
return result;
}
public Element OpenERPWrite(Element parameters, String url, int port, String db, String uname, String pwd, String object) {
Logger l = Logger.getLogger(OpenERPCodelet.class);
l.setLevel(Level.ALL);
l.info("OpenERPWrite");
Element result = new Element("Result");
Element writeParams = parameters.getChild("WriteParameters");
if (writeParams == null)
return result.addContent(new Element("Error").addContent("Error: No write parameters supplied."));
int uid = OpenERPConnect(url, port, db, uname, pwd);
l.debug("OpenERPConnect returned " + uid);
if (uid < 0)
return result.addContent(new Element("Error").addContent("Error: Could not login to OpenERP"));
XmlRpcClient client = createXMLRPCClient(url, port, "object");
Element fieldValuePairList = writeParams.getChild("FieldValuePairList");
List fieldValuePairs = fieldValuePairList.getChildren("FieldValuePair");
HashMap hm = new HashMap();
for (int i = 0; i < fieldValuePairs.size(); i++) {
Element fieldValuePair = fieldValuePairs.get(i);
Object Value;
Value = new String(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type") != null) {
if (fieldValuePair.getChild("Type").getValue().equals("integer"))
Value = new Integer(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("long"))
Value = new Integer(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("float"))
Value = new Double(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("double"))
Value = new Double(fieldValuePair.getChild("Value").getValue());
if (fieldValuePair.getChild("Type").getValue().equals("boolean"))
Value = new Boolean(fieldValuePair.getChild("Value").getValue());
}
hm.put(fieldValuePair.getChild("Field").getValue(), Value );
l.debug("Added HashMap Entry (" + fieldValuePair.getChild("Field").getValue() + " // " + Value + " // " + Value.getClass().getName() + ")");
}
Element idListElement = writeParams.getChild("IDList");
List idsElement = idListElement.getChildren("ID");
Integer[] ids = new Integer[idsElement.size()];
for (int i = 0; i < idsElement.size(); i++) {
Element idElement = idsElement.get(i);
ids[i] = new Integer(idElement.getValue());
l.debug("Added ID entry (" + ids[i] + ")");
}
Object[] params = new Object[7];
params[0] = db;
params[1] = uid;
params[2] = pwd;
params[3] = object;
params[4] = "write";
params[5] = ids;
params[6] = hm;
try {
client.execute("execute", params);
} catch (Exception e) {
l.error("Error while executing write: " + e.getMessage());
return result.addContent(new Element("Error").addContent("Error while executing write: " + e.getMessage()));
}
result.addContent(new Element("WriteResults").addContent("true"));
return result;
}
public Element OpenERPRead(Element parameters, String url, int port, String db, String uname, String pwd, String object) {
Logger l = Logger.getLogger(OpenERPCodelet.class);
l.setLevel(Level.ALL);
l.info("OpenERPRead");
Element result = new Element("Result");
Element readParams = parameters.getChild("ReadParameters");
if (readParams == null)
return result.addContent(new Element("Error").addContent("Error: No read parameters supplied."));
int uid = OpenERPConnect(url, port, db, uname, pwd);
l.debug("OpenERPConnect returned " + uid);
if (uid < 0)
return result.addContent(new Element("Error").addContent("Error: Could not login to OpenERP"));
XmlRpcClient client = createXMLRPCClient(url, port, "object");
Object[] params;
Element idListElement = readParams.getChild("IDList");
List idsElement = idListElement.getChildren("ID");
Object[] ids = new Object[idsElement.size()];
for (int i = 0; i < idsElement.size(); i++) {
Element idElement = idsElement.get(i);
ids[i] = new Integer(idElement.getValue());
l.debug("Added ID entry (" + ids[i] + ")");
}
Object[] fields = null;
Element fieldListElement = readParams.getChild("FieldList");
if (fieldListElement != null) {
params = new Object[7];
List fieldsElement = fieldListElement.getChildren("Field");
fields = new Object[fieldsElement.size()];
for (int i = 0; i < fieldsElement.size(); i++) {
Element fieldElement = fieldsElement.get(i);
fields[i] = fieldElement.getValue();
l.debug("Added fields entry (" + fields[i] + ")");
}
params[6] = fields;
} else {
params = new Object[6];
l.debug("No fields specified");
}
params[0] = db;
params[1] = uid;
params[2] = pwd;
params[3] = object;
params[4] = "read";
params[5] = ids;
Object[] info;
try {
info = (Object[])client.execute("execute", params);
} catch (Exception e) {
l.error("Error while executing read: " + e.getMessage());
return result.addContent(new Element("Error").addContent("Error while executing read: " + e.getMessage()));
}
Element readResults = new Element("ReadResults");
result.addContent(readResults);
l.debug("Read " + info.length + " records");
for (int i=0; i hm = (HashMap