blob: 928d9cb4cb8b55d58f27755d0449d69b6b87f328 [file] [log] [blame]
package org.apache.velocity.tools;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.Map;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.tools.config.ConfigurationUtils;
import org.apache.velocity.tools.config.FactoryConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Manages tools for non-web applications. This simplifies the process
* of getting a tool-populated Velocity context for merging with templates.
* It allows for both direct configuration by passing in a {@link FactoryConfiguration}
* as well as configuration via a tools.xml or tools.properties file in
* either the classpath or the local file system.
*
* @author Nathan Bubna
* @version $Id: ToolManager.java 511959 2007-02-26 19:24:39Z nbubna $
*/
public class ToolManager
{
protected VelocityEngine velocity;
protected ToolboxFactory factory;
protected Logger log = null;
private Toolbox application;
private boolean userOverwrite = true;
/**
* Constructs an instance already configured to use the default tools and
* any configuration specified via a "org.apache.velocity.tools"
* system property.
*/
public ToolManager()
{
this(true, true);
}
/**
* Constructs an instance that may or not include default tools,
* and already configured with
* any configuration specified via a "org.apache.velocity.tools"
* system property.
* @param includeDefaults whether to include default tools
*/
public ToolManager(boolean includeDefaults)
{
this(true, includeDefaults);
}
/**
* Constructs an instance that may or not include default tools,
* and which may or not be already configured with
* any configuration specified via a "org.apache.velocity.tools"
* system property.
* @param autoConfig whether to use configuration file specified
* in the <code>org.apache.velocity.tools</code> system property
* @param includeDefaults whether to include default tools
*/
public ToolManager(boolean autoConfig, boolean includeDefaults)
{
this.factory = new ToolboxFactory();
if (autoConfig)
{
autoConfigure(includeDefaults);
}
}
/**
* Autoconfiguration using the configuration file potentially found
* in the <code>org.apache.velocity.tools</code> system property.
* @param includeDefaults whether to include default tools
*/
public void autoConfigure(boolean includeDefaults)
{
// look for any specified via system property
FactoryConfiguration sys = ConfigurationUtils.findFromSystemProperty();
if (sys != null)
{
configure(sys);
}
}
/**
* Configure the tool manager with this toolbox factory config
* @param config toolbox factory config
*/
public void configure(FactoryConfiguration config)
{
// clear the cached application toolbox
this.application = null;
this.factory.configure(config);
}
/**
* Configure the tool manager with the provided configuration file
* @param path path to configuration file
*/
public void configure(String path)
{
FactoryConfiguration config = findConfig(path);
if (config != null)
{
configure(config);
}
else
{
throw new RuntimeException("Could not find any configuration at "+path);
}
}
/**
* Find a configuration file
* @param path path to a configuration file
* @return toolbox factory configuration
*/
protected FactoryConfiguration findConfig(String path)
{
return ConfigurationUtils.find(path);
}
/**
* Returns the underlying {@link ToolboxFactory} being used.
* @return underlying toolbox factory
*/
public ToolboxFactory getToolboxFactory()
{
return this.factory;
}
/**
* Sets the underlying ToolboxFactory being used.
* <b>If you use this, be sure that your ToolboxFactory
* is already properly configured.</b>
* @param factory toolbox factory
*/
public void setToolboxFactory(ToolboxFactory factory)
{
if (this.factory != factory)
{
if (factory == null)
{
throw new NullPointerException("ToolboxFactory cannot be null");
}
getLog().debug("ToolboxFactory instance was changed to {}", factory);
this.factory = factory;
}
}
/**
* Sets the underlying VelocityEngine being used.
* <b>If you use this, be sure that your VelocityEngine
* is already properly configured and initialized.</b>
* @param engine VelocityEngine instance
*/
public void setVelocityEngine(VelocityEngine engine)
{
if (velocity != engine)
{
getLog().debug("VelocityEngine instance was changed to {}", engine);
this.velocity = engine;
}
}
/**
* Get the underlying VelocityEngine being used.
* @return VelocityEngine instance
*/
public VelocityEngine getVelocityEngine()
{
return this.velocity;
}
/**
* Set whether template user can overwrite tools keys
* @param overwrite flag value
*/
public void setUserCanOverwriteTools(boolean overwrite)
{
this.userOverwrite = overwrite;
}
/**
* Get whether template user can overwrite tools keys
* @return flag value
*/
public boolean getUserCanOverwriteTools()
{
return this.userOverwrite;
}
/**
* Get logger
* @return logger
*/
public Logger getLog()
{
if (log == null)
{
synchronized (this)
{
if (log == null)
{
initLog();
}
}
}
return log;
}
/**
* init logger
*/
protected void initLog()
{
if (velocity == null)
{
log = LoggerFactory.getLogger(ToolManager.class);
}
else
{
log = ConfigurationUtils.getLog(velocity, "tools");
}
}
/**
* create new context with configured toolboxes tools
* @return newly created context
*/
public ToolContext createContext()
{
return createContext(null);
}
/**
* create new context with configured toolboxes tools,
* using the provided tools properties
* @param toolProps tools properties
* @return newly created context
*/
public ToolContext createContext(Map<String,Object> toolProps)
{
ToolContext context = new ToolContext(toolProps);
prepareContext(context);
return context;
}
/**
* Prepare context
* @param context tool context
*/
protected void prepareContext(ToolContext context)
{
context.setUserCanOverwriteTools(this.userOverwrite);
if (this.velocity != null)
{
context.putVelocityEngine(this.velocity);
}
addToolboxes(context);
}
/**
* Add toolboxes to contex
* @param context context
*/
protected void addToolboxes(ToolContext context)
{
if (hasApplicationTools())
{
context.addToolbox(getApplicationToolbox());
}
if (hasRequestTools())
{
context.addToolbox(getRequestToolbox());
}
}
/**
* Check for the presence of tools in a given scope
* @param scope scope to check
* @return whether this scope contains tools
*/
protected boolean hasTools(String scope)
{
return this.factory.hasTools(scope);
}
/**
* Create a toolbox for the given scope
* @param scope scope
* @return newly created toolbox
*/
protected Toolbox createToolbox(String scope)
{
return this.factory.createToolbox(scope);
}
/**
* Check whether this tool manager has request scoped tools
* @return <code>true</code> if this tool manager has request scoped tools,
* <code>false</code> otherwise
*/
public boolean hasRequestTools()
{
return hasTools(Scope.REQUEST);
}
/**
* Get the toolbox for request scoped tools
* @return toolbox of request scoped tools
*/
public Toolbox getRequestToolbox()
{
return createToolbox(Scope.REQUEST);
}
/**
* Check whether this tool manager has application scoped tools
* @return <code>true</code> if this tool manager has application scoped tools,
* <code>false</code> otherwise
*/
public boolean hasApplicationTools()
{
return hasTools(Scope.APPLICATION);
}
/**
* Get the toolbox for application scoped tools
* @return toolbox of application scoped tools
*/
public Toolbox getApplicationToolbox()
{
if (this.application == null && hasApplicationTools())
{
this.application = createToolbox(Scope.APPLICATION);
}
return this.application;
}
}