/*
* 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:
* Raj Kuttan
* Lori Phillips
*/
package edu.harvard.i2b2.im.ws;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.im.delegate.GetAuditHandlerHandler;
import edu.harvard.i2b2.im.delegate.IsKeySetHandlerHandler;
import edu.harvard.i2b2.im.delegate.RequestHandler;
import edu.harvard.i2b2.im.delegate.PdoHandlerHandler;
import edu.harvard.i2b2.im.delegate.SetKeyHandlerHandler;
import edu.harvard.i2b2.im.delegate.ValidationHandlerHandler;
import edu.harvard.i2b2.im.ws.ExecutorRunnable;
import edu.harvard.i2b2.im.ws.MessageFactory;
import edu.harvard.i2b2.im.datavo.i2b2message.MessageHeaderType;
import edu.harvard.i2b2.im.datavo.i2b2message.ResponseHeaderType;
import edu.harvard.i2b2.im.datavo.i2b2message.ResponseMessageType;
import org.apache.axiom.om.OMElement;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//import javax.xml.stream.XMLStreamException;
/**
* This is webservice skeleton class. It parses incoming Workplace service requests
* and generates responses in the Work Data Object XML format.
*
*/
public class IMService {
private static Log log = LogFactory.getLog(IMService.class);
public OMElement validateSiteId(OMElement requestElement) throws Exception {
log.debug("In Validate Site ID");
OMElement returnElement = null;
String workplaceDataResponse = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
if (requestElement == null) {
log.error("Incoming IM request is null");
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
return MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
}
PDORequestMessage protectedDataMsg = new PDORequestMessage();
String requestElementString = requestElement.toString();
protectedDataMsg.setRequestMessageType(requestElementString);
long waitTime = 0;
if (protectedDataMsg.getRequestMessageType() != null) {
if (protectedDataMsg.getRequestMessageType().getRequestHeader() != null) {
waitTime = protectedDataMsg.getRequestMessageType()
.getRequestHeader()
.getResultWaittimeMs();
}
}
return execute(new ValidationHandlerHandler(protectedDataMsg), waitTime);
}
public OMElement pdorequest(OMElement requestElement) throws Exception {
log.debug("In pdorequest");
OMElement returnElement = null;
String workplaceDataResponse = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
if (requestElement == null) {
log.error("Incoming IM request is null");
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
return MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
}
PDORequestMessage protectedDataMsg = new PDORequestMessage();
String requestElementString = requestElement.toString();
protectedDataMsg.setRequestMessageType(requestElementString);
long waitTime = 0;
if (protectedDataMsg.getRequestMessageType() != null) {
if (protectedDataMsg.getRequestMessageType().getRequestHeader() != null) {
waitTime = protectedDataMsg.getRequestMessageType()
.getRequestHeader()
.getResultWaittimeMs();
}
}
return execute(new PdoHandlerHandler(protectedDataMsg), waitTime);
}
public OMElement setKey(OMElement requestElement) throws Exception {
log.debug("In setKey");
OMElement returnElement = null;
String workplaceDataResponse = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
if (requestElement == null) {
log.error("Incoming IM request is null");
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
return MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
}
SetKeyRequestMessage setKey = new SetKeyRequestMessage();
String requestElementString = requestElement.toString();
setKey.setRequestMessageType(requestElementString);
long waitTime = 0;
if (setKey.getRequestMessageType() != null) {
if (setKey.getRequestMessageType().getRequestHeader() != null) {
waitTime = setKey.getRequestMessageType()
.getRequestHeader()
.getResultWaittimeMs();
}
}
return execute(new SetKeyHandlerHandler(setKey), waitTime);
}
public OMElement isKeySet(OMElement requestElement) throws Exception {
log.debug("In Is Key Set");
OMElement returnElement = null;
String workplaceDataResponse = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
if (requestElement == null) {
log.error("Incoming IM request is null");
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
return MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
}
IsKeySetRequestMessage setKey = new IsKeySetRequestMessage();
String requestElementString = requestElement.toString();
setKey.setRequestMessageType(requestElementString);
long waitTime = 0;
if (setKey.getRequestMessageType() != null) {
if (setKey.getRequestMessageType().getRequestHeader() != null) {
waitTime = setKey.getRequestMessageType()
.getRequestHeader()
.getResultWaittimeMs();
}
}
return execute(new IsKeySetHandlerHandler(setKey), waitTime);
}
public OMElement getAudit(OMElement requestElement) throws Exception {
log.debug("In Get Audit");
OMElement returnElement = null;
String workplaceDataResponse = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
if (requestElement == null) {
log.error("Incoming IM request is null");
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
return MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
}
GetAuditRequestMessage getAudit = new GetAuditRequestMessage();
String requestElementString = requestElement.toString();
getAudit.setRequestMessageType(requestElementString);
long waitTime = 0;
if (getAudit.getRequestMessageType() != null) {
if (getAudit.getRequestMessageType().getRequestHeader() != null) {
waitTime = getAudit.getRequestMessageType()
.getRequestHeader()
.getResultWaittimeMs();
}
}
return execute(new GetAuditHandlerHandler(getAudit), waitTime);
}
private OMElement execute(RequestHandler handler, long waitTime)throws I2B2Exception{
//do workplace processing inside thread, so that
// service could send back message with timeout error.
log.debug("In execute");
OMElement returnElement = null;
String unknownErrorMessage = "Error message delivered from the remote server \n" +
"You may wish to retry your last action";
ExecutorRunnable er = new ExecutorRunnable();
er.setRequestHandler(handler);
Thread t = new Thread(er);
String workplaceDataResponse = null;
synchronized (t) {
t.start();
// try {
// if (waitTime > 0) {
// t.wait(waitTime);
// } else {
// t.wait();
// }
try {
long startTime = System.currentTimeMillis();
long deltaTime = -1;
while((er.isJobCompleteFlag() == false)&& (deltaTime < waitTime)){
if (waitTime > 0) {
t.wait(waitTime - deltaTime);
deltaTime = System.currentTimeMillis() - startTime;
} else {
t.wait();
}
}
workplaceDataResponse = er.getOutputString();
if (workplaceDataResponse == null) {
if (er.getJobException() != null) {
log.error("er.jobException is " + er.getJobException().getMessage());
log.info("waitTime is " + waitTime);
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
} else if (er.isJobCompleteFlag() == false) {
//<result_waittime_ms>5000</result_waittime_ms>
String timeOuterror = "Remote server timed out \n" +
"Result waittime = " +
waitTime +
" ms elapsed,\nPlease try again";
log.error(timeOuterror);
log.debug("im waited " + deltaTime + "ms for " + er.getRequestHandler().getClass().getName());
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
timeOuterror);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
} else {
log.error("im data response is null");
log.info("waitTime is " + waitTime);
log.debug("im waited " + deltaTime + "ms for " + er.getRequestHandler().getClass().getName());
ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null,
unknownErrorMessage);
workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType);
}
}
} catch (InterruptedException e) {
log.error(e.getMessage());
throw new I2B2Exception("Thread error while running IM job ");
} finally {
t.interrupt();
er = null;
t = null;
}
}
returnElement = MessageFactory.createResponseOMElementFromString(workplaceDataResponse);
return returnElement;
}
}