/* * 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; } }