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);
}
}