/*
* Copyright (c) 2012 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.
*
* Creator:
* Neha Patel
*/
package edu.harvard.i2b2.im.delegate;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Iterator;
import java.util.List;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.im.util.HighEncryption;
import edu.harvard.i2b2.im.ws.MessageFactory;
import edu.harvard.i2b2.im.ws.PDORequestMessage;
import edu.harvard.i2b2.im.ws.PDOResponseMessage;
import edu.harvard.i2b2.im.dao.IMKey;
import edu.harvard.i2b2.im.dao.PdoDao;
import edu.harvard.i2b2.im.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.im.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.im.datavo.pdo.PatientDataType;
import edu.harvard.i2b2.im.datavo.pdo.PidSet;
import edu.harvard.i2b2.im.datavo.pdo.PidType;
import edu.harvard.i2b2.im.datavo.pdo.PidType.PatientMapId;
import edu.harvard.i2b2.im.datavo.pdo.query.GetPDOFromInputListRequestType;
import edu.harvard.i2b2.im.datavo.pdo.query.PatientDataResponseType;
import edu.harvard.i2b2.im.datavo.pdo.query.PdoQryHeaderType;
import edu.harvard.i2b2.im.datavo.pdo.query.PdoRequestTypeType;
import edu.harvard.i2b2.im.datavo.pdo.query.RequestType;
import edu.harvard.i2b2.im.datavo.pdo.query.PidListType.Pid;
import edu.harvard.i2b2.im.datavo.pm.ProjectType;
public class ValidationHandlerHandler extends RequestHandler {
private String userId = null;
private PDORequestMessage pdoRequestMsg;
private PdoQryHeaderType requestType;
private ProjectType projectInfo = null;
private PdoDao pdoDao;
public ValidationHandlerHandler(PDORequestMessage requestMsg) throws I2B2Exception{
try {
pdoDao = new PdoDao();
pdoRequestMsg = requestMsg;
requestType = requestMsg.getPdoQryHeaderType();
projectInfo = getRoleInfo(requestMsg.getMessageHeaderType());
userId = requestMsg.getMessageHeaderType().getSecurity().getUsername();
setDbInfo(requestMsg.getMessageHeaderType());
} catch (Exception e) {
log.error("error setting up ValidationHandlerHandler");
throw new I2B2Exception("ValidationHandlerHandler not configured");
}
}
public String execute() throws I2B2Exception{
// call ejb and pass input object
ResponseMessageType responseMessageType = null;
String errResponse = "";
Boolean errorFlag = false;
// check to see if we have userId(if not indicates problem)
if(userId == null) {
log.error("user Id is null");
responseMessageType = MessageFactory.doBuildErrorResponse(pdoRequestMsg.getMessageHeaderType(), "PM service is not responding");
}
// Error flag has been set to true, return a error response with appropriate message
if(errorFlag){
responseMessageType = MessageFactory.doBuildErrorResponse(pdoRequestMsg.getMessageHeaderType(), errResponse);
errResponse = MessageFactory.convertToXMLString(responseMessageType);
return errResponse;
}
String response = null;
// Verify key is set
try {
if (IMKey.isKeySet(projectInfo) == -11111)
responseMessageType = MessageFactory.doBuildErrorResponse(pdoRequestMsg.getMessageHeaderType(), "User does not have correct privileges");
else if (IMKey.isKeySet(projectInfo) == 0)
responseMessageType = MessageFactory.doBuildErrorResponse(pdoRequestMsg.getMessageHeaderType(), "Key not set");
} catch (Exception e1) {
responseMessageType = MessageFactory.doBuildErrorResponse(pdoRequestMsg.getMessageHeaderType(), "Database error");
}
// String responseWdo = null;
PDOResponseMessage protectedDataMsg = new PDOResponseMessage();
try {
PatientDataResponseType patientDataResponsse = new PatientDataResponseType();
//protectedDataMsg.getPatientDataFromResponseXML(response);
GetPDOFromInputListRequestType getPDOFromInputListRequestType = pdoRequestMsg.getgetPDOFromInputListRequestType();
//Go through the patients and encrypt them
List<Pid> pids = getPDOFromInputListRequestType.getInputList().getPidList().getPid();
// create a new pid set
PidType pidType = new PidType();
for (Pid pid: pids) {
PatientMapId pmapId = new PatientMapId();
pmapId.setSource(pid.getSource());
pmapId.setValue(pid.getValue());
pidType.getPatientMapId().add(pmapId);
}
PidSet pidset = new PidSet();
pidset.getPid().add(pidType);
PidSet newids = pdoDao.findPidsByProject(pidset, userId, projectInfo, this.getDbInfo());
//Save pids in Audit Table
pdoDao.addAudit(projectInfo.getId(), newids, userId, null, this.getDbInfo());
PatientDataType patientDataType = new PatientDataType();
patientDataType.setPidSet(newids);
patientDataResponsse.setPatientData(patientDataType);
//patientDataResponsse.s.getPatientData();
responseMessageType = MessageFactory.createBuildResponsePdo(pdoRequestMsg.getMessageHeaderType(), null);
responseMessageType.setMessageBody(protectedDataMsg.getBodyType(patientDataResponsse));
response = MessageFactory.convertToXMLString(responseMessageType);
//response = protectedDataMsg.doBuildXML(patientDataResponsse,pdoRequestMsg.getMessageHeaderType());
}
catch (Exception e)
{
e.printStackTrace();
}
return response;
}
}