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/11 21:18:56 UTC

svn commit: r1069944 - in /commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder: LinkedRuleBuilderImpl.java ProvidersRegistry.java RegisteredProvider.java RulesBinderImpl.java

Author: simonetripodi
Date: Fri Feb 11 20:18:56 2011
New Revision: 1069944

URL: http://svn.apache.org/viewvc?rev=1069944&view=rev
Log:
plugged a more sophisticated RuleProvider registry instead of simple collection, with indexed provider for quick search

Added:
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java   (with props)
Removed:
    commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/RegisteredProvider.java
Modified:
    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/internal/rulesbinder/RulesBinderImpl.java

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=1069944&r1=1069943&r2=1069944&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 Fri Feb 11 20:18:56 2011
@@ -17,8 +17,6 @@
  */
 package org.apache.commons.digester3.internal.rulesbinder;
 
-import java.util.Collection;
-
 import org.apache.commons.digester3.Rule;
 import org.apache.commons.digester3.RulesBinder;
 import org.apache.commons.digester3.rulesbinder.BeanPropertySetterBuilder;
@@ -49,7 +47,7 @@ final class LinkedRuleBuilderImpl implem
     /**
      * The data structure where storing the providers binding.
      */
-    private final Collection<RegisteredProvider> providers;
+    private final ProvidersRegistry providersRegistry;
 
     private final ClassLoader classLoader;
 
@@ -58,11 +56,11 @@ final class LinkedRuleBuilderImpl implem
     private String namespaceURI;
 
     public LinkedRuleBuilderImpl(final RulesBinder mainBinder,
-            final Collection<RegisteredProvider> providers,
+            final ProvidersRegistry providersRegistry,
             final ClassLoader classLoader,
             final String keyPattern) {
         this.mainBinder = mainBinder;
-        this.providers = providers;
+        this.providersRegistry = providersRegistry;
         this.classLoader = classLoader;
         this.keyPattern = keyPattern;
     }
@@ -233,7 +231,7 @@ final class LinkedRuleBuilderImpl implem
             return provider;
         }
 
-        this.providers.add(new RegisteredProvider(this.keyPattern, provider));
+        this.providersRegistry.registerProvider(this.keyPattern, provider);
 
         return provider;
     }

Added: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java?rev=1069944&view=auto
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java (added)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java Fri Feb 11 20:18:56 2011
@@ -0,0 +1,89 @@
+package org.apache.commons.digester3.internal.rulesbinder;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.digester3.Rule;
+import org.apache.commons.digester3.spi.RuleProvider;
+import org.apache.commons.digester3.spi.Rules;
+
+final class ProvidersRegistry {
+
+    /**
+     * The data structure where storing the providers binding.
+     */
+    private final Collection<RegisteredProvider> providers = new ArrayList<RegisteredProvider>();
+
+    private final Map<String, List<RuleProvider<? extends Rule>>> providersIndex =
+        new HashMap<String, List<RuleProvider<? extends Rule>>>();
+
+    /**
+     * 
+     *
+     * @param <R>
+     * @param <RP>
+     * @param keyPattern
+     * @param provider
+     * @return
+     */
+    public <R extends Rule, RP extends RuleProvider<R>> void registerProvider(String keyPattern, RP provider) {
+        this.providers.add(new RegisteredProvider(keyPattern, provider));
+
+        List<RuleProvider<? extends Rule>> indexedProviders = this.providersIndex.get(keyPattern);
+        if (indexedProviders == null) {
+            indexedProviders = new ArrayList<RuleProvider<? extends Rule>>();
+            this.providersIndex.put(keyPattern, indexedProviders);
+        }
+        indexedProviders.add(provider);
+    }
+
+    public <R extends Rule, RP extends RuleProvider<R>> RP getProvider(String keyPattern, Class<RP> type) {
+        List<RuleProvider<? extends Rule>> indexedProviders = this.providersIndex.get(keyPattern);
+
+        if (indexedProviders == null || indexedProviders.isEmpty()) {
+            return null;
+        }
+
+        for (RuleProvider<? extends Rule> ruleProvider  : indexedProviders) {
+            if (type.isInstance(ruleProvider)) {
+                return type.cast(ruleProvider);
+            }
+        }
+
+        return null;
+    }
+
+    public void registerRules(Rules rules) {
+        for (RegisteredProvider registeredProvider : this.providers) {
+            rules.add(registeredProvider.getPattern(), registeredProvider.getProvider().get());
+        }
+    }
+
+    /**
+     * Used to associate rule providers with paths in the rules binder.
+     */
+    private static final class RegisteredProvider {
+
+        private final String pattern;
+
+        private final RuleProvider<? extends Rule> provider;
+
+        public <R extends Rule> RegisteredProvider(String pattern, RuleProvider<R> provider) {
+            this.pattern = pattern;
+            this.provider = provider;
+        }
+
+        public String getPattern() {
+            return pattern;
+        }
+
+        public RuleProvider<? extends Rule> getProvider() {
+            return provider;
+        }
+
+    }
+
+}

Propchange: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/ProvidersRegistry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/RulesBinderImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/RulesBinderImpl.java?rev=1069944&r1=1069943&r2=1069944&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/RulesBinderImpl.java (original)
+++ commons/sandbox/digester3/trunk/src/main/java/org/apache/commons/digester3/internal/rulesbinder/RulesBinderImpl.java Fri Feb 11 20:18:56 2011
@@ -48,10 +48,7 @@ public final class RulesBinderImpl imple
      */
     private final List<ErrorMessage> errors = new ArrayList<ErrorMessage>();
 
-    /**
-     * The data structure where storing the providers binding.
-     */
-    private final Collection<RegisteredProvider> providers = new ArrayList<RegisteredProvider>();
+    private final ProvidersRegistry providersRegistry = new ProvidersRegistry();
 
     private final ClassLoader classLoader;
 
@@ -108,7 +105,7 @@ public final class RulesBinderImpl imple
             }
         }
 
-        return new LinkedRuleBuilderImpl(this, this.providers, this.classLoader, keyPattern);
+        return new LinkedRuleBuilderImpl(this, this.providersRegistry, this.classLoader, keyPattern);
     }
 
     /**
@@ -166,9 +163,7 @@ public final class RulesBinderImpl imple
             throw new DigesterLoadingException(fmt.toString());
         }
 
-        for (RegisteredProvider registeredProvider : this.providers) {
-            rules.add(registeredProvider.getPattern(), registeredProvider.getProvider().get());
-        }
+        this.providersRegistry.registerRules(rules);
     }
 
 }