/* * 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.delegate.setfinder; import java.util.Date; import java.util.List; import javax.xml.bind.JAXBElement; import org.apache.axis2.AxisFault; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.harvard.i2b2.common.exception.I2B2Exception; import edu.harvard.i2b2.common.exception.StackTraceUtil; import edu.harvard.i2b2.common.util.jaxb.JAXBUnWrapHelper; import edu.harvard.i2b2.common.util.jaxb.JAXBUtil; import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException; import edu.harvard.i2b2.crc.dao.setfinder.querybuilder.ProcessTimingReportUtil; import edu.harvard.i2b2.crc.datavo.CRCJAXBUtil; import edu.harvard.i2b2.crc.datavo.I2B2MessageResponseFactory; import edu.harvard.i2b2.crc.datavo.i2b2message.BodyType; import edu.harvard.i2b2.crc.datavo.i2b2message.RequestMessageType; import edu.harvard.i2b2.crc.datavo.i2b2message.SecurityType; import edu.harvard.i2b2.crc.datavo.i2b2message.StatusType; import edu.harvard.i2b2.crc.datavo.pm.ParamType; import edu.harvard.i2b2.crc.datavo.pm.ProjectType; import edu.harvard.i2b2.crc.datavo.setfinder.query.PsmQryHeaderType; import edu.harvard.i2b2.crc.datavo.setfinder.query.PsmRequestTypeType; import edu.harvard.i2b2.crc.datavo.setfinder.query.StatusType.Condition; import edu.harvard.i2b2.crc.delegate.RequestHandlerDelegate; import edu.harvard.i2b2.crc.delegate.ejbpm.EJBPMUtil; import edu.harvard.i2b2.crc.delegate.pm.CallPMUtil; import edu.harvard.i2b2.crc.delegate.pm.PMServiceDriver; import edu.harvard.i2b2.crc.util.CacheUtil; import edu.harvard.i2b2.crc.util.LogTimingUtil; import edu.harvard.i2b2.crc.util.ParamUtil; /** * Setfinder query request delegate class $Id: QueryRequestDelegate.java,v 1.17 * 2008/05/08 15:13:45 rk903 Exp $ * * @author rkuttan */ public class QueryRequestDelegate extends RequestHandlerDelegate { /** log **/ protected final Log log = LogFactory.getLog(getClass()); /** * @see edu.harvard.i2b2.crc.delegate.RequestHandlerDelegate#handleRequest(java.lang.String) */ public String handleRequest(String requestXml) throws I2B2Exception { PsmQryHeaderType headerType = null; String response = null; JAXBUtil jaxbUtil = CRCJAXBUtil.getJAXBUtil(); try { JAXBElement jaxbElement = jaxbUtil.unMashallFromString(requestXml); if (jaxbElement == null) { throw new I2B2Exception("Request is null after unmashall" + requestXml); } RequestMessageType requestMessageType = (RequestMessageType) jaxbElement .getValue(); BodyType bodyType = requestMessageType.getMessageBody(); if (bodyType == null) { log.error("null value in body type"); throw new I2B2Exception("null value in body type"); } // Call PM cell to validate user ProjectType projectType = null; StatusType procStatus = null; try { SecurityType securityType = null; String projectId = null; if (requestMessageType.getMessageHeader() != null) { if (requestMessageType.getMessageHeader().getSecurity() != null) { securityType = requestMessageType.getMessageHeader() .getSecurity(); } projectId = requestMessageType.getMessageHeader() .getProjectId(); } if (securityType == null) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Request message missing user/password"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } // String pmResponse = // PMServiceDriver.checkValidUser(securityType); PMServiceDriver pmServiceDriver = new PMServiceDriver(); projectType = pmServiceDriver.checkValidUser(securityType, projectId); if (projectType == null) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Invalid user/password for the given project[" + projectId + "]"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } log.debug("project name from PM " + projectType.getName()); log.debug("project id from PM " + projectType.getId()); if (projectType.getRole() != null) { log.debug("project role from PM " + projectType.getRole().get(0)); this.putRoles(projectId, securityType.getUsername(), securityType.getDomain(), projectType.getRole()); //TODO removed cache // Node rootNode = CacheUtil.getCache().getRoot(); //List<String> roles = (List<String>) rootNode // .get(securityType.getDomain() + "/" + projectId // + "/" + securityType.getUsername()); List<String> roles = (List<String>) CacheUtil .get(securityType.getDomain() + "/" + projectId + "/" + securityType.getUsername()); if (roles != null) { log.debug("User Roles count " + roles.size()); } } else { log.error("Project role not set for the user "); } //check if process_timing_flag is set log.debug("check if process_timing_flag is set"); LogTimingUtil.clearPocessTiming(projectId, securityType.getUsername(), securityType.getDomain()); ParamUtil paramUtil = new ParamUtil(); paramUtil.clearParam(projectId, securityType.getUsername(), securityType.getDomain(), ParamUtil.CRC_ENABLE_UNITCD_CONVERSION); if (projectType.getParam() != null) { for (ParamType param : projectType.getParam()) { if (param.getName() != null && param.getName().trim().equalsIgnoreCase(LogTimingUtil.PM_ENABLE_PROCESS_TIMING)) { //this.putPocessTiming(projectId, securityType.getUsername(), securityType.getDomain(), param); LogTimingUtil.putPocessTiming(projectId, securityType.getUsername(), securityType.getDomain(), param); String cacheValue = LogTimingUtil.getPocessTiming(projectId, securityType.getUsername(), securityType.getDomain()); log.debug("CRC param stored in the cache Project Id [" + projectId + "] user [" + securityType.getUsername() + "] domain [" + securityType.getDomain() + "] " + ParamUtil.PM_ENABLE_PROCESS_TIMING + "[" + cacheValue + "]" ); } else if (param.getName() != null && param.getName().trim().equalsIgnoreCase(ParamUtil.CRC_ENABLE_UNITCD_CONVERSION)) { paramUtil.putParam(projectId, securityType.getUsername(), securityType.getDomain(),ParamUtil.CRC_ENABLE_UNITCD_CONVERSION,param); String unitCdCache = paramUtil.getParam(projectId, securityType.getUsername(), securityType.getDomain(),ParamUtil.CRC_ENABLE_UNITCD_CONVERSION); log.debug("CRC param stored in the cache Project Id [" + projectId + "] user [" + securityType.getUsername() + "] domain [" + securityType.getDomain() + "] " + ParamUtil.CRC_ENABLE_UNITCD_CONVERSION + "[" + unitCdCache + "]" ); } } } } catch (AxisFault e) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus.setValue("Could not connect to server"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } catch (I2B2Exception e) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Message error connecting Project Management cell"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } catch (JAXBUtilException e) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Message error from Project Management cell"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } // check if the role is DATA_AGG to proceed log.debug("check if the role is DATA_AGG to proceed"); boolean errorFlag = false; JAXBUnWrapHelper unWrapHelper = new JAXBUnWrapHelper(); headerType = (PsmQryHeaderType) unWrapHelper .getObjectByClass( bodyType.getAny(), edu.harvard.i2b2.crc.datavo.setfinder.query.PsmQryHeaderType.class); BodyType responseBodyType = null; if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_QUERY_MASTER_LIST_FROM_USER_ID)) { GetQueryMasterListFromUserIdHandler handler = new GetQueryMasterListFromUserIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_QUERY_MASTER_LIST_FROM_GROUP_ID)) { // check if user have right permission to access this request if (projectType != null && projectType.getRole().size() > 0) { if ((!projectType.getRole().contains("MANAGER"))) { // Not authorized procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Authorization failure, should have MANAGER role"); response = I2B2MessageResponseFactory .buildResponseMessage(requestXml, procStatus, bodyType); return response; } } else { // Not authorized procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("Authorization failure, should have MANAGER role"); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } GetQueryMasterListFromGroupIdHandler handler = new GetQueryMasterListFromGroupIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_RUN_QUERY_INSTANCE_FROM_QUERY_DEFINITION)) { log.debug("Running in " + PsmRequestTypeType.CRC_QRY_RUN_QUERY_INSTANCE_FROM_QUERY_DEFINITION); ParamType lockedParamType = null; List<ParamType> paramList = projectType.getParam(); for (ParamType paramType : paramList) { if (paramType.getName().equals(EJBPMUtil.LOCKEDOUT)) { lockedParamType = paramType; break; } } log.debug("Check if user is locked out"); if (lockedParamType != null) { // Not authorized procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("LOCKEDOUT error: The user account is lockedout at [" + lockedParamType.getValue() + "]"); bodyType = new BodyType(); response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, bodyType); return response; } else { RunQueryInstanceFromQueryDefinitionHandler handler = new RunQueryInstanceFromQueryDefinitionHandler( requestXml); responseBodyType = handler.execute(); // check if the response body type has lockedout error if (handler.getLockedoutFlag()) { procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus .setValue("LOCKEDOUT error: The user account is lockedout at [" + new Date(System.currentTimeMillis()) + "]"); response = I2B2MessageResponseFactory .buildResponseMessage(requestXml, procStatus, responseBodyType); return response; } //if (handler.getErrorFlag()) { // errorFlag = true; //} } } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_RUN_QUERY_INSTANCE_FROM_QUERY_MASTER_ID)) { RunQueryInstanceFromQueryMasterHandler handler = new RunQueryInstanceFromQueryMasterHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_QUERY_RESULT_INSTANCE_LIST_FROM_QUERY_INSTANCE_ID)) { GetQueryResultInstanceListFromQueryInstanceIdHandler handler = new GetQueryResultInstanceListFromQueryInstanceIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_QUERY_INSTANCE_LIST_FROM_QUERY_MASTER_ID)) { GetQueryInstanceListFromMasterIdHandler handler = new GetQueryInstanceListFromMasterIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_REQUEST_XML_FROM_QUERY_MASTER_ID)) { GetRequestXmlFromQueryMasterIdHandler handler = new GetRequestXmlFromQueryMasterIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType.getRequestType().equals( PsmRequestTypeType.CRC_QRY_DELETE_QUERY_MASTER)) { DeleteQueryMasterHandler handler = new DeleteQueryMasterHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType.getRequestType().equals( PsmRequestTypeType.CRC_QRY_RENAME_QUERY_MASTER)) { RenameQueryMasterHandler handler = new RenameQueryMasterHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_UPDATE_RESULT_INSTANCE_DESCRIPTION)) { UpdateQueryResultInstanceDescriptionHandler handler = new UpdateQueryResultInstanceDescriptionHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_GET_RESULT_DOCUMENT_FROM_RESULT_INSTANCE_ID)) { GetXmlResultFromQueryResultIdHandler handler = new GetXmlResultFromQueryResultIdHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType.getRequestType().equals( PsmRequestTypeType.CRC_QRY_GET_RESULT_TYPE)) { GetAllQueryResultTypeHandler handler = new GetAllQueryResultTypeHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType .getRequestType() .equals( PsmRequestTypeType.CRC_QRY_RUN_QUERY_INSTANCE_FROM_ANALYSIS_DEFINITION)) { RunQueryInstanceFromAnalysisDefinitionHandler handler = new RunQueryInstanceFromAnalysisDefinitionHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType.getRequestType().equals( PsmRequestTypeType.CRC_QRY_CANCEL_QUERY)) { CancelQueryInstanceHandler handler = new CancelQueryInstanceHandler( requestXml); responseBodyType = handler.execute(); } else if (headerType.getRequestType().equals( PsmRequestTypeType.CRC_QRY_GET_ANALYSIS_PLUGIN_METADATA)) { GetAnalysisPluginMetadataTypeHandler handler = new GetAnalysisPluginMetadataTypeHandler( requestXml); responseBodyType = handler.execute(); } procStatus = new StatusType(); if (errorFlag == false) { procStatus.setType("DONE"); procStatus.setValue("DONE"); } else { procStatus.setType("ERROR"); procStatus.setValue("ERROR"); } response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, responseBodyType); } catch (JAXBUtilException e) { log.error("JAXBUtilException", e); StatusType procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus.setValue(requestXml + "\n\n" + StackTraceUtil.getStackTrace(e)); try { response = I2B2MessageResponseFactory.buildResponseMessage( null, procStatus, null); } catch (JAXBUtilException e1) { e1.printStackTrace(); } // throw new I2B2Exception("JAXBUtil exception",e); } catch (I2B2Exception e) { log.error("I2B2Exception", e); StatusType procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus.setValue(StackTraceUtil.getStackTrace(e)); try { response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, null); } catch (JAXBUtilException e1) { e1.printStackTrace(); } } catch (Throwable e) { log.error("Throwable", e); StatusType procStatus = new StatusType(); procStatus.setType("ERROR"); procStatus.setValue(StackTraceUtil.getStackTrace(e)); try { response = I2B2MessageResponseFactory.buildResponseMessage( requestXml, procStatus, null); } catch (JAXBUtilException e1) { e1.printStackTrace(); } } return response; } }