Package org.pentaho.platform.web.http.api.resources

Source Code of org.pentaho.platform.web.http.api.resources.UserConsoleResource

/*!
* 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.http.api.resources;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.enunciate.Facet;
import org.codehaus.enunciate.jaxrs.ResponseCode;
import org.codehaus.enunciate.jaxrs.StatusCodes;
import org.pentaho.platform.api.engine.IContentInfo;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IPluginManager;
import org.pentaho.platform.api.engine.IPluginOperation;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.api.engine.ISystemConfig;
import org.pentaho.platform.config.PropertiesFileConfiguration;
import org.pentaho.platform.plugin.action.mondrian.catalog.IMondrianCatalogService;
import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalog;
import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCube;
import org.pentaho.platform.plugin.services.pluginmgr.IAdminContentConditionalLogic;
import org.pentaho.platform.web.http.api.resources.services.UserConsoleService;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static javax.ws.rs.core.MediaType.APPLICATION_XML;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;

/**
* The UserConsoleResource service provides the ability to check whether the current user is authenticated and/or is an administrator.
*/
@Path ( "/mantle/" )
public class UserConsoleResource extends AbstractJaxRSResource {

  private static final Log logger = LogFactory.getLog( UserConsoleResource.class );
  protected static UserConsoleService userConsoleService;
  private static ISystemConfig systemConfig;
  private static List<String> setSessionVarWhiteList;
  private static List<String> getSessionVarWhiteList;
  private static PropertiesFileConfiguration config;
  private static boolean isInitialized = false;

  public UserConsoleResource() {

    userConsoleService = new UserConsoleService();

    if ( !isInitialized ) {
      systemConfig = PentahoSystem.get( ISystemConfig.class );
      String solutionRootPath = PentahoSystem.getApplicationContext().getSolutionRootPath();
      config =
          new PropertiesFileConfiguration( "rest", new File( solutionRootPath + "/system/restConfig.properties" ) );
      try {
        systemConfig.registerConfiguration( config );
        setSessionVarWhiteList = Arrays
            .asList( systemConfig.getProperty( "rest.userConsoleResource.setSessionVarWhiteList" ).split( "," ) );
        getSessionVarWhiteList = Arrays
            .asList( systemConfig.getProperty( "rest.userConsoleResource.getSessionVarWhiteList" ).split( "," ) );
      } catch ( IOException e ) {
        //Default to hard coded white list
        setSessionVarWhiteList.add( "scheduler_folder" );
        setSessionVarWhiteList.add( "showOverrideDialog" );
        getSessionVarWhiteList.add( "scheduler_folder" );
        getSessionVarWhiteList.add( "showOverrideDialog" );
      }
      isInitialized = true;
    }

  }

  /**
   * Returns whether the current user is an administrator.
   *
   * <p><b>Example Request:</b><br />
   *    GET pentaho/api/mantle/isAdministrator
   * </p>
   *
   * @return String true if the user is an administrator, or false otherwise.
   *
   * <p><b>Example Response:</b></p>
   <pre function="syntax.xml">
   *     true
   *  </pre>
   */
  @GET
  @Path ( "/isAdministrator" )
  @StatusCodes ( {
      @ResponseCode ( code = 200, condition = "Returns the boolean response" )
  } )
  public Response isAdministrator() {
    return buildOkResponse( String.valueOf( userConsoleService.isAdministrator() ) );
  }

  /**
   * Returns whether the user is sn authenticated user or not.
   *
   * <p><b>Example Request:</b><br />
   *    GET pentaho/api/mantle/isAuthenticated
   * </p>
   *
   * @return String true if the user is an administrator, or false otherwise.
   *
   * <p><b>Example Response:</b></p>
   <pre function="syntax.xml">
   *     true
   *  </pre>
   */
  @GET
  @Path ( "/isAuthenticated" )
  @StatusCodes ( {
      @ResponseCode ( code = 200, condition = "Returns the boolean response" ),
      @ResponseCode ( code = 401, condition = "User is not authenticated" )
  } )
  public Response isAuthenticated() {
    return buildOkResponse( String.valueOf( userConsoleService.isAuthenticated() ) );
  }

  /**
   * Returns the list of admin related settings
   *
   * @return list of settings
   */
  @GET
  @Path ( "/getAdminContent" )
  @Facet ( name = "Unsupported" )
  @Produces ( { APPLICATION_JSON, APPLICATION_XML } )
  public List<Setting> getAdminContent() {

    ArrayList<Setting> settings = new ArrayList<Setting>();
    try {
      IPluginManager pluginManager = PentahoSystem.get( IPluginManager.class, UserConsoleService.getPentahoSession() );
      List<String> pluginIds = pluginManager.getRegisteredPlugins();
    nextPlugin:
      for ( String pluginId : pluginIds ) {
        String adminContentInfo = (String) pluginManager.getPluginSetting( pluginId, "admin-content-info", null );
        String exceptionMessage = (String) pluginManager.getPluginSetting( pluginId, "exception-message", null );
        if ( adminContentInfo != null ) {
          StringTokenizer nameValuePairs = new StringTokenizer( adminContentInfo, ";" );
          while ( nameValuePairs.hasMoreTokens() ) {
            String currentToken = nameValuePairs.nextToken().trim();
            if ( currentToken.startsWith( "conditional-logic-validator=" ) ) {
              String validatorName = currentToken.substring( "conditional-logic-validator=".length() );
              Class<?> validatorClass = pluginManager.getClassLoader( pluginId ).loadClass( validatorName );
              IAdminContentConditionalLogic validator = (IAdminContentConditionalLogic) validatorClass.newInstance();
              int status = validator.validate();
              if ( status == IAdminContentConditionalLogic.DISPLAY_ADMIN_CONTENT ) {
                settings.add( new Setting( "admin-content-info", adminContentInfo ) );
              }
              if ( status == IAdminContentConditionalLogic.DISPLAY_EXCEPTION_MESSAGE && exceptionMessage != null ) {
                settings.add( new Setting( "exception-message", exceptionMessage ) );
              }
              if ( status == IAdminContentConditionalLogic.AVOID_ADMIN_CONTENT ) {
                continue nextPlugin;
              }
            }
          }
        }
      }
    } catch ( Exception e ) {
      logger.error( e.getMessage(), e );
    }
    return settings;
  }

  /**
   * Return the current user console settings
   *
   * @return current settings
   */
  @GET
  @Path ( "/settings" )
  @Produces ( { APPLICATION_JSON, APPLICATION_XML } )
  @Facet ( name = "Unsupported" )
  public List<Setting> getMantleSettings() {
    ArrayList<Setting> settings = new ArrayList<Setting>();
    settings
        .add( new Setting( "login-show-users-list", PentahoSystem.getSystemSetting( "login-show-users-list", "" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    settings.add( new Setting( "documentation-url", PentahoSystem.getSystemSetting( "documentation-url", "" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    settings.add( new Setting( "submit-on-enter-key", PentahoSystem.getSystemSetting( "submit-on-enter-key", "true" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    settings.add( new Setting( "user-console-revision", PentahoSystem.getSystemSetting( "user-console-revision", "" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    settings.add( new Setting( "startupPerspective", PentahoSystem.getSystemSetting( "startup-perspective", "" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    settings.add( new Setting( "showOnlyPerspective", PentahoSystem.getSystemSetting( "show-only-perspective", "" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

    int startupUrls = Integer.parseInt( PentahoSystem.getSystemSetting( "num-startup-urls", "0" ) );
    settings.add( new Setting( "num-startup-urls", PentahoSystem.getSystemSetting( "num-startup-urls", "0" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    for ( int i = 1; i <= startupUrls; i++ ) {
      settings.add( new Setting( "startup-url-" + i, PentahoSystem.getSystemSetting( "startup-url-" + i, "" ) ) ); //$NON-NLS-1$
      settings.add( new Setting( "startup-name-" + i, PentahoSystem.getSystemSetting( "startup-name-" + i, "" ) ) ); //$NON-NLS-1$
    }

    // Check for override of New Analysis View via pentaho.xml
    // Poked in via pentaho.xml entries
    // <new-analysis-view>
    // <command-url>http://www.google.com</command-url>
    // <command-title>Marc Analysis View</command-title>
    // </new-analysis-view>
    // <new-report>
    // <command-url>http://www.yahoo.com</command-url>
    // <command-title>Marc New Report</command-title>
    // </new-report>
    //
    String overrideNewAnalysisViewCommmand = PentahoSystem.getSystemSetting( "new-analysis-view/command-url", null ); //$NON-NLS-1$
    String overrideNewAnalysisViewTitle = PentahoSystem.getSystemSetting( "new-analysis-view/command-title", null ); //$NON-NLS-1$
    if ( ( overrideNewAnalysisViewCommmand != null ) && ( overrideNewAnalysisViewTitle != null ) ) {
      settings.add( new Setting( "new-analysis-view-command-url", overrideNewAnalysisViewCommmand ) ); //$NON-NLS-1$
      settings.add( new Setting( "new-analysis-view-command-title", overrideNewAnalysisViewTitle ) ); //$NON-NLS-1$
    }
    String overrideNewReportCommmand = PentahoSystem.getSystemSetting( "new-report/command-url", null ); //$NON-NLS-1$
    String overrideNewReportTitle = PentahoSystem.getSystemSetting( "new-report/command-title", null ); //$NON-NLS-1$
    if ( ( overrideNewReportCommmand != null ) && ( overrideNewReportTitle != null ) ) {
      settings.add( new Setting( "new-report-command-url", overrideNewReportCommmand ) ); //$NON-NLS-1$
      settings.add( new Setting( "new-report-command-title", overrideNewReportTitle ) ); //$NON-NLS-1$
    }

    IPluginManager pluginManager = PentahoSystem.get( IPluginManager.class, UserConsoleService.getPentahoSession() ); //$NON-NLS-1$
    if ( pluginManager != null ) {
      // load content types from IPluginSettings
      int i = 0;
      for ( String contentType : pluginManager.getContentTypes() ) {
        IContentInfo info = pluginManager.getContentTypeInfo( contentType );
        if ( info != null ) {
          settings.add( new Setting( "plugin-content-type-" + i, "." + contentType ) ); //$NON-NLS-1$ //$NON-NLS-2$
          settings.add( new Setting( "plugin-content-type-icon-" + i, info.getIconUrl() ) ); //$NON-NLS-1$
          int j = 0;
          for ( IPluginOperation operation : info.getOperations() ) {
            settings.add( new Setting( "plugin-content-type-" + i + "-command-" + j, operation.getId() ) ); //$NON-NLS-1$
            settings.add( new Setting(
                "plugin-content-type-" + i + "-command-perspective-" + j, operation.getPerspective() ) ); //$NON-NLS-1$
            j++;
          }
          i++;
        }
      }
    }

    return settings;
  }

  /**
   * Return the list of mondrian cubes in the platform
   *
   * @return list of cubes
   */
  @GET
  @Path ( "/cubes" )
  @Facet ( name = "Unsupported" )
  @Produces ( { APPLICATION_JSON, APPLICATION_XML } )
  public List<Cube> getMondrianCatalogs() {
    ArrayList<Cube> cubes = new ArrayList<Cube>();

    IMondrianCatalogService catalogService =
        PentahoSystem.get( IMondrianCatalogService.class, "IMondrianCatalogService", UserConsoleService
            .getPentahoSession() ); //$NON-NLS-1$
    List<MondrianCatalog> catalogs = catalogService.listCatalogs( UserConsoleService.getPentahoSession(), true );

    for ( MondrianCatalog cat : catalogs ) {
      for ( MondrianCube cube : cat.getSchema().getCubes() ) {
        cubes.add( new Cube( cat.getName(), cube.getName(), cube.getId() ) );
      }
    }
    return cubes;
  }

  /**
   * Apply the selected locale to the user console
   *
   * @param locale (user console's locale)
   * @return
   */
  @POST
  @Path ( "/locale" )
  @Facet ( name = "Unsupported" )
  public Response setLocaleOverride( String locale ) {
    return new SystemResource().setLocaleOverride( locale );
  }

  /**
   * Return the server side locale
   *
   * @return server's locale
   */
  @GET
  @Path ( "/locale" )
  @Facet ( name = "Unsupported" )
  public Response getLocale() {
    return new SystemResource().getLocale();
  }

  @POST
  @Path ( "/session-variable" )
  @Facet ( name = "Unsupported" )
  public Response setSessionVariable( @QueryParam ( "key" ) String key, @QueryParam ( "value" ) String value ) {
    if ( setSessionVarWhiteList.contains( key ) ) {
      IPentahoSession session = UserConsoleService.getPentahoSession();
      session.setAttribute( key, value );
      return Response.ok( session.getAttribute( key ) ).build();
    }
    return Response.status( FORBIDDEN ).build();
  }

  @GET
  @Path ( "/session-variable" )
  @Facet ( name = "Unsupported" )
  public Response getSessionVariable( @QueryParam ( "key" ) String key ) {
    if ( getSessionVarWhiteList.contains( key ) ) {
      return Response.ok( UserConsoleService.getPentahoSession().getAttribute( key ) ).build();
    }
    return Response.status( FORBIDDEN ).build();
  }

  @DELETE
  @Path ( "/session-variable" )
  @Facet ( name = "Unsupported" )
  public Response clearSessionVariable( @QueryParam ( "key" ) String key ) {
    return Response.ok( UserConsoleService.getPentahoSession().removeAttribute( key ) ).build();
  }

  protected Response buildOkResponse( Object entity ) {
    return Response.ok( entity ).build();
  }
}
TOP

Related Classes of org.pentaho.platform.web.http.api.resources.UserConsoleResource

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.