/*
* 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:
* Raj Kuttan
* Lori Phillips
*/
package edu.harvard.i2b2.ontology.ws;
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;
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 edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.util.jaxb.DTOFactory;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.ontology.datavo.i2b2message.ApplicationType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.FacilityType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.MessageControlIdType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.ProcessingIdType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.RequestHeaderType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.ResponseHeaderType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.ResultStatusType;
import edu.harvard.i2b2.ontology.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.ontology.datavo.vdo.ConceptsType;
import edu.harvard.i2b2.ontology.datavo.vdo.DirtyValueType;
import edu.harvard.i2b2.ontology.datavo.vdo.ModifiersType;
import edu.harvard.i2b2.ontology.datavo.vdo.OntologyProcessStatusListType;
import edu.harvard.i2b2.ontology.datavo.vdo.OntologyProcessStatusType;
import edu.harvard.i2b2.ontology.util.OntologyJAXBUtil;
/**
* Factory class to create request/response message objects.
*
*/
public class MessageFactory {
private static Log log = LogFactory.getLog(MessageFactory.class);
/**
* Function creates Ontology response OMElement from xml string
*
* @param xmlString
* @return OMElement
* @throws XMLStreamException
*/
public static OMElement createResponseOMElementFromString(String xmlString)
throws I2B2Exception {
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 e) {
log
.error("Error while converting Ontology response VDO to OMElement");
throw new I2B2Exception("XML Stream error ", e);
}
return returnElement;
}
/**
* Function to build concepts body type
*
* @param vocabData
* Concept set to be returned to requester
* @return BodyType object
*/
public static BodyType createBodyType(ConceptsType vocabData) {
edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory of = new edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(of.createConcepts(vocabData));
return bodyType;
}
/**
* Function to build Dirty state body type
*
* @param type Dirty state to be returned
* @return BodyType object
*/
public static BodyType createBodyType(DirtyValueType type) {
edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory of = new edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(of.createDirtyState(type));
return bodyType;
}
/**
* Function to build Modifiers body type
*
* @param vocabData
* Modifier set to be returned to requester
* @return BodyType object
*/
public static BodyType createBodyType(ModifiersType vocabData) {
edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory of = new edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(of.createModifiers(vocabData));
return bodyType;
}
/**
* Function to create response message header based on request message
* header
*
* @return MessageHeader object
*/
public static MessageHeaderType createResponseMessageHeader(
MessageHeaderType reqMsgHeader) {
MessageHeaderType messageHeader = new MessageHeaderType();
messageHeader.setI2B2VersionCompatible(new BigDecimal("1.1"));
messageHeader.setHl7VersionCompatible(new BigDecimal("2.4"));
ApplicationType appType = new ApplicationType();
appType.setApplicationName("Ontology Cell");
appType.setApplicationVersion("1.700");
messageHeader.setSendingApplication(appType);
FacilityType facility = new FacilityType();
facility.setFacilityName("i2b2 Hive");
messageHeader.setSendingFacility(facility);
if (reqMsgHeader != null) {
ApplicationType recvApp = new ApplicationType();
recvApp.setApplicationName(reqMsgHeader.getSendingApplication()
.getApplicationName());
recvApp.setApplicationVersion(reqMsgHeader.getSendingApplication()
.getApplicationVersion());
messageHeader.setReceivingApplication(recvApp);
FacilityType recvFac = new FacilityType();
recvFac.setFacilityName(reqMsgHeader.getSendingFacility()
.getFacilityName());
messageHeader.setReceivingFacility(recvFac);
messageHeader.setSecurity(reqMsgHeader.getSecurity());
}
Date currentDate = new Date();
DTOFactory factory = new DTOFactory();
messageHeader.setDatetimeOfMessage(factory
.getXMLGregorianCalendar(currentDate.getTime()));
MessageControlIdType mcIdType = new MessageControlIdType();
mcIdType.setInstanceNum(1);
if (reqMsgHeader != null) {
if (reqMsgHeader.getMessageControlId() != null) {
mcIdType.setMessageNum(reqMsgHeader.getMessageControlId()
.getMessageNum());
mcIdType.setSessionId(reqMsgHeader.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");
if (reqMsgHeader != null) {
messageHeader.setProjectId(reqMsgHeader.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 {
strWriter = new StringWriter();
edu.harvard.i2b2.ontology.datavo.i2b2message.ObjectFactory objectFactory = new edu.harvard.i2b2.ontology.datavo.i2b2message.ObjectFactory();
OntologyJAXBUtil.getJAXBUtil().marshaller(
objectFactory.createResponse(respMessageType), strWriter);
} catch (JAXBUtilException e) {
log.error(e.getMessage());
throw new I2B2Exception(
"Error converting response message type to string "
+ e.getMessage(), e);
}
return strWriter.toString();
}
/**
* Function to build Response message type and return it as an XML string
*
* @param concepts
* The set of Ontology concepts that match request
*
* @return A String data type containing the ResponseMessage in XML format
* @throws Exception
*/
public static ResponseMessageType createBuildResponse(
MessageHeaderType messageHeaderType, ConceptsType concepts) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
BodyType bodyType = createBodyType(concepts);
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
/**
* Function to build Response message type and return it as an XML string
*
* @param
*
* @return A String data type containing the ResponseMessage in XML format
* @throws Exception
*/
public static ResponseMessageType createBuildResponse(
MessageHeaderType messageHeaderType) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
ConceptsType concepts = null;
BodyType bodyType = createBodyType(concepts);
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
/**
* Function to build Response message type and return it as an XML string
*
* @param concepts
* The set of Ontology concepts that match request
*
* @return A String data type containing the ResponseMessage in XML format
* @throws Exception
*/
public static ResponseMessageType createBuildResponse(
MessageHeaderType messageHeaderType,DirtyValueType dirtyType) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
BodyType bodyType = createBodyType(dirtyType);
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
/**
* Function to build Response message type and return it as an XML string
*
* @param modifiers
* The set of Ontology modifiers that match request
*
* @return A String data type containing the ResponseMessage in XML format
* @throws Exception
*/
public static ResponseMessageType createBuildResponse(
MessageHeaderType messageHeaderType, ModifiersType modifiers) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
BodyType bodyType = createBodyType(modifiers);
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
public static ResponseMessageType createProcessStatusResponse(
MessageHeaderType messageHeaderType,
OntologyProcessStatusType ontProcessStatusType) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory of = new edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(
of.createOntologyProcessStatus(ontProcessStatusType));
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
public static ResponseMessageType createProcessStatusListResponse(
MessageHeaderType messageHeaderType,
OntologyProcessStatusListType ontProcessStatusListType) {
ResponseMessageType respMessageType = null;
ResponseHeaderType respHeader = createResponseHeader("DONE",
"Ontology processing completed");
edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory of = new edu.harvard.i2b2.ontology.datavo.vdo.ObjectFactory();
BodyType bodyType = new BodyType();
bodyType.getAny().add(
of.createOntologyProcessStatusList(ontProcessStatusListType));
respMessageType = createResponseMessageType(messageHeaderType,
respHeader, bodyType);
return respMessageType;
}
/**
* 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;
}
}