/*
* 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:
* Rajesh Kuttan
*/
package edu.harvard.i2b2.fr.delegate;
import java.util.ArrayList;
import java.util.Iterator;
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.fr.datavo.FRJAXBUtil;
import edu.harvard.i2b2.fr.datavo.I2B2MessageResponseFactory;
import edu.harvard.i2b2.fr.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.fr.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.fr.datavo.i2b2message.SecurityType;
import edu.harvard.i2b2.fr.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.fr.datavo.pm.ConfigureType;
import edu.harvard.i2b2.fr.datavo.pm.ParamType;
import edu.harvard.i2b2.fr.datavo.pm.ProjectType;
import edu.harvard.i2b2.fr.delegate.RequestHandlerDelegate;
import edu.harvard.i2b2.fr.delegate.pm.PMServiceDriver;
import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.bind.JAXBElement;
/**
* PDO query request delegate class
* $Id: LoaderQueryRequestDelegate.java,v 1.7 2008/10/21 17:56:30 mem61 Exp $
* @author rkuttan
*/
public class LoaderQueryRequestDelegate extends RequestHandlerDelegate {
/** log **/
protected final Log log = LogFactory.getLog(getClass());
//ConfigureType pmResponseUserInfo = null;
@Override
public String handleRequest(String requestXml,RequestHandler requestHandler) throws I2B2Exception {
String response = null;
JAXBUtil jaxbUtil = FRJAXBUtil.getJAXBUtil();
try {
log.debug("LoaderQueryRequestDelegate - RequestXML: " + requestXml);
JAXBElement<?> jaxbElement = jaxbUtil.unMashallFromString(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");
}
log.debug("Calling PM Cell to vaidate user");
//Call PM cell to validate user
StatusType procStatus = null;
ProjectType projectType = null;
ConfigureType pmResponseUserInfo = null;
try {
SecurityType securityType = null;
if (requestMessageType.getMessageHeader() != null ){
if (requestMessageType.getMessageHeader().getSecurity() != null) {
securityType = requestMessageType.getMessageHeader().getSecurity();
}
}
if (securityType == null) {
procStatus = new StatusType();
procStatus.setType("ERROR");
procStatus.setValue("Request message missing user/password");
response = I2B2MessageResponseFactory.buildResponseMessage(requestXml, procStatus, bodyType);
return response;
}
pmResponseUserInfo = PMServiceDriver.checkValidUser(securityType);
//projectType = pmResponseUserInfo.getUser().getProject().get(0);
Iterator<?> it = pmResponseUserInfo.getUser().getProject().iterator();
while (it.hasNext())
{
projectType = (ProjectType)it.next();
if (projectType.getId().equals(requestMessageType.getMessageHeader().getProjectId())) {
// log.info(header.getProjectId());
// log.info(projectType.getId());
break;
}
}
if (projectType == null) {
procStatus = new StatusType();
procStatus.setType("ERROR");
procStatus.setValue("Invalid user/password for the given domain");
response = I2B2MessageResponseFactory.buildResponseMessage(requestXml, procStatus, bodyType);
return response;
}
log.debug("project name from PM " + projectType.getName());
log.debug("project id from PM " + projectType.getId());
log.debug("Project role from PM " + projectType.getRole().get(0));
} catch (AxisFault e) {
log.error("AxisFault exception",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) {
log.error("I2B2Exception exception",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) {
log.error("JAXBUtil exception",e);
procStatus = new StatusType();
procStatus.setType("ERROR");
procStatus.setValue("Message error from Project Management cell");
response = I2B2MessageResponseFactory.buildResponseMessage(requestXml, procStatus, bodyType);
return response;
}
JAXBUnWrapHelper unWrapHelper = new JAXBUnWrapHelper();
BodyType responseBodyType = null;
if (requestHandler instanceof SendfileRequestHandler) {
String irodsStorageResource = null;
// check if user have right permission to access this request
log.debug("Number of roles:" + projectType.getRole().size());
if (projectType != null && projectType.getRole().size() > 0) {
//for (String a : projectType.getRole())
// log.debug("Roles:" + a);
if (isRoleValid(projectType) == false) {
//!projectType.getRole().contains("MANAGER") && !projectType.getRole().contains("EDITOR")) {
// Not authorized
procStatus = new StatusType();
procStatus.setType("ERROR");
procStatus
.setValue("Authorization failure, need MANAGER or EDITOR role");
response = I2B2MessageResponseFactory
.buildResponseMessage(requestXml, procStatus,
bodyType);
return response;
}
} else {
// Not authorized
procStatus = new StatusType();
procStatus.setType("ERROR");
procStatus
.setValue("Authorization failure, need MANAGER or EDITOR role");
response = I2B2MessageResponseFactory.buildResponseMessage(
requestXml, procStatus, bodyType);
return response;
}
for (ParamType paramType : projectType.getParam()) {
if (paramType.getName().equalsIgnoreCase("SRBDefaultStorageResource")) {
irodsStorageResource = paramType.getValue();
log.debug("param value for SRBDefaultStorageResource" + paramType.getValue());
}
}
((SendfileRequestHandler)requestHandler).setPmResponseUserInfo(pmResponseUserInfo);
}
if (requestHandler instanceof RecvfileRequestHandler) {
String irodsStorageResource = null;
for (ParamType paramType : projectType.getParam()) {
if (paramType.getName().equalsIgnoreCase("SRBDefaultStorageResource")) {
irodsStorageResource = paramType.getValue();
log.debug("param value for SRBDefaultStorageResource" + paramType.getValue());
}
}
((RecvfileRequestHandler)requestHandler).setPmResponseUserInfo(pmResponseUserInfo);
}
responseBodyType = requestHandler.execute();
procStatus = new StatusType();
procStatus.setType("DONE");
procStatus.setValue("DONE");
response = I2B2MessageResponseFactory.buildResponseMessage(requestXml, procStatus, responseBodyType,true);
} catch (JAXBUtilException e) {
log.error("JAXBUtil exception",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();
}
} 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;
}
public boolean isRoleValid(ProjectType projectInfo){
ArrayList<String> roles = (ArrayList<String>) projectInfo.getRole();
for(String param :roles) {
if(param.equalsIgnoreCase("manager"))
return true;
if(param.equalsIgnoreCase("editor"))
return true;
}
return false;
}
}