org.pentaho.platform.web.servlet.HttpWebService.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.platform.web.servlet.HttpWebService.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.platform.web.servlet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultElement;
import org.pentaho.platform.api.engine.IActionParameter;
import org.pentaho.platform.api.engine.IActionSequence;
import org.pentaho.platform.api.engine.IMessageFormatter;
import org.pentaho.platform.api.engine.IParameterProvider;
import org.pentaho.platform.api.engine.IPentahoAclEntry;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IRuntimeContext;
import org.pentaho.platform.api.engine.IUserRoleListService;
import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission;
import org.pentaho.platform.api.util.XmlParseException;
import org.pentaho.platform.engine.core.output.SimpleOutputHandler;
import org.pentaho.platform.engine.core.solution.ActionInfo;
import org.pentaho.platform.engine.core.solution.SimpleParameterProvider;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.security.acls.PentahoAclEntry;
import org.pentaho.platform.engine.services.ActionSequenceJCRHelper;
import org.pentaho.platform.engine.services.SoapHelper;
import org.pentaho.platform.engine.services.solution.PentahoEntityResolver;
import org.pentaho.platform.uifoundation.chart.ChartDefinition;
import org.pentaho.platform.uifoundation.chart.ChartHelper;
import org.pentaho.platform.util.messages.LocaleHelper;
import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper;
import org.pentaho.platform.web.http.request.HttpRequestParameterProvider;
import org.pentaho.platform.web.http.request.HttpWebServiceRequestHandler;
import org.pentaho.platform.web.http.session.HttpSessionParameterProvider;
import org.pentaho.platform.web.servlet.messages.Messages;
import org.pentaho.reporting.libraries.base.util.StringUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Servlet Class
 * 
 * web.servlet name="ViewAction" display-name="Name for ViewAction" description="Description for ViewAction"
 * web.servlet-mapping url-pattern="/ViewAction" web.servlet-init-param name="A parameter" value="A value"
 */
public class HttpWebService extends ServletBase {

    /**
     * 
     */
    private static final long serialVersionUID = -2011812808062152707L;

    private static final Log logger = LogFactory.getLog(HttpWebService.class);

    @Override
    public Log getLogger() {
        return HttpWebService.logger;
    }

    /**
     * 
     */
    public HttpWebService() {
        super();
    }

    public String getPayloadAsString(final HttpServletRequest request) throws IOException {
        BufferedReader reader = request.getReader();
        StringBuffer stringBuffer = new StringBuffer();
        char[] buffer = new char[2048];
        int b = reader.read(buffer);
        while (b > 0) {
            stringBuffer.append(buffer, 0, b);
        }
        return stringBuffer.toString();
    }

    public void doGetFixMe(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        //
        // System Entry/Exit point handled by the doGet method.
        //

        try {
            String actionPath = request.getParameter("path"); //$NON-NLS-1$
            String solutionName = actionPath.substring(0, actionPath.indexOf('/', 1));
            String actionName = actionPath.substring(actionPath.lastIndexOf('/'));

            String actionSeqPath = ActionInfo.buildSolutionPath(solutionName, actionPath, actionName);

            String component = request.getParameter("component"); //$NON-NLS-1$
            String content = getPayloadAsString(request);

            IParameterProvider parameterProvider = null;
            HashMap parameters = new HashMap();
            if ((content != null) && (content.length() > 0)) {
                Document doc = XmlDom4JHelper.getDocFromString(content, new PentahoEntityResolver());
                List parameterNodes = doc.selectNodes("//SOAP-ENV:Body/*/*"); //$NON-NLS-1$
                for (int i = 0; i < parameterNodes.size(); i++) {
                    Node parameterNode = (Node) parameterNodes.get(i);
                    String parameterName = parameterNode.getName();
                    String parameterValue = parameterNode.getText();
                    // String type = parameterNode.selectSingleNode( "@type" );
                    // if( "xml-data".equalsIgnoreCase( ) )
                    if ("action".equals(parameterName)) { //$NON-NLS-1$
                        ActionInfo info = ActionInfo.parseActionString(parameterValue);
                        solutionName = info.getSolutionName();
                        actionPath = info.getPath();
                        actionName = info.getActionName();
                    } else if ("component".equals(parameterName)) { //$NON-NLS-1$
                        component = parameterValue;
                    } else {
                        parameters.put(parameterName, parameterValue);
                    }

                }
                parameterProvider = new SimpleParameterProvider(parameters);
            } else {
                parameterProvider = new HttpRequestParameterProvider(request);
            }

            response.setContentType("text/xml"); //$NON-NLS-1$
            response.setCharacterEncoding(LocaleHelper.getSystemEncoding());
            // PentahoHttpSession userSession = new PentahoHttpSession(
            // request.getRemoteUser(), request.getSession(),
            // request.getLocale() );
            IPentahoSession userSession = getPentahoSession(request);

            String instanceId = request.getParameter("instance-id"); //$NON-NLS-1$
            String processId = this.getClass().getName();

            OutputStream contentStream = new ByteArrayOutputStream();

            SimpleOutputHandler outputHandler = new SimpleOutputHandler(contentStream, false);

            // send the header of the message to prevent time-outs while we are
            // working
            OutputStream outputStream = response.getOutputStream();
            if ((component == null) || "action".equals(component)) { //$NON-NLS-1$
                // assume this is an action sequence execute
                HttpWebServiceRequestHandler requestHandler = new HttpWebServiceRequestHandler(userSession, null,
                        outputHandler, parameterProvider, null);

                requestHandler.setParameterProvider(IParameterProvider.SCOPE_SESSION,
                        new HttpSessionParameterProvider(userSession));
                requestHandler.setInstanceId(instanceId);
                requestHandler.setProcessId(processId);
                requestHandler.setActionPath(actionSeqPath);

                if (ServletBase.debug) {
                    debug(Messages.getInstance().getString("HttpWebService.DEBUG_WEB_SERVICE_START")); //$NON-NLS-1$
                }
                IRuntimeContext runtime = null;
                try {
                    runtime = requestHandler.handleActionRequest(0, 0);
                    Document responseDoc = SoapHelper.createSoapResponseDocument(runtime, outputHandler,
                            contentStream, requestHandler.getMessages());
                    XmlDom4JHelper.saveDom(responseDoc, outputStream,
                            PentahoSystem.getSystemSetting("web-service-encoding", "utf-8"), true);
                } finally {
                    if (runtime != null) {
                        runtime.dispose();
                    }
                }
            } else if ("dial".equals(component)) { //$NON-NLS-1$
                doDial(solutionName, actionPath, actionName, parameterProvider, outputStream, userSession);
            } else if ("chart".equals(component)) { //$NON-NLS-1$
                doChart(actionPath, parameterProvider, outputStream, userSession);
            } else if ("xaction-parameter".equals(component)) { //$NON-NLS-1$
                doParameter(solutionName, actionPath, actionName, parameterProvider, outputStream, userSession,
                        response);
            }

        } catch (Throwable t) {
            error(Messages.getInstance().getErrorString("HttpWebService.ERROR_0001_ERROR_DURING_WEB_SERVICE"), t); //$NON-NLS-1$
        }
        if (ServletBase.debug) {
            debug(Messages.getInstance().getString("HttpWebService.DEBUG_WEB_SERVICE_END")); //$NON-NLS-1$
        }

    }

    @Override
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);

    }

    private void doParameter(final String solutionName, final String actionPath, final String actionName,
            final IParameterProvider parameterProvider, final OutputStream outputStream,
            final IPentahoSession userSession, final HttpServletResponse response) throws IOException {

        final IActionSequence actionSequence = new ActionSequenceJCRHelper().getActionSequence(
                ActionInfo.buildSolutionPath(solutionName, actionPath, actionName), PentahoSystem.loggingLevel,
                RepositoryFilePermission.READ);
        if (actionSequence == null) {
            logger.debug(Messages.getInstance().getString("HttpWebService.ERROR_0002_NOTFOUND", solutionName,
                    actionPath, actionName));
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

        final Document document = DocumentHelper.createDocument();
        try {
            final Element parametersElement = document.addElement("parameters");

            // noinspection unchecked
            final Map<String, IActionParameter> params = actionSequence
                    .getInputDefinitionsForParameterProvider(IParameterProvider.SCOPE_REQUEST);
            for (final Map.Entry<String, IActionParameter> entry : params.entrySet()) {
                final String paramName = entry.getKey();
                final IActionParameter paramDef = entry.getValue();
                final String value = paramDef.getStringValue();
                final Class type;
                // yes, the actual type-code uses equals-ignore-case and thus allows the user
                // to specify type information in a random case. sTrInG is equal to STRING is equal to the value
                // defined as constant (string)
                if (IActionParameter.TYPE_LIST.equalsIgnoreCase(paramDef.getType())) {
                    type = String[].class;
                } else {
                    type = String.class;
                }
                final String label = paramDef.getSelectionDisplayName();

                final String[] values;
                if (StringUtils.isEmpty(value)) {
                    values = new String[0];
                } else {
                    values = new String[] { value };
                }

                createParameterElement(parametersElement, paramName, type, label, "user", "parameters", values);
            }

            // built in parameters: solution, path, action, prompt, instance-id
            createParameterElement(parametersElement, "solution", String.class, null, "system", "system",
                    new String[] { solutionName });
            createParameterElement(parametersElement, "path", String.class, null, "system", "system",
                    new String[] { actionPath });
            createParameterElement(parametersElement, "action", String.class, null, "system", "system",
                    new String[] { actionName });
            createParameterElement(parametersElement, "prompt", String.class, null, "system", "system",
                    new String[] { "yes", "no" });
            createParameterElement(parametersElement, "instance-id", String.class, null, "system", "system",
                    new String[] { parameterProvider.getStringParameter("instance-id", null) });

        } catch (Exception e) {
            logger.warn(Messages.getInstance().getString("HttpWebService.ERROR_0003_UNEXPECTED"), e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }
        // no close, as far as I know tomcat does not like it that much ..
        final XMLWriter writer = new XMLWriter(outputStream, OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.flush();
    }

    private Element createParameterElement(final Element parametersElement, final String paramName,
            final Class type, final String label, final String role, final String group, final String[] values) {
        final Element parameterElement = parametersElement.addElement("parameter");
        parameterElement.addAttribute("name", paramName);
        parameterElement.addAttribute("type", type.getName());

        if (StringUtils.isEmpty(label) == false) {
            final Element labelAttr = parameterElement.addElement("attribute");
            labelAttr.addAttribute("namespace",
                    "http://reporting.pentaho.org/namespaces/engine/parameter-attributes/core");
            labelAttr.addAttribute("name", "label");
            labelAttr.addAttribute("value", label);
        }

        final Element roleAttr = parameterElement.addElement("attribute");
        roleAttr.addAttribute("namespace",
                "http://reporting.pentaho.org/namespaces/engine/parameter-attributes/core");
        roleAttr.addAttribute("name", "role");
        roleAttr.addAttribute("value", role);

        final Element paramGroupAttr = parameterElement.addElement("attribute");
        paramGroupAttr.addAttribute("namespace",
                "http://reporting.pentaho.org/namespaces/engine/parameter-attributes/core");
        paramGroupAttr.addAttribute("name", "parameter-group");
        paramGroupAttr.addAttribute("value", group);

        final Element paramGroupLabelAttr = parameterElement.addElement("attribute");
        paramGroupLabelAttr.addAttribute("namespace",
                "http://reporting.pentaho.org/namespaces/engine/parameter-attributes/core");
        paramGroupLabelAttr.addAttribute("name", "parameter-group-label");
        paramGroupLabelAttr.addAttribute("value", lookupParameterGroupLabel(group));

        if (values.length > 0) {
            final Element valuesElement = parameterElement.addElement("values");
            for (final String value : values) {
                final Element valueAttr = valuesElement.addElement("value");
                valueAttr.addAttribute("type", String.class.getName());
                valueAttr.addAttribute("value", value);
                valueAttr.addAttribute("selected", String.valueOf(values.length == 1));
            }
        }
        return parameterElement;
    }

    private String lookupParameterGroupLabel(final String group) {
        if ("system".equals(group)) {
            return Messages.getInstance().getString("HttpWebService.PARAMETER_GROUP_SYSTEM");
        }
        return Messages.getInstance().getString("HttpWebService.PARAMETER_GROUP_USER");
    }

    @SuppressWarnings("deprecation")
    private void doDial(final String solutionName, final String actionPath, final String actionName,
            final IParameterProvider parameterProvider, final OutputStream outputStream,
            final IPentahoSession userSession) {

        ArrayList messages = new ArrayList();
        StringBuffer buffer = new StringBuffer();
        boolean ok = ChartHelper.doDial(solutionName, actionPath, actionName, parameterProvider, buffer,
                userSession, messages, this);
        if (!ok) {
            PentahoSystem.get(IMessageFormatter.class, userSession).formatErrorMessage("text/html",
                    Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages,
                    buffer); //$NON-NLS-1$ //$NON-NLS-2$
        }

        try {
            XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(buffer.toString()), outputStream,
                    PentahoSystem.getSystemSetting("web-service-encoding", "utf-8"), true);
        } catch (IOException e) {
            // not much we can do here...
        }

        /*
         * String linkUrl = parameterProvider.getStringParameter("drill-url", null); //$NON-NLS-1$ String imageUrl =
         * parameterProvider.getStringParameter("image-url", null); //$NON-NLS-1$ if (imageUrl == null) { imageUrl =
         * PentahoSystem.getApplicationContext().getBaseUrl(); }
         * 
         * if (linkUrl == null) { linkUrl = ""; //$NON-NLS-1$ }
         * 
         * int width = (int) parameterProvider.getLongParameter("image-width", 150); //$NON-NLS-1$ int height = (int)
         * parameterProvider.getLongParameter("image-height", 150); //$NON-NLS-1$
         * 
         * SimpleUrlFactory urlFactory = new SimpleUrlFactory(linkUrl);
         * 
         * ArrayList messages = new ArrayList(); DashboardWidgetComponent widget = new
         * DashboardWidgetComponent(DashboardWidgetComponent.TYPE_DIAL, solutionName + File.separator + actionPath +
         * File.separator + actionName, width, height, urlFactory, messages); //$NON-NLS-1$ widget.validate(userSession,
         * null);
         * 
         * widget.setParameterProvider("request", parameterProvider); //$NON-NLS-1$
         * 
         * double value = Double.parseDouble(parameterProvider.getStringParameter("value", "0")); //$NON-NLS-1$
         * //$NON-NLS-2$ widget.setValue(value);
         * 
         * String title = parameterProvider.getStringParameter("title", ""); //$NON-NLS-1$ //$NON-NLS-2$
         * widget.setTitle(title); //$NON-NLS-1$
         * 
         * String content = widget.getContent("text/html"); //$NON-NLS-1$
         * 
         * if (content == null) { StringBuffer buffer = new StringBuffer();
         * MessageFormatHelper.formatErrorMessage("text/html",
         * Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages, buffer); //$NON-NLS-1$
         * //$NON-NLS-2$ content = buffer.toString(); }
         * 
         * if (content == null || content.equals("")) { //$NON-NLS-1$ content = "&nbsp;"; //$NON-NLS-1$ } try {
         * outputStream.write(SoapHelper.getSoapHeader().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.openSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("<content><![CDATA[".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(content.getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("]]></content>".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(SoapHelper.closeSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.getSoapFooter().getBytes(LocaleHelper.getSystemEncoding())); } catch (IOException
         * e) { // not much we acn do here... }
         */
    }

    private void doChart(final String actionPath, final IParameterProvider parameterProvider,
            final OutputStream outputStream, final IPentahoSession userSession) {

        String chartTypeStr = parameterProvider.getStringParameter("chart-type", ""); //$NON-NLS-1$ //$NON-NLS-2$
        if (ChartDefinition.PIE_CHART_STR.equals(chartTypeStr)) {
            doPieChart(actionPath, parameterProvider, outputStream, userSession);
        } else {
            doOtherChart(actionPath, parameterProvider, outputStream, userSession);
        }
    }

    @SuppressWarnings("deprecation")
    private void doPieChart(final String actionPath, final IParameterProvider parameterProvider,
            final OutputStream outputStream, final IPentahoSession userSession) {

        ArrayList messages = new ArrayList();
        StringBuffer buffer = new StringBuffer();
        boolean ok = ChartHelper.doPieChart(actionPath, parameterProvider, buffer, userSession, messages, this);
        if (!ok) {
            PentahoSystem.get(IMessageFormatter.class, userSession).formatErrorMessage("text/html",
                    Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages,
                    buffer); //$NON-NLS-1$ //$NON-NLS-2$
        }

        try {
            XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(buffer.toString()), outputStream,
                    PentahoSystem.getSystemSetting("web-service-encoding", "utf-8"), true);
        } catch (IOException e) {
            // not much we can do here...
        }

        /*
         * String outerParams = parameterProvider.getStringParameter("outer-params", null); //$NON-NLS-1$ String innerParam
         * = parameterProvider.getStringParameter("inner-param", null); //$NON-NLS-1$
         * 
         * String urlDrillTemplate = parameterProvider.getStringParameter("drill-url", null); //$NON-NLS-1$ String imageUrl
         * = parameterProvider.getStringParameter("image-url", null); //$NON-NLS-1$ if (imageUrl == null) { imageUrl =
         * PentahoSystem.getApplicationContext().getBaseUrl(); }
         * 
         * if (urlDrillTemplate == null) { urlDrillTemplate = ""; //$NON-NLS-1$ }
         * 
         * SimpleUrlFactory urlFactory = new SimpleUrlFactory(urlDrillTemplate);
         * 
         * PieDatasetChartComponent chartComponent = null; try { ArrayList messages = new ArrayList(); String
         * chartDefinitionStr = solutionName + File.separator + actionPath + File.separator + actionName; chartComponent =
         * new PieDatasetChartComponent(chartDefinitionStr, urlFactory, messages); //$NON-NLS-1$
         * chartComponent.setUrlTemplate(urlDrillTemplate); if (outerParams != null) { StringTokenizer tokenizer = new
         * StringTokenizer(outerParams, ";"); //$NON-NLS-1$ while (tokenizer.hasMoreTokens()) {
         * chartComponent.addOuterParamName(tokenizer.nextToken()); } } chartComponent.setParamName(innerParam);
         * 
         * chartComponent.setDataAction(chartDefinitionStr); chartComponent.validate(userSession, null);
         * 
         * chartComponent.setParameterProvider("request", parameterProvider); //$NON-NLS-1$
         * 
         * String content = chartComponent.getContent("text/html"); //$NON-NLS-1$
         * 
         * if (content == null || content.equals("")) { //$NON-NLS-1$ content = "&nbsp;"; //$NON-NLS-1$ } if (content ==
         * null) { StringBuffer buffer = new StringBuffer(); MessageFormatHelper.formatErrorMessage("text/html",
         * Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages, buffer); //$NON-NLS-1$
         * //$NON-NLS-2$ content = buffer.toString(); }
         * 
         * try { outputStream.write(SoapHelper.getSoapHeader().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.openSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("<content><![CDATA[".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(content.getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("]]></content>".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(SoapHelper.closeSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.getSoapFooter().getBytes(LocaleHelper.getSystemEncoding())); } catch (IOException
         * e) { // not much we acn do here... } } finally { if (chartComponent != null) chartComponent.dispose(); }
         */
    }

    private void doOtherChart(final String actionPath, final IParameterProvider parameterProvider,
            final OutputStream outputStream, final IPentahoSession userSession) {

        ArrayList messages = new ArrayList();
        StringBuffer buffer = new StringBuffer();
        boolean ok = ChartHelper.doChart(actionPath, parameterProvider, buffer, userSession, messages, this);
        if (!ok) {
            PentahoSystem.get(IMessageFormatter.class, userSession).formatErrorMessage("text/html",
                    Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages,
                    buffer); //$NON-NLS-1$ //$NON-NLS-2$
        }

        try {
            XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(buffer.toString()), outputStream,
                    PentahoSystem.getSystemSetting("web-service-encoding", "utf-8"), true);
        } catch (IOException e) {
            // not much we can do here...
        }

        /*
         * String outerParams = parameterProvider.getStringParameter("outer-params", null); //$NON-NLS-1$ String innerParam
         * = parameterProvider.getStringParameter("inner-param", null); //$NON-NLS-1$
         * 
         * String urlDrillTemplate = parameterProvider.getStringParameter("drill-url", null); //$NON-NLS-1$ String imageUrl
         * = parameterProvider.getStringParameter("image-url", null); //$NON-NLS-1$ if (imageUrl == null) { imageUrl =
         * PentahoSystem.getApplicationContext().getBaseUrl(); }
         * 
         * if (urlDrillTemplate == null) { urlDrillTemplate = ""; //$NON-NLS-1$ }
         * 
         * int width = (int) parameterProvider.getLongParameter("image-width", 150); //$NON-NLS-1$ int height = (int)
         * parameterProvider.getLongParameter("image-height", 150); //$NON-NLS-1$
         * 
         * SimpleUrlFactory urlFactory = new SimpleUrlFactory(urlDrillTemplate);
         * 
         * CategoryDatasetChartComponent chartComponent = null; try { String content = null; ArrayList messages = new
         * ArrayList(); try { String chartDefinitionStr = solutionName + File.separator + actionPath + File.separator +
         * actionName; String chartTypeStr = parameterProvider.getStringParameter("chart-type", null); //$NON-NLS-1$ int
         * chartType = CategoryDatasetChartDefinition.getChartType(chartTypeStr); chartComponent = new
         * CategoryDatasetChartComponent(chartType, chartDefinitionStr, width, height, urlFactory, messages); //$NON-NLS-1$
         * 
         * String connectionName = parameterProvider.getStringParameter("connection", null); //$NON-NLS-1$ String query =
         * parameterProvider.getStringParameter("query", null); //$NON-NLS-1$ String dataAction =
         * parameterProvider.getStringParameter("data-process", null); //$NON-NLS-1$ IPentahoConnection connection = null;
         * //$NON-NLS-1$ try { if (connectionName != null && query != null) { connection = new SQLConnection(connectionName,
         * this); //$NON-NLS-1$ try { query = TemplateUtil.applyTemplate(query,
         * TemplateUtil.parametersToProperties(parameterProvider)); IPentahoResultSet results =
         * connection.executeQuery(query); chartComponent.setValues(results); } finally { }
         * chartComponent.setUrlTemplate(urlDrillTemplate); if (outerParams != null) { StringTokenizer tokenizer = new
         * StringTokenizer(outerParams, ";"); //$NON-NLS-1$ while (tokenizer.hasMoreTokens()) {
         * chartComponent.addOuterParamName(tokenizer.nextToken()); } }
         * 
         * chartComponent.setParamName(innerParam);
         * 
         * chartComponent.setDataAction(chartDefinitionStr); chartComponent.validate(userSession, null);
         * 
         * chartComponent.setParameterProvider("request", parameterProvider); //$NON-NLS-1$
         * 
         * content = chartComponent.getContent("text/html"); //$NON-NLS-1$ } else if (dataAction != null) { String
         * actionInfo[] = PentahoSystem.parseActionString(dataAction); if (actionInfo != null && actionInfo.length == 3) {
         * chartComponent.setDataAction(actionInfo[0], actionInfo[1], actionInfo[2], "rule-result"); //$NON-NLS-1$
         * //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } } else { error("'query' and 'connection' must be specified"); }
         * 
         * } finally { if (connection != null) { connection.close(); } }
         * 
         * // String query = "select department, actual, budget, variance // from quadrant_actuals"; //$NON-NLS-1$
         * 
         * } catch (Exception e) { // not much we can do here... } try { if (content == null) { StringBuffer buffer = new
         * StringBuffer(); MessageFormatHelper.formatErrorMessage("text/html",
         * Messages.getInstance().getString("Widget.ERROR_0001_COULD_NOT_CREATE_WIDGET"), messages, buffer); //$NON-NLS-1$
         * //$NON-NLS-2$ content = buffer.toString(); }
         * outputStream.write(SoapHelper.getSoapHeader().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.openSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("<content><![CDATA[".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(content.getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write("]]></content>".getBytes(LocaleHelper.getSystemEncoding())); //$NON-NLS-1$
         * outputStream.write(SoapHelper.closeSoapResponse().getBytes(LocaleHelper.getSystemEncoding()));
         * outputStream.write(SoapHelper.getSoapFooter().getBytes(LocaleHelper.getSystemEncoding())); } catch (Exception e)
         * {
         * 
         * } } finally { if (chartComponent != null) chartComponent.dispose(); }
         */
    }

    //
    // FIXME: Copied straight from something else - make this nice
    //
    /**
     * <ol>
     * <li>Make sure this request has required parameters either on query string or in body of post.</li>
     * <li>Make calls into <code>UserDetailsRoleListService</code> instance for users and roles.</li>
     * <li>Make static call into <code>PentahoAclEntry</code> for ACLs.</li>
     * <li>Construct SOAP response.</li>
     * </ol>
     */
    @Override
    public void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        PentahoSystem.systemEntryPoint();
        try {

            if (!isSecurityDetailsRequest(request)) {
                if (HttpWebService.logger.isDebugEnabled()) {
                    HttpWebService.logger.debug(
                            Messages.getInstance().getString("HttpWebService.DEBUG_MISSING_ACTION_PARAMETER")); //$NON-NLS-1$
                }
                doGetFixMe(request, response);
                return;
            }

            String responseEncoding = PentahoSystem.getSystemSetting("web-service-encoding", "utf-8");
            response.setContentType("text/xml"); //$NON-NLS-1$
            response.setCharacterEncoding(responseEncoding);

            String details = getDetailsParameter(request);
            if ("users".equalsIgnoreCase(details)) { //$NON-NLS-1$
                Document usersDoc = getUsers();
                Document aclsDoc = getACLs();
                XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(new Document[] { usersDoc, aclsDoc }),
                        response.getOutputStream(), responseEncoding, true);
            } else if ("roles".equalsIgnoreCase(details)) { //$NON-NLS-1$

                Document rolesDoc = getRoles();
                Document aclsDoc = getACLs();
                XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(new Document[] { rolesDoc, aclsDoc }),
                        response.getOutputStream(), responseEncoding, true);
            } else if ("acls".equalsIgnoreCase(details)) { //$NON-NLS-1$
                Document aclsDoc = getACLs();
                XmlDom4JHelper.saveDom(SoapHelper.createSoapResponseDocument(aclsDoc), response.getOutputStream(),
                        responseEncoding, true);
            } else {

                if (!"all".equalsIgnoreCase(details)) { //$NON-NLS-1$
                    if (HttpWebService.logger.isWarnEnabled()) {
                        HttpWebService.logger.warn(
                                Messages.getInstance().getString("HttpWebService.WARN_MISSING_DETAILS_PARAMETER")); //$NON-NLS-1$
                    }
                }
                Document usersDoc = getUsers();
                Document rolesDoc = getRoles();
                Document aclsDoc = getACLs();
                XmlDom4JHelper.saveDom(
                        SoapHelper.createSoapResponseDocument(new Document[] { usersDoc, rolesDoc, aclsDoc }),
                        response.getOutputStream(), responseEncoding, true);
            }
        } finally {
            PentahoSystem.systemExitPoint();
        }
    }

    /**
     * Returns true if the required parameter is either in the query string or body.
     */
    protected boolean isSecurityDetailsRequest(final HttpServletRequest request) {
        return hasActionInQueryString(request) || hasActionInBody(request);
    }

    /**
     * Returns parameter named <code>details</code> either from query string or body. This parameter specifies how much
     * information the caller wants returned.
     */
    protected String getDetailsParameter(final HttpServletRequest request) {
        // check query string first
        String details = request.getParameter("details"); //$NON-NLS-1$
        if (null != details) {
            return details;
        }

        // now check body
        String payload;
        try {
            payload = getPayloadAsString(request);
        } catch (IOException e) {
            if (HttpWebService.logger.isErrorEnabled()) {
                HttpWebService.logger.error(e);
            }
            return null;
        }
        if ((null != payload) && (payload.length() > 0)) {
            Map parameters = getParameterMapFromPayload(payload);
            Object obj = parameters.get("details"); //$NON-NLS-1$
            if (null != obj) {
                return obj.toString();
            }
        }
        return null;
    }

    /**
     * Returns true if required parameter is in body of request.
     */
    protected boolean hasActionInBody(final HttpServletRequest request) {
        String payload;
        try {
            payload = getPayloadAsString(request);
        } catch (IOException e) {
            if (HttpWebService.logger.isErrorEnabled()) {
                HttpWebService.logger.error(e);
            }
            return false;
        }
        if ((null != payload) && (payload.length() > 0)) {
            Map parameters = getParameterMapFromPayload(payload);
            Object obj = parameters.get("action"); //$NON-NLS-1$
            if ((null != obj) && obj.toString().equalsIgnoreCase("securitydetails")) { //$NON-NLS-1$
                return true;
            }

        }
        return false;
    }

    /**
     * Returns true if required parameter named <code>action</code> is in query string.
     */
    protected boolean hasActionInQueryString(final HttpServletRequest request) {
        String action = request.getParameter("action"); //$NON-NLS-1$
        if (("securitydetails").equalsIgnoreCase(action)) { //$NON-NLS-1$
            return true;
        } else {
            return false;
        }
    }

    protected Map getParameterMapFromPayload(final String xml) {
        Map parameters = new HashMap();
        Document doc = null;
        try {
            doc = XmlDom4JHelper.getDocFromString(xml, new PentahoEntityResolver());
        } catch (XmlParseException e) {
            error(Messages.getInstance().getErrorString("HttpWebService.ERROR_0001_ERROR_DURING_WEB_SERVICE"), e); //$NON-NLS-1$
            return parameters;
        }
        List parameterNodes = doc.selectNodes("//SOAP-ENV:Body/*/*"); //$NON-NLS-1$
        for (int i = 0; i < parameterNodes.size(); i++) {
            Node parameterNode = (Node) parameterNodes.get(i);
            String parameterName = parameterNode.getName();
            String parameterValue = parameterNode.getText();
            parameters.put(parameterName, parameterValue);
        }
        return parameters;
    }

    /**
     * Returns XML for list of users.
     */
    protected Document getUsers() throws ServletException, IOException {
        IUserRoleListService service = PentahoSystem.get(IUserRoleListService.class);
        Element rootElement = new DefaultElement("users");
        Document doc = DocumentHelper.createDocument(rootElement);
        if (service != null) {
            List users = service.getAllUsers();
            for (Iterator usersIterator = users.iterator(); usersIterator.hasNext();) {
                String username = usersIterator.next().toString();
                if ((null != username) && (username.length() > 0)) {
                    rootElement.addElement("user").addCDATA(username);
                }
            }
        }
        return doc;
    }

    /**
     * Returns XML for list of roles.
     */
    protected Document getRoles() throws ServletException, IOException {
        IUserRoleListService service = PentahoSystem.get(IUserRoleListService.class);
        Element rootElement = new DefaultElement("roles");
        Document doc = DocumentHelper.createDocument(rootElement);
        if (service != null) {
            List roles = service.getAllRoles();
            for (Iterator rolesIterator = roles.iterator(); rolesIterator.hasNext();) {
                String roleName = rolesIterator.next().toString();
                if ((null != roleName) && (roleName.length() > 0)) {
                    rootElement.addElement("role").addCDATA(roleName);
                }
            }
        }
        return doc;
    }

    /**
     * Returns XML for list of ACLs.
     */
    protected Document getACLs() throws ServletException, IOException {
        Map validPermissionsNameMap = PentahoAclEntry
                .getValidPermissionsNameMap(IPentahoAclEntry.PERMISSIONS_LIST_ALL);
        Element rootElement = new DefaultElement("acls");
        Document doc = DocumentHelper.createDocument(rootElement);
        if (validPermissionsNameMap != null) {
            Set aclsKeySet = validPermissionsNameMap.keySet();
            for (Iterator aclsIterator = aclsKeySet.iterator(); aclsIterator.hasNext();) {
                String aclName = aclsIterator.next().toString();
                String aclMask = null != validPermissionsNameMap.get(aclName)
                        ? validPermissionsNameMap.get(aclName).toString()
                        : null;

                if ((null != aclName) && (aclName.length() > 0) && (null != aclMask) && (aclMask.length() > 0)) {
                    Element aclElement = rootElement.addElement("acl");
                    aclElement.addElement("name").addCDATA(aclName);
                    aclElement.addElement("mask").setText(aclMask);
                }

            }
        }
        return doc;
    }

}