edu.harvard.i2b2.crc.axis2.MessageFactory.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.crc.axis2.MessageFactory.java

Source

/*
 * 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
 *       Wayne Chan
 */
package edu.harvard.i2b2.crc.axis2;

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.crc.datavo.CRCJAXBUtil;
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.MessageControlIdType;
import edu.harvard.i2b2.crc.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ProcessingIdType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestHeaderType;
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;
import edu.harvard.i2b2.crc.datavo.pdo.query.PdoRequestTypeType;
//import edu.harvard.i2b2.crc.datavo.wdo.AuditsType;
import edu.harvard.i2b2.crc.datavo.pdo.query.DblookupsType;
//import edu.harvard.i2b2.crc.datavo.wdo.IsKeySetType;
import edu.harvard.i2b2.crc.datavo.pdo.query.ObjectFactory;

//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 PDO to OMElement");
            throw new I2B2Exception("XML Stream error ", e);
        } catch (Exception e) {
            log.error("Error while converting CRC response PDO 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;
    //    }

    /**swc20160520
     * Function to build concepts body type
     * 
     * @param dblookups
     *            Concept set to be returned to requester
     * @return BodyType object
     */
    public static BodyType createBodyType(DblookupsType dblookups) {
        //      edu.harvard.i2b2.im.datavo.wdo.ObjectFactory of = new edu.harvard.i2b2.im.datavo.wdo.ObjectFactory();
        ObjectFactory of = new ObjectFactory();
        BodyType bodyType = new BodyType();
        bodyType.getAny().add(of.createDblookups(dblookups));

        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("CRC 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.crc.datavo.i2b2message.ObjectFactory objectFactory = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
            CRCJAXBUtil.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", "CRC 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",
    //                    "CRC 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",
    //                    "CRC processing completed");
    //            if(folders != null)
    //               bodyType = createBodyType(folders);
    //            
    //            
    //            respMessageType = createResponseMessageType(messageHeaderType, respHeader,
    //                    bodyType);
    //            
    //            return respMessageType;
    //        }

    /**swc20160520
     * Function to build Response message type and return it as an XML string
     * 
     * @param dblookups
     *            The set of i2b2hive.work_db_lookup entries, per request
     * 
     * @return A String data type containing the ResponseMessage in XML format
     * @throws Exception
     */
    public static ResponseMessageType createBuildResponse(MessageHeaderType messageHeaderType,
            DblookupsType dblookups) {
        ResponseMessageType respMessageType = null;
        ResponseHeaderType respHeader = createResponseHeader("DONE", "CRC processing completed");
        BodyType bodyType = createBodyType(dblookups);
        respMessageType = createResponseMessageType(messageHeaderType, respHeader, bodyType);
        return respMessageType;
    }

    /**swc20160520
     * Function to build Response message type and return it as an XML string
     * 
     * @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", "CRC processing completed");
        respMessageType = createResponseMessageType(messageHeaderType, respHeader, null);
        return respMessageType;
    }

    /**swc20160520
     * Function to build 'Non Standard' Response message and return it as an XML string
     * 
     * @param messageHeaderType
     * @param msg
     * 
     * @return A String data type containing the ResponseMessage in XML format
     * @throws Exception
     */
    public static ResponseMessageType createNonStandardResponse(MessageHeaderType messageHeaderType, String msg) {
        ResponseMessageType respMessageType = null;
        ResponseHeaderType respHeader = createResponseHeader("DONE", msg + " - CRC processing completed");
        respMessageType = createResponseMessageType(messageHeaderType, respHeader, null);
        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",
    //                "CRC processing completed");
    //        if(patientDataType != null)
    //           bodyType = createBodyType(patientDataType);
    //        
    //       // else
    //       //    log.error("creating response with null body type ");
    //        
    //        respMessageType = createResponseMessageType(messageHeader, respHeader,
    //                bodyType);
    //        
    //        return respMessageType;
    //   
    //   }

}