Package org.pentaho.platform.web.servlet

Source Code of org.pentaho.platform.web.servlet.HttpWebService

/*!
* 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;
  }

}
TOP

Related Classes of org.pentaho.platform.web.servlet.HttpWebService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.