/* * 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.im.ws; 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.im.util.IMJAXBUtil; import edu.harvard.i2b2.im.datavo.i2b2message.ApplicationType; import edu.harvard.i2b2.im.datavo.i2b2message.BodyType; import edu.harvard.i2b2.im.datavo.i2b2message.FacilityType; import edu.harvard.i2b2.im.datavo.i2b2message.MessageControlIdType; import edu.harvard.i2b2.im.datavo.i2b2message.MessageHeaderType; import edu.harvard.i2b2.im.datavo.i2b2message.ProcessingIdType; import edu.harvard.i2b2.im.datavo.i2b2message.RequestHeaderType; import edu.harvard.i2b2.im.datavo.i2b2message.ResponseHeaderType; import edu.harvard.i2b2.im.datavo.i2b2message.ResponseMessageType; import edu.harvard.i2b2.im.datavo.i2b2message.ResultStatusType; import edu.harvard.i2b2.im.datavo.i2b2message.StatusType; import edu.harvard.i2b2.im.datavo.pdo.query.PdoRequestTypeType; import edu.harvard.i2b2.im.datavo.wdo.AuditsType; import edu.harvard.i2b2.im.datavo.wdo.IsKeySetType; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import org.apache.axis2.AxisFault; 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.FactoryConfigurationError; 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); /** * Function creates Workplace 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("xml stream response WDO to OMElement"); throw new I2B2Exception("XML Stream error ", e); } catch (Exception e) { log.error("Error while converting IM response WDO to OMElement"); throw new I2B2Exception("Response OMElement creation error ", e); } return returnElement; } /** * Function to build workplaceData body type * * @param obsSet * Observation fact set to be returned to requester * @return BodyType object */ public static BodyType createBodyType(PdoRequestTypeType workplaceData) { edu.harvard.i2b2.im.datavo.pdo.query.ObjectFactory of = new edu.harvard.i2b2.im.datavo.pdo.query.ObjectFactory(); BodyType bodyType = new BodyType(); //MM bodyType.getAny().add(of..createFolders(workplaceData)); return bodyType; } private static BodyType createBodyType(AuditsType patientDataType) { edu.harvard.i2b2.im.datavo.wdo.ObjectFactory of = new edu.harvard.i2b2.im.datavo.wdo.ObjectFactory(); BodyType bodyType = new BodyType(); bodyType.getAny().add(of.createAudits(patientDataType)); return bodyType; } public static BodyType createBodyType(IsKeySetType workplaceData) { edu.harvard.i2b2.im.datavo.wdo.ObjectFactory of = new edu.harvard.i2b2.im.datavo.wdo.ObjectFactory(); BodyType bodyType = new BodyType(); bodyType.getAny().add(of.createKeySet(workplaceData)); return bodyType; } public static BodyType createBodyType(String workplaceData) { edu.harvard.i2b2.im.datavo.pdo.query.ObjectFactory of = new edu.harvard.i2b2.im.datavo.pdo.query.ObjectFactory(); BodyType bodyType = new BodyType(); //MM bodyType.getAny().add(of.createRequestXML(workplaceData)); // createFolders(workplaceData)); 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("IM 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.im.datavo.i2b2message.ObjectFactory objectFactory = new edu.harvard.i2b2.im.datavo.i2b2message.ObjectFactory(); IMJAXBUtil.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 folders The set of Workplace folders that match request * * @return A String data type containing the ResponseMessage in XML format * @throws Exception */ public static ResponseMessageType createBuildResponsePdo( MessageHeaderType messageHeaderType, PdoRequestTypeType folders) { ResponseMessageType respMessageType = null; BodyType bodyType = null; ResponseHeaderType respHeader = createResponseHeader("DONE", "IM processing completed"); if(folders != null) bodyType = createBodyType(folders); // else // log.error("creating response with null body type "); respMessageType = createResponseMessageType(messageHeaderType, respHeader, bodyType); return respMessageType; } public static ResponseMessageType createBuildResponseKeySet( MessageHeaderType messageHeaderType, IsKeySetType folders) { ResponseMessageType respMessageType = null; BodyType bodyType = null; ResponseHeaderType respHeader = createResponseHeader("DONE", "IM processing completed"); if(folders != null) bodyType = createBodyType(folders); // else // log.error("creating response with null body type "); respMessageType = createResponseMessageType(messageHeaderType, respHeader, bodyType); return respMessageType; } public static ResponseMessageType createBuildResponseRequestXML( MessageHeaderType messageHeaderType, String folders) { ResponseMessageType respMessageType = null; BodyType bodyType = null; ResponseHeaderType respHeader = createResponseHeader("DONE", "IM processing completed"); if(folders != null) bodyType = createBodyType(folders); 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; } public static ResponseMessageType createBuildResponseAudits( MessageHeaderType messageHeader, AuditsType patientDataType) { ResponseMessageType respMessageType = null; BodyType bodyType = null; ResponseHeaderType respHeader = createResponseHeader("DONE", "IM processing completed"); if(patientDataType != null) bodyType = createBodyType(patientDataType); // else // log.error("creating response with null body type "); respMessageType = createResponseMessageType(messageHeader, respHeader, bodyType); return respMessageType; } }