?? configurationfactory.java
字號:
this.digesterRuleNamespaceURI = digesterRuleNamespaceURI;
}
/**
* Configure the current digester to be namespace aware and to have
* a Configuration object to which all of the other configurations
* should be added
*
* @param digester The Digester to configure
*/
private void configureNamespace(Digester digester)
{
if (getDigesterRuleNamespaceURI() != null)
{
digester.setNamespaceAware(true);
digester.setRuleNamespaceURI(getDigesterRuleNamespaceURI());
}
else
{
digester.setNamespaceAware(false);
}
digester.setValidating(false);
}
/**
* Returns the Base path from which this Configuration Factory operates.
* This is never null. If you set the BasePath to null, then a base path
* according to the configuration to load is returned.
*
* @return The base Path of this configuration factory.
*/
public String getBasePath()
{
String path = StringUtils.isEmpty(basePath) ?
impliciteBasePath : basePath;
return StringUtils.isEmpty(path) ? "." : path;
}
/**
* Sets the basePath for all file references from this Configuration Factory.
* Normally a base path need not to be set because it is determined by
* the location of the configuration file to load. All relative pathes in
* this file are resolved relative to this file. Setting a base path makes
* sense if such relative pathes should be otherwise resolved, e.g. if
* the configuration file is loaded from the class path and all sub
* configurations it refers to are stored in a special config directory.
*
* @param basePath The new basePath to set.
*/
public void setBasePath(String basePath)
{
this.basePath = basePath;
}
/**
* A base class for digester factory classes. This base class maintains
* a default class for the objects to be created.
* There will be sub classes for specific configuration implementations.
*/
public class DigesterConfigurationFactory
extends AbstractObjectCreationFactory
implements ObjectCreationFactory
{
/** Actual class to use. */
private Class clazz;
/**
* Creates a new instance of <code>DigesterConfigurationFactory</code>.
* @param clazz the class which we should instantiate
*/
public DigesterConfigurationFactory(Class clazz)
{
this.clazz = clazz;
}
/**
* Creates an instance of the specified class.
* @param attribs the attributes (ignored)
* @return the new object
* @exception Exception if object creation fails
*/
public Object createObject(Attributes attribs) throws Exception
{
return clazz.newInstance();
}
}
/**
* A tiny inner class that allows the Configuration Factory to
* let the digester construct BasePathConfiguration objects
* that already have the correct base Path set.
*
*/
public class BasePathConfigurationFactory
extends DigesterConfigurationFactory
{
/**
* C'tor
*
* @param clazz The class which we should instantiate.
*/
public BasePathConfigurationFactory(Class clazz)
{
super(clazz);
}
/**
* Gets called by the digester.
*
* @param attributes the actual attributes
* @return the new object
* @throws Exception Couldn't instantiate the requested object.
*/
public Object createObject(Attributes attributes) throws Exception
{
BasePathLoader bpl =
(BasePathLoader) super.createObject(attributes);
bpl.setBasePath(getBasePath());
return bpl;
}
}
/**
* A tiny inner class that allows the Configuration Factory to
* let the digester construct JNDIPathConfiguration objects.
*
*/
public class JNDIConfigurationFactory
extends DigesterConfigurationFactory
{
/**
* C'tor
*/
public JNDIConfigurationFactory()
{
super(JNDIConfiguration.class);
}
}
/**
* A simple data class that holds all information about a configuration
* from the <code><additional></code> section.
*/
public static class AdditionalConfigurationData
{
/** Stores the configuration object.*/
private Configuration configuration;
/** Stores the location of this configuration in the global tree.*/
private String at;
/**
* Returns the value of the <code>at</code> attribute.
* @return the at attribute
*/
public String getAt()
{
return at;
}
/**
* Sets the value of the <code>at</code> attribute.
* @param string the attribute value
*/
public void setAt(String string)
{
at = string;
}
/**
* Returns the configuration object.
* @return the configuration
*/
public Configuration getConfiguration()
{
return configuration;
}
/**
* Sets the configuration object. Note: Normally this method should be
* named <code>setConfiguration()</code>, but the name
* <code>addConfiguration()</code> is required by some of the digester
* rules.
* @param config the configuration to set
*/
public void addConfiguration(Configuration config)
{
configuration = config;
}
}
/**
* An internally used helper class for constructing the composite
* configuration object.
*/
public static class ConfigurationBuilder
{
/** Stores the composite configuration.*/
private CompositeConfiguration config;
/** Stores a collection with the configs from the additional section.*/
private Collection additionalConfigs;
/**
* Creates a new instance of <code>ConfigurationBuilder</code>.
*/
public ConfigurationBuilder()
{
config = new CompositeConfiguration();
additionalConfigs = new LinkedList();
}
/**
* Adds a new configuration to this object. This method is called by
* Digester.
* @param conf the configuration to be added
*/
public void addConfiguration(Configuration conf)
{
config.addConfiguration(conf);
}
/**
* Adds information about an additional configuration. This method is
* called by Digester.
* @param data the data about the additional configuration
*/
public void addAdditionalConfig(AdditionalConfigurationData data)
{
additionalConfigs.add(data);
}
/**
* Returns the final composite configuration.
* @return the final configuration object
*/
public CompositeConfiguration getConfiguration()
{
if(!additionalConfigs.isEmpty())
{
Configuration unionConfig =
createAdditionalConfiguration(additionalConfigs);
if(unionConfig != null)
{
addConfiguration(unionConfig);
} /* if */
additionalConfigs.clear();
} /* if */
return config;
}
/**
* Creates a configuration object with the union of all properties
* defined in the <code><additional></code> section. This
* implementation returns a <code>HierarchicalConfiguration</code>
* object.
* @param configs a collection with
* <code>AdditionalConfigurationData</code> objects
* @return the union configuration (can be <b>null</b>)
*/
protected Configuration createAdditionalConfiguration(
Collection configs)
{
HierarchicalConfiguration result = new HierarchicalConfiguration();
for(Iterator it = configs.iterator(); it.hasNext();)
{
AdditionalConfigurationData cdata =
(AdditionalConfigurationData) it.next();
result.addNodes(cdata.getAt(),
createRootNode(cdata).getChildren().asVector());
} /* for */
return (result.isEmpty()) ? null : result;
}
/**
* Creates a configuration root node for the specified configuration.
* @param cdata the configuration data object
* @return a root node for this configuration
*/
private HierarchicalConfiguration.Node createRootNode(
AdditionalConfigurationData cdata)
{
if(cdata.getConfiguration() instanceof HierarchicalConfiguration)
{
// we can directly use this configuration's root node
return ((HierarchicalConfiguration) cdata.getConfiguration())
.getRoot();
} /* if */
else
{
// transform configuration to a hierarchical root node
HierarchicalConfigurationNodeConverter conv =
new HierarchicalConfigurationNodeConverter();
conv.process(cdata.getConfiguration());
return conv.getRootNode();
} /* else */
}
}
/**
* A specialized <code>HierarchicalConfigurationConverter</code> class
* that creates a <code>HierarchicalConfiguration</code> root node from
* an arbitrary <code>Configuration</code> object. This class is used to
* add additional configuration objects to the hierarchical configuration
* managed by the <code>ConfigurationBuilder</code>.
*/
static class HierarchicalConfigurationNodeConverter
extends HierarchicalConfigurationConverter
{
/** A stack for constructing the hierarchy.*/
private Stack nodes;
/** Stores the root node.*/
private HierarchicalConfiguration.Node root;
/**
* Default constructor.
*/
public HierarchicalConfigurationNodeConverter()
{
nodes = new Stack();
root = new HierarchicalConfiguration.Node();
nodes.push(root);
}
/**
* Callback for an element start event. Creates a new node and adds
* it to the actual parent.
* @param name the name of the new node
* @param value the node's value
*/
protected void elementStart(String name, Object value)
{
HierarchicalConfiguration.Node parent =
(HierarchicalConfiguration.Node) nodes.peek();
HierarchicalConfiguration.Node child =
new HierarchicalConfiguration.Node(name);
if(value != null)
{
child.setValue(value);
} /* if */
parent.addChild(child);
nodes.push(child);
}
/**
* Callback for an element end event. Clears the stack.
* @param name the name of the element
*/
protected void elementEnd(String name)
{
nodes.pop();
}
/**
* Returns the constructed root node.
* @return the root node
*/
public HierarchicalConfiguration.Node getRootNode()
{
return root;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -