/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports 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. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jasperreports.extensions; import net.sf.jasperreports.engine.JRRuntimeException; import net.sf.jasperreports.engine.util.ClassUtils; import net.sf.jasperreports.engine.util.JRProperties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * A class that provides means of setting and accessing * {@link ExtensionsRegistry} instances. * * @author Lucian Chirita (lucianc@users.sourceforge.net) * @version $Id: ExtensionsEnvironment.java 3659 2010-03-31 10:20:49Z shertage $ * @see #getExtensionsRegistry() */ public final class ExtensionsEnvironment { private ExtensionsEnvironment() { } private static final Log log = LogFactory.getLog(ExtensionsEnvironment.class); protected final static Object NULL_CACHE_KEY = new Object(); /** * A property that provides the default {@link ExtensionsRegistry} * implementation class. * * <p> * This property is only read at initialization time, therefore changing * the property value at a later time will have no effect. */ public static final String PROPERTY_EXTENSIONS_REGISTRY_CLASS = JRProperties.PROPERTY_PREFIX + "extensions.registry.class"; private static ExtensionsRegistry systemRegistry; private static final ThreadLocal threadRegistry = new InheritableThreadLocal(); static { systemRegistry = createDefaultRegistry(); } private static ExtensionsRegistry createDefaultRegistry() { String registryClass = JRProperties.getProperty(PROPERTY_EXTENSIONS_REGISTRY_CLASS); if (log.isDebugEnabled()) { log.debug("Instantiating extensions registry class " + registryClass); } ExtensionsRegistry registry = (ExtensionsRegistry) ClassUtils. instantiateClass(registryClass, ExtensionsRegistry.class); return registry; } /** * Returns the system default extensions registry object. * * <p> * This is either the one instantiated based on {@link #PROPERTY_EXTENSIONS_REGISTRY_CLASS}, * or the one set by {@link #setSystemExtensionsRegistry(ExtensionsRegistry)}. * * @return the system default extensions registry object */ public static synchronized ExtensionsRegistry getSystemExtensionsRegistry() { return systemRegistry; } /** * Sets the system default extensions registry. * * @param extensionsRegistry the extensions registry */ public static synchronized void setSystemExtensionsRegistry(ExtensionsRegistry extensionsRegistry) { if (extensionsRegistry == null) { throw new JRRuntimeException("Cannot set a null extensions registry."); } systemRegistry = extensionsRegistry; } /** * Returns the thread extensions registry, if any. * * @return the thread extensions registry */ public static ExtensionsRegistry getThreadExtensionsRegistry() { return (ExtensionsRegistry) threadRegistry.get(); } /** * Sets the thread extensions registry. * * @param extensionsRegistry * @see #getExtensionsRegistry() */ public static void setThreadExtensionsRegistry(ExtensionsRegistry extensionsRegistry) { threadRegistry.set(extensionsRegistry); } /** * Resets (to null) the thread extensions registry. * * @see #setThreadExtensionsRegistry(ExtensionsRegistry) */ public static void resetThreadExtensionsRegistry() { threadRegistry.set(null); } /** * Returns the extensions registry to be used in the current context. * * <p> * The method returns the thread extensions registry (as returned by * {@link #getThreadExtensionsRegistry()}) if it exists, and the system * registry (as returned by {@link #getSystemExtensionsRegistry()}) otherwise. * * @return the context extensions registry */ public static ExtensionsRegistry getExtensionsRegistry() { ExtensionsRegistry registry = getThreadExtensionsRegistry(); if (registry == null) { registry = getSystemExtensionsRegistry(); } return registry; } /** * Returns an object that can be used as cache key for extension-related * caches. * * @return an extension-related cache key */ public static Object getExtensionsCacheKey() { Object key = Thread.currentThread().getContextClassLoader(); if (key == null) { key = NULL_CACHE_KEY; } return key; } }