/*
* 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:
* Mike Mendis - initial API and implementation
*/
package edu.harvard.i2b2.pm.ws;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.util.jaxb.DTOFactory;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.pm.datavo.i2b2message.ApplicationType;
import edu.harvard.i2b2.pm.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.pm.datavo.i2b2message.FacilityType;
import edu.harvard.i2b2.pm.datavo.i2b2message.MessageControlIdType;
import edu.harvard.i2b2.pm.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.pm.datavo.i2b2message.ProcessingIdType;
import edu.harvard.i2b2.pm.datavo.i2b2message.RequestHeaderType;
import edu.harvard.i2b2.pm.datavo.i2b2message.ResponseHeaderType;
import edu.harvard.i2b2.pm.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.pm.datavo.i2b2message.ResultStatusType;
import edu.harvard.i2b2.pm.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.pm.datavo.pm.ApprovalType;
import edu.harvard.i2b2.pm.datavo.pm.ApprovalsType;
import edu.harvard.i2b2.pm.datavo.pm.CellDataType;
import edu.harvard.i2b2.pm.datavo.pm.CellDatasType;
import edu.harvard.i2b2.pm.datavo.pm.ConfigureType;
import edu.harvard.i2b2.pm.datavo.pm.ConfiguresType;
import edu.harvard.i2b2.pm.datavo.pm.GlobalDataType;
import edu.harvard.i2b2.pm.datavo.pm.GlobalDatasType;
import edu.harvard.i2b2.pm.datavo.pm.ParamType;
import edu.harvard.i2b2.pm.datavo.pm.ParamsType;
import edu.harvard.i2b2.pm.datavo.pm.ProjectRequestType;
import edu.harvard.i2b2.pm.datavo.pm.ProjectRequestsType;
import edu.harvard.i2b2.pm.datavo.pm.ProjectType;
import edu.harvard.i2b2.pm.datavo.pm.ProjectsType;
import edu.harvard.i2b2.pm.datavo.pm.RoleType;
import edu.harvard.i2b2.pm.datavo.pm.RolesType;
import edu.harvard.i2b2.pm.datavo.pm.UserType;
import edu.harvard.i2b2.pm.datavo.pm.UsersType;
import edu.harvard.i2b2.pm.util.JAXBConstant;
//import edu.harvard.i2b2.pm.datavo.pm.ResponseType;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.StringReader;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.util.Date;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
/**
* Factory class to create request/response message objects.
*
*/
public class MessageFactory {
private static Log log = LogFactory.getLog(MessageFactory.class);
private static JAXBUtil jaxbUtil = new JAXBUtil(JAXBConstant.DEFAULT_PACKAGE_NAME);
public static JAXBUtil getJAXBUtil()
{
return jaxbUtil;
}
/**
* Function creates PFT response OMElement from xml string
* @param xmlString
* @return OMElement
* @throws XMLStreamException
*/
public static OMElement createResponseOMElementFromString(String xmlString)
throws XMLStreamException {
OMElement returnElement = null;
try {
StringReader strReader = new StringReader(xmlString);
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader reader = xif.createXMLStreamReader(strReader);
StAXOMBuilder builder = new StAXOMBuilder(reader);
returnElement = builder.getDocumentElement();
} catch (XMLStreamException xmlStreamEx) {
log.error("Error while converting PM response ConfigureType to OMElement");
throw xmlStreamEx;
}
return returnElement;
}
/**
* Function to build patientData body type
*
* @param obsSet
* Observation fact set to be returned to requester
* @return BodyType object
*/
public static BodyType createBodyType(Object uType) {
edu.harvard.i2b2.pm.datavo.pm.ObjectFactory of = new edu.harvard.i2b2.pm.datavo.pm.ObjectFactory();
BodyType bodyType = new BodyType();
if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ConfigureType"))
bodyType.getAny().add(of.createConfigure((ConfigureType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.UserType"))
bodyType.getAny().add(of.createUser((UserType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.UsersType"))
bodyType.getAny().add(of.createUsers((UsersType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ProjectType"))
bodyType.getAny().add(of.createProject((ProjectType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ProjectsType"))
bodyType.getAny().add(of.createProjects((ProjectsType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.CellDataType"))
bodyType.getAny().add(of.createCell((CellDataType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.CellDatasType"))
bodyType.getAny().add(of.createCells((CellDatasType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.GlobalDataType"))
bodyType.getAny().add(of.createGlobal((GlobalDataType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.GlobalDatasType"))
bodyType.getAny().add(of.createGlobals((GlobalDatasType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ParamType"))
bodyType.getAny().add(of.createParam((ParamType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ParamsType"))
bodyType.getAny().add(of.createParams((ParamsType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ProjectRequestType"))
bodyType.getAny().add(of.createProjectRequest((ProjectRequestType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ProjectRequestsType"))
bodyType.getAny().add(of.createProjectRequests((ProjectRequestsType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.RoleType"))
bodyType.getAny().add(of.createRole((RoleType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.RolesType"))
bodyType.getAny().add(of.createRoles((RolesType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ConfigureType"))
bodyType.getAny().add(of.createHive((ConfigureType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ConfiguresType"))
bodyType.getAny().add(of.createHives((ConfiguresType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ApprovalType"))
bodyType.getAny().add(of.createApproval((ApprovalType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.pm.ApprovalsType"))
bodyType.getAny().add(of.createApprovals((ApprovalsType) uType));
else if (uType.getClass().getName().equals("edu.harvard.i2b2.pm.datavo.i2b2message.ResultStatusType"))
bodyType.getAny().add(of.createResponse(((ResultStatusType) uType).getStatus().getValue()));
return bodyType;
}
/**
* Function to create response message header based
* on request message header
*
* @return MessageHeader object
*/
public static MessageHeaderType createResponseMessageHeader(
MessageHeaderType messageHeaderType) {
MessageHeaderType messageHeader = new MessageHeaderType();
messageHeader.setI2B2VersionCompatible(new BigDecimal("1.1"));
messageHeader.setHl7VersionCompatible(new BigDecimal("2.4"));
ApplicationType appType = new ApplicationType();
appType.setApplicationName("PM Cell");
appType.setApplicationVersion("1.700");
messageHeader.setSendingApplication(appType);
FacilityType facility = new FacilityType();
facility.setFacilityName("i2b2 Hive");
messageHeader.setSendingFacility(facility);
if (messageHeaderType != null) {
if (messageHeaderType.getSendingApplication() != null) {
messageHeader.setReceivingApplication(messageHeaderType.getSendingApplication());
}
messageHeader.setReceivingFacility(messageHeaderType.getSendingFacility());
}
Date currentDate = new Date();
DTOFactory factory = new DTOFactory();
messageHeader.setDatetimeOfMessage(factory.getXMLGregorianCalendar(
currentDate.getTime()));
MessageControlIdType mcIdType = new MessageControlIdType();
mcIdType.setInstanceNum(1);
if (messageHeaderType != null) {
if (messageHeaderType.getMessageControlId() != null) {
mcIdType.setMessageNum(messageHeaderType.getMessageControlId()
.getMessageNum());
mcIdType.setSessionId(messageHeaderType.getMessageControlId()
.getSessionId());
}
}
messageHeader.setMessageControlId(mcIdType);
ProcessingIdType proc = new ProcessingIdType();
proc.setProcessingId("P");
proc.setProcessingMode("I");
messageHeader.setProcessingId(proc);
messageHeader.setAcceptAcknowledgementType("AL");
messageHeader.setApplicationAcknowledgementType("AL");
messageHeader.setCountryCode("US");
messageHeader.setProjectId(messageHeaderType.getProjectId());
return messageHeader;
}
/**
* Function to create response message type
* @param messageHeader
* @param respHeader
* @param bodyType
* @return ResponseMessageType
*/
public static ResponseMessageType createResponseMessageType(
MessageHeaderType messageHeader, ResponseHeaderType respHeader,
BodyType bodyType) {
ResponseMessageType respMsgType = new ResponseMessageType();
respMsgType.setMessageHeader(messageHeader);
respMsgType.setMessageBody(bodyType);
respMsgType.setResponseHeader(respHeader);
return respMsgType;
}
/**
* Function to convert ResponseMessageType to string
* @param respMessageType
* @return String
* @throws Exception
*/
public static String convertToXMLString(ResponseMessageType respMessageType)
throws I2B2Exception {
StringWriter strWriter = null;
try {
// JAXBUtil jaxbUtil = new JAXBUtil(JAXBConstant.DEFAULT_PACKAGE_NAME);
strWriter = new StringWriter();
edu.harvard.i2b2.pm.datavo.i2b2message.ObjectFactory objectFactory = new edu.harvard.i2b2.pm.datavo.i2b2message.ObjectFactory();
jaxbUtil.marshaller(objectFactory.createResponse(respMessageType),
strWriter);
} catch (JAXBUtilException e) {
e.printStackTrace();
throw new I2B2Exception(
"Error converting response message type to string " +
e.getMessage(), e);
}
return strWriter.toString();
}
/**
* Function to convert ResponseMessageType to string
* @param respMessageType
* @return String
* @throws Exception
*/
public static String convertToXMLString(edu.harvard.i2b2.pm.datavo.i2b2versionmessage.ResponseMessageType respMessageType)
throws I2B2Exception {
StringWriter strWriter = null;
try {
JAXBUtil jaxbUtil = new JAXBUtil(JAXBConstant.DEFAULT_PACKAGE_NAME);
strWriter = new StringWriter();
edu.harvard.i2b2.pm.datavo.i2b2versionmessage.ObjectFactory objectFactory = new edu.harvard.i2b2.pm.datavo.i2b2versionmessage.ObjectFactory();
jaxbUtil.marshaller(objectFactory.createResponse(respMessageType),
strWriter);
} catch (JAXBUtilException e) {
e.printStackTrace();
throw new I2B2Exception(
"Error converting response message type to string " +
e.getMessage(), e);
}
return strWriter.toString();
}
/**
* Function to get i2b2 Request message header
*
* @return RequestHeader object
*/
public static RequestHeaderType getRequestHeader() {
RequestHeaderType reqHeader = new RequestHeaderType();
reqHeader.setResultWaittimeMs(120000);
return reqHeader;
}
/**
* Function to create Response with given error message
* @param messageHeaderType
* @param errorMessage
* @return
* @throws Exception
*/
public static ResponseMessageType doBuildErrorResponse(
MessageHeaderType messageHeaderType, String errorMessage) {
ResponseMessageType respMessageType = null;
MessageHeaderType messageHeader = createResponseMessageHeader(messageHeaderType);
ResponseHeaderType respHeader = createResponseHeader("ERROR",
errorMessage);
respMessageType = createResponseMessageType(messageHeader, respHeader,
null);
return respMessageType;
}
/**
* Creates ResponseHeader for the given type and value
* @param type
* @param value
* @return
*/
private static ResponseHeaderType createResponseHeader(String type,
String value) {
ResponseHeaderType respHeader = new ResponseHeaderType();
StatusType status = new StatusType();
status.setType(type);
status.setValue(value);
ResultStatusType resStat = new ResultStatusType();
resStat.setStatus(status);
respHeader.setResultStatus(resStat);
return respHeader;
}
/**
* Function to build Response message type and return it as an XML string
*
* @param obsSet
* observation fact set to be included in response PDO
*
* @return A String data type containing the ResponseMessage in XML format
* @throws Exception
*/
public static ResponseMessageType createBuildResponse(
MessageHeaderType messageHeaderType,
Object obsSet) {
ResponseMessageType respMessageType = null;
MessageHeaderType messageHeader = createResponseMessageHeader(messageHeaderType);
log.debug("Created message header");
ResponseHeaderType respHeader = createResponseHeader("DONE",
"PM processing completed");
log.debug("Created response header");
BodyType bodyType = createBodyType(obsSet);
log.debug("Created body part");
respMessageType = createResponseMessageType(messageHeader, respHeader,
bodyType);
log.debug("Response message type ");
return respMessageType;
}
}