edu.harvard.i2b2.crc.loader.delegate.pm.PMServiceDriver.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.crc.loader.delegate.pm.PMServiceDriver.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: 
 *     Rajesh Kuttan
 */
package edu.harvard.i2b2.crc.loader.delegate.pm;

import java.io.StringReader;
import java.util.List;

import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
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.axis2.ServiceClient;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.crc.datavo.i2b2message.SecurityType;
import edu.harvard.i2b2.crc.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.crc.datavo.pm.ConfigureType;
import edu.harvard.i2b2.crc.datavo.pm.GetUserConfigurationType;
import edu.harvard.i2b2.crc.datavo.pm.ProjectType;
import edu.harvard.i2b2.crc.loader.util.CRCLoaderUtil;

public class PMServiceDriver {
    private static Log log = LogFactory.getLog(PMServiceDriver.class);

    /**
     * Function to convert pm requestVdo to OMElement
     * 
     * @param requestPm
     *            String request to send to pm web service
     * @return An OMElement containing the pm web service requestVdo
     */
    public OMElement getPmPayLoad(String requestPm) throws I2B2Exception {
        OMElement method = null;
        try {
            OMFactory fac = OMAbstractFactory.getOMFactory();
            // OMNamespace omNs =
            // fac.createOMNamespace("http://www.i2b2.org/xsd/hive/msg",
            // "i2b2");
            // method = fac.createOMElement("request", omNs);
            StringReader strReader = new StringReader(requestPm);
            XMLInputFactory xif = XMLInputFactory.newInstance();
            XMLStreamReader reader = xif.createXMLStreamReader(strReader);
            StAXOMBuilder builder = new StAXOMBuilder(reader);
            method = builder.getDocumentElement();

        } catch (FactoryConfigurationError e) {
            log.error(e.getMessage());
            throw new I2B2Exception("", e.getException());
        } catch (XMLStreamException e) {
            log.error(e.getMessage());
            throw new I2B2Exception("", e);
        }
        return method;
    }

    /**
     * Function to send getRoles request to PM web service
     * 
     * @param GetUserConfigurationType
     *            userConfig we wish to get data for
     * @return A String containing the PM web service response
     */
    public String getRoles(SecurityType userSec) throws AxisFault, I2B2Exception {
        String response = null;
        try {
            GetUserConfigurationRequestMessage reqMsg = new GetUserConfigurationRequestMessage();
            String getRolesRequestString = reqMsg.doBuildXML(new GetUserConfigurationType(), userSec);
            OMElement getPm = getPmPayLoad(getRolesRequestString);
            String pmEPR = "";
            try {
                pmEPR = CRCLoaderUtil.getInstance().getProjectManagementCellUrl();
                log.debug("project management cell URL " + pmEPR);
            } catch (I2B2Exception e1) {
                e1.printStackTrace();
                log.error("Error reading project management cell URL " + e1.getMessage());
                throw new I2B2Exception("Error reading project management cell URL " + e1.getMessage());
            }
            /*
            Options options = new Options();
            options.setTo(new EndpointReference(pmEPR));
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
            options.setProperty(Constants.Configuration.ENABLE_REST,
                  Constants.VALUE_TRUE);
            options.setTimeOutInMilliSeconds(50000);
            ServiceClient sender = PMServiceClient.getServiceClient();
            sender.setOptions(options);
            OMElement result = sender.sendReceive(getPm);
            if (result != null) {
               response = result.toString();
               log.debug("PM response message [" + response + "]");
            }
            sender.cleanup();
            */

            response = ServiceClient.sendREST(pmEPR, getPm);
        } catch (AxisFault e) {
            log.error(e);
            throw e;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return response;
    }

    public ProjectType checkValidUser(SecurityType security, String projectId)
            throws I2B2Exception, AxisFault, JAXBUtilException {
        ProjectType projectType = null;

        // Are we bypassing the PM cell? Look in properties file.
        Boolean pmBypass = false;
        String pmBypassRole = null, pmBypassProject = null, response = null;
        try {
            pmBypass = CRCLoaderUtil.getInstance().getProjectManagementByPassFlag();
            pmBypassRole = CRCLoaderUtil.getInstance().getProjectManagementByPassRole();
            pmBypassProject = CRCLoaderUtil.getInstance().getProjectManagementByPassProject();
            log.debug("Project Management bypass flag  from property file :[" + pmBypass + "] bypass role ["
                    + pmBypassRole + "] project [" + pmBypassProject + "]");
        } catch (I2B2Exception e1) {
            e1.printStackTrace();
            log.info("Could not read Project Management bypass setting, trying PM without bypass option");
        }

        if (pmBypass == true) {
            log.info("Using Project Management by pass option ");
            log.info("Using project Management bypass flag  from property file :[" + pmBypass + "] bypass role ["
                    + pmBypassRole + "] project [" + pmBypassProject + "]");
            projectType = new ProjectType();
            projectType.getRole().add(pmBypassRole);
            projectType.setId(pmBypassProject);

        } else {
            PMResponseMessage msg = new PMResponseMessage();
            response = getRoles(security);
            StatusType procStatus = msg.processResult(response);
            if (procStatus.getType().equalsIgnoreCase("ERROR")) {
                log.debug("PM response error [" + procStatus.getValue() + "]");
                projectType = null;
            } else {
                ConfigureType pmResponseUserInfo = msg.readUserInfo();
                List<ProjectType> projectList = pmResponseUserInfo.getUser().getProject();
                for (ProjectType pType : projectList) {
                    if (pType.getId().equalsIgnoreCase(projectId)) {
                        projectType = pType;
                        break;
                    }
                }
                if (projectType == null) {
                    throw new I2B2Exception("User not registered to the project[" + projectId + "]");
                }

            }
        }
        return projectType;
    }
}