first commit
This commit is contained in:
159
hrmsEjb/org/apache/commons/digester/FactoryCreateRule.java
Normal file
159
hrmsEjb/org/apache/commons/digester/FactoryCreateRule.java
Normal file
@@ -0,0 +1,159 @@
|
||||
package org.apache.commons.digester;
|
||||
|
||||
import org.apache.commons.collections.ArrayStack;
|
||||
import org.xml.sax.Attributes;
|
||||
|
||||
public class FactoryCreateRule extends Rule {
|
||||
private boolean ignoreCreateExceptions;
|
||||
|
||||
private ArrayStack exceptionIgnoredStack;
|
||||
|
||||
protected String attributeName;
|
||||
|
||||
protected String className;
|
||||
|
||||
protected ObjectCreationFactory creationFactory;
|
||||
|
||||
public FactoryCreateRule(Digester digester, String className) {
|
||||
this(className);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Digester digester, Class clazz) {
|
||||
this(clazz);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Digester digester, String className, String attributeName) {
|
||||
this(className, attributeName);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Digester digester, Class clazz, String attributeName) {
|
||||
this(clazz, attributeName);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Digester digester, ObjectCreationFactory creationFactory) {
|
||||
this(creationFactory);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(String className) {
|
||||
this(className, false);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Class clazz) {
|
||||
this(clazz, false);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(String className, String attributeName) {
|
||||
this(className, attributeName, false);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Class clazz, String attributeName) {
|
||||
this(clazz, attributeName, false);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(ObjectCreationFactory creationFactory) {
|
||||
this(creationFactory, false);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(String className, boolean ignoreCreateExceptions) {
|
||||
this(className, (String)null, ignoreCreateExceptions);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Class clazz, boolean ignoreCreateExceptions) {
|
||||
this(clazz, (String)null, ignoreCreateExceptions);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(String className, String attributeName, boolean ignoreCreateExceptions) {
|
||||
this.attributeName = null;
|
||||
this.className = null;
|
||||
this.creationFactory = null;
|
||||
this.className = className;
|
||||
this.attributeName = attributeName;
|
||||
this.ignoreCreateExceptions = ignoreCreateExceptions;
|
||||
}
|
||||
|
||||
public FactoryCreateRule(Class clazz, String attributeName, boolean ignoreCreateExceptions) {
|
||||
this(clazz.getName(), attributeName, ignoreCreateExceptions);
|
||||
}
|
||||
|
||||
public FactoryCreateRule(ObjectCreationFactory creationFactory, boolean ignoreCreateExceptions) {
|
||||
this.attributeName = null;
|
||||
this.className = null;
|
||||
this.creationFactory = null;
|
||||
this.creationFactory = creationFactory;
|
||||
this.ignoreCreateExceptions = ignoreCreateExceptions;
|
||||
}
|
||||
|
||||
public void begin(String namespace, String name, Attributes attributes) throws Exception {
|
||||
if (this.ignoreCreateExceptions) {
|
||||
if (this.exceptionIgnoredStack == null)
|
||||
this.exceptionIgnoredStack = new ArrayStack();
|
||||
try {
|
||||
Object instance = getFactory(attributes).createObject(attributes);
|
||||
if (this.digester.log.isDebugEnabled())
|
||||
this.digester.log.debug("[FactoryCreateRule]{" + this.digester.match + "} New " + instance.getClass().getName());
|
||||
this.digester.push(instance);
|
||||
this.exceptionIgnoredStack.push(Boolean.FALSE);
|
||||
} catch (Exception e) {
|
||||
if (this.digester.log.isInfoEnabled()) {
|
||||
this.digester.log.info("[FactoryCreateRule] Create exception ignored: " + ((e.getMessage() == null) ? e.getClass().getName() : e.getMessage()));
|
||||
if (this.digester.log.isDebugEnabled())
|
||||
this.digester.log.debug("[FactoryCreateRule] Ignored exception:", e);
|
||||
}
|
||||
this.exceptionIgnoredStack.push(Boolean.TRUE);
|
||||
}
|
||||
} else {
|
||||
Object instance = getFactory(attributes).createObject(attributes);
|
||||
if (this.digester.log.isDebugEnabled())
|
||||
this.digester.log.debug("[FactoryCreateRule]{" + this.digester.match + "} New " + instance.getClass().getName());
|
||||
this.digester.push(instance);
|
||||
}
|
||||
}
|
||||
|
||||
public void end(String namespace, String name) throws Exception {
|
||||
if (this.ignoreCreateExceptions && this.exceptionIgnoredStack != null && !this.exceptionIgnoredStack.empty())
|
||||
if (((Boolean)this.exceptionIgnoredStack.pop()).booleanValue()) {
|
||||
if (this.digester.log.isTraceEnabled())
|
||||
this.digester.log.trace("[FactoryCreateRule] No creation so no push so no pop");
|
||||
return;
|
||||
}
|
||||
Object top = this.digester.pop();
|
||||
if (this.digester.log.isDebugEnabled())
|
||||
this.digester.log.debug("[FactoryCreateRule]{" + this.digester.match + "} Pop " + top.getClass().getName());
|
||||
}
|
||||
|
||||
public void finish() throws Exception {
|
||||
if (this.attributeName != null)
|
||||
this.creationFactory = null;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer("FactoryCreateRule[");
|
||||
sb.append("className=");
|
||||
sb.append(this.className);
|
||||
sb.append(", attributeName=");
|
||||
sb.append(this.attributeName);
|
||||
if (this.creationFactory != null) {
|
||||
sb.append(", creationFactory=");
|
||||
sb.append(this.creationFactory);
|
||||
}
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
protected ObjectCreationFactory getFactory(Attributes attributes) throws Exception {
|
||||
if (this.creationFactory == null) {
|
||||
String realClassName = this.className;
|
||||
if (this.attributeName != null) {
|
||||
String value = attributes.getValue(this.attributeName);
|
||||
if (value != null)
|
||||
realClassName = value;
|
||||
}
|
||||
if (this.digester.log.isDebugEnabled())
|
||||
this.digester.log.debug("[FactoryCreateRule]{" + this.digester.match + "} New factory " + realClassName);
|
||||
Class clazz = this.digester.getClassLoader().loadClass(realClassName);
|
||||
this.creationFactory = (ObjectCreationFactory)clazz.newInstance();
|
||||
this.creationFactory.setDigester(this.digester);
|
||||
}
|
||||
return this.creationFactory;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user