160 lines
5.6 KiB
Java
160 lines
5.6 KiB
Java
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;
|
|
}
|
|
}
|