package org.fireflow.service.jdbc.query;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import javax.sql.DataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import junit.framework.Assert;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.fireflow.client.WorkflowSession;
import org.fireflow.client.WorkflowSessionFactory;
import org.fireflow.engine.context.RuntimeContext;
import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem;
import org.fireflow.model.servicedef.ServiceDef;
import org.fireflow.service.AbsTestContext;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@ContextConfiguration(locations = { "classpath:/applicationContext.xml"})
public class DBQueryImplTest extends AbsTestContext{
@Test
public void testDoQuery() throws Exception{
TransactionTemplate transactionTemplate = (TransactionTemplate)this.applicationContext.getBean("transactionTemplate");
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg0) {
RuntimeContext runtimeContext = (RuntimeContext)applicationContext.getBean("runtimeContext");
WorkflowSession session = WorkflowSessionFactory.createWorkflowSession(runtimeContext, FireWorkflowSystem.getInstance());
createProcessInstance(session, runtimeContext);
return null;
}
});
DBQueryImpl dbQuery = new DBQueryImpl();
ServiceDef service = this.buildService();
dbQuery.setDBQueryService((DBQueryServiceDef)service);
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder db =df.newDocumentBuilder();
Document whereDoc = db.newDocument();
Element rootElement = whereDoc.createElementNS(service.getTargetNamespaceUri(),"where_fields");
whereDoc.appendChild(rootElement);
Element procIdElem = whereDoc.createElementNS(service.getTargetNamespaceUri(),"process_id");
procIdElem.appendChild(whereDoc.createTextNode("processId-123456"));
rootElement.appendChild(procIdElem);
Element stateElem = whereDoc.createElementNS(service.getTargetNamespaceUri(), "state");
stateElem.appendChild(whereDoc.createTextNode("0"));
rootElement.appendChild(stateElem);
Document resultDoc = dbQuery.doQuery(whereDoc);
Assert.assertNotNull(resultDoc);
Element resultRoot = resultDoc.getDocumentElement();
Assert.assertNotNull(resultRoot);
Element rowElement = (Element)resultRoot.getFirstChild();
Assert.assertNotNull(rowElement);
NodeList idNodeList = rowElement.getElementsByTagName("id");
Assert.assertEquals(1,idNodeList.getLength());
Element idElement = (Element)idNodeList.item(0);
Assert.assertNotNull(idElement);
Assert.assertNotNull(idElement.getTextContent());
NodeList tokenIdNodeList = rowElement.getElementsByTagName("token_id");
Assert.assertEquals(1, tokenIdNodeList.getLength());
Element tokenIdElement = (Element)tokenIdNodeList.item(0);
Assert.assertNotNull(tokenIdElement);
Assert.assertEquals("tokenId-123", tokenIdElement.getTextContent());
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//transformer.transform()方法 将 XML Source转换为 Result
transformer.transform(new DOMSource(resultDoc), new StreamResult(outputStream));
System.out.println( outputStream.toString() );
}
public ServiceDef buildService(){
DataSource ds = (DataSource)this.applicationContext.getBean("MyDataSource");
DBQueryServiceDef service = new DBQueryServiceDef();
service.setName("query_from_workitem");
service.setTargetNamespaceUri("http://test/");
service.setDataSource(ds);
service.setSQL("select * from t_ff_rt_process_instance where process_id=? and state=? ");
try {
service.afterPropertiesSet();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//输出service 的schema
XmlSchemaCollection xmlSchemaCollection = service.getXmlSchemaCollection();
if (xmlSchemaCollection!=null){
XmlSchema[] xmlSchemas = xmlSchemaCollection.getXmlSchemas();
for (XmlSchema xmlSchema : xmlSchemas){
try {
xmlSchema.write(System.out);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return service;
}
}