package org.fireflow.service.jdbc.query;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.io.DocumentSource;
import org.fireflow.engine.exception.ServiceInvocationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@WebServiceProvider
@ServiceMode(value=Service.Mode.PAYLOAD)
public class DBQueryImpl implements DBQuery, Provider<DOMSource> {
private static final Log log = LogFactory.getLog(DBQueryImpl.class);
DBQueryServiceDef service = null;
public DBQueryServiceDef getDBQueryService() {
return service;
}
public void setDBQueryService(DBQueryServiceDef service) {
this.service = service;
}
public DOMSource invoke(DOMSource request) {
try{
Document message = doQuery((Document)request.getNode());
return new DOMSource(message);
}catch(ServiceInvocationException e){
throw new WebServiceException(e);
}
}
public Document doQuery(Document condition)
throws ServiceInvocationException {
log.debug("The sql is '"+service.getSQL()+"'");
Element whereElement = condition.getDocumentElement();
List<Element> whereFieldsElement = new ArrayList<Element>();
NodeList nodeList = whereElement.getChildNodes();
for (int i=0;i<nodeList.getLength();i++){
Node node = nodeList.item(i);
if (node.getNodeType()==Node.ELEMENT_NODE){
whereFieldsElement.add((Element)node);
}
}
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
DataSource ds = service.getDataSource();
con = ds.getConnection();
pstmt = con.prepareStatement(service.getSQL());
DBQueryServiceDef.fulfillPreparedStatement(pstmt,whereFieldsElement,1);
rs = pstmt.executeQuery();
Document doc = DBQueryServiceDef.createDataSet(rs,rs.getMetaData(),service.getTargetNamespaceUri());
return doc;//
}catch(SQLException e){
throw new ServiceInvocationException(e);
}catch(Exception e){
throw new ServiceInvocationException(e);
}
finally{
try{
if (rs!=null){
rs.close();
}
if (pstmt!=null){
pstmt.close();
}
if (con!=null){
con.close();
}
}catch(SQLException ex){
}
}
}
}