/*
* 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.loader.datavo;
import java.io.StringWriter;
import java.math.BigDecimal;
import javax.xml.bind.JAXBElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.crc.datavo.i2b2message.ApplicationType;
import edu.harvard.i2b2.crc.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.crc.datavo.i2b2message.FacilityType;
import edu.harvard.i2b2.crc.datavo.i2b2message.InfoType;
import edu.harvard.i2b2.crc.datavo.i2b2message.MessageControlIdType;
import edu.harvard.i2b2.crc.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.PollingUrlType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResponseHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResultStatusType;
import edu.harvard.i2b2.crc.datavo.i2b2message.StatusType;
public class I2B2MessageResponseFactory {
/** log * */
protected final static Log log = LogFactory
.getLog(I2B2MessageResponseFactory.class);
/**
* Function to build response message type using given bodytype and request
* xml
*
* @param requestXml
* @param bodyType
* @return i2b2 response message xml
* @throws JAXBUtilException
*/
public static String buildResponseMessage(String requestXml,
StatusType statusType, BodyType bodyType, boolean splCharFilterFlag)
throws JAXBUtilException {
JAXBUtil util = CRCLoaderJAXBUtil.getJAXBUtil();
MessageHeaderType messageHeader = new MessageHeaderType();
ApplicationType appType = new ApplicationType();
appType.setApplicationName("edu.harvard.i2b2.crc.loader");
appType.setApplicationVersion("1.0");
if (requestXml != null) {
RequestMessageType requestMsgType = getI2B2RequestMessageType(requestXml);
MessageHeaderType clientMessageHeader = requestMsgType.getMessageHeader();
// reverse sending and receiving app
if (clientMessageHeader != null) {
ApplicationType sendingApp = clientMessageHeader
.getSendingApplication();
messageHeader.setSendingApplication(appType);
messageHeader.setReceivingApplication(sendingApp);
messageHeader.setProjectId(clientMessageHeader.getProjectId());
}
} else {
messageHeader = new MessageHeaderType();
messageHeader.setSendingApplication(appType);
}
messageHeader.setI2B2VersionCompatible(new BigDecimal("1.1"));
messageHeader.setHl7VersionCompatible(new BigDecimal("2.4"));
MessageControlIdType messageControlIdType = new MessageControlIdType();
messageControlIdType.setInstanceNum(1);
messageHeader.setMessageControlId(messageControlIdType);
FacilityType facility = new FacilityType();
facility.setFacilityName("i2b2 Hive");
messageHeader.setSendingFacility(facility);
messageHeader.setReceivingFacility(facility);
// :TODO statusType.setValue(sessionId);
PollingUrlType pollingType = new PollingUrlType();
pollingType.setIntervalMs(100);
// :TODO value come from property file
// pollingType.setValue("http://localhost:8080/QueryProcessor/getResult");
ResultStatusType resultStatusType = new ResultStatusType();
resultStatusType.setStatus(statusType);
resultStatusType.setPollingUrl(pollingType);
InfoType infoType = new InfoType();
// :TODO value come from property file
// infoType.setUrl("http://localhost:8080/QueryProcessor/getStatus");
infoType.setValue("Log information");
ResponseHeaderType responseHeader = new ResponseHeaderType();
responseHeader.setResultStatus(resultStatusType);
responseHeader.setInfo(infoType);
ResponseMessageType responseMessageType = new ResponseMessageType();
responseMessageType.setMessageHeader(messageHeader);
responseMessageType.setResponseHeader(responseHeader);
responseMessageType.setMessageBody(bodyType);
edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
StringWriter strWriter = new StringWriter();
util.marshaller(of.createResponse(responseMessageType), strWriter,
splCharFilterFlag);
return strWriter.toString();
}
/**
* Function to build response message type using given bodytype and request
* xml
*
* @param requestXml
* @param bodyType
* @return i2b2 response message xml
* @throws JAXBUtilException
*/
public static String buildResponseMessage(String requestXml,
StatusType statusType, BodyType bodyType) throws JAXBUtilException {
return buildResponseMessage(requestXml, statusType, bodyType, false);
}
/**
* Function to unmarshall i2b2 request message type
*
* @param requestXml
* @return RequestMessageType
* @throws JAXBUtilException
*/
private static RequestMessageType getI2B2RequestMessageType(
String requestXml) throws JAXBUtilException {
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
JAXBElement jaxbElement = jaxbUtil.unMashallFromString(requestXml);
RequestMessageType requestMessageType = (RequestMessageType) jaxbElement
.getValue();
return requestMessageType;
}
/**
* Function marshall i2b2 response message type
*
* @param responseMessageType
* @return
*/
public static String getResponseString(
ResponseMessageType responseMessageType) {
StringWriter strWriter = new StringWriter();
try {
edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
jaxbUtil.marshaller(of.createResponse(responseMessageType),
strWriter);
} catch (JAXBUtilException e) {
log.error("Error while generating response message"
+ e.getMessage());
}
return strWriter.toString();
}
}