/*
* 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;
import java.io.StringWriter;
import javax.xml.bind.JAXBElement;
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.jaxb.JAXBUnWrapHelper;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtil;
import edu.harvard.i2b2.common.util.jaxb.JAXBUtilException;
import edu.harvard.i2b2.crc.loader.datavo.CRCLoaderJAXBUtil;
import edu.harvard.i2b2.crc.datavo.i2b2message.ApplicationType;
import edu.harvard.i2b2.crc.datavo.i2b2message.BodyType;
import edu.harvard.i2b2.crc.datavo.i2b2message.InfoType;
import edu.harvard.i2b2.crc.datavo.i2b2message.MessageControlIdType;
import edu.harvard.i2b2.crc.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.PollingUrlType;
import edu.harvard.i2b2.crc.datavo.i2b2message.RequestMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResponseHeaderType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResponseMessageType;
import edu.harvard.i2b2.crc.datavo.i2b2message.ResultStatusType;
import edu.harvard.i2b2.crc.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.crc.loader.datavo.loader.DataSourceLookup;
/**
* Top level class to process the request. There will be
* seperate requesthandler class for each request type.
* The main processing of for the request will be done inside
* execute function
* $Id: RequestHandler.java,v 1.4 2008/06/03 20:48:19 rk903 Exp $
* @author rkuttan
*/
public abstract class RequestHandler {
/** log **/
protected final Log log = LogFactory.getLog(getClass());
protected DataSourceLookup dataSourceLookup = null;
/**
* Function to perform operation on the given
* request
* @return response xml message
*/
public abstract BodyType execute() throws I2B2Exception;
/**
* Class to fetch specific request message
* from i2b2 message xml
* @param requestXml
* @param classname
* @return object which is of type classname
* @throws JAXBUtilException
*/
protected Object getRequestType(String requestXml, Class classname)
throws JAXBUtilException {
Object returnObject = null;
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
JAXBElement jaxbElement = jaxbUtil.unMashallFromString(requestXml);
RequestMessageType requestMessageType = (RequestMessageType) jaxbElement.getValue();
BodyType bodyType = requestMessageType.getMessageBody();
JAXBUnWrapHelper unWrapHelper = new JAXBUnWrapHelper();
//get request header type
returnObject = unWrapHelper.getObjectByClass(bodyType.getAny(),
classname);
return returnObject;
}
protected MessageHeaderType getMessageHeaderType(String requestXml)
throws JAXBUtilException {
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
JAXBElement<?> jaxbElement = jaxbUtil.unMashallFromString(requestXml);
RequestMessageType requestMessageType = (RequestMessageType) jaxbElement.getValue();
return requestMessageType.getMessageHeader();
}
/**
* Function to build response message type
* using given bodytype and request xml
* @param requestXml
* @param bodyType
* @return i2b2 response message xml
* @throws JAXBUtilException
*/
protected String buildResponseMessage(String requestXml, BodyType bodyType)
throws JAXBUtilException {
JAXBUtil util = CRCLoaderJAXBUtil.getJAXBUtil();
RequestMessageType requestMsgType = getI2B2RequestMessageType(requestXml);
MessageHeaderType messageHeader = requestMsgType.getMessageHeader();
//reverse sending and receiving app
ApplicationType sendingApp = messageHeader.getSendingApplication();
ApplicationType receiveApp = messageHeader.getReceivingApplication();
messageHeader.setSendingApplication(receiveApp);
messageHeader.setReceivingApplication(sendingApp);
//set instance num
MessageControlIdType messageControlIdType = messageHeader.getMessageControlId();
if (messageControlIdType != null) {
messageControlIdType.setInstanceNum(1);
}
StatusType statusType = new StatusType();
statusType.setType("DONE");
//:TODO statusType.setValue(sessionId);
PollingUrlType pollingType = new PollingUrlType();
pollingType.setIntervalMs(100);
//:TODO value come from property file
ResultStatusType resultStatusType = new ResultStatusType();
resultStatusType.setStatus(statusType);
resultStatusType.setPollingUrl(pollingType);
InfoType infoType = new InfoType();
//:TODO value come from property file
infoType.setValue("Log information");
ResponseHeaderType responseHeader = new ResponseHeaderType();
responseHeader.setResultStatus(resultStatusType);
responseHeader.setInfo(infoType);
ResponseMessageType responseMessageType = new ResponseMessageType();
responseMessageType.setMessageHeader(messageHeader);
responseMessageType.setResponseHeader(responseHeader);
responseMessageType.setMessageBody(bodyType);
edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
StringWriter strWriter = new StringWriter();
util.marshaller(of.createResponse(responseMessageType), strWriter);
return strWriter.toString();
}
/**
* Function to unmarshall i2b2 request message type
* @param requestXml
* @return RequestMessageType
* @throws JAXBUtilException
*/
protected RequestMessageType getI2B2RequestMessageType(String requestXml)
throws JAXBUtilException {
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
JAXBElement jaxbElement = jaxbUtil.unMashallFromString(requestXml);
RequestMessageType requestMessageType = (RequestMessageType) jaxbElement.getValue();
return requestMessageType;
}
/**
* Function marshall i2b2 response message type
* @param responseMessageType
* @return
*/
protected String getResponseString(ResponseMessageType responseMessageType) {
StringWriter strWriter = new StringWriter();
try {
edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory of = new edu.harvard.i2b2.crc.datavo.i2b2message.ObjectFactory();
JAXBUtil jaxbUtil = CRCLoaderJAXBUtil.getJAXBUtil();
jaxbUtil.marshaller(of.createResponse(responseMessageType),
strWriter);
} catch (JAXBUtilException e) {
log.error("Error while generating response message" +
e.getMessage());
}
return strWriter.toString();
}
protected edu.harvard.i2b2.crc.loader.datavo.loader.query.StatusType buildCRCStausType(String statusType,String message) {
edu.harvard.i2b2.crc.loader.datavo.loader.query.StatusType st = new edu.harvard.i2b2.crc.loader.datavo.loader.query.StatusType();
edu.harvard.i2b2.crc.loader.datavo.loader.query.StatusType.Condition condition = new edu.harvard.i2b2.crc.loader.datavo.loader.query.StatusType.Condition();
condition.setType(statusType);
condition.setValue(message);
st.getCondition().add(condition);
return st;
}
protected void setDataSourceLookup(String requestXml) throws JAXBUtilException {
RequestMessageType reqMessage = getI2B2RequestMessageType(requestXml);
String projectId = reqMessage.getMessageHeader().getProjectId();
String domainId = reqMessage.getMessageHeader().getSecurity().getDomain();
String userId = reqMessage.getMessageHeader().getSecurity().getUsername();
dataSourceLookup = new DataSourceLookup();
dataSourceLookup.setProjectPath(projectId);
dataSourceLookup.setDomainId(domainId);
dataSourceLookup.setOwnerId(userId);
}
protected DataSourceLookup getDataSourceLookup() {
return dataSourceLookup;
}
}