From 4b0861b13aa6c19d5be68a8f299cc23de4a69609 Mon Sep 17 00:00:00 2001 From: Julian Hyde Date: Tue, 3 Jun 2003 23:44:35 -0800 Subject: [PATCH] MONDRIAN: XML for Analysis servlet. [git-p4: depot-paths = "//open/mondrian/": change = 583] --- src/main/mondrian/util/SAXWriter.java | 22 ++++++++++ src/main/mondrian/xmla/XmlaMediator.java | 12 +++--- src/main/mondrian/xmla/XmlaServlet.java | 53 ++++++++++++++++++++++++ src/main/mondrian/xmla/XmlaTest.java | 53 ++++++++++++++++++++---- webapp/WEB-INF/web-jpivot.xml | 10 +++++ webapp/WEB-INF/web.xml | 10 +++++ webapp/xmla.jsp | 23 ++++++++++ 7 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 src/main/mondrian/xmla/XmlaServlet.java create mode 100644 webapp/xmla.jsp diff --git a/src/main/mondrian/util/SAXWriter.java b/src/main/mondrian/util/SAXWriter.java index cf257cb9b0..9eb9906a3c 100644 --- a/src/main/mondrian/util/SAXWriter.java +++ b/src/main/mondrian/util/SAXWriter.java @@ -17,6 +17,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.io.Writer; import mondrian.xom.XMLUtil; import mondrian.xom.XOMUtil; @@ -43,10 +44,31 @@ public class SAXWriter implements ContentHandler { /** After a burst of character data. */ private static final int STATE_CHARACTERS = 3; + /** + * Creates a SAXWriter writing to an {@link OutputStream}. + */ public SAXWriter(OutputStream stream) { this.pw = new PrintWriter(new OutputStreamWriter(stream)); } + /** + * Creates a SAXWriter writing to a {@link Writer}. + * + *

If writer is a {@link PrintWriter}, + * {@link #SAXWriter(PrintWriter)} is preferred. + */ + public SAXWriter(Writer writer) { + this.pw = new PrintWriter(writer); + } + + /** + * Creates a SAXWriter writing to a {@link PrintWriter}. + * @param writer + */ + public SAXWriter(PrintWriter writer) { + this.pw = writer; + } + public void setDocumentLocator(Locator locator) { } diff --git a/src/main/mondrian/xmla/XmlaMediator.java b/src/main/mondrian/xmla/XmlaMediator.java index 4a6de98276..77f4e52bf7 100644 --- a/src/main/mondrian/xmla/XmlaMediator.java +++ b/src/main/mondrian/xmla/XmlaMediator.java @@ -20,11 +20,11 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; -import java.io.OutputStream; import java.io.StringReader; -import java.util.Properties; -import java.util.HashMap; +import java.io.Writer; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Properties; /** * An XmlaMediator responds to XML for Analysis requests. @@ -38,10 +38,10 @@ public class XmlaMediator { /** * Processes a request. - * @param request - * @param response + * @param request XML request, for example, "". + * @param response Destination for response */ - public void process(String request, OutputStream response) { + public void process(String request, Writer response) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = null; try { diff --git a/src/main/mondrian/xmla/XmlaServlet.java b/src/main/mondrian/xmla/XmlaServlet.java new file mode 100644 index 0000000000..a1831a4948 --- /dev/null +++ b/src/main/mondrian/xmla/XmlaServlet.java @@ -0,0 +1,53 @@ +/* +// $Id$ +// This software is subject to the terms of the Common Public License +// Agreement, available at the following URL: +// http://www.opensource.org/licenses/cpl.html. +// Copyright (C) 2003-2003 Julian Hyde +// All Rights Reserved. +// You must accept the terms of that agreement to use this software. +// +// jhyde, May 2, 2003 +*/ +package mondrian.xmla; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * An XmlaServlet responds to XML for Analysis SOAP requests. + * + * @see XmlaMediator + * + * @author jhyde + * @since 27 April, 2003 + * @version $Id$ + */ +public class XmlaServlet extends HttpServlet { + private final XmlaMediator mediator = new XmlaMediator(); + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + process(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + process(request, response); + } + + public void process(HttpServletRequest request, HttpServletResponse response) { + final String soapRequest = request.getParameter("SOAPRequest"); + final PrintWriter printWriter; + try { + printWriter = response.getWriter(); + } catch (IOException e) { + return; + } + mediator.process(soapRequest, printWriter); + } +} + +// End XmlaServlet.java diff --git a/src/main/mondrian/xmla/XmlaTest.java b/src/main/mondrian/xmla/XmlaTest.java index 45eb6a87db..92af6f8731 100644 --- a/src/main/mondrian/xmla/XmlaTest.java +++ b/src/main/mondrian/xmla/XmlaTest.java @@ -13,8 +13,9 @@ import junit.framework.TestCase; -import java.io.ByteArrayOutputStream; -import java.io.IOException; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.regex.Pattern; /** @@ -30,19 +31,55 @@ public class XmlaTest extends TestCase { //private static final String dataSource = "Provider=MSOLAP;Data Source=local;"; private static final String dataSource = "Provider=Mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=file:/E:/mondrian/demo/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;"; private static final String catalogName = "file:/E:/mondrian/demo/FoodMart.xml"; + /** + * Usually null, when {@link #getRequests} sets it, {@link #executeRequest} + * writes request strings into it and returns null. + */ + private ArrayList requestList; public XmlaTest(String s) { super(s); } + /** + * Executes a request and returns the result. + * + *

When called from {@link #getRequests}, {@link #requestList} is not + * null, and this method behaves very differently: it records the request + * and returns null. + */ private String executeRequest(String request) { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - new XmlaMediator().process(request, baos); - try { - baos.flush(); - } catch (IOException e) { + if (requestList != null) { + requestList.add(request); + return null; + } + final StringWriter sw = new StringWriter(); + final XmlaMediator mediator = new XmlaMediator(); + mediator.process(request, sw); + return sw.toString(); + } + + /** + * Returns a list of all requests in this test. (These requests are used + * in the sample web page, xmlaTest.jsp.) + */ + public synchronized String[] getRequests() { + this.requestList = new ArrayList(); + Method[] methods = getClass().getMethods(); + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + if (method.getName().startsWith("test")) { + try { + method.invoke(this, null); + } catch (Throwable e) { + // ignore + } + } } - return baos.toString(); + final String[] requests = (String[]) + requestList.toArray(new String[requestList.size()]); + this.requestList = null; + return requests; } private void assertRequestYields(String request, String expected) { diff --git a/webapp/WEB-INF/web-jpivot.xml b/webapp/WEB-INF/web-jpivot.xml index 2dabbbbcb8..878e9c02f5 100644 --- a/webapp/WEB-INF/web-jpivot.xml +++ b/webapp/WEB-INF/web-jpivot.xml @@ -54,11 +54,21 @@ You must accept the terms of that agreement to use this software. + + MondrianXmlaServlet + mondrian.xmla.XmlaServlet + + MDXQueryServlet /mdxquery + + MondrianXmlaServlet + /xmla + + index.jsp diff --git a/webapp/WEB-INF/web.xml b/webapp/WEB-INF/web.xml index 8b3b2c4907..25b4956ffc 100644 --- a/webapp/WEB-INF/web.xml +++ b/webapp/WEB-INF/web.xml @@ -38,11 +38,21 @@ You must accept the terms of that agreement to use this software. + + MondrianXmlaServlet + mondrian.xmla.XmlaServlet + + MDXQueryServlet /mdxquery + + MondrianXmlaServlet + /xmla + + 30 diff --git a/webapp/xmla.jsp b/webapp/xmla.jsp new file mode 100644 index 0000000000..711403048d --- /dev/null +++ b/webapp/xmla.jsp @@ -0,0 +1,23 @@ +<%@ page import="mondrian.xmla.XmlaMediator, + mondrian.xmla.XmlaServlet, + java.io.OutputStream"%> +<%@ page language="java" %> +<%-- +// $Id$ +// This software is subject to the terms of the Common Public License +// Agreement, available at the following URL: +// http://www.opensource.org/licenses/cpl.html. +// (C) Copyright 2003-2003 Julian Hyde +// All Rights Reserved. +// You must accept the terms of that agreement to use this software. +// +// Julian Hyde, 3 June, 2003 +--%> +<%! + final XmlaMediator mediator = new XmlaMediator(); +%> +<% + final ServletContext servletContext = config.getServletContext(); + final RequestDispatcher dispatcher = servletContext.getNamedDispatcher("MondrianXmlaServlet"); + dispatcher.forward(request, response); +%>