commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ozeigerm...@apache.org
Subject svn commit: r153729 - jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java
Date Mon, 14 Feb 2005 07:15:11 GMT
Author: ozeigermann
Date: Sun Feb 13 23:15:11 2005
New Revision: 153729

URL: http://svn.apache.org/viewcvs?view=rev&rev=153729
Log:
- Takes account of the explicitely unmodifiable list 
returned by DefaultRuleManager and does a wild mixture 
of caching and concatenating the list returned from 
DefaultRuleManager and its own list of supplementary actions.

- Inherits from FallbackRuleManager

Modified:
    jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java

Modified: jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java?view=diff&r1=153728&r2=153729
==============================================================================
--- jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java
(original)
+++ jakarta/commons/proper/digester/branches/digester2/src/java/org/apache/commons/digester2/SupplementaryRuleManager.java
Sun Feb 13 23:15:11 2005
@@ -19,17 +19,19 @@
 package org.apache.commons.digester2;
 
 
+import java.util.AbstractList;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
-import java.util.ArrayList;
+import java.util.Map;
 
 
 /**
  * @see DefaultRuleManager
  */
 
-public class SupplementaryRuleManager extends DefaultRuleManager {
+public class SupplementaryRuleManager extends FallbackRuleManager {
 
     public static boolean matches(String path, String pathToMatch) {
         if (pathToMatch.charAt(0) == '/') {
@@ -57,39 +59,25 @@
         return false;
     }
     
-    protected final Action supplementaryAction;
-    protected final Action fallbackAction;
+    protected final List supplementaryActions;
+    protected final Map path2ActionsMap = new HashMap();
     
-    protected final List fallbackList = new ArrayList();
+    public SupplementaryRuleManager(List supplementaryActions) {
+        this.supplementaryActions = supplementaryActions;
+    }
     
-    public SupplementaryRuleManager(Action supplementaryAction) {
-        this(supplementaryAction, null);
+    public SupplementaryRuleManager(List supplementaryActions, List fallbackActions) {
+        super(fallbackActions);
+        this.supplementaryActions = supplementaryActions;
     }
     
-    public SupplementaryRuleManager(Action supplementaryAction, Action fallbackAction) {
-        
-        if (fallbackAction == null && supplementaryAction == null) {
-            throw new IllegalArgumentException(
-                    "Both parameters set to null makes no sense. Use DefaultRuleManager instead.");
-        }
-
-        this.supplementaryAction = supplementaryAction;
-        this.fallbackAction = fallbackAction;
-
-        if (fallbackAction != null) {
-            fallbackList.add(fallbackAction);
-        }
-
-        if (supplementaryAction != null) {
-            fallbackList.add(supplementaryAction);
-        }
+    public SupplementaryRuleManager() {
+        this(new ArrayList());
     }
     
     public SupplementaryRuleManager(SupplementaryRuleManager manager) {
-        this(manager.supplementaryAction, manager.fallbackAction);
-        this.namespaces = (HashMap) manager.namespaces.clone();
-        this.actions = (ArrayList) manager.actions.clone();
-        this.rules = (MultiHashMap) manager.rules.clone();
+        super(manager);
+        this.supplementaryActions = manager.supplementaryActions;
     }
     
     /**
@@ -99,31 +87,73 @@
         return new SupplementaryRuleManager(this);
     }
     
+    public void addRule(String pattern, Action action) throws InvalidRuleException {
+        super.addRule(pattern, action);
+        invalidateCache();
+    }
+
+    public void addFallbackAction(Action action) {
+        super.addFallbackAction(action);
+        invalidateCache();
+    }
+
+    public void addSupplementaryAction(Action action) {
+        supplementaryActions.add(action);
+        invalidateCache();
+    }
+
     /**
      * @see DefaultRuleManager#getMatchingActions(String)
      */
     public List getMatchingActions(String path) {
+        
+        List completeList = (List) path2ActionsMap.get(path);
+        if (completeList != null) {
+            return completeList;
+        } 
+        
         List actionList = super.getMatchingActions(path);
-        if (actionList == Collections.EMPTY_LIST) {
-            return fallbackList;
-        }
-        if (supplementaryAction != null) {
-            actionList.add(supplementaryAction);
+        if (supplementaryActions.size() != 0) {
+            if (actionList == Collections.EMPTY_LIST) {
+                completeList = Collections.unmodifiableList(supplementaryActions);
+            } else {
+                completeList = new ReadOnlyConcatList(actionList, supplementaryActions);
+            }
+        } else {
+            completeList = actionList;
         }
-        return actionList;
+
+        path2ActionsMap.put(path, completeList);
+        return completeList;
     }
 
-    /**
-     * @return Returns the fallbackAction.
-     */
-    public Action getFallbackAction() {
-        return fallbackAction;
+    protected void invalidateCache() {
+        path2ActionsMap.clear();
     }
+    
+    protected static class ReadOnlyConcatList extends AbstractList {
+
+        final List left;
+        final List right;
+        final int border;
+
+        ReadOnlyConcatList(List left, List right) {
+            this.left = left;
+            this.right = right;
+            this.border = left.size();
+        }
+
+        public Object get(int index) {
+            if (index >= border) {
+                return right.get(index - border);
+            } else {
+                return left.get(index);
+            }
+        }
+
+        public int size() {
+            return left.size() + right.size();
+        }
 
-    /**
-     * @return Returns the supplementaryAction.
-     */
-    public Action getSupplementaryAction() {
-        return supplementaryAction;
     }
-}
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message