org.pentaho.reporting.platform.plugin.PentahoReportEnvironment.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.reporting.platform.plugin.PentahoReportEnvironment.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 2010-2013 Pentaho Corporation.  All rights reserved.
 */

package org.pentaho.reporting.platform.plugin;

import java.net.URL;
import java.util.HashMap;
import java.util.Locale;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.mt.ITenantedPrincipleNameResolver;
import org.pentaho.platform.engine.core.system.PentahoRequestContextHolder;
import org.pentaho.platform.engine.core.system.PentahoSessionHolder;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.security.SecurityHelper;
import org.pentaho.platform.util.messages.LocaleHelper;
import org.pentaho.reporting.engine.classic.core.DefaultReportEnvironment;
import org.pentaho.reporting.libraries.base.config.Configuration;
import org.pentaho.reporting.libraries.base.util.CSVQuoter;
import org.pentaho.reporting.platform.plugin.messages.Messages;
import org.springframework.security.Authentication;
import org.springframework.security.GrantedAuthority;

public class PentahoReportEnvironment extends DefaultReportEnvironment {
    private static final Log logger = LogFactory.getLog(PentahoReportEnvironment.class);
    private HashMap<String, String> cache;
    private String clText;
    private String clId;

    public PentahoReportEnvironment(final Configuration configuration) {
        this(configuration, null);
    }

    public PentahoReportEnvironment(final Configuration configuration, final String clText) {
        super(configuration);
        this.clText = clText;
    }

    public String getEnvironmentProperty(final String key) {
        if (key == null) {
            throw new NullPointerException();
        }

        if ("contentLink".equals(key)) {
            return clText;
        }

        if (cache == null) {
            cache = new HashMap<String, String>();
        }

        final String cached = cache.get(key);
        if (cached != null) {
            return cached;
        }

        final IPentahoSession session = PentahoSessionHolder.getSession();
        if (PentahoSystem.getApplicationContext() != null) {
            final String fullyQualifiedServerUrl = PentahoSystem.getApplicationContext()
                    .getFullyQualifiedServerURL();
            if ("serverBaseURL".equals(key)) //$NON-NLS-1$
            {
                final String baseServerURL = getBaseServerURL(fullyQualifiedServerUrl);
                cache.put(key, baseServerURL);
                return baseServerURL;
            } else if ("pentahoBaseURL".equals(key)) //$NON-NLS-1$
            {
                cache.put(key, fullyQualifiedServerUrl);
                return fullyQualifiedServerUrl;
            } else if ("solutionRoot".equals(key)) //$NON-NLS-1$
            {
                final String solutionRoot = PentahoSystem.getApplicationContext().getSolutionPath("");
                cache.put(key, solutionRoot);
                return solutionRoot; //$NON-NLS-1$
            } else if ("hostColonPort".equals(key)) //$NON-NLS-1$
            {
                final String hostColonPort = getHostColonPort(fullyQualifiedServerUrl);
                cache.put(key, hostColonPort);
                return hostColonPort;
            } else if ("requestContextPath".equals(key)) //$NON-NLS-1$
            {
                final String requestContextPath = PentahoRequestContextHolder.getRequestContext().getContextPath();
                cache.put(key, requestContextPath);
            }
        } else {
            if ("serverBaseURL".equals(key) || //$NON-NLS-1$
                    "pentahoBaseURL".equals(key) || //$NON-NLS-1$
                    "solutionRoot".equals(key) || //$NON-NLS-1$
                    "hostColonPort".equals(key) || //$NON-NLS-1$
                    "requestContextPath".equals(key) //$NON-NLS-1$
            ) //$NON-NLS-1$
            {
                logger.warn(Messages.getInstance().getString("ReportPlugin.warnNoApplicationContext"));
                // make it explicit that these values are not available. This way
                // a configuration in the classic-engine.properties file cannot begin
                // to interfer here.
                cache.put(key, null);
                return null;
            }
        }
        if (session != null) {
            if ("username".equals(key)) //$NON-NLS-1$
            {
                final Authentication authentication = SecurityHelper.getInstance().getAuthentication();
                if (authentication == null) {
                    return null;
                }
                ITenantedPrincipleNameResolver tenantedUserNameUtils = PentahoSystem
                        .get(ITenantedPrincipleNameResolver.class, "tenantedUserNameUtils", session);
                String userName = null;
                if (tenantedUserNameUtils != null) {
                    userName = tenantedUserNameUtils.getPrincipleName(authentication.getName());
                } else {
                    userName = authentication.getName();
                }

                cache.put(key, userName);
                return userName;
            } else if ("roles".equals(key)) //$NON-NLS-1$
            {
                final Authentication authentication = SecurityHelper.getInstance().getAuthentication();
                if (authentication == null) {
                    return null;
                }
                final StringBuilder property = new StringBuilder();
                final GrantedAuthority[] roles = authentication.getAuthorities();
                ITenantedPrincipleNameResolver tenantedRoleNameUtils = PentahoSystem
                        .get(ITenantedPrincipleNameResolver.class, "tenantedRoleNameUtils", session);
                if (roles == null) {
                    return null;
                }

                final int rolesSize = roles.length;
                final CSVQuoter quoter = new CSVQuoter(',', '"');//$NON-NLS-1$
                for (int i = 0; i < rolesSize; i++) {
                    if (i != 0) {
                        property.append(",");//$NON-NLS-1$
                    }
                    String authority = null;
                    if (tenantedRoleNameUtils != null) {
                        authority = tenantedRoleNameUtils.getPrincipleName(roles[i].getAuthority());
                    } else {
                        authority = roles[i].getAuthority();
                    }

                    property.append(quoter.doQuoting(authority));
                }
                return property.toString();
            }

            if (key.startsWith("session:"))//$NON-NLS-1$
            {
                final Object attribute = session.getAttribute(key.substring("session:".length()));//$NON-NLS-1$
                return String.valueOf(attribute);
            } else if (key.startsWith("global:")) {
                final Object attribute = PentahoSystem.getGlobalParameters()
                        .getParameter(key.substring("global:".length()));//$NON-NLS-1$
                return String.valueOf(attribute);
            }
        } else {
            if (key.startsWith("session:") || //$NON-NLS-1$
                    key.equals("username") || //$NON-NLS-1$
                    key.startsWith("global:") || //$NON-NLS-1$
                    key.equals("roles"))//$NON-NLS-1$
            {
                logger.warn(Messages.getInstance().getString("ReportPlugin.warnNoSession"));
                return null;
            }
        }

        final Object environmentProperty = super.getEnvironmentProperty(key);
        if (environmentProperty == null) {
            return null;
        }
        return String.valueOf(environmentProperty);
    }

    private String getBaseServerURL(final String fullyQualifiedServerUrl) {
        try {
            final URL url = new URL(fullyQualifiedServerUrl);
            return url.getProtocol() + "://" + url.getHost() + ":" + url.getPort(); //$NON-NLS-1$ //$NON-NLS-2$
        } catch (Exception e) {
            // ignore
            logger.warn(Messages.getInstance().getString("ReportPlugin.warnNoBaseServerURL"), e);
        }
        return null;
    }

    private String getHostColonPort(final String fullyQualifiedServerUrl) {
        try {
            final URL url = new URL(fullyQualifiedServerUrl);
            return url.getHost() + ":" + url.getPort();//$NON-NLS-1$ 
        } catch (Exception e) {
            // ignore
            logger.warn(Messages.getInstance().getString("ReportPlugin.warnNoHostColonPort"), e);
        }
        return null;
    }

    public Locale getLocale() {
        return LocaleHelper.getLocale();
    }
}