/* * 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.workplace.ws; import edu.harvard.i2b2.common.exception.I2B2Exception; import edu.harvard.i2b2.workplace.delegate.RequestHandler; import edu.harvard.i2b2.workplace.ws.ExecutorRunnable; import edu.harvard.i2b2.workplace.ws.MessageFactory; import edu.harvard.i2b2.workplace.datavo.i2b2message.MessageHeaderType; import edu.harvard.i2b2.workplace.datavo.i2b2message.ResponseHeaderType; import edu.harvard.i2b2.workplace.datavo.i2b2message.ResponseMessageType; import edu.harvard.i2b2.workplace.delegate.AddChildHandler; import edu.harvard.i2b2.workplace.delegate.AnnotateChildHandler; import edu.harvard.i2b2.workplace.delegate.DeleteChildHandler; import edu.harvard.i2b2.workplace.delegate.ExportChildHandler; import edu.harvard.i2b2.workplace.delegate.GetFoldersByProjectHandler; import edu.harvard.i2b2.workplace.delegate.GetFoldersByUserIdHandler; import edu.harvard.i2b2.workplace.delegate.GetChildrenHandler; import edu.harvard.i2b2.workplace.delegate.RenameChildHandler; import edu.harvard.i2b2.workplace.delegate.MoveChildHandler; import edu.harvard.i2b2.workplace.delegate.GetNameInfoHandler; import edu.harvard.i2b2.workplace.delegate.SetProtectedAcessHandler; 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 WorkplaceService { private static Log log = LogFactory.getLog(WorkplaceService.class); /** * This function is main webservice interface to get vocab data * for a query. It uses AXIOM elements(OMElement) to conveniently parse * xml messages. * * It excepts incoming request in i2b2 message format, which wraps a Workplace * query inside a vocab query request object. The response is also will be in i2b2 * message format, which will wrap work data object. Work data object will * have all the results returned by the query. * * * @param getChildren * @return OMElement in i2b2message format * @throws Exception */ public OMElement getChildren(OMElement getChildrenElement) throws I2B2Exception { 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 (getChildrenElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } GetChildrenDataMessage childrenDataMsg = new GetChildrenDataMessage(); String requestElementString = getChildrenElement.toString(); childrenDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (childrenDataMsg.getRequestMessageType() != null) { if (childrenDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = childrenDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new GetChildrenHandler(childrenDataMsg), waitTime); } /** * This function is main webservice interface to get vocab data * for a query. It uses AXIOM elements(OMElement) to conveniently parse * xml messages. * * It excepts incoming request in i2b2 message format, which wraps an Workplace * query inside a work query request object. The response is also will be in i2b2 * message format, which will wrap work data object. Work data object will * have all the results returned by the query. * * * @param OMElement getFoldersElement * @return OMElement in i2b2message format * @throws Exception */ public OMElement getFoldersByProject(OMElement getFoldersElement) throws Exception { 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 (getFoldersElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } GetFoldersDataMessage foldersDataMsg = new GetFoldersDataMessage(); String requestElementString = getFoldersElement.toString(); // log.info(requestElementString); foldersDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (foldersDataMsg.getRequestMessageType() != null) { if (foldersDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = foldersDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could sends back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new GetFoldersByProjectHandler(foldersDataMsg), waitTime); } public OMElement getFoldersByUserId(OMElement getFoldersElement) throws Exception { 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 (getFoldersElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } GetFoldersDataMessage foldersDataMsg = new GetFoldersDataMessage(); String requestElementString = getFoldersElement.toString(); // log.info(requestElementString); foldersDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (foldersDataMsg.getRequestMessageType() != null) { if (foldersDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = foldersDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new GetFoldersByUserIdHandler(foldersDataMsg), waitTime); } /** * * This method is for finding the workplace item with the given keyword * It uses AXIOM elements(OMElement) to conveniently parse * xml messages. * * It excepts incoming request in i2b2 message format, which wraps an Workplace * query inside a work query request object. The response is also will be in i2b2 * message format, which will wrap work data object. Work data object will * have all the results returned by the query. * * @param requestElement * @return * @throws Exception * * @author Neha Patel */ public OMElement getNameInfo(OMElement requestElement) throws Exception { //OMElement requestElement = 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 Find Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } GetNameInfoDataMessage foldersDataMsg = new GetNameInfoDataMessage(); String requestElementString = requestElement.toString(); log.debug(requestElementString); foldersDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (foldersDataMsg.getRequestMessageType() != null) { if (foldersDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = foldersDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } return execute(new GetNameInfoHandler(foldersDataMsg), waitTime); } public OMElement deleteChild(OMElement deleteNodeElement)throws Exception { 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 (deleteNodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } DeleteChildDataMessage deleteDataMsg = new DeleteChildDataMessage(); String requestElementString = deleteNodeElement.toString(); // log.info(requestElementString); deleteDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (deleteDataMsg.getRequestMessageType() != null) { if (deleteDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = deleteDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new DeleteChildHandler(deleteDataMsg), waitTime); } public OMElement moveChild(OMElement nodeElement)throws Exception { 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 (nodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } MoveChildDataMessage moveDataMsg = new MoveChildDataMessage(); String requestElementString = nodeElement.toString(); // log.info(requestElementString); moveDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (moveDataMsg.getRequestMessageType() != null) { if (moveDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = moveDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new MoveChildHandler(moveDataMsg), waitTime); } public OMElement renameChild(OMElement renameNodeElement) throws Exception { 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 (renameNodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } RenameChildDataMessage renameDataMsg = new RenameChildDataMessage(); String requestElementString = renameNodeElement.toString(); // log.info(requestElementString); renameDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (renameDataMsg.getRequestMessageType() != null) { if (renameDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = renameDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new RenameChildHandler(renameDataMsg), waitTime); } public OMElement annotateChild(OMElement annotateNodeElement) throws Exception { 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 (annotateNodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } AnnotateChildDataMessage annotateDataMsg = new AnnotateChildDataMessage(); String requestElementString = annotateNodeElement.toString(); // log.info(requestElementString); annotateDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (annotateDataMsg.getRequestMessageType() != null) { if (annotateDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = annotateDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new AnnotateChildHandler(annotateDataMsg), waitTime); } public OMElement exportChild(OMElement aexportNodeElement) throws Exception { log.debug("In export Child"); 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 (aexportNodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } log.debug("Start of request string"); ExportChildDataMessage exportDataMsg = new ExportChildDataMessage(); String requestElementString = aexportNodeElement.toString(); log.debug("created new string"); exportDataMsg.setRequestMessageType(requestElementString); log.debug("set request messagetype"); long waitTime = 0; if (exportDataMsg.getRequestMessageType() != null) { if (exportDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = exportDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new ExportChildHandler(exportDataMsg), waitTime); } public OMElement addChild(OMElement addNodeElement) throws Exception { 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 (addNodeElement == null) { log.error("Incoming Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } AddChildDataMessage addDataMsg = new AddChildDataMessage(); String requestElementString = addNodeElement.toString(); // log.info(requestElementString); addDataMsg.setRequestMessageType(requestElementString); long waitTime = 0; if (addDataMsg.getRequestMessageType() != null) { if (addDataMsg.getRequestMessageType().getRequestHeader() != null) { waitTime = addDataMsg.getRequestMessageType() .getRequestHeader() .getResultWaittimeMs(); } } //do Workplace query processing inside thread, so that // service could send back message with timeout error. // ExecutorRunnable er = new ExecutorRunnable(); return execute(new AddChildHandler(addDataMsg), waitTime); } public OMElement setProtectedAccess(OMElement requestElement) throws Exception { 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 Workplace request is null"); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, unknownErrorMessage); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); return MessageFactory.createResponseOMElementFromString(workplaceDataResponse); } ProtectedDataMessage protectedDataMsg = new ProtectedDataMessage(); 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 SetProtectedAcessHandler(protectedDataMsg), 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("workplace waited " + deltaTime + "ms for " + er.getRequestHandler().getClass().getName()); ResponseMessageType responseMsgType = MessageFactory.doBuildErrorResponse(null, timeOuterror); workplaceDataResponse = MessageFactory.convertToXMLString(responseMsgType); } else { log.error("workplace data response is null"); log.info("waitTime is " + waitTime); log.debug("workplace 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 Workplace job "); } finally { t.interrupt(); er = null; t = null; } } returnElement = MessageFactory.createResponseOMElementFromString(workplaceDataResponse); return returnElement; } }