/*
* Copyright (c) 2006-2007 Massachusetts General Hospital
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the i2b2 Software License v1.0
* which accompanies this distribution.
*
* Contributors:
* Rajesh Kuttan
*/
package edu.harvard.i2b2.crc.axis2;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import org.apache.axiom.attachments.Attachments;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.OperationClient;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.MessageContext;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.bind.JAXBElement;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import junit.framework.JUnit4TestAdapter;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.junit.BeforeClass;
import org.junit.Test;
import edu.harvard.i2b2.common.util.jaxb.JAXBUnWrapHelper;
import edu.harvard.i2b2.crc.datavo.CRCJAXBUtil;
import edu.harvard.i2b2.crc.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.MasterInstanceResultResponseType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ObjectFactory;
import edu.harvard.i2b2.crc.datavo.setfinder.query.PsmQryHeaderType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryInstanceType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryMasterType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryResultInstanceType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.RequestType;
/**
* Class to test different CRC Loader request's
* @author Mike Mendis
*/
public class CRCLoaderTest extends CRCAxisAbstract {
private static QueryMasterType queryMaster = null;
private static QueryInstanceType queryInstance = null;
private static String masterInstanceResult = null;
private static String testFileDir = null;
private static EndpointReference frUrl = new EndpointReference(
"http://infra6.mgh.harvard.edu:9090/i2b2/services/FRService");
private static String setfinderUrl =
//System.getProperty("testhost")
"http://infra6.mgh.harvard.edu:9090/i2b2/services"
+ "/QueryToolService/request";
private static String requestXml = "";
@BeforeClass
public static void setUp() throws Exception {
testFileDir = "testfiles"; //System.getProperty("testfiledir");
System.out.println("test file dir " + testFileDir);
if (!((testFileDir != null) && (testFileDir.trim().length() > 0))) {
throw new Exception(
"please provide test file directory info -Dtestfiledir");
}
}
public static junit.framework.Test suite() {
return new JUnit4TestAdapter(CRCLoaderTest.class);
}
public static RequestHeaderType generateRequestHeader() {
RequestHeaderType reqHeaderType = new RequestHeaderType();
reqHeaderType.setResultWaittimeMs(90000);
return reqHeaderType;
}
public static String getRequestString() throws Exception {
StringBuffer queryStr = new StringBuffer();
DataInputStream dataStream = new DataInputStream(new FileInputStream(
requestXml));
BufferedReader reader = new BufferedReader(new InputStreamReader(
dataStream));
String singleLine = null;
while ((singleLine = reader.readLine()) != null) {
queryStr.append(singleLine + "\n");
}
// System.out.println("queryStr " + queryStr);
return queryStr.toString();
}
public static OMElement getRequestPayLoad() throws Exception {
OMElement method = null;
try {
StringReader strReader = new StringReader(getRequestString());
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader reader = xif.createXMLStreamReader(strReader);
StAXOMBuilder builder = new StAXOMBuilder(reader);
method = builder.getDocumentElement();
} catch (FactoryConfigurationError e) {
// TODO Auto-generated catch block
// No log because its a thread?
e.printStackTrace();
throw new Exception(e);
}
//System.out.println(method.toString());
return method;
}
@Test
public void UploadPatientSet() throws Exception {
requestXml = testFileDir + "/import_ptMap.xml";
try {
OMElement getRequestElmt = getRequestPayLoad();
Options options = new Options();
options.setTo(frUrl);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
// options.setProperty(Constants.Configuration.ENABLE_REST, Constants.VALUE_TRUE);
options.setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTimeOutInMilliSeconds(50000);
options.setAction("urn:sendfileRequest");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OperationClient mepClient = sender.createClient(ServiceClient.ANON_OUT_IN_OP);
SOAPFactory sfac = OMAbstractFactory.getSOAP11Factory();
SOAPEnvelope env = sfac.getDefaultEnvelope();
env.getBody().addChild(getRequestElmt);
MessageContext mc = new MessageContext();
mc.setEnvelope(env);
FileDataSource fileDataSource = new FileDataSource( testFileDir + "/ptMap_8-15-2012.csv");
DataHandler dataHandler = new DataHandler(fileDataSource);
mc.addAttachment(fileDataSource.getName(), dataHandler);
// fileDataSource = new FileDataSource(testFileDir + "ptMap_8-15-2012.csv");
// dataHandler = new DataHandler(fileDataSource);
// mc.addAttachment(fileDataSource.getName(), dataHandler);
Attachments attachments = mc.getAttachmentMap();
System.out.println("# of attachments: " + attachments.getAllContentIDs().length);
mepClient.addMessageContext(mc);
mepClient.execute(true);
MessageContext inMsgtCtx = mepClient.getMessageContext("In");
SOAPEnvelope responseEnv = inMsgtCtx.getEnvelope();
OMElement soapResponse = responseEnv.getBody().getFirstElement();
OMElement soapResult = soapResponse.getFirstElement();
String i2b2Response = soapResponse.toString();
System.out.println(i2b2Response);
JAXBElement responseJaxb = CRCJAXBUtil.getJAXBUtil().unMashallFromString(i2b2Response);
ResponseMessageType r = (ResponseMessageType)responseJaxb.getValue();
JAXBUnWrapHelper helper = new JAXBUnWrapHelper();
masterInstanceResult = (String)helper.getObjectByClass(r.getMessageBody().getAny(),String.class);
assertNotNull(masterInstanceResult);
/*
DataInputStream dataStream = new DataInputStream(new FileInputStream(
filename));
OMElement requestElement = convertStringToOMElement(dataStream);
OMElement responseElement = getServiceClient(setfinderUrl).sendReceive(requestElement);
//read test file and store query instance ;
//unmarshall this response string
JAXBElement responseJaxb = CRCJAXBUtil.getJAXBUtil().unMashallFromString(responseElement.toString());
ResponseMessageType r = (ResponseMessageType)responseJaxb.getValue();
JAXBUnWrapHelper helper = new JAXBUnWrapHelper();
MasterInstanceResultResponseType masterInstanceResult = (MasterInstanceResultResponseType)helper.getObjectByClass(r.getMessageBody().getAny(),MasterInstanceResultResponseType.class);
assertNotNull(masterInstanceResult);
String queryMasterId = masterInstanceResult.getQueryMaster().getQueryMasterId();
// First Query In Query
String requestString = getQueryString(testFileDir + "/QIQ_4Q_MALE_[28].xml");
requestString = requestString.replace("masterid:431", "masterid:"+queryMasterId);
requestElement = convertStringToOMElement(requestString);
responseElement = getServiceClient(setfinderUrl).sendReceive(requestElement);
//read test file and store query instance ;
//unmarshall this response string
responseJaxb = CRCJAXBUtil.getJAXBUtil().unMashallFromString(responseElement.toString());
r = (ResponseMessageType)responseJaxb.getValue();
helper = new JAXBUnWrapHelper();
masterInstanceResult = (MasterInstanceResultResponseType)helper.getObjectByClass(r.getMessageBody().getAny(),MasterInstanceResultResponseType.class);
assertNotNull(masterInstanceResult);
for (QueryResultInstanceType results :masterInstanceResult.getQueryResultInstance() )
{
if (results.getQueryResultType().getName().equals("PATIENT_COUNT_XML"))
assertEquals(results.getSetSize(), 28);
else
assertTrue(false);
}
// Second Query In Query
requestString = getQueryString(testFileDir + "/QIQ_4Q_FEMALE_[10].xml");
requestString = requestString.replace("masterid:431", "masterid:"+queryMasterId);
requestElement = convertStringToOMElement(requestString);
responseElement = getServiceClient(setfinderUrl).sendReceive(requestElement);
//read test file and store query instance ;
//unmarshall this response string
responseJaxb = CRCJAXBUtil.getJAXBUtil().unMashallFromString(responseElement.toString());
r = (ResponseMessageType)responseJaxb.getValue();
helper = new JAXBUnWrapHelper();
masterInstanceResult = (MasterInstanceResultResponseType)helper.getObjectByClass(r.getMessageBody().getAny(),MasterInstanceResultResponseType.class);
assertNotNull(masterInstanceResult);
for (QueryResultInstanceType results :masterInstanceResult.getQueryResultInstance() )
{
if (results.getQueryResultType().getName().equals("PATIENT_COUNT_XML"))
assertEquals(results.getSetSize(), 10);
else
assertTrue(false);
}
*/
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
public static RequestMessageType buildRequestMessage(PsmQryHeaderType requestHeaderType, RequestType requestType) {
//create body type
BodyType bodyType = new BodyType();
ObjectFactory of = new ObjectFactory();
bodyType.getAny().add(of.createPsmheader(requestHeaderType));
bodyType.getAny().add(of.createRequest(requestType));
RequestMessageType requestMessageType = new RequestMessageType();
requestMessageType.setMessageHeader(generateMessageHeader());
requestMessageType.setMessageBody(bodyType);
requestMessageType.setRequestHeader(generateRequestHeader());
return requestMessageType;
}
}