/*
* 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.ejb;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import edu.harvard.i2b2.common.exception.I2B2DAOException;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.common.util.jaxb.DTOFactory;
import edu.harvard.i2b2.crc.dao.DAOFactoryHelper;
import edu.harvard.i2b2.crc.dao.SetFinderDAOFactory;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryInstanceDao;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryMasterDao;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryResultInstanceDao;
import edu.harvard.i2b2.crc.dao.setfinder.IQueryResultTypeDao;
import edu.harvard.i2b2.crc.datavo.PSMFactory;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
import edu.harvard.i2b2.crc.datavo.db.QtQueryInstance;
import edu.harvard.i2b2.crc.datavo.db.QtQueryMaster;
import edu.harvard.i2b2.crc.datavo.db.QtQueryResultInstance;
import edu.harvard.i2b2.crc.datavo.db.QtQueryResultType;
import edu.harvard.i2b2.crc.datavo.db.QtQueryStatusType;
import edu.harvard.i2b2.crc.datavo.i2b2message.SecurityType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.FindByChildType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.InstanceResultResponseType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.MasterRequestType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.MasterResponseType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryInstanceType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryMasterType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryResultInstanceType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.QueryResultTypeType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.RequestXmlType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ResultResponseType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.ResultTypeResponseType;
import edu.harvard.i2b2.crc.datavo.setfinder.query.UserRequestType;
/**
* Ejb manager class for query operation
*
* @author rkuttan
*
* @ejb.bean description="QueryTool Query Info"
* display-name="QueryTool Query Info"
* jndi-name="ejb.querytool.QueryInfo"
* local-jndi-name="ejb.querytool.QueryInfoLocal"
* name="querytool.QueryInfo" type="Stateless" view-type="both"
* transaction-type="Container"
*
*
*
* @ejb.interface remote-class="edu.harvard.i2b2.crc.ejb.QueryInfoRemote"
*
*
*/
public class QueryInfoBean { //implements SessionBean {
private static Log log = LogFactory.getLog(QueryInfoBean.class);
/**
* Function to return master query list for the given user id
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param userRequestType
* user_id
*
* @return String publish response XML
*/
public MasterResponseType getQueryMasterListFromUserId(
DataSourceLookup dataSourceLookup, UserRequestType userRequestType)
throws I2B2DAOException {
String userId = userRequestType.getUserId();
int fetchSize = userRequestType.getFetchSize();
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
List<QtQueryMaster> masterList = queryMasterDao.getQueryMasterByUserId(
userId, fetchSize);
MasterResponseType masterResponseType = buildMasterResponseType(masterList);
return masterResponseType;
}
/**
* Function to return master query list for the give group id
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param userRequestType
* group_id
*
* @return String publish response XML
* @throws I2B2Exception
*/
public MasterResponseType getQueryMasterListFromNameInfo(
DataSourceLookup dataSourceLookup, SecurityType userRequestType, FindByChildType findChildType)
throws I2B2Exception {
//String groupId = userRequestType.getGroupId();
//int fetchSize = userRequestType.getFetchSize();
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
List<QtQueryMaster> masterList = queryMasterDao
.getQueryMasterByNameInfo(userRequestType, findChildType);
MasterResponseType masterResponseType = buildMasterResponseType(masterList);
return masterResponseType;
}
/**
* Function to return master query list for the give group id
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param userRequestType
* group_id
*
* @return String publish response XML
* @throws I2B2DAOException
*/
public MasterResponseType getQueryMasterListFromGroupId(
DataSourceLookup dataSourceLookup, UserRequestType userRequestType)
throws I2B2DAOException {
String groupId = userRequestType.getGroupId();
int fetchSize = userRequestType.getFetchSize();
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
List<QtQueryMaster> masterList = queryMasterDao
.getQueryMasterByGroupId(groupId, fetchSize);
MasterResponseType masterResponseType = buildMasterResponseType(masterList);
return masterResponseType;
}
/**
* Function to publish patients using publish message format.
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param int session id publish request XML fileName
*
* @return String publish response XML
*/
public MasterResponseType getRequestXmlFromMasterId(
DataSourceLookup dataSourceLookup, String userId,
MasterRequestType masterRequestType) throws I2B2Exception {
String queryMasterId = masterRequestType.getQueryMasterId();
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
QtQueryMaster qtQueryMaster = queryMasterDao
.getQueryDefinition(queryMasterId);
MasterResponseType masterResponseType = new MasterResponseType();
if (qtQueryMaster != null) {
QueryMasterType queryMasterType = new QueryMasterType();
queryMasterType.setQueryMasterId(qtQueryMaster.getQueryMasterId());
queryMasterType.setName(qtQueryMaster.getName());
queryMasterType.setUserId(qtQueryMaster.getUserId());
String requestXml = qtQueryMaster.getRequestXml();
if (requestXml != null) {
Document doc = null;
RequestXmlType requestXmlType = new RequestXmlType();
try {
/*
* //get jaxb object JAXBContext jc1 =
* JAXBContext.newInstance
* (edu.harvard.i2b2.crc.datavo.setfinder
* .query.ObjectFactory.class); Unmarshaller unMarshaller =
* jc1.createUnmarshaller(); JAXBElement jaxbElement =
* (JAXBElement)unMarshaller.unmarshal(new
* StringReader(requestXml)); QueryDefinitionType
* queryDefinition =
* (QueryDefinitionType)jaxbElement.getValue();
*
*
* //marshall to dom JAXBContext jc =
* JAXBContext.newInstance
* (edu.harvard.i2b2.crc.datavo.setfinder
* .query.QueryDefinitionType.class); Marshaller m =
* jc.createMarshaller(); DocumentBuilderFactory f =
* DocumentBuilderFactory.newInstance(); DocumentBuilder
* builder = f.newDocumentBuilder(); doc =
* builder.newDocument(); m.marshal((new
* edu.harvard.i2b2.crc
* .datavo.setfinder.query.ObjectFactory(
* )).createQueryDefinition(queryDefinition), doc);
*/
doc = edu.harvard.i2b2.common.util.xml.XMLUtil
.convertStringToDOM(requestXml);
log.debug("query definition xml prefix "
+ doc.getDocumentElement().getPrefix());
requestXmlType.getContent().add(doc.getDocumentElement());
} catch (Exception i2b2) {
i2b2.printStackTrace();
throw new I2B2Exception(
"Error converting request xml to dom "
+ i2b2.getMessage(), i2b2);
}
queryMasterType.setRequestXml(requestXmlType);
}
masterResponseType.getQueryMaster().add(queryMasterType);
} else {
throw new I2B2Exception("Could not find query for masterId: ["
+ queryMasterId + "]");
}
return masterResponseType;
}
/**
* Function to delete master query
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param string
* user id
* @param int master id
*
* @return String Master Query response XML
*/
public MasterResponseType deleteQueryMaster(
DataSourceLookup dataSourceLookup, String userId, String masterId)
throws I2B2Exception {
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
queryMasterDao.deleteQuery(masterId);
MasterResponseType masterResponseType = new MasterResponseType();
QueryMasterType queryMasterType = new QueryMasterType();
queryMasterType.setQueryMasterId(masterId);
masterResponseType.getQueryMaster().add(queryMasterType);
return masterResponseType;
}
/**
* Function to rename master query
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param int session id publish request XML fileName
*
* @return Master Query response XML
*/
public MasterResponseType renameQueryMaster(
DataSourceLookup dataSourceLookup, String userId, String masterId,
String queryNewName) throws I2B2Exception {
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryMasterDao queryMasterDao = sfDaoFactory.getQueryMasterDAO();
queryMasterDao.renameQuery(masterId, queryNewName);
MasterResponseType masterResponseType = new MasterResponseType();
QueryMasterType queryMasterType = new QueryMasterType();
queryMasterType.setQueryMasterId(masterId);
queryMasterType.setUserId(userId);
queryMasterType.setName(queryNewName);
masterResponseType.getQueryMaster().add(queryMasterType);
return masterResponseType;
}
/**
* Function to update query result instance description
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param String
* resultInstanceId
* @param Strign
* description
*
* @return Master Query response XML
*/
public ResultResponseType updateResultInstanceDescription(
DataSourceLookup dataSourceLookup, String resultInstanceId,
String newDescription) throws I2B2Exception {
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryResultInstanceDao queryResultInstanceDao = sfDaoFactory
.getPatientSetResultDAO();
queryResultInstanceDao.updateResultInstanceDescription(
resultInstanceId, newDescription);
QtQueryResultInstance updatedQueryResultInstance = queryResultInstanceDao
.getResultInstanceById(resultInstanceId);
ResultResponseType resultResponseType = new ResultResponseType();
QueryResultInstanceType resultInstanceType = PSMFactory
.buildQueryResultInstanceType(updatedQueryResultInstance);
resultResponseType.getQueryResultInstance().add(resultInstanceType);
return resultResponseType;
}
/**
* Function to update query instance with cancel status
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
* @param String
* instanceId
*
* @return Instance Query response XML
*/
public InstanceResultResponseType cancelQueryInstance(
DataSourceLookup dataSourceLookup, String instanceId)
throws I2B2Exception {
InstanceResultResponseType instanceResultResponseType = new InstanceResultResponseType();
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
// get query instance by id and change the status type to cancelled.
IQueryInstanceDao queryInstanceDao = sfDaoFactory.getQueryInstanceDAO();
QtQueryInstance queryInstance = queryInstanceDao
.getQueryInstanceByInstanceId(instanceId);
QtQueryStatusType queryStatusType = queryInstance
.getQtQueryStatusType();
int queryStatusTypeId = queryStatusType.getStatusTypeId();
// check if the query is already completed
if ((queryStatusTypeId == 3 || queryStatusTypeId == 4
|| queryStatusTypeId == 6 || queryStatusTypeId == 10)) {
log.error("Query instance [" + instanceId
+ "] is already finished");
throw new I2B2Exception("Query instance [" + instanceId
+ "] is already finished");
}
// check if the query is already cancelled
if (queryStatusTypeId == 9) {
log.warn("Already the query [" + instanceId
+ "] is in Cancelled state");
}
queryStatusType.setStatusTypeId(9);
queryInstance.setQtQueryStatusType(queryStatusType);
queryInstanceDao.update(queryInstance, false);
queryInstance = queryInstanceDao
.getQueryInstanceByInstanceId(instanceId);
IQueryResultInstanceDao queryResultInstanceDao = sfDaoFactory
.getPatientSetResultDAO();
List<QtQueryResultInstance> resultInstanceList = queryResultInstanceDao
.getResultInstanceList(instanceId);
QueryInstanceType queryInstanceResponse = PSMFactory
.buildQueryInstanceType(queryInstance);
instanceResultResponseType.setQueryInstance(queryInstanceResponse);
// update cancelled status to all the result instance
String resultInstanceId = "";
int statusTypeId = 0;
for (QtQueryResultInstance resultInstance : resultInstanceList) {
resultInstanceId = resultInstance.getResultInstanceId();
queryResultInstanceDao.updatePatientSet(resultInstanceId, 9, 0);
resultInstance.getQtQueryStatusType().setStatusTypeId(9);
QueryResultInstanceType resultInstanceResponse = PSMFactory
.buildQueryResultInstanceType(resultInstance);
instanceResultResponseType.getQueryResultInstance().add(
resultInstanceResponse);
}
return instanceResultResponseType;
}
/**
* Function to return all query result type
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*
*/
public ResultTypeResponseType getAllResultType(
DataSourceLookup dataSourceLookup) throws I2B2Exception {
SetFinderDAOFactory sfDaoFactory = this.getSetFinderDaoFactory(
dataSourceLookup.getDomainId(), dataSourceLookup
.getProjectPath(), dataSourceLookup.getOwnerId());
IQueryResultTypeDao resultTypeDao = sfDaoFactory
.getQueryResultTypeDao();
List<QtQueryResultType> queryResultTypeList = resultTypeDao
.getAllQueryResultType();
ResultTypeResponseType resultTypeResponseType = new ResultTypeResponseType();
List<QueryResultTypeType> returnQueryResultType = new ArrayList<QueryResultTypeType>();
for (QtQueryResultType queryResultType : queryResultTypeList) {
returnQueryResultType.add(PSMFactory
.buildQueryResultType(queryResultType));
}
resultTypeResponseType.getQueryResultType().addAll(
returnQueryResultType);
return resultTypeResponseType;
}
// -------------------------------------------------
// private functions
// -------------------------------------------------
private MasterResponseType buildMasterResponseType(
List<QtQueryMaster> masterList) {
MasterResponseType masterResponseType = new MasterResponseType();
// masterResponseType
DTOFactory dtoFactory = new DTOFactory();
for (QtQueryMaster queryMaster : masterList) {
QueryMasterType queryMasterType = new QueryMasterType();
queryMasterType.setQueryMasterId(queryMaster.getQueryMasterId());
java.util.Date createDate = queryMaster.getCreateDate();
queryMasterType.setCreateDate(dtoFactory
.getXMLGregorianCalendar(createDate.getTime()));
java.util.Date deleteDate = queryMaster.getDeleteDate();
if (deleteDate != null) {
queryMasterType.setDeleteDate(dtoFactory
.getXMLGregorianCalendar(deleteDate.getTime()));
}
queryMasterType.setName(queryMaster.getName());
queryMasterType.setGroupId(queryMaster.getGroupId());
queryMasterType.setUserId(queryMaster.getUserId());
queryMasterType.setMasterTypeCd(queryMaster.getMasterTypeCd());
masterResponseType.getQueryMaster().add(queryMasterType);
}
return masterResponseType;
}
private SetFinderDAOFactory getSetFinderDaoFactory(String domainId,
String projectPath, String ownerId) throws I2B2DAOException {
DAOFactoryHelper helper = new DAOFactoryHelper(domainId, projectPath,
ownerId);
SetFinderDAOFactory sfDaoFactory = helper.getDAOFactory()
.getSetFinderDAOFactory();
return sfDaoFactory;
}
}