/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.xmla.test;
import mondrian.olap.Util;
import mondrian.xmla.XmlaServlet;
import java.io.*;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* Dummy request for testing XmlaServlet. Provides a 'text/xml' content stream
* from a post from xmlaTest.jsp. Assumes that the SOAPRequest parameter
* contains XML/A SOAP request body.
*
* @author Sherman Wood
*/
public class XmlaTestServletRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest originalRequest;
private ServletInputStream servletInStream;
public XmlaTestServletRequestWrapper(HttpServletRequest req) {
super(req);
originalRequest = req;
init();
}
/**
* Extract the data from the HTTP request and create an XML/A request
*/
private void init() {
String soapRequest = originalRequest.getParameter("SOAPRequest");
if (soapRequest == null || soapRequest.length() == 0) {
// Parameter not set. Look for the request in the body of the http
// request.
try {
final ServletInputStream inputStream =
originalRequest.getInputStream();
soapRequest = Util.readFully(
new InputStreamReader(inputStream), 2048);
} catch (IOException e) {
throw Util.newInternal(e, "error reading body of soap request");
}
if (soapRequest.length() == 0) {
throw new RuntimeException("SOAPRequest not set");
}
}
/*
* Strip the XML premable if it is there
*/
if (soapRequest.indexOf("<?") == 0) {
soapRequest = soapRequest.substring(soapRequest.indexOf("?>") + 2);
}
/*
* Make a SOAP message
*/
String request =
"<?xml version=\"1.0\"?>\r\n"
+ "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\""
+ XmlaServlet.NS_SOAP_ENV_1_1
+ "\" SOAP-ENV:encodingStyle=\""
+ XmlaServlet.NS_SOAP_ENC_1_1
+ "\">\r\n"
+ "<SOAP-ENV:Header/>\r\n"
+ "<SOAP-ENV:Body>\r\n"
+ soapRequest
+ "</SOAP-ENV:Body>\r\n</SOAP-ENV:Envelope>\r\n";
servletInStream = new XmlaTestServletInputStream(request);
}
public String getContentType() {
return "text/xml";
}
public ServletInputStream getInputStream() {
return servletInStream;
}
private static class XmlaTestServletInputStream extends ServletInputStream {
private ByteArrayInputStream bais;
XmlaTestServletInputStream(String source) {
bais = new ByteArrayInputStream(source.getBytes());
}
public int readLine(byte[] arg0, int arg1, int arg2)
throws IOException
{
return bais.read(arg0, arg1, arg2);
}
public int available() throws IOException {
return bais.available();
}
public void close() throws IOException {
bais.close();
}
public synchronized void mark(int readlimit) {
bais.mark(readlimit);
}
public boolean markSupported() {
return bais.markSupported();
}
public int read() throws IOException {
return bais.read();
}
public int read(byte[] b, int off, int len) throws IOException {
return bais.read(b, off, len);
}
public int read(byte[] b) throws IOException {
return bais.read(b);
}
public synchronized void reset() throws IOException {
bais.reset();
}
public long skip(long n) throws IOException {
return bais.skip(n);
}
}
}
// End XmlaTestServletRequestWrapper.java