blob: c2409194d243c074dfab98e97e6392a67f25e72e [file] [log] [blame]
package org.apache.velocity.tools.config;
/*
* 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.Collection;
import org.apache.velocity.tools.Scope;
import org.apache.velocity.tools.ToolboxFactory;
/**
* <p>This class handles configuration info for the Toolbox instances
* that will eventually be produced by {@link ToolboxFactory}.
* It contains {@link ToolConfiguration}s for tools which will be managed
* by those toolboxes, as well the toolboxes' scope and
* any other {@link Property}s which you intend to be available
* to all the tools in the toolbox.</p>
* <p>
* Most users will not find themselves directly using the API of this class.
* </p>
* <p>NOTE: Two instances of this class are considered equal() if their scopes
* are equal. This is not the intuitive behavior at this level but is done
* to facilitate intuitive behavior in the higher APIs, which are much more
* likely to be used directly.</p>
*
* @author Nathan Bubna
* @version $Id: ToolboxConfiguration.java 511959 2007-02-26 19:24:39Z nbubna $
*/
public class ToolboxConfiguration
extends CompoundConfiguration<ToolConfiguration>
{
private String scope = ToolboxFactory.DEFAULT_SCOPE;
public ToolboxConfiguration()
{
// ensure that even the default scope is set as a property
setProperty("scope", this.scope);
}
public void setScope(String scope)
{
if (scope == null)
{
throw new NullPointerException("Toolbox scope cannot be null");
}
this.scope = scope;
// ensure the scope is also set as a property of the toolbox
setProperty("scope", scope);
}
public String getScope()
{
return this.scope;
}
public void addTool(ToolConfiguration tool)
{
addChild(tool);
}
public void removeTool(ToolConfiguration tool)
{
removeChild(tool);
}
public ToolConfiguration getTool(String key)
{
for (ToolConfiguration tool : getTools())
{
if (key.equals(tool.getKey()))
{
return tool;
}
}
return null;
}
public Collection<ToolConfiguration> getTools()
{
return getChildren();
}
public void setTools(Collection<ToolConfiguration> tools)
{
setChildren(tools);
}
@Override
public void validate()
{
super.validate();
if (getScope() == null)
{
throw new ConfigurationException(this, "Toolbox scope cannot be null");
}
if (!Scope.exists(getScope()))
{
throw new ConfigurationException(this, "Scope '"+getScope()+"' is not recognized. Please correct or add your new custom scope with "+Scope.class.getName()+".add(\""+getScope()+"\").");
}
// validate that all tools are allowed in this scope
for (ToolConfiguration tool : getTools())
{
// check if this toolbox's scope has been declared invalid
for (String invalidScope : tool.getInvalidScopes())
{
if (getScope().equals(invalidScope))
{
throw new InvalidScopeException(this, tool);
}
}
// if the set of valid scopes has been limited, check to be
// sure that this toolbox's scope is in the set
String[] validScopes = tool.getValidScopes();
if (validScopes != null && validScopes.length > 0)
{
boolean found = false;
for (String validScope : validScopes)
{
if (getScope().equals(validScope))
{
found = true;
break;
}
}
if (!found)
{
throw new InvalidScopeException(this, tool);
}
}
}
}
@Override
public int compareTo(Configuration conf)
{
if (!(conf instanceof ToolboxConfiguration))
{
throw new UnsupportedOperationException("ToolboxConfigurations can only be compared to other ToolboxConfigurations");
}
ToolboxConfiguration toolbox = (ToolboxConfiguration)conf;
return getScope().compareTo(toolbox.getScope());
}
@Override
public int hashCode()
{
return scope.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof ToolboxConfiguration)
{
return scope.equals(((ToolboxConfiguration)obj).scope);
}
return false;
}
public String toString()
{
StringBuilder out = new StringBuilder();
out.append("Toolbox '");
out.append(this.scope);
out.append("' ");
appendProperties(out);
appendChildren(out, "tools: \n ", "\n ");
return out.toString();
}
}