commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From simonetrip...@apache.org
Subject svn commit: r1069997 - in /commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3: internal/rulesbinder/ rule/ rulesbinder/
Date Sat, 12 Feb 2011 00:11:21 GMT
Author: simonetripodi
Date: Sat Feb 12 00:11:20 2011
New Revision: 1069997

URL: http://svn.apache.org/viewvc?rev=1069997&view=rev
Log:
ObjectCreationFactory type on FactoryCreateRule resolved at binding time, not parsing time

Modified:
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/FactoryCreateBuilderImpl.java
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/LinkedRuleBuilderImpl.java
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rule/FactoryCreateRule.java
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/FactoryCreateBuilder.java

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/FactoryCreateBuilderImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/FactoryCreateBuilderImpl.java?rev=1069997&r1=1069996&r2=1069997&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/FactoryCreateBuilderImpl.java
(original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/FactoryCreateBuilderImpl.java
Sat Feb 12 00:11:20 2011
@@ -29,7 +29,9 @@ final class FactoryCreateBuilderImpl
         extends AbstractBackToLinkedRuleBuilder<FactoryCreateRule>
         implements FactoryCreateBuilder {
 
-    private String className;
+    private final ClassLoader classLoader;
+
+    private Class<? extends ObjectCreationFactory<?>> type;
 
     private String attributeName;
 
@@ -40,34 +42,52 @@ final class FactoryCreateBuilderImpl
     public FactoryCreateBuilderImpl(String keyPattern,
             String namespaceURI,
             RulesBinder mainBinder,
-            LinkedRuleBuilderImpl mainBuilder) {
+            LinkedRuleBuilderImpl mainBuilder,
+            ClassLoader classLoader) {
         super(keyPattern, namespaceURI, mainBinder, mainBuilder);
+        this.classLoader = classLoader;
     }
 
     /**
      * {@inheritDoc}
      */
-    public FactoryCreateBuilderImpl ofType(/* @Nullable */String className) {
-        this.className = className;
+    public FactoryCreateBuilder ofType(String className) {
+        if (className == null) {
+            this.reportError("factoryCreate().ofType(Class<?>)", "NULL Java type not
allowed");
+        }
+
+        try {
+            Class<?> type = this.classLoader.loadClass(className);
+            if (!ObjectCreationFactory.class.isAssignableFrom(type)) {
+                this.reportError("factoryCreate().ofType(Class<?>)", "NULL Java type
not allowed");
+                return this;
+            }
+
+            this.type = (Class<? extends ObjectCreationFactory<?>>) type;
+        } catch (ClassNotFoundException e) {
+            this.reportError("factoryCreate().ofType(String)", String.format("class '%s'
cannot be load", className));
+        }
+
         return this;
     }
 
     /**
      * {@inheritDoc}
      */
-    public FactoryCreateBuilderImpl ofType(Class<?> type) {
+    public <T> FactoryCreateBuilder ofType(Class<? extends ObjectCreationFactory<T>>
type) {
         if (type == null) {
             this.reportError("factoryCreate().ofType(Class<?>)", "NULL Java type not
allowed");
-            return this;
         }
 
-        return this.ofType(type.getName());
+        this.type = type;
+
+        return this;
     }
 
     /**
      * {@inheritDoc}
      */
-    public <T> FactoryCreateBuilderImpl usingFactory(/* @Nullable */ObjectCreationFactory<T>
creationFactory) {
+    public <T> FactoryCreateBuilder usingFactory(/* @Nullable */ObjectCreationFactory<T>
creationFactory) {
         this.creationFactory = creationFactory;
         return this;
     }
@@ -75,7 +95,7 @@ final class FactoryCreateBuilderImpl
     /**
      * {@inheritDoc}
      */
-    public FactoryCreateBuilderImpl overriddenByAttribute(/* @Nullable */String attributeName)
{
+    public FactoryCreateBuilder overriddenByAttribute(/* @Nullable */String attributeName)
{
         this.attributeName = attributeName;
         return this;
     }
@@ -83,7 +103,7 @@ final class FactoryCreateBuilderImpl
     /**
      * {@inheritDoc}
      */
-    public FactoryCreateBuilderImpl ignoreCreateExceptions(boolean ignoreCreateExceptions)
{
+    public FactoryCreateBuilder ignoreCreateExceptions(boolean ignoreCreateExceptions) {
         this.ignoreCreateExceptions = ignoreCreateExceptions;
         return this;
     }
@@ -93,12 +113,12 @@ final class FactoryCreateBuilderImpl
      */
     @Override
     protected FactoryCreateRule createRule() {
-        if (className == null && attributeName == null && creationFactory
== null) {
+        if (type == null && attributeName == null && creationFactory == null)
{
             this.reportError("factoryCreate()",
                     "at least one between 'className' ar 'attributeName' or 'creationFactory'
has to be specified");
         }
 
-        return new FactoryCreateRule(this.className, this.attributeName, this.creationFactory,
this.ignoreCreateExceptions);
+        return new FactoryCreateRule(this.type, this.attributeName, this.creationFactory,
this.ignoreCreateExceptions);
     }
 
 }

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/LinkedRuleBuilderImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/LinkedRuleBuilderImpl.java?rev=1069997&r1=1069996&r2=1069997&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/LinkedRuleBuilderImpl.java
(original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/LinkedRuleBuilderImpl.java
Sat Feb 12 00:11:20 2011
@@ -111,7 +111,8 @@ final class LinkedRuleBuilderImpl implem
      * {@inheritDoc}
      */
     public FactoryCreateBuilder factoryCreate() {
-        return this.addProvider(new FactoryCreateBuilderImpl(this.keyPattern, this.namespaceURI,
this.mainBinder, this));
+        return this.addProvider(
+                new FactoryCreateBuilderImpl(this.keyPattern, this.namespaceURI, this.mainBinder,
this, this.classLoader));
     }
 
     /**

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rule/FactoryCreateRule.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rule/FactoryCreateRule.java?rev=1069997&r1=1069996&r2=1069997&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rule/FactoryCreateRule.java
(original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rule/FactoryCreateRule.java
Sat Feb 12 00:11:20 2011
@@ -47,10 +47,10 @@ public class FactoryCreateRule extends R
     private String attributeName = null;
 
     /**
-     * The Java class name of the ObjectCreationFactory to be created.
+     * The Java class of the ObjectCreationFactory to be created.
      * This class must have a no-arguments constructor.
      */
-    private String className = null;
+    private Class<? extends ObjectCreationFactory<?>> type = null;
 
     /**
      * The object creation factory we will use to instantiate objects
@@ -72,8 +72,11 @@ public class FactoryCreateRule extends R
      * @param ignoreCreateExceptions if true, exceptions thrown by the object
      *  creation factory will be ignored.
      */
-    public <T> FactoryCreateRule(String className, String attributeName, ObjectCreationFactory<T>
creationFactory, boolean ignoreCreateExceptions) {
-        this.className = className;
+    public FactoryCreateRule(Class<? extends ObjectCreationFactory<?>> type,
+            String attributeName,
+            ObjectCreationFactory<?> creationFactory,
+            boolean ignoreCreateExceptions) {
+        this.type = type;
         this.attributeName = attributeName;
         this.creationFactory = creationFactory;
         this.ignoreCreateExceptions = ignoreCreateExceptions;
@@ -169,8 +172,8 @@ public class FactoryCreateRule extends R
      */
     @Override
     public String toString() {
-        return String.format("FactoryCreateRule[className=%s, attributeName=%s, creationFactory=%s]",
-                this.className,
+        return String.format("FactoryCreateRule[type=%s, attributeName=%s, creationFactory=%s]",
+                this.type != null ? this.type.getName() : "",
                 this.attributeName,
                 this.creationFactory);
     }
@@ -185,19 +188,21 @@ public class FactoryCreateRule extends R
      */
     protected ObjectCreationFactory<?> getFactory(Attributes attributes) throws Exception
{
         if (this.creationFactory == null) {
-            String realClassName = this.className;
+            Class<?> clazz = this.type;
+
             if (this.attributeName != null) {
                 String value = attributes.getValue(this.attributeName);
                 if (value != null) {
-                    realClassName = value;
+                    clazz = this.getDigester().getClassLoader().loadClass(value);
                 }
             }
+
             if (this.getDigester().getLog().isDebugEnabled()) {
                 this.getDigester().getLog().debug(String.format("[FactoryCreateRule]{%s}
New factory %s",
                         this.getDigester().getMatch(),
-                        realClassName));
+                        clazz.getName()));
             }
-            Class<?> clazz = this.getDigester().getClassLoader().loadClass(realClassName);
+
             this.creationFactory = (ObjectCreationFactory<?>) clazz.newInstance();
             this.creationFactory.setDigester(this.getDigester());
         }

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/FactoryCreateBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/FactoryCreateBuilder.java?rev=1069997&r1=1069996&r2=1069997&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/FactoryCreateBuilder.java
(original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/FactoryCreateBuilder.java
Sat Feb 12 00:11:20 2011
@@ -41,7 +41,7 @@ public interface FactoryCreateBuilder ex
      * @param type Java class of the object creation factory class
      * @return this builder instance
      */
-    FactoryCreateBuilder ofType(Class<?> type);
+    <T> FactoryCreateBuilder ofType(Class<? extends ObjectCreationFactory<T>>
type);
 
     /**
      * Construct a factory create rule using the given, already instantiated, {@link ObjectCreationFactory}.



Mime
View raw message