// Wanda POS - Africa's Gift to the World
// Copyright (c) 2014-2015 IT-Kamer & previous Unicenta POS and Openbravo POS works
// www.erp-university-africa.com
//
// This file is part of Wanda POS
//
// Wanda POS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Wanda POS 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 Wanda POS. If not, see <http://www.gnu.org/licenses/>.
package cm.wandapos.webservices.implementation;
import cm.wandapos.webservices.data.AbstractWebService;
import cm.wandapos.webservices.data.DatabaseDocument;
import cm.wandapos.webservices.data.StandardResponseDocument;
import cm.wandapos.webservices.fields.DataField;
import cm.wandapos.webservices.fields.DataRow;
import cm.wandapos.webservices.fields.DataSet;
import cm.wandapos.webservices.interfaces.IModelWebService;
import cm.wandapos.webservices.model.MWebServicePara;
import cm.wandapos.webservices.model.MWebServiceType;
import cm.wandapos.webservices.model.ModelCRUD;
import cm.wandapos.webservices.model.ModelCRUDRequest;
import com.openbravo.basic.BasicException;
import com.openbravo.data.loader.Datas;
import com.openbravo.data.loader.SerializerReadBasic;
import com.openbravo.data.loader.SerializerWriteBasic;
import com.openbravo.pos.forms.AppView;
import com.truemesh.squiggle.SelectQuery;
import com.truemesh.squiggle.Table;
import com.truemesh.squiggle.criteria.MatchCriteria;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.jws.WebService;
/**
*
* @author Ing. Tatioti Mbogning Raoul
*/
@WebService(endpointInterface = "cm.wandapos.webservices.interfaces.IModelWebService")
public class ModelWebService extends AbstractWebService implements IModelWebService {
private final String m_webServiceName = "ModelWebService";
public ModelWebService(AppView app) {
super(app);
}
@Override
public DatabaseDocument readData(ModelCRUDRequest request) {
DatabaseDocument responseDocument = new DatabaseDocument();
try {
/**
* Login Return an error message if there is an error Return null if
* there is no errors
*/
String error = login(request.getLoginRequest(), m_webServiceName, "readData", request.getModelCRUD().getServiceType());
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
MWebServiceType webServiceType = m_dlWebService.getWebServiceType(request.getModelCRUD().getServiceType());
// Validate web service type parameters
error = validateParameters(request.getModelCRUD(), webServiceType);
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
List<String> outputFields = m_dlWebService.getOutputFields(webServiceType.getId());
// Contruct SQL Query
SelectQuery query = new SelectQuery();
Table table = new Table(request.getModelCRUD().getTableName());
// Add output fields and construct SerializerRead
SerializerReadBasic serializerRead = new SerializerReadBasic();
for (String column : outputFields) {
query.addColumn(table, column);
serializerRead.addClasse(Datas.OBJECT);
}
// Add where clause
query.addCriteria(new MatchCriteria(table, "ID", MatchCriteria.EQUALS, "?"));
List<Object[]> listDatas = m_dlWebService.getDatas(m_appView.getSession(), query.toString(), new SerializerWriteBasic(new Datas[]{Datas.STRING}),
serializerRead, request.getModelCRUD().getRecordID());
// Construct the DataSet
DataSet dataSet = new DataSet();
for (Object[] data : listDatas) {
DataRow dataRow = new DataRow();
for (int i = 0; i < data.length; ++i) {
DataField dataField = new DataField();
dataField.setColumnName(outputFields.get(i));
dataField.setValue((String) data[i]);
dataRow.addDataField(dataField);
}
dataSet.addDataRow(dataRow);
}
responseDocument.setStartRow(1);
responseDocument.setNumRows(listDatas.size());
responseDocument.setTotalRows(listDatas.size());
responseDocument.setDataSet(dataSet);
} catch (BasicException ex) {
DatabaseDocument errorDocument = new DatabaseDocument();
errorDocument.setError(ex.getMessage());
return errorDocument;
}
return responseDocument;
}
@Override
public DatabaseDocument queryData(ModelCRUDRequest request) {
DatabaseDocument responseDocument = new DatabaseDocument();
try {
/**
* Login Return an error message if there is an error Return null if
* there is no errors
*/
String error = login(request.getLoginRequest(), m_webServiceName, "readData", request.getModelCRUD().getServiceType());
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
MWebServiceType webServiceType = m_dlWebService.getWebServiceType(request.getModelCRUD().getServiceType());
// Validate web service type parameters
error = validateParameters(request.getModelCRUD(), webServiceType);
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
List<String> outputFields = m_dlWebService.getOutputFields(webServiceType.getId());
List<String[]> inputFields = m_dlWebService.getInputFields(webServiceType.getId());
// Validate input columns
if (inputFields != null) {
List<String> inputFieldColumns = new ArrayList<>();
for (String[] field : inputFields)
inputFieldColumns.add(field[1]);
error = validateInputColumns(request.getModelCRUD(), inputFieldColumns);
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
}
// Contruct SQL Query
SelectQuery query = new SelectQuery();
Table table = new Table(request.getModelCRUD().getTableName());
// Add output columns and construct SerializerRead
SerializerReadBasic serializerRead = new SerializerReadBasic();
for (String column : outputFields) {
query.addColumn(table, column);
serializerRead.addClasse(Datas.OBJECT);
}
// Add where clause using input fields
for (DataField inputField : request.getModelCRUD().getDataRow().getDataFields()) {
// Get input column reference
String referenceName = m_dlWebService.getReferenceByID(inputField.getColumnName());
switch (referenceName) {
case "ID":
query.addCriteria(new MatchCriteria(table, inputField.getColumnName(), MatchCriteria.EQUALS, inputField.getValue()));
break;
case "String":
query.addCriteria(new MatchCriteria(table, inputField.getColumnName(), MatchCriteria.LIKE, inputField.getValue()));
break;
}
}
List<Object[]> listDatas = m_dlWebService.getDatas(m_appView.getSession(), query.toString(), serializerRead);
// Construct the DataSet
DataSet dataSet = new DataSet();
for (Object[] data : listDatas) {
DataRow dataRow = new DataRow();
for (int i = 0; i < data.length; ++i) {
DataField dataField = new DataField();
dataField.setColumnName(outputFields.get(i));
dataField.setValue((String) data[i]);
dataRow.addDataField(dataField);
}
dataSet.addDataRow(dataRow);
}
responseDocument.setStartRow(1);
responseDocument.setNumRows(listDatas.size());
responseDocument.setTotalRows(listDatas.size());
responseDocument.setDataSet(dataSet);
} catch (BasicException ex) {
DatabaseDocument errorDocument = new DatabaseDocument();
errorDocument.setError(ex.getMessage());
return errorDocument;
}
return responseDocument;
}
@Override
public StandardResponseDocument createData(ModelCRUDRequest request) {
StandardResponseDocument responseDocument = new StandardResponseDocument();
/**
* Login Return an error message if there is an error Return null if
* there is no errors
*/
String error = login(request.getLoginRequest(), m_webServiceName, "readData", request.getModelCRUD().getServiceType());
if ((error != null) && error.length() > 0) {
responseDocument.setError(error);
return responseDocument;
}
// Create data
return responseDocument;
}
private String validateParameters(ModelCRUD modelCRUD, MWebServiceType webServiceType) {
try {
List webServiceParameters = null;
webServiceParameters = m_dlWebService.getParamaters(webServiceType.getId());
if (webServiceParameters == null) {
return "The service : " + modelCRUD.getServiceType() + " is not well configured.";
} else {
for (Object webServiceParameter : webServiceParameters) {
MWebServicePara parameter = (MWebServicePara) webServiceParameter;
if (parameter.getName().equals(MWebServicePara.PARA_ACTION)) {
if (!modelCRUD.getAction().equals(parameter.getConstantValue())) {
return "The action parameter" + modelCRUD.getAction() + " is invalid";
}
} else if (parameter.getName().equals(MWebServicePara.PARA_TABLENAME)) {
if (!modelCRUD.getTableName().equals(parameter.getConstantValue())) {
return "The tablename paramater : " + modelCRUD.getTableName() + " is invalid";
}
}
}
}
} catch (BasicException ex) {
}
return null;
}
private String validateInputColumns(ModelCRUD modelCRUD, List<String> inputColumns) {
if (modelCRUD.getDataRow().getDataFields().size() != inputColumns.size())
return "You request has more input fields than the configured web service";
List<String> requestInputColumn = new ArrayList<>();
for (DataField dataField : modelCRUD.getDataRow().getDataFields()) {
requestInputColumn.add(dataField.getColumnName());
}
// Sort request input column
Collections.sort(requestInputColumn);
if (!requestInputColumn.equals(inputColumns))
return "The input fields in your request does not correspond to the input field configured in the web service";
return null;
}
}