com.opensymphony.xwork2.config.entities.PackageConfig Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xwork Show documentation
Show all versions of xwork Show documentation
XWork is an command-pattern framework that is used to power WebWork
as well as other applications. XWork provides an Inversion of Control
container, a powerful expression language, data type conversion,
validation, and pluggable configuration.
/*
* Copyright (c) 2002-2006 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.xwork2.config.entities;
import com.opensymphony.xwork2.util.TextUtils;
import com.opensymphony.xwork2.util.location.Located;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.Serializable;
import java.util.*;
/**
* Configuration for Package.
*
* In the xml configuration file this is defined as the package
tag.
*
* @author Rainer Hermanns
* @version $Revision: 1445 $
*/
public class PackageConfig extends Located implements Comparable, Serializable {
private static final Log LOG = LogFactory.getLog(PackageConfig.class);
private Map actionConfigs = new LinkedHashMap();
private Map globalResultConfigs = new LinkedHashMap();
private Map interceptorConfigs = new LinkedHashMap();
private Map resultTypeConfigs = new LinkedHashMap();
private List globalExceptionMappingConfigs = new ArrayList();
private List parents = new ArrayList();
private String defaultInterceptorRef;
private String defaultActionRef;
private String defaultResultType;
private String defaultClassRef;
private String name;
private String namespace = "";
private boolean isAbstract = false;
private boolean needsRefresh;
public PackageConfig() {
}
public PackageConfig(String name) {
this.name = name;
}
public PackageConfig(String name, String namespace, boolean isAbstract) {
this(name);
this.namespace = TextUtils.noNull(namespace);
this.isAbstract = isAbstract;
}
public PackageConfig(String name, String namespace, boolean isAbstract, List parents) {
this(name, namespace, isAbstract);
if (parents != null) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parent = (PackageConfig) iterator.next();
addParent(parent);
}
}
}
public void setAbstract(boolean isAbstract) {
this.isAbstract = isAbstract;
}
public boolean isAbstract() {
return isAbstract;
}
public Map getActionConfigs() {
return actionConfigs;
}
/**
* returns the Map of all the ActionConfigs available in the current package.
* ActionConfigs defined in ancestor packages will be included in this Map.
*
* @return a Map of ActionConfig Objects with the action name as the key
* @see ActionConfig
*/
public Map getAllActionConfigs() {
Map retMap = new LinkedHashMap();
if (!parents.isEmpty()) {
for (PackageConfig parent : parents) {
retMap.putAll(parent.getAllActionConfigs());
}
}
retMap.putAll(getActionConfigs());
return retMap;
}
/**
* returns the Map of all the global ResultConfigs available in the current package.
* Global ResultConfigs defined in ancestor packages will be included in this Map.
*
* @return a Map of Result Objects with the result name as the key
* @see ResultConfig
*/
public Map getAllGlobalResults() {
Map retMap = new LinkedHashMap();
if (!parents.isEmpty()) {
for (PackageConfig parentConfig : parents) {
retMap.putAll(parentConfig.getAllGlobalResults());
}
}
retMap.putAll(getGlobalResultConfigs());
return retMap;
}
/**
* returns the Map of all InterceptorConfigs and InterceptorStackConfigs available in the current package.
* InterceptorConfigs defined in ancestor packages will be included in this Map.
*
* @return a Map of InterceptorConfig and InterceptorStackConfig Objects with the ref-name as the key
* @see InterceptorConfig
* @see InterceptorStackConfig
*/
public Map getAllInterceptorConfigs() {
Map retMap = new LinkedHashMap();
if (!parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parentContext = iterator.next();
retMap.putAll(parentContext.getAllInterceptorConfigs());
}
}
retMap.putAll(getInterceptorConfigs());
return retMap;
}
/**
* returns the Map of all the ResultTypeConfigs available in the current package.
* ResultTypeConfigs defined in ancestor packages will be included in this Map.
*
* @return a Map of ResultTypeConfig Objects with the result type name as the key
* @see ResultTypeConfig
*/
public Map getAllResultTypeConfigs() {
Map retMap = new LinkedHashMap();
if (!parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parentContext = iterator.next();
retMap.putAll(parentContext.getAllResultTypeConfigs());
}
}
retMap.putAll(getResultTypeConfigs());
return retMap;
}
/**
* returns the List of all the ExceptionMappingConfigs available in the current package.
* ExceptionMappingConfigs defined in ancestor packages will be included in this list.
*
* @return a List of ExceptionMappingConfigs Objects with the result type name as the key
* @see ExceptionMappingConfig
*/
public List getAllExceptionMappingConfigs() {
List allExceptionMappings = new ArrayList();
if (!parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parentContext = iterator.next();
allExceptionMappings.addAll(parentContext.getAllExceptionMappingConfigs());
}
}
allExceptionMappings.addAll(getGlobalExceptionMappingConfigs());
return allExceptionMappings;
}
public void setDefaultInterceptorRef(String name) {
defaultInterceptorRef = name;
}
public String getDefaultInterceptorRef() {
return defaultInterceptorRef;
}
public void setDefaultActionRef(String name) {
defaultActionRef = name;
}
public String getDefaultActionRef() {
return defaultActionRef;
}
public void setDefaultClassRef( String defaultClassRef ) {
this.defaultClassRef = defaultClassRef;
}
public String getDefaultClassRef() {
return defaultClassRef;
}
/**
* sets the default Result type for this package
*
* @param defaultResultType
*/
public void setDefaultResultType(String defaultResultType) {
this.defaultResultType = defaultResultType;
}
/**
* Returns the default result type for this package.
*/
public String getDefaultResultType() {
return defaultResultType;
}
/**
* gets the default interceptor-ref name. If this is not set on this PackageConfig, it searches the parent
* PackageConfigs in order until it finds one.
*/
public String getFullDefaultInterceptorRef() {
if ((defaultInterceptorRef == null) && !parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parent = iterator.next();
String parentDefault = parent.getFullDefaultInterceptorRef();
if (parentDefault != null) {
return parentDefault;
}
}
}
return defaultInterceptorRef;
}
/**
* gets the default action-ref name. If this is not set on this PackageConfig, it searches the parent
* PackageConfigs in order until it finds one.
*/
public String getFullDefaultActionRef() {
if ((defaultActionRef == null) && !parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parent = iterator.next();
String parentDefault = parent.getFullDefaultActionRef();
if (parentDefault != null) {
return parentDefault;
}
}
}
return defaultActionRef;
}
/**
* Returns the default result type for this package.
*
* If there is no default result type, but this package has parents - we will try to
* look up the default result type of a parent.
*/
public String getFullDefaultResultType() {
if ((defaultResultType == null) && !parents.isEmpty()) {
for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
PackageConfig parent = iterator.next();
String parentDefault = parent.getFullDefaultResultType();
if (parentDefault != null) {
return parentDefault;
}
}
}
return defaultResultType;
}
/**
* gets the global ResultConfigs local to this package
*
* @return a Map of ResultConfig objects keyed by result name
* @see ResultConfig
*/
public Map getGlobalResultConfigs() {
return globalResultConfigs;
}
/**
* gets the InterceptorConfigs and InterceptorStackConfigs local to this package
*
* @return a Map of InterceptorConfig and InterceptorStackConfig objects keyed by ref-name
* @see InterceptorConfig
* @see InterceptorStackConfig
*/
public Map getInterceptorConfigs() {
return interceptorConfigs;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setNamespace(String namespace) {
if (namespace == null) {
this.namespace = "";
} else {
this.namespace = namespace;
}
}
public String getNamespace() {
return namespace;
}
public List getParents() {
return new ArrayList(parents);
}
/**
* gets the ResultTypeConfigs local to this package
*
* @return a Map of ResultTypeConfig objects keyed by result name
* @see ResultTypeConfig
*/
public Map getResultTypeConfigs() {
return resultTypeConfigs;
}
/**
* gets the ExceptionMappingConfigs local to this package
*
* @return a Map of ExceptionMappingConfig objects keyed by result name
* @see ExceptionMappingConfig
*/
public List getGlobalExceptionMappingConfigs() {
return globalExceptionMappingConfigs;
}
public void addActionConfig(String name, ActionConfig action) {
actionConfigs.put(name, action);
}
public void addAllParents(List parents) {
for (PackageConfig config : parents) {
addParent(config);
}
}
public void addGlobalResultConfig(ResultConfig resultConfig) {
globalResultConfigs.put(resultConfig.getName(), resultConfig);
}
public void addGlobalResultConfigs(Map resultConfigs) {
globalResultConfigs.putAll(resultConfigs);
}
public void addExceptionMappingConfig(ExceptionMappingConfig exceptionMappingConfig) {
globalExceptionMappingConfigs.add(exceptionMappingConfig);
}
public void addGlobalExceptionMappingConfigs(List exceptionMappingConfigs) {
globalExceptionMappingConfigs.addAll(exceptionMappingConfigs);
}
public void addInterceptorConfig(InterceptorConfig config) {
interceptorConfigs.put(config.getName(), config);
}
public void addInterceptorStackConfig(InterceptorStackConfig config) {
interceptorConfigs.put(config.getName(), config);
}
public void addParent(PackageConfig parent) {
if (this.equals(parent)) {
LOG.error("A package cannot extend itself: " + name);
}
parents.add(0, parent);
}
public void addResultTypeConfig(ResultTypeConfig config) {
resultTypeConfigs.put(config.getName(), config);
}
public boolean isNeedsRefresh() {
return needsRefresh;
}
public void setNeedsRefresh(boolean needsRefresh) {
this.needsRefresh = needsRefresh;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof PackageConfig)) {
return false;
}
final PackageConfig packageConfig = (PackageConfig) o;
if (isAbstract != packageConfig.isAbstract) {
return false;
}
if ((actionConfigs != null) ? (!actionConfigs.equals(packageConfig.actionConfigs)) : (packageConfig.actionConfigs != null))
{
return false;
}
if ((defaultResultType != null) ? (!defaultResultType.equals(packageConfig.defaultResultType)) : (packageConfig.defaultResultType != null))
{
return false;
}
if ((defaultClassRef != null) ? (!defaultClassRef.equals(packageConfig.defaultClassRef)) : (packageConfig.defaultClassRef != null))
{
return false;
}
if ((globalResultConfigs != null) ? (!globalResultConfigs.equals(packageConfig.globalResultConfigs)) : (packageConfig.globalResultConfigs != null))
{
return false;
}
if ((interceptorConfigs != null) ? (!interceptorConfigs.equals(packageConfig.interceptorConfigs)) : (packageConfig.interceptorConfigs != null))
{
return false;
}
if ((name != null) ? (!name.equals(packageConfig.name)) : (packageConfig.name != null)) {
return false;
}
if ((namespace != null) ? (!namespace.equals(packageConfig.namespace)) : (packageConfig.namespace != null)) {
return false;
}
if ((parents != null) ? (!parents.equals(packageConfig.parents)) : (packageConfig.parents != null)) {
return false;
}
if ((resultTypeConfigs != null) ? (!resultTypeConfigs.equals(packageConfig.resultTypeConfigs)) : (packageConfig.resultTypeConfigs != null))
{
return false;
}
if ((globalExceptionMappingConfigs != null) ? (!globalExceptionMappingConfigs.equals(packageConfig.globalExceptionMappingConfigs)) : (packageConfig.globalExceptionMappingConfigs != null))
{
return false;
}
return true;
}
public int hashCode() {
// System.out.println("hashCode() + {Name:"+name+" abstract:"+isAbstract+" namespace:"+namespace+" parents: "+parents+"}");
int result;
result = ((name != null) ? name.hashCode() : 0);
result = (29 * result) + ((parents != null) ? parents.hashCode() : 0);
result = (29 * result) + ((actionConfigs != null) ? actionConfigs.hashCode() : 0);
result = (29 * result) + ((globalResultConfigs != null) ? globalResultConfigs.hashCode() : 0);
result = (29 * result) + ((interceptorConfigs != null) ? interceptorConfigs.hashCode() : 0);
result = (29 * result) + ((resultTypeConfigs != null) ? resultTypeConfigs.hashCode() : 0);
result = (29 * result) + ((globalExceptionMappingConfigs != null) ? globalExceptionMappingConfigs.hashCode() : 0);
result = (29 * result) + ((defaultResultType != null) ? defaultResultType.hashCode() : 0);
result = (29 * result) + ((defaultClassRef != null) ? defaultClassRef.hashCode() : 0);
result = (29 * result) + ((namespace != null) ? namespace.hashCode() : 0);
result = (29 * result) + (isAbstract ? 1 : 0);
return result;
}
public void removeParent(PackageConfig parent) {
parents.remove(parent);
}
public String toString() {
return "{PackageConfig Name:" + name + " namespace:" + namespace + " abstract:" + isAbstract + " parents:" + parents + "}";
}
public int compareTo(Object o) {
PackageConfig other = (PackageConfig) o;
String full = namespace + "!" + name;
String otherFull = other.namespace + "!" + other.name;
// note, this isn't perfect (could come from different parents), but it is "good enough"
return full.compareTo(otherFull);
}
}