You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2011/02/09 22:38:05 UTC

svn commit: r1069124 - in /commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3: DigesterLoader.java RulesBinderImpl.java rulesbinder/ObjectCreateBuilder.java

Author: simonetripodi
Date: Wed Feb  9 21:38:05 2011
New Revision: 1069124

URL: http://svn.apache.org/viewvc?rev=1069124&view=rev
Log:
moved the String type resolution of ObjectCreationRule to binding time rather then execution time

Modified:
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/DigesterLoader.java
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/RulesBinderImpl.java
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/ObjectCreateBuilder.java

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/DigesterLoader.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/DigesterLoader.java?rev=1069124&r1=1069123&r2=1069124&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/DigesterLoader.java (original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/DigesterLoader.java Wed Feb  9 21:38:05 2011
@@ -71,7 +71,7 @@ public final class DigesterLoader {
     /**
      * The concrete {@link RulesBinder} implementation.
      */
-    private final RulesBinderImpl rulesBinder = new RulesBinderImpl();
+    private RulesBinderImpl rulesBinder;
 
     /**
      * The URLs of entityValidator that have been registered, keyed by the public
@@ -84,6 +84,10 @@ public final class DigesterLoader {
      */
     private final SAXParserFactory factory = SAXParserFactory.newInstance();
 
+    private final Object $lock = new Object();
+
+    private final Collection<RulesModule> rulesModules;
+
     private boolean useContextClassLoader;
 
     /**
@@ -102,14 +106,7 @@ public final class DigesterLoader {
      * @param rulesModules The modules containing the {@code Rule} binding
      */
     private DigesterLoader(Collection<RulesModule> rulesModules) {
-        for (RulesModule rulesModule : rulesModules) {
-            rulesModule.configure(this.rulesBinder);
-        }
-
-        // check if there were errors while binding rules
-        if (this.rulesBinder.containsErrors()) {
-            throw new DigesterLoadingException(this.rulesBinder.getErrors());
-        }
+        this.rulesModules = rulesModules;
     }
 
     /**
@@ -353,6 +350,15 @@ public final class DigesterLoader {
         ClassLoader classLoader = this.classLoader != null ? this.classLoader :
             (this.useContextClassLoader ? Thread.currentThread().getContextClassLoader() : this.getClass().getClassLoader());
 
+        synchronized (this.$lock) {
+            if (this.rulesBinder == null) {
+                this.rulesBinder = new RulesBinderImpl(classLoader);
+                for (RulesModule rulesModule : rulesModules) {
+                    rulesModule.configure(this.rulesBinder);
+                }
+            }
+        }
+
         // check if there were errors while binding rules
         if (this.rulesBinder.containsErrors()) {
             throw new DigesterLoadingException(this.rulesBinder.getErrors());

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/RulesBinderImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/RulesBinderImpl.java?rev=1069124&r1=1069123&r2=1069124&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/RulesBinderImpl.java (original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/RulesBinderImpl.java Wed Feb  9 21:38:05 2011
@@ -487,17 +487,17 @@ final class RulesBinderImpl implements R
             public ObjectCreateBuilder createObject() {
                 return this.addProvider(new ObjectCreateBuilder() {
 
-                    private String className;
+                    private Class<?> type;
 
                     private String attributeName;
 
                     public ObjectCreateRule get() {
-                        if (this.className == null && this.attributeName == null) {
-                            throw new DigesterLoadingException("{forPattern(\"%s\").createObject()} At least one between 'className' or 'attributeName' has to be specified",
+                        if (this.type == null && this.attributeName == null) {
+                            throw new DigesterLoadingException("{forPattern(\"%s\").createObject()} At least one between 'type' or 'attributeName' has to be specified",
                                     keyPattern);
                         }
 
-                        return setNamespaceAndReturn(new ObjectCreateRule(this.className, this.attributeName));
+                        return setNamespaceAndReturn(new ObjectCreateRule(this.type, this.attributeName));
                     }
 
                     public LinkedRuleBuilder then() {
@@ -509,19 +509,33 @@ final class RulesBinderImpl implements R
                         return this;
                     }
 
-                    public ObjectCreateBuilder ofType(Class<?> type) {
+                    public <T> ObjectCreateBuilder ofType(Class<T> type) {
                         if (type == null) {
                             addError("{forPattern(\"%s\").createObject().ofType(Class<?>)} NULL Java type not allowed",
                                     keyPattern);
                             return this;
                         }
 
-                        return this.ofType(type.getName());
+                        this.type = type;
+
+                        return this;
                     }
 
                     public ObjectCreateBuilder ofType(String className) {
-                        this.className = className;
-                        return this;
+                        if (className == null) {
+                            addError("{forPattern(\"%s\").createObject().ofType(String)} NULL Java type not allowed",
+                                    keyPattern);
+                            return this;
+                        }
+
+                        try {
+                            return this.ofType(classLoader.loadClass(className));
+                        } catch (ClassNotFoundException e) {
+                            addError("{forPattern(\"%s\").createObject().ofType(String)} class '%s' cannot be load",
+                                    keyPattern,
+                                    className);
+                            return this;
+                        }
                     }
 
                 });
@@ -676,7 +690,7 @@ final class RulesBinderImpl implements R
                                     this.paramTypes[i] = classLoader.loadClass(paramTypeNames[i]);
                                 } catch (ClassNotFoundException e) {
                                     // use the digester log
-                                    addError("{forPattern(\"%s\").callMethod().withParamTypes(%s)} class %s cannot be load",
+                                    addError("{forPattern(\"%s\").callMethod().withParamTypes(%s)} class '%s' cannot be load",
                                             keyPattern,
                                             Arrays.toString(paramTypeNames),
                                             paramTypeNames[i]);

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/ObjectCreateBuilder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/ObjectCreateBuilder.java?rev=1069124&r1=1069123&r2=1069124&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/ObjectCreateBuilder.java (original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/rulesbinder/ObjectCreateBuilder.java Wed Feb  9 21:38:05 2011
@@ -38,7 +38,7 @@ public interface ObjectCreateBuilder ext
      * @param type Java class of the object to be created
      * @return this builder instance
      */
-    ObjectCreateBuilder ofType(Class<?> type);
+    <T> ObjectCreateBuilder ofType(Class<T> type);
 
     /**
      * Allows specify the attribute containing an override class name if it is present.