/*
* Copyright (c) 2006-2012 Massachusetts General Hospital
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the i2b2 Software License v2.1
* which accompanies this distribution.
*
* Contributors:
* Rajesh Kuttan
* Mike Mendis
* Bill Wang
*/
package edu.harvard.i2b2.fr.ws;
import java.io.StringReader;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.fr.delegate.RecvfileRequestHandler;
import edu.harvard.i2b2.fr.delegate.LoaderQueryRequestDelegate;
import edu.harvard.i2b2.fr.delegate.SendfileRequestHandler;
public class FileRepositoryService {
protected final Log log = LogFactory.getLog(getClass());
public OMElement sendfileRequest(OMElement request) {
LoaderQueryRequestDelegate queryDelegate = new LoaderQueryRequestDelegate();
OMElement responseElement = null;
try {
String requestXml = request.toString();
if (requestXml.indexOf("<soapenv:Body>") > -1) {
requestXml = requestXml.substring(
requestXml.indexOf("<soapenv:Body>") + 14,
requestXml.indexOf("</soapenv:Body>"));
}
SendfileRequestHandler handler = new SendfileRequestHandler(
requestXml);
String response = queryDelegate.handleRequest(requestXml, handler);
responseElement = 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 responseElement;
}
public OMElement recvfileRequest(OMElement request) {
LoaderQueryRequestDelegate queryDelegate = new LoaderQueryRequestDelegate();
OMElement responseElement = null;
FileDataSource fileDataSource;
DataHandler fileDataHandler;
try {
String requestXml = request.toString();
if (requestXml.indexOf("<soapenv:Body>") > -1) {
requestXml = requestXml.substring(
requestXml.indexOf("<soapenv:Body>") + 14,
requestXml.indexOf("</soapenv:Body>"));
}
RecvfileRequestHandler handler = new RecvfileRequestHandler(
requestXml);
String response = queryDelegate.handleRequest(requestXml, handler);
String filename = handler.getFilename();
// We can obtain the request (incoming) MessageContext as follows
MessageContext inMessageContext = MessageContext
.getCurrentMessageContext();
// We can obtain the operation context from the request message
// context
OperationContext operationContext = inMessageContext
.getOperationContext();
MessageContext outMessageContext = operationContext
.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
outMessageContext.setDoingSwA(true);
outMessageContext.setDoingREST(false);
if (!filename.equals("")) {
fileDataSource = new FileDataSource(filename);
fileDataHandler = new DataHandler(fileDataSource);
// use requested filename as content ID
outMessageContext.addAttachment(handler.getRequestedFilename(), fileDataHandler);
outMessageContext.setDoingMTOM(false);
outMessageContext.setDoingSwA(true);
responseElement = buildOMElementFromString(response,
fileDataHandler.getName());
} else {
log.error("where did the file go? ");
}
} 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 responseElement;
}
private OMElement buildOMElementFromString(String xmlString,
String contentID) throws XMLStreamException {
OMElement returnElement = null;
try {
StringReader strReader = new StringReader(xmlString);
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader reader = xif.createXMLStreamReader(strReader);
StAXOMBuilder builder = new StAXOMBuilder(reader);
returnElement = builder.getDocumentElement();
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace omNs = factory.createOMNamespace(
"http://www.i2b2.org/xsd", "swa");
OMElement fileElement = factory.createOMElement("file", omNs,
returnElement);
fileElement.addAttribute("href", contentID, null);
} catch (XMLStreamException ex) {
log.error("Error while converting FR response PDO to OMElement", ex);
throw ex;
}
return returnElement;
}
public OMElement getFile(OMElement getFileElement) throws I2B2Exception {
return recvfileRequest(getFileElement);
}
public OMElement putFile(OMElement putFileElement) throws I2B2Exception {
return sendfileRequest(putFileElement);
}
}