edu.harvard.i2b2.explorer.dataModel.PDORequestMessageModel.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.explorer.dataModel.PDORequestMessageModel.java

Source

/*
 * Copyright (c) 2006-2012 Massachusetts General Hospital 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the i2b2 Software License v2.1 
 * which accompanies this distribution. 
 * 
 * Contributors: 
 *   
 *     Wensong Pan
 *     
 */
package edu.harvard.i2b2.explorer.dataModel;

import java.io.StringWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import edu.harvard.i2b2.common.util.jaxb.DTOFactory;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.eclipse.UserInfoBean;
import edu.harvard.i2b2.explorer.datavo.ExplorerJAXBUtil;
import edu.harvard.i2b2.explorer.data.Messages;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.ApplicationType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.FacilityType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.MessageControlIdType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.MessageTypeType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.PasswordType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.ProcessingIdType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.RequestHeaderType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.SecurityType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.ConstrainDateType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.FactOutputOptionType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.FilterListType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.GetPDOFromInputListRequestType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.InputOptionListType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.ItemType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.ObjectFactory;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.OutputOptionListType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.OutputOptionNameType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.OutputOptionSelectType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.OutputOptionSelectionFilterType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.OutputOptionType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.PanelType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.PatientListType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.PdoQryHeaderType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.PdoRequestTypeType;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.ItemType.ConstrainByDate;
import edu.harvard.i2b2.crcxmljaxb.datavo.pdo.query.ItemType.ConstrainByModifier;

public class PDORequestMessageModel {

    private static final Log log = LogFactory.getLog(PDORequestMessageModel.class);

    private PdoQryHeaderType buildHeaderType() {
        PdoQryHeaderType pdoHeader = new PdoQryHeaderType();
        pdoHeader.setEstimatedTime(180000);
        pdoHeader.setRequestType(PdoRequestTypeType.GET_PDO_FROM_INPUT_LIST);
        return pdoHeader;
    }

    public GetPDOFromInputListRequestType getPDOFromInputListRequestType(ArrayList<PDOItem> items,
            String patientSetRefId, Integer min, Integer max, boolean fromFact, String filter) {

        PatientListType patientListType = new PatientListType();
        if (patientSetRefId.compareTo("-1") == 0) {
            patientListType.setPatientSetCollId(null);
            patientListType.setEntirePatientSet(true);
        } else {
            patientListType.setPatientSetCollId(patientSetRefId);
        }
        patientListType.setMin(min);
        patientListType.setMax(max);
        // patientListType.setEntirePatientSet();

        // PatientListType.PatientNum patientNum = new
        // PatientListType.PatientNum();
        // patientNum.setIndex(1);
        // patientNum.setValue(344);
        // patientListType.getPatientNum().add(patientNum);

        // VisitListType visitListType = new VisitListType();
        // visitListType.setPatientEncCollId(100);

        FilterListType filterListType = new FilterListType();

        // set up concept path list
        for (int i = 0; i < items.size(); i++) {
            PDOItem item = items.get(i);
            // for(int j=0;j<=item.valDisplayProperties.size();j++) {
            PanelType panelType = new PanelType();
            panelType.setName(item.panelName());// +(j>0?""+j:""));

            ItemType itemType = new ItemType();
            itemType.setItemKey(item.fullPath);
            itemType.setDimDimcode(item.dimcode);
            itemType.setDimTablename(item.tableType);
            for (int j = 0; j < item.valDisplayProperties.size(); j++) {
                PDOValueModel valdp = item.valDisplayProperties.get(j);
                if (!item.queryModel().valueModel().noValue()) {
                    itemType.getConstrainByValue().add(valdp.writeValueConstraint(item.queryModel().valueModel()));
                    //panelType.setName(item.fullPath+getValueName(item.queryModel()
                    //.valueModel()));
                }
            }

            if (item.queryModel().isModifier()) {
                ModifierData mdata = (ModifierData) item.queryModel();
                ConstrainByModifier constrainByModifier = new ConstrainByModifier();
                constrainByModifier.setAppliedPath(mdata.applied_path());
                constrainByModifier.setModifierKey(mdata.modifier_key());
                constrainByModifier.setModifierName(mdata.modifier_name());
                //panelType.setName(item.panelName()+mdata.modifier_key());

                ConstrainByModifier.ConstrainByValue value;// = new ConstrainByModifier.ConstrainByValue();
                for (int k = 0; k < item.modifierValDisplayProperties.size(); k++) {
                    PDOValueModel valdp = item.modifierValDisplayProperties.get(k);
                    if (!mdata.modifierValuePropertyData().noValue()) {
                        value = valdp.writeModifierValueConstraint(mdata.modifierValuePropertyData());
                        constrainByModifier.getConstrainByValue().add(value);
                        //panelType.setName(item.panelName()+getValueName(mdata.modifierValuePropertyData()));
                    }
                    //panelType.setName(item.panelName()+getValueName(mdata.modifierValuePropertyData()));
                }
                itemType.setConstrainByModifier(constrainByModifier);
                //panelType.setName(item.panelName()+getValueName(mdata.modifierValuePropertyData()));
            }

            ConstrainByDate timeConstrain = new ConstrainByDate();
            DTOFactory dtoFactory = new DTOFactory();

            if (item.queryModel().startTime() != -1) {
                ConstrainDateType constraindateType = new ConstrainDateType();
                constraindateType.setValue(dtoFactory.getXMLGregorianCalendarDate(item.queryModel().startYear(),
                        item.queryModel().startMonth() + 1, item.queryModel().startDay()));

                timeConstrain.setDateFrom(constraindateType);
            }
            if (item.queryModel().endTime() != -1) {
                ConstrainDateType constraindateType = new ConstrainDateType();
                constraindateType.setValue(dtoFactory.getXMLGregorianCalendarDate(item.queryModel().endYear(),
                        item.queryModel().endMonth() + 1, item.queryModel().endDay()));
                timeConstrain.setDateTo(constraindateType);
            }

            itemType.getConstrainByDate().add(timeConstrain);
            panelType.getItem().add(itemType);
            filterListType.getPanel().add(panelType);
            // }
        }

        OutputOptionType patientOutputOptionType = new OutputOptionType();
        if (fromFact) {
            patientOutputOptionType.setSelect(OutputOptionSelectType.USING_FILTER_LIST);
        } else {
            patientOutputOptionType.setSelect(OutputOptionSelectType.USING_INPUT_LIST);
        }
        patientOutputOptionType.setOnlykeys(false);

        FactOutputOptionType factOutputOptionType = new FactOutputOptionType();
        factOutputOptionType.setOnlykeys(false);
        factOutputOptionType.setBlob(false);

        //OutputOptionSelectionFilterType outputOptionSelectionFilterType = new OutputOptionSelectionFilterType();
        if (filter.equalsIgnoreCase("max")) {
            factOutputOptionType.setSelectionfilter(OutputOptionSelectionFilterType.MAX_VALUE);
        } else if (filter.equalsIgnoreCase("min")) {
            factOutputOptionType.setSelectionfilter(OutputOptionSelectionFilterType.MIN_VALUE);
        } else if (filter.equalsIgnoreCase("first")) {
            factOutputOptionType.setSelectionfilter(OutputOptionSelectionFilterType.FIRST_VALUE);
        } else if (filter.equalsIgnoreCase("last")) {
            factOutputOptionType.setSelectionfilter(OutputOptionSelectionFilterType.LAST_VALUE);
        }

        OutputOptionType visitOutputOptionType = new OutputOptionType();
        // if(fromFact) {
        visitOutputOptionType.setSelect(OutputOptionSelectType.USING_FILTER_LIST);
        // }
        // else {
        // visitOutputOptionType.setSelect("from_input");
        // }
        visitOutputOptionType.setOnlykeys(false);

        ///////pid set
        OutputOptionType pidOutputOptionType = new OutputOptionType();
        // if(fromFact) {
        pidOutputOptionType.setSelect(OutputOptionSelectType.USING_FILTER_LIST);
        // }
        // else {
        // visitOutputOptionType.setSelect("from_input");
        // }
        pidOutputOptionType.setOnlykeys(false);

        OutputOptionListType outputOptionListType = new OutputOptionListType();
        outputOptionListType.setPatientSet(patientOutputOptionType);
        // outputOptionListType.setVisitDimension(visitOutputOptionType);
        outputOptionListType.setPidSet(pidOutputOptionType);
        outputOptionListType.setObservationSet(factOutputOptionType);
        outputOptionListType.setNames(OutputOptionNameType.ASATTRIBUTES);

        /*
         * GetPDOFromPatientSetRequestType requestType = new
         * GetPDOFromPatientSetRequestType();
         * requestType.setPatientList(patientListType);
         * requestType.setFilterList(filterListType);
         * requestType.setOuputOptionList(outputOptionListType);
         */

        InputOptionListType inputOptionListType = new InputOptionListType();
        inputOptionListType.setPatientList(patientListType);
        // inputOptionListType.setVisitList(visitListType);

        GetPDOFromInputListRequestType inputListRequestType = new GetPDOFromInputListRequestType();
        inputListRequestType.setFilterList(filterListType);
        inputListRequestType.setOutputOption(outputOptionListType);
        inputListRequestType.setInputList(inputOptionListType);

        return inputListRequestType;
    }

    public String requestXmlMessage(ArrayList<PDOItem> items, String patientSetRefId, Integer min, Integer max,
            boolean fromFact, String filter) throws Exception {
        PdoQryHeaderType headerType = buildHeaderType();
        // GetPDOFromPatientSetRequestType patientSetRequestType =
        // buildPatientSetRequestType();

        GetPDOFromInputListRequestType patientSetRequestType = getPDOFromInputListRequestType(items,
                patientSetRefId, min, max, fromFact, filter);
        ObjectFactory obsFactory = new ObjectFactory();

        BodyType bodyType = new BodyType();
        bodyType.getAny().add(obsFactory.createPdoheader(headerType));
        bodyType.getAny().add(obsFactory.createRequest(patientSetRequestType));

        RequestHeaderType requestHeader = new RequestHeaderType();
        requestHeader.setResultWaittimeMs(180000);

        MessageHeaderType messageHeader = getMessageHeader();
        RequestMessageType reqMsgType = new RequestMessageType();
        reqMsgType.setMessageBody(bodyType);
        reqMsgType.setMessageHeader(messageHeader);
        reqMsgType.setRequestHeader(requestHeader);

        JAXBUtil jaxbUtil = ExplorerJAXBUtil.getJAXBUtil();
        StringWriter strWriter = new StringWriter();
        try {
            edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.ObjectFactory of = new edu.harvard.i2b2.crcxmljaxb.datavo.i2b2message.ObjectFactory();
            jaxbUtil.marshallerWithCDATA(of.createRequest(reqMsgType), strWriter,
                    new String[] { "value_constraint" });
        } catch (Exception e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }

        log.debug("Request Xml String: " + strWriter.toString());
        return strWriter.toString();
    }

    public static void main(String[] args) throws Exception {
        PDORequestMessageModel pdoFactory = new PDORequestMessageModel();
        String conceptPath = new String(
                "\\RPDR\\Labtests\\LAB\\(LLB16) Chemistry\\(LLB21) General Chemistries\\CA");

        ArrayList<String> paths = new ArrayList<String>();
        paths.add(conceptPath);

        conceptPath = new String("\\RPDR\\Labtests\\LAB\\(LLB16) Chemistry\\(LLB21) General Chemistries\\GGT");
        paths.add(conceptPath);

        ArrayList<String> ppaths = new ArrayList<String>();
        conceptPath = new String("\\Providers\\BWH");
        ppaths.add(conceptPath);

        pdoFactory.requestXmlMessage(null, "1545", new Integer(0), new Integer(10), false, "");
    }

    protected MessageHeaderType getMessageHeader() {
        MessageHeaderType messageHeader = new MessageHeaderType();

        messageHeader
                .setI2B2VersionCompatible(new BigDecimal(Messages.getString("QueryData.i2b2VersionCompatible"))); //$NON-NLS-1$

        ApplicationType appType = new ApplicationType();
        appType.setApplicationName(Messages.getString("QueryData.SendingApplicationName")); //$NON-NLS-1$
        appType.setApplicationVersion(Messages.getString("QueryData.SendingApplicationVersion")); //$NON-NLS-1$
        messageHeader.setSendingApplication(appType);

        messageHeader.setAcceptAcknowledgementType(new String("messageId"));

        MessageTypeType messageTypeType = new MessageTypeType();
        messageTypeType.setEventType(Messages.getString("QueryData.EventType"));
        messageTypeType.setMessageCode(Messages.getString("QueryData.MessageCode"));
        messageHeader.setMessageType(messageTypeType);

        FacilityType facility = new FacilityType();
        facility.setFacilityName(Messages.getString("QueryData.SendingFacilityName")); //$NON-NLS-1$
        messageHeader.setSendingFacility(facility);

        ApplicationType appType2 = new ApplicationType();
        appType2.setApplicationVersion(Messages.getString("QueryData.ReceivingApplicationVersion")); //$NON-NLS-1$
        appType2.setApplicationName(Messages.getString("QueryData.ReceivingApplicationName")); //$NON-NLS-1$
        messageHeader.setReceivingApplication(appType2);

        FacilityType facility2 = new FacilityType();
        facility2.setFacilityName(Messages.getString("QueryData.ReceivingFacilityName")); //$NON-NLS-1$
        messageHeader.setReceivingFacility(facility2);

        Date currentDate = new Date();
        DTOFactory factory = new DTOFactory();
        messageHeader.setDatetimeOfMessage(factory.getXMLGregorianCalendar(currentDate.getTime()));

        SecurityType secType = new SecurityType();
        secType.setDomain(UserInfoBean.getInstance().getUserDomain());
        secType.setUsername(UserInfoBean.getInstance().getUserName());
        PasswordType ptype = new PasswordType();
        ptype.setIsToken(UserInfoBean.getInstance().getUserPasswordIsToken());
        ptype.setTokenMsTimeout(UserInfoBean.getInstance().getUserPasswordTimeout());
        ptype.setValue(UserInfoBean.getInstance().getUserPassword());

        secType.setPassword(ptype);
        messageHeader.setSecurity(secType);

        MessageControlIdType mcIdType = new MessageControlIdType();
        mcIdType.setInstanceNum(0);
        mcIdType.setMessageNum(generateMessageId());
        messageHeader.setMessageControlId(mcIdType);

        ProcessingIdType proc = new ProcessingIdType();
        proc.setProcessingId(Messages.getString("QueryData.ProcessingId")); //$NON-NLS-1$
        proc.setProcessingMode(Messages.getString("QueryData.ProcessingMode")); //$NON-NLS-1$
        messageHeader.setProcessingId(proc);

        messageHeader.setAcceptAcknowledgementType(Messages.getString("QueryData.AcceptAcknowledgementType")); //$NON-NLS-1$
        messageHeader
                .setApplicationAcknowledgementType(Messages.getString("QueryData.ApplicationAcknowledgementType")); //$NON-NLS-1$
        messageHeader.setCountryCode(Messages.getString("QueryData.CountryCode")); //$NON-NLS-1$
        messageHeader.setProjectId(UserInfoBean.getInstance().getProjectId());
        return messageHeader;
    }

    protected String generateMessageId() {
        StringWriter strWriter = new StringWriter();
        for (int i = 0; i < 20; i++) {
            int num = getValidAcsiiValue();
            strWriter.append((char) num);
        }
        return strWriter.toString();
    }

    private int getValidAcsiiValue() {
        int number = 48;
        while (true) {
            number = 48 + (int) Math.round(Math.random() * 74);
            if ((number > 47 && number < 58) || (number > 64 && number < 91) || (number > 96 && number < 123)) {
                break;
            }
        }
        return number;

    }

    private String getValueName(PSMValueModel model) {
        String name = "";
        if (model.noValue()) {
            return name;
        } else if (model.useValueFlag()) {
            if (model.valueFlag().equalsIgnoreCase("H")) {
                name = "=HIGH";
            } else {
                name = "=LOW";
            }
        } else if (model.useNumericValue()) {

            // deal with between...
            if (model.operator().equalsIgnoreCase("between")) {
                name = "between " + model.lowValue() + " and " + model.highValue();
            } else {
                name = /* getOperator( */model.operator()/* ) */ + " " + model.value();
            }
        }
        return name;
    }
}