/* * 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.axis2; import java.io.StringReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; import edu.harvard.i2b2.common.exception.I2B2Exception; import edu.harvard.i2b2.crc.delegate.RequestHandlerDelegate; //import edu.harvard.i2b2.crc.delegate.loader.LoaderQueryRequestDelegate; //import edu.harvard.i2b2.crc.delegate.loader.PublishDataRequestHandler; import edu.harvard.i2b2.crc.delegate.getnameinfo.GetNameInfoRequestDelegate; import edu.harvard.i2b2.crc.delegate.pdo.PdoQueryRequestDelegate; import edu.harvard.i2b2.crc.delegate.setfinder.QueryRequestDelegate; import edu.harvard.i2b2.crc.loader.delegate.BulkLoadRequestHandler; import edu.harvard.i2b2.crc.loader.delegate.GetLoadStatusRequestHandler; import edu.harvard.i2b2.crc.loader.delegate.LoaderQueryRequestDelegate; import edu.harvard.i2b2.crc.loader.delegate.PublishDataRequestHandler; import edu.harvard.i2b2.crc.loader.ws.ProviderRestService; /** * <b>Axis2's service class<b> * * <p> * This class implements methods related to webservice operation. * <li>For example http://localhost:8080/axis2/services/crc/serfinderrequest * http://localhost:8080/axis2/services/crc/pdorequest * * $Id: QueryService.java,v 1.14 2009/09/10 19:32:06 rk903 Exp $ * * @author rkuttan * @see QueryRequestDelegate * @see PdoQueryRequestDelegate */ public class QueryService { /** log **/ protected final Log log = LogFactory.getLog(getClass()); /** set pdo request constant used only inside this class **/ private final String PDO_REQUEST = "PDO_REQUEST"; /** set finder request constant used only inside this class **/ private final String SETFINDER_REQUEST = "SETFINDER_REQUEST"; /** get name info request constant used only inside this class **/ private final String GETNAMEINFO_REQUEST = "GETNAMEINFO_REQUEST"; /** * Webservice function to handle setfinder request * * @param omElement * request message wrapped in OMElement * @return response message in wrapped inside OMElement */ public OMElement request(OMElement omElement) { Assert.notNull(omElement, "Setfinder request OMElement must not be null"); log.debug("Inside setfinder request " + omElement); return handleRequest(SETFINDER_REQUEST, omElement); } /** * Webservice function to handle pdo request * * @param omElement * request message wrapped in OMElement * @return response message in wrapped inside OMElement */ public OMElement pdorequest(OMElement omElement) { Assert.notNull(omElement, "PDO request OMElement must not be null"); log.debug("Inside pdo request " + omElement); return handleRequest(PDO_REQUEST, omElement); } /** * Webservice function to handle find request * * @param omElement * request message wrapped in OMElement * @return response message in wrapped inside OMElement */ public OMElement getNameInfo(OMElement omElement) { Assert.notNull(omElement, "getNameInfo OMElement must not be null"); log.debug("Inside getNameInfo request " + omElement); return handleRequest(GETNAMEINFO_REQUEST, omElement); } public OMElement publishDataRequest(OMElement request) { Assert.notNull(request, "publish data request OMElement must not be null"); log.debug("Inside publish data request " + request); //TODO removed loader // Added back LoaderQueryRequestDelegate queryDelegate = new LoaderQueryRequestDelegate(); OMElement responseElement = null; try { String requestXml = request.toString(); PublishDataRequestHandler handler = new PublishDataRequestHandler( requestXml); String response = queryDelegate.handleRequest(requestXml, handler); responseElement = buildOMElementFromString(response); } catch (Exception e) { log.error("i2b2 exception", e); } catch (Throwable e) { log.error("Throwable", e); } return responseElement; } public OMElement bulkLoadRequest(OMElement request) { Assert.notNull(request, "bulk load request OMElement must not be null"); log.debug("Inside bulk load request " + request); //LoaderQueryReqDel handles permissions... LoaderQueryRequestDelegate queryDelegate = new LoaderQueryRequestDelegate(); OMElement responseElement = null; try { String requestXml = request.toString(); BulkLoadRequestHandler handler = new BulkLoadRequestHandler( requestXml); String response = queryDelegate.handleRequest(requestXml, handler); responseElement = buildOMElementFromString(response); } catch (Exception e) { log.error("i2b2 exception", e); } catch (Throwable e) { log.error("Throwable", e); } return responseElement; } public OMElement getLoadDataStatusRequest(OMElement request) { Assert.notNull(request, "get load Data status request OMElement must not be null"); log.debug("Inside load status request " + request); //LoaderQueryReqDel handles permissions... LoaderQueryRequestDelegate queryDelegate = new LoaderQueryRequestDelegate(); OMElement responseElement = null; try { String requestXml = request.toString(); GetLoadStatusRequestHandler handler = new GetLoadStatusRequestHandler( requestXml); String response = queryDelegate.handleRequest(requestXml, handler); responseElement = buildOMElementFromString(response); } catch (Exception e) { log.error("i2b2 exception", e); } catch (Throwable e) { log.error("Throwable", e); } return responseElement; } //TODO removed loader // added back above (lcp5) /* public OMElement getLoadDataStatusRequest(OMElement request) { Assert.notNull(request, "Data load status request OMElement must not be null"); log.debug("Inside data load status request " + request); ProviderRestService rs = new ProviderRestService(); return rs.getLoadDataStatusRequest(request); } public OMElement getMissingTermRequest(OMElement request) { Assert.notNull(request, "Missing term request OMElement must not be null"); log.debug("Inside missing term request " + request); ProviderRestService rs = new ProviderRestService(); return rs.getMissingTermRequest(request); } */ // -------------------------------------------- // Creates delegate based on the request type // -------------------------------------------- private OMElement handleRequest(String requestType, OMElement request) { RequestHandlerDelegate requestHandlerDelegate = null; if (requestType.equals(PDO_REQUEST)) { requestHandlerDelegate = new PdoQueryRequestDelegate(); } else if (requestType.equals(SETFINDER_REQUEST)) { requestHandlerDelegate = new QueryRequestDelegate(); } else if (requestType.equals(GETNAMEINFO_REQUEST)) { requestHandlerDelegate = new GetNameInfoRequestDelegate(); } OMElement returnElement = null; try { // call delegate's handleRequest function String response = requestHandlerDelegate.handleRequest(request .toString()); log.debug("Response in service" + response); returnElement = buildOMElementFromString(response); } catch (XMLStreamException e) { log.error("xml stream exception", e); } catch (I2B2Exception e) { log.error("i2b2 exception", e); } catch (Throwable e) { log.error("Throwable", e); } return returnElement; } /** * Function constructs OMElement for the given String * * @param xmlString * @return OMElement * @throws XMLStreamException */ private OMElement buildOMElementFromString(String xmlString) throws XMLStreamException { XMLInputFactory xif = XMLInputFactory.newInstance(); StringReader strReader = new StringReader(xmlString); XMLStreamReader reader = xif.createXMLStreamReader(strReader); StAXOMBuilder builder = new StAXOMBuilder(reader); OMElement element = builder.getDocumentElement(); return element; } }