IDEMPIERE-460 Integrate and migrate 3e services. Added lookup support for web services to ease the building of idempiere web service client in webui or swing.
This commit is contained in:
parent
284104f96f
commit
c692c7e19e
|
@ -0,0 +1,227 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2013 Heng Sin Low *
|
||||
* Copyright (C) 2013 Trek Global *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.idempiere.webservices.client;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import javax.xml.soap.MessageFactory;
|
||||
import javax.xml.soap.SOAPBody;
|
||||
import javax.xml.soap.SOAPConnection;
|
||||
import javax.xml.soap.SOAPConnectionFactory;
|
||||
import javax.xml.soap.SOAPEnvelope;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
import javax.xml.soap.SOAPPart;
|
||||
|
||||
import org.apache.axis.soap.MessageFactoryImpl;
|
||||
import org.apache.axis.soap.SOAPConnectionFactoryImpl;
|
||||
import org.compiere.model.Lookup;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.NamePair;
|
||||
import org.compiere.util.ValueNamePair;
|
||||
import org.idempiere.adInterface.x10.ADLoginRequest;
|
||||
import org.idempiere.adInterface.x10.DataField;
|
||||
import org.idempiere.adInterface.x10.DataRow;
|
||||
import org.idempiere.adInterface.x10.DataSet;
|
||||
import org.idempiere.adInterface.x10.ModelGetList;
|
||||
import org.idempiere.adInterface.x10.ModelGetListRequest;
|
||||
import org.idempiere.adInterface.x10.ModelGetListRequestDocument;
|
||||
import org.idempiere.adInterface.x10.WindowTabData;
|
||||
import org.idempiere.adInterface.x10.WindowTabDataDocument;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class GetListLookup extends Lookup {
|
||||
|
||||
/**
|
||||
* generated serial id
|
||||
*/
|
||||
private static final long serialVersionUID = -137206840260406730L;
|
||||
private String filter;
|
||||
private String serviceType;
|
||||
private String endPoint;
|
||||
private String keyColumn;
|
||||
private String displayColumn;
|
||||
|
||||
private volatile LinkedHashMap<Object,NamePair> dataMap = new LinkedHashMap<Object, NamePair>();
|
||||
private boolean m_refreshing = false;
|
||||
private ADLoginRequest login;
|
||||
|
||||
/**
|
||||
* @param windowNo
|
||||
* @param login
|
||||
* @param keyColumn
|
||||
* @param displayColumn
|
||||
* @param filter
|
||||
* @param endPoint
|
||||
* @param serviceType
|
||||
*/
|
||||
public GetListLookup(int windowNo, ADLoginRequest login, String keyColumn, String displayColumn, String filter, String endPoint, String serviceType) {
|
||||
super(DisplayType.Table, windowNo);
|
||||
this.keyColumn = keyColumn;
|
||||
this.displayColumn = displayColumn;
|
||||
this.filter = filter;
|
||||
this.endPoint = endPoint;
|
||||
this.serviceType = serviceType;
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getDisplay(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public String getDisplay(Object key) {
|
||||
NamePair pair = dataMap.get(key);
|
||||
return pair != null ? pair.getName() : "";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#get(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public NamePair get(Object key) {
|
||||
return dataMap.get(key);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getData(boolean, boolean, boolean, boolean, boolean)
|
||||
*/
|
||||
@Override
|
||||
public ArrayList<Object> getData(boolean mandatory, boolean onlyValidated,
|
||||
boolean onlyActive, boolean temporary, boolean shortlist) {
|
||||
ClassLoader cl = Thread.currentThread().getContextClassLoader();
|
||||
SOAPConnectionFactory cf;
|
||||
try {
|
||||
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
|
||||
dataMap = new LinkedHashMap<Object, NamePair>();
|
||||
cf = new SOAPConnectionFactoryImpl();
|
||||
SOAPConnection conn = cf.createConnection();
|
||||
// Create a SOAPMessage instance
|
||||
MessageFactory mf = new MessageFactoryImpl();
|
||||
SOAPMessage message = mf.createMessage();
|
||||
// Create a SOAP envelope and body
|
||||
SOAPPart part = message.getSOAPPart();
|
||||
SOAPEnvelope env = part.getEnvelope();
|
||||
SOAPBody body = env.getBody();
|
||||
|
||||
ModelGetListRequestDocument getListDocument = ModelGetListRequestDocument.Factory.newInstance();
|
||||
ModelGetListRequest getListRequest = getListDocument.addNewModelGetListRequest();
|
||||
|
||||
getListRequest.setADLoginRequest(login);
|
||||
ModelGetList getList = getListRequest.addNewModelGetList();
|
||||
getList.setFilter(filter);
|
||||
getList.setServiceType(serviceType);
|
||||
|
||||
body.addDocument((Document) getListDocument.getDomNode());
|
||||
|
||||
// Invoke the service endpoint
|
||||
URL endpoint = new URL(endPoint);
|
||||
|
||||
SOAPMessage responseMsg = null;
|
||||
try {
|
||||
responseMsg = conn.call(message, endpoint);
|
||||
} finally {
|
||||
conn.close();
|
||||
}
|
||||
|
||||
if (responseMsg != null && responseMsg.getSOAPBody() != null)
|
||||
{
|
||||
if (responseMsg.getSOAPBody().hasFault())
|
||||
{
|
||||
throw new RuntimeException(responseMsg.getSOAPBody().getFault().getFaultString());
|
||||
}
|
||||
|
||||
WindowTabDataDocument responseDoc = WindowTabDataDocument.Factory.parse(responseMsg.getSOAPBody().getFirstChild().getFirstChild());
|
||||
WindowTabData windowTabData = responseDoc.getWindowTabData();
|
||||
if (windowTabData.isSetError())
|
||||
{
|
||||
throw new RuntimeException(windowTabData.getError());
|
||||
}
|
||||
DataSet dataset = windowTabData.getDataSet();
|
||||
DataRow[] dataRows = dataset.getDataRowArray();
|
||||
for(DataRow dataRow : dataRows)
|
||||
{
|
||||
DataField[] dataFields = dataRow.getFieldArray();
|
||||
String key = null;
|
||||
String display = null;
|
||||
for(DataField dataField : dataFields)
|
||||
{
|
||||
if (dataField.getColumn().equals(keyColumn))
|
||||
{
|
||||
key = dataField.getVal();
|
||||
}
|
||||
else if (dataField.getColumn().equals(displayColumn))
|
||||
{
|
||||
display = dataField.getVal();
|
||||
}
|
||||
}
|
||||
if (key != null && display != null)
|
||||
{
|
||||
dataMap.put(key, new ValueNamePair(key, display));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof RuntimeException)
|
||||
throw (RuntimeException)e;
|
||||
else
|
||||
throw new RuntimeException(e.getLocalizedMessage(), e);
|
||||
} finally {
|
||||
Thread.currentThread().setContextClassLoader(cl);
|
||||
}
|
||||
return new ArrayList<Object>(dataMap.values());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getColumnName()
|
||||
*/
|
||||
@Override
|
||||
public String getColumnName() {
|
||||
return keyColumn;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#containsKey(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
return dataMap.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh & return number of items read.
|
||||
* Get get data of parent lookups
|
||||
* @return no of items read
|
||||
*/
|
||||
@Override
|
||||
public int refresh ()
|
||||
{
|
||||
if (m_refreshing ) return 0;
|
||||
|
||||
try
|
||||
{
|
||||
m_refreshing = true;
|
||||
fillComboBox(isMandatory(), true, true, false, isShortList());
|
||||
return dataMap.size();
|
||||
}
|
||||
finally
|
||||
{
|
||||
m_refreshing = false;
|
||||
}
|
||||
} // refresh
|
||||
}
|
|
@ -0,0 +1,243 @@
|
|||
/******************************************************************************
|
||||
* Copyright (C) 2013 Heng Sin Low *
|
||||
* Copyright (C) 2013 Trek Global *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program is distributed in the hope *
|
||||
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||
* See the GNU General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.idempiere.webservices.client;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.soap.MessageFactory;
|
||||
import javax.xml.soap.SOAPBody;
|
||||
import javax.xml.soap.SOAPConnection;
|
||||
import javax.xml.soap.SOAPConnectionFactory;
|
||||
import javax.xml.soap.SOAPEnvelope;
|
||||
import javax.xml.soap.SOAPMessage;
|
||||
import javax.xml.soap.SOAPPart;
|
||||
|
||||
import org.apache.axis.soap.MessageFactoryImpl;
|
||||
import org.apache.axis.soap.SOAPConnectionFactoryImpl;
|
||||
import org.compiere.model.Lookup;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.NamePair;
|
||||
import org.idempiere.adInterface.x10.ADLoginRequest;
|
||||
import org.idempiere.adInterface.x10.DataField;
|
||||
import org.idempiere.adInterface.x10.DataRow;
|
||||
import org.idempiere.adInterface.x10.DataSet;
|
||||
import org.idempiere.adInterface.x10.ModelCRUD;
|
||||
import org.idempiere.adInterface.x10.ModelCRUDRequest;
|
||||
import org.idempiere.adInterface.x10.ModelCRUDRequestDocument;
|
||||
import org.idempiere.adInterface.x10.WindowTabData;
|
||||
import org.idempiere.adInterface.x10.WindowTabDataDocument;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class QueryDataLookup extends Lookup {
|
||||
|
||||
/**
|
||||
* generated serial id
|
||||
*/
|
||||
private static final long serialVersionUID = -137206840260406730L;
|
||||
private String filter;
|
||||
private String serviceType;
|
||||
private String endPoint;
|
||||
private String keyColumn;
|
||||
private String displayColumn;
|
||||
|
||||
private volatile LinkedHashMap<Integer,KeyNamePair> dataMap = new LinkedHashMap<Integer, KeyNamePair>();
|
||||
private boolean m_refreshing = false;
|
||||
private ADLoginRequest login;
|
||||
|
||||
/**
|
||||
* @param windowNo
|
||||
* @param login
|
||||
* @param keyColumn
|
||||
* @param displayColumn
|
||||
* @param filter
|
||||
* @param endPoint
|
||||
* @param serviceType
|
||||
*/
|
||||
public QueryDataLookup(int windowNo, ADLoginRequest login, String keyColumn, String displayColumn, String filter, String endPoint, String serviceType) {
|
||||
super(DisplayType.Table, windowNo);
|
||||
this.keyColumn = keyColumn;
|
||||
this.displayColumn = displayColumn;
|
||||
this.filter = filter;
|
||||
this.endPoint = endPoint;
|
||||
this.serviceType = serviceType;
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getDisplay(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public String getDisplay(Object key) {
|
||||
KeyNamePair pair = dataMap.get(key);
|
||||
return pair != null ? pair.getName() : "";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#get(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public NamePair get(Object key) {
|
||||
return dataMap.get(key);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getData(boolean, boolean, boolean, boolean, boolean)
|
||||
*/
|
||||
@Override
|
||||
public ArrayList<Object> getData(boolean mandatory, boolean onlyValidated,
|
||||
boolean onlyActive, boolean temporary, boolean shortlist) {
|
||||
ClassLoader cl = Thread.currentThread().getContextClassLoader();
|
||||
SOAPConnectionFactory cf;
|
||||
try {
|
||||
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
|
||||
dataMap = new LinkedHashMap<Integer, KeyNamePair>();
|
||||
cf = new SOAPConnectionFactoryImpl();
|
||||
SOAPConnection conn = cf.createConnection();
|
||||
// Create a SOAPMessage instance
|
||||
MessageFactory mf = new MessageFactoryImpl();
|
||||
SOAPMessage message = mf.createMessage();
|
||||
// Create a SOAP envelope and body
|
||||
SOAPPart part = message.getSOAPPart();
|
||||
SOAPEnvelope env = part.getEnvelope();
|
||||
SOAPBody body = env.getBody();
|
||||
|
||||
ModelCRUDRequestDocument crudDocument = ModelCRUDRequestDocument.Factory.newInstance();
|
||||
ModelCRUDRequest crudRequest = crudDocument.addNewModelCRUDRequest();
|
||||
crudRequest.setADLoginRequest(login);
|
||||
|
||||
ModelCRUD crud = crudRequest.addNewModelCRUD();
|
||||
crud.setRecordID(0);
|
||||
crud.setFilter(filter);
|
||||
crud.setAction(ModelCRUD.Action.READ);
|
||||
crud.setServiceType(serviceType);
|
||||
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
Document document = builder.newDocument();
|
||||
Element element = document.createElementNS("http://idempiere.org/ADInterface/1_0", "queryData");
|
||||
Node domNode = document.importNode(crudDocument.getDomNode().getFirstChild(), true);
|
||||
document.appendChild(element);
|
||||
element.appendChild(domNode);
|
||||
|
||||
body.addDocument(document);
|
||||
|
||||
// Invoke the service endpoint
|
||||
URL endpoint = new URL(endPoint);
|
||||
|
||||
SOAPMessage responseMsg = null;
|
||||
|
||||
try {
|
||||
responseMsg = conn.call(message, endpoint);
|
||||
} finally {
|
||||
conn.close();
|
||||
}
|
||||
|
||||
if (responseMsg != null && responseMsg.getSOAPBody() != null)
|
||||
{
|
||||
if (responseMsg.getSOAPBody().hasFault())
|
||||
{
|
||||
throw new RuntimeException(responseMsg.getSOAPBody().getFault().getFaultString());
|
||||
}
|
||||
WindowTabDataDocument responseDoc = WindowTabDataDocument.Factory.parse(responseMsg.getSOAPBody().getFirstChild().getFirstChild());
|
||||
WindowTabData windowTabData = responseDoc.getWindowTabData();
|
||||
if (windowTabData.isSetError())
|
||||
{
|
||||
throw new RuntimeException(windowTabData.getError());
|
||||
}
|
||||
|
||||
DataSet dataset = windowTabData.getDataSet();
|
||||
DataRow[] dataRows = dataset.getDataRowArray();
|
||||
for(DataRow dataRow : dataRows)
|
||||
{
|
||||
DataField[] dataFields = dataRow.getFieldArray();
|
||||
String key = null;
|
||||
String display = null;
|
||||
for(DataField dataField : dataFields)
|
||||
{
|
||||
if (dataField.getColumn().equals(keyColumn))
|
||||
{
|
||||
key = dataField.getVal();
|
||||
}
|
||||
else if (dataField.getColumn().equals(displayColumn))
|
||||
{
|
||||
display = dataField.getVal();
|
||||
}
|
||||
}
|
||||
if (key != null && display != null)
|
||||
{
|
||||
Integer id = new Integer(key);
|
||||
dataMap.put(id, new KeyNamePair(id, display));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (e instanceof RuntimeException)
|
||||
throw (RuntimeException)e;
|
||||
else
|
||||
throw new RuntimeException(e.getLocalizedMessage(), e);
|
||||
} finally {
|
||||
Thread.currentThread().setContextClassLoader(cl);
|
||||
}
|
||||
return new ArrayList<Object>(dataMap.values());
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#getColumnName()
|
||||
*/
|
||||
@Override
|
||||
public String getColumnName() {
|
||||
return keyColumn;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.compiere.model.Lookup#containsKey(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
return dataMap.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh & return number of items read.
|
||||
* Get get data of parent lookups
|
||||
* @return no of items read
|
||||
*/
|
||||
@Override
|
||||
public int refresh ()
|
||||
{
|
||||
if (m_refreshing ) return 0;
|
||||
|
||||
try
|
||||
{
|
||||
m_refreshing = true;
|
||||
fillComboBox(isMandatory(), true, true, false, isShortList());
|
||||
return dataMap.size();
|
||||
}
|
||||
finally
|
||||
{
|
||||
m_refreshing = false;
|
||||
}
|
||||
} // refresh
|
||||
}
|
Loading…
Reference in New Issue