svn commit: r897594 - /ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r897594 - /ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/

adrianc
Author: adrianc
Date: Sun Jan 10 07:15:50 2010
New Revision: 897594

URL: http://svn.apache.org/viewvc?rev=897594&view=rev
Log:
Converted PathNode class to visitor pattern.

Added:
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java   (with props)
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java   (with props)
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java   (with props)
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java   (with props)
Modified:
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ArtifactPath.java
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
    ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java

Modified: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java?rev=897594&r1=897593&r2=897594&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java (original)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AccessControllerImpl.java Sun Jan 10 07:15:50 2010
@@ -41,18 +41,18 @@
     public static final String module = AccessControllerImpl.class.getName();
 
     protected final OFBizPermission permission;
-    protected final PathNode node;
+    protected final PermissionsGatherer permissionsGatherer;
     // Temporary - will be removed later
     protected boolean verbose = false;
     protected boolean disabled = false;
 
     protected AccessControllerImpl(PathNode node) {
-        this.node = node;
+        this.permissionsGatherer = new PermissionsGatherer(node);
         this.permission = new OFBizPermission(ThreadContext.getUserLogin().getString("userLoginId"));
         this.verbose = "true".equals(UtilProperties.getPropertyValue("api.properties", "authorizationManager.verbose"));
         this.disabled = "true".equals(UtilProperties.getPropertyValue("api.properties", "authorizationManager.disabled"));
         if (this.verbose) {
-            Debug.logInfo("Permissions for " + ThreadContext.getUserLogin().getString("userLoginId") + ": \n" + this.node, module);
+            Debug.logInfo("Permissions for " + ThreadContext.getUserLogin().getString("userLoginId") + ": \n" + node, module);
         }
     }
 
@@ -61,7 +61,7 @@
             Debug.logInfo("Checking permission: " + ThreadContext.getExecutionPath() + "[" + permission + "]", module);
         }
         this.permission.reset();
-        this.node.getPermissions(new ArtifactPath(ThreadContext.getExecutionPath()), this.permission);
+        this.permissionsGatherer.gatherPermissions(new ArtifactPath(ThreadContext.getExecutionPath()), this.permission);
         if (this.verbose) {
             Debug.logInfo("Found permission(s): " + ThreadContext.getUserLogin().getString("userLoginId") +
                     "@" + ThreadContext.getExecutionPath() + "[" + this.permission + "]", module);

Modified: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ArtifactPath.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ArtifactPath.java?rev=897594&r1=897593&r2=897594&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ArtifactPath.java (original)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/ArtifactPath.java Sun Jan 10 07:15:50 2010
@@ -21,14 +21,19 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import javolution.text.TextBuilder;
+import javolution.util.FastList;
+
 /** Artifact path class. */
-public class ArtifactPath implements Cloneable, Iterator<String> {
+public class ArtifactPath implements Iterator<String> {
 
     public static final ArtifactPath PATH_ROOT = new ArtifactPath("ofbiz");
     public static final String ELEMENT_SEPARATOR = "/";
 
     protected int currentIndex = 0;
     protected final String[] pathElementArray;
+    protected FastList<Integer> stack = null;
+    protected final TextBuilder stringBuilder = TextBuilder.newInstance();
 
     public ArtifactPath(String artifactPath) {
         this.pathElementArray = artifactPath.split(ELEMENT_SEPARATOR);
@@ -38,22 +43,18 @@
         this.pathElementArray = pathElementArray;
     }
 
-    @Override
-    public ArtifactPath clone() {
-        ArtifactPath newPath = new ArtifactPath(this.pathElementArray);
-        newPath.currentIndex = this.currentIndex;
-        return newPath;
-    }
-
     public String getCurrentPath() {
-        StringBuilder sb = new StringBuilder();
+        if (this.pathElementArray.length == 1 || !this.hasNext()) {
+            return this.pathElementArray[this.currentIndex];
+        }
+        this.stringBuilder.clear();
         for (int i = this.currentIndex; i < this.pathElementArray.length; i++) {
             if (i != this.currentIndex) {
-                sb.append(ELEMENT_SEPARATOR);
+                stringBuilder.append(ELEMENT_SEPARATOR);
             }
-            sb.append(this.pathElementArray[i]);
+            stringBuilder.append(this.pathElementArray[i]);
         }
-        return sb.toString();
+        return stringBuilder.toString();
     }
 
     public String getCurrentPathElement() {
@@ -77,4 +78,17 @@
     public void remove() {
         throw new UnsupportedOperationException();
     }
+
+    public void restoreState() {
+        if (this.stack == null) {
+            this.stack = FastList.newInstance();
+        }
+        this.stack.addLast(this.currentIndex);
+    }
+
+    public void saveState() {
+        if (this.stack != null && !this.stack.isEmpty()) {
+            this.currentIndex = this.stack.removeLast();
+        }
+    }
 }

Modified: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java?rev=897594&r1=897593&r2=897594&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java (original)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/AuthorizationManagerImpl.java Sun Jan 10 07:15:50 2010
@@ -90,9 +90,10 @@
     }
 
     protected static void setPermissions(String id, PathNode node, List<GenericValue> permissionValues) throws AuthorizationManagerException {
+        PermissionTreeBuilder builder = new PermissionTreeBuilder();
         for (GenericValue value : permissionValues) {
-            String artifactPath = value.getString("artifactPath");
-            OFBizPermission target = new OFBizPermission(id + "@" + artifactPath);
+            String artifactPathString = value.getString("artifactPath");
+            OFBizPermission target = new OFBizPermission(id + "@" + artifactPathString);
             String[] pair = value.getString("permissionValue").split("=");
             if ("filter".equalsIgnoreCase(pair[0])) {
                 target.addFilter(pair[1]);
@@ -110,7 +111,7 @@
                     throw new AuthorizationManagerException("Invalid permission: " + pair[0]);
                 }
             }
-            node.setPermissions(new ArtifactPath(artifactPath), target);
+            builder.buildPermissionTree(node, new ArtifactPath(artifactPathString), target);
         }
     }
 

Modified: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java?rev=897594&r1=897593&r2=897594&view=diff
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java (original)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNode.java Sun Jan 10 07:15:50 2010
@@ -18,14 +18,9 @@
  *******************************************************************************/
 package org.ofbiz.context;
 
-import java.util.Collection;
 import java.util.Map;
 
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-/** A node in a permissions tree.
- */
+/** A node in a permissions tree. */
 public abstract class PathNode {
 
     public static final String SUBSTITUTION_CHARACTER = "?";
@@ -49,50 +44,15 @@
         this.nodeName = nodeName;
     }
 
-    protected void buildNodeString(FastList<PathNode> currentPath, StringBuilder result) {
-        if (this.childNodes != null) {
-            Collection<PathNode> childNodes = this.childNodes.values();
-            for (PathNode childNode : childNodes) {
-                childNode.buildNodeString(currentPath, result);
-            }
-        }
-    }
-
-    protected void getChildNodePermissions(String key, ArtifactPath artifactPath, OFBizPermission permission) {
-        if (this.childNodes != null) {
-            PathNode node = this.childNodes.get(key.toUpperCase());
-            if (node != null) {
-                node.getPermissions(artifactPath, permission);
-            }
-        }
-    }
-
-    public abstract void getPermissions(ArtifactPath artifactPath, OFBizPermission permission);
-
-    protected void setChildNodePermissions(String key, ArtifactPath artifactPath, OFBizPermission permission) {
-        if (this.childNodes == null) {
-            this.childNodes = FastMap.newInstance();
-        }
-        key = key.toUpperCase();
-        PathNode node = this.childNodes.get(key);
-        if (node == null) {
-            node = PathNode.getInstance(artifactPath);
-            this.childNodes.put(key, node);
-        }
-        node.setPermissions(artifactPath, permission);
-    }
-
-    public abstract void setPermissions(ArtifactPath artifactPath, OFBizPermission permission);
+    public abstract void accept(PathNodeVisitor visitor);
 
     @Override
     public String toString() {
-        FastList<PathNode> currentPath = FastList.newInstance();
-        StringBuilder result = new StringBuilder();
-        buildNodeString(currentPath, result);
-        return result.toString();
+        TreeStringBuilder tsb = new TreeStringBuilder(this);
+        return tsb.toString();
     }
 
-    protected static class BranchNode extends PathNode {
+    public static class BranchNode extends PathNode {
         protected OFBizPermission permission = null;
         protected SubstitutionNode substitutionNode = null;
         protected WildCardNode wildCardNode = null;
@@ -102,132 +62,33 @@
         }
 
         @Override
-        protected void buildNodeString(FastList<PathNode> currentPath, StringBuilder result) {
-            currentPath.add(this);
-            if (this.permission != null) {
-                for (PathNode pathNode: currentPath) {
-                    result.append("/");
-                    result.append(pathNode.nodeName);
-                }
-                result.append("[");
-                result.append(this.permission);
-                result.append("]");
-                result.append("\n");
-            }
-            if (this.substitutionNode != null) {
-                this.substitutionNode.buildNodeString(currentPath, result);
-            }
-            if (this.wildCardNode != null) {
-                this.wildCardNode.buildNodeString(currentPath, result);
-            }
-            super.buildNodeString(currentPath, result);
-            currentPath.removeLast();
-        }
-
-        @Override
-        public void getPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            permission.accumulatePermissions(this.permission);
-            if (artifactPath.hasNext()) {
-                String key = artifactPath.next();
-                if (this.substitutionNode != null) {
-                    this.substitutionNode.getPermissions(artifactPath.clone(), permission);
-                }
-                if (this.wildCardNode != null) {
-                    this.wildCardNode.getPermissions(artifactPath.clone(), permission);
-                }
-                this.getChildNodePermissions(key, artifactPath, permission);
-            }
-        }
-
-        @Override
-        public void setPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            if (!artifactPath.hasNext()) {
-                if (this.permission == null) {
-                    this.permission = permission;
-                } else {
-                    this.permission.accumulatePermissions(permission);
-                }
-                return;
-            }
-            String key = artifactPath.next();
-            if (SUBSTITUTION_CHARACTER.equals(key)) {
-                if (this.substitutionNode == null) {
-                    this.substitutionNode = new SubstitutionNode();
-                }
-                this.substitutionNode.setPermissions(artifactPath, permission);
-                return;
-            }
-            if (WILDCARD_CHARACTER.equals(key)) {
-                if (this.wildCardNode == null) {
-                    this.wildCardNode = new WildCardNode();
-                }
-                this.wildCardNode.setPermissions(artifactPath, permission);
-                return;
-            }
-            this.setChildNodePermissions(key, artifactPath, permission);
+        public void accept(PathNodeVisitor visitor) {
+            visitor.visit(this);
         }
     }
 
-    protected static class SubstitutionNode extends PathNode {
+    public static class SubstitutionNode extends PathNode {
 
         protected SubstitutionNode() {
             super(SUBSTITUTION_CHARACTER);
         }
 
         @Override
-        protected void buildNodeString(FastList<PathNode> currentPath, StringBuilder result) {
-            currentPath.add(this);
-            super.buildNodeString(currentPath, result);
-            currentPath.removeLast();
+        public void accept(PathNodeVisitor visitor) {
+            visitor.visit(this);
         }
 
-        @Override
-        public void getPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            if (artifactPath.hasNext()) {
-                this.getChildNodePermissions(artifactPath.next(), artifactPath, permission);
-            }
-        }
-
-        @Override
-        public void setPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            if (artifactPath.hasNext()) {
-                this.setChildNodePermissions(artifactPath.next(), artifactPath, permission);
-            }
-        }
     }
 
-    protected static class WildCardNode extends PathNode {
+    public static class WildCardNode extends PathNode {
 
         protected WildCardNode() {
             super(WILDCARD_CHARACTER);
         }
 
         @Override
-        protected void buildNodeString(FastList<PathNode> currentPath, StringBuilder result) {
-            currentPath.add(this);
-            super.buildNodeString(currentPath, result);
-            currentPath.removeLast();
-        }
-
-        public void getPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            if (artifactPath.hasNext() && this.childNodes != null) {
-                artifactPath.next();
-                String currentPath = artifactPath.getCurrentPath().toUpperCase();
-                for (Map.Entry<String, PathNode> entry : this.childNodes.entrySet()) {
-                    if (currentPath.endsWith(entry.getKey())) {
-                        entry.getValue().getPermissions(artifactPath, permission);
-                        return;
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void setPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
-            if (artifactPath.hasNext()) {
-                artifactPath.next();
-                this.setChildNodePermissions(artifactPath.getCurrentPath(), artifactPath, permission);
-            }
+        public void accept(PathNodeVisitor visitor) {
+            visitor.visit(this);
         }
     }
 }

Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java?rev=897594&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java Sun Jan 10 07:15:50 2010
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import org.ofbiz.context.PathNode.BranchNode;
+import org.ofbiz.context.PathNode.SubstitutionNode;
+import org.ofbiz.context.PathNode.WildCardNode;
+
+public interface PathNodeVisitor {
+    public void visit(BranchNode node);
+    public void visit(SubstitutionNode node);
+    public void visit(WildCardNode node);
+}

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PathNodeVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java?rev=897594&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java Sun Jan 10 07:15:50 2010
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import javolution.util.FastMap;
+
+import org.ofbiz.context.PathNode.BranchNode;
+import org.ofbiz.context.PathNode.SubstitutionNode;
+import org.ofbiz.context.PathNode.WildCardNode;
+
+public class PermissionTreeBuilder implements PathNodeVisitor {
+
+    protected ArtifactPath artifactPath;
+    protected OFBizPermission permission;
+
+    public void buildPermissionTree(PathNode node, ArtifactPath artifactPath, OFBizPermission permission) {
+        this.artifactPath = artifactPath;
+        this.permission = permission;
+        node.accept(this);
+    }
+
+    protected void setChildNodePermissions(PathNode node, String key) {
+        if (node.childNodes == null) {
+            node.childNodes = FastMap.newInstance();
+        }
+        key = key.toUpperCase();
+        PathNode childNode = node.childNodes.get(key);
+        if (childNode == null) {
+            childNode = PathNode.getInstance(this.artifactPath);
+            node.childNodes.put(key, childNode);
+        }
+        childNode.accept(this);
+    }
+
+    @Override
+    public void visit(BranchNode node) {
+        if (!this.artifactPath.hasNext()) {
+            if (node.permission == null) {
+                node.permission = this.permission;
+            } else {
+                node.permission.accumulatePermissions(this.permission);
+            }
+            return;
+        }
+        String key = this.artifactPath.next();
+        if (PathNode.SUBSTITUTION_CHARACTER.equals(key)) {
+            if (node.substitutionNode == null) {
+                node.substitutionNode = new SubstitutionNode();
+            }
+            node.substitutionNode.accept(this);
+            return;
+        }
+        if (PathNode.WILDCARD_CHARACTER.equals(key)) {
+            if (node.wildCardNode == null) {
+                node.wildCardNode = new WildCardNode();
+            }
+            node.wildCardNode.accept(this);
+            return;
+        }
+        this.setChildNodePermissions(node, key);
+    }
+
+    @Override
+    public void visit(SubstitutionNode node) {
+        if (this.artifactPath.hasNext()) {
+            this.setChildNodePermissions(node, this.artifactPath.next());
+        }
+    }
+
+    @Override
+    public void visit(WildCardNode node) {
+        if (this.artifactPath.hasNext()) {
+            this.artifactPath.next();
+            this.setChildNodePermissions(node, this.artifactPath.getCurrentPath());
+        }
+    }
+}

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionTreeBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java?rev=897594&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java Sun Jan 10 07:15:50 2010
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.util.Map;
+
+import org.ofbiz.context.PathNode.BranchNode;
+import org.ofbiz.context.PathNode.SubstitutionNode;
+import org.ofbiz.context.PathNode.WildCardNode;
+
+public class PermissionsGatherer implements PathNodeVisitor {
+    protected ArtifactPath artifactPath;
+    protected final PathNode node;
+    protected OFBizPermission permission;
+
+    public PermissionsGatherer(PathNode node) {
+        this.node = node;
+    }
+
+    public void gatherPermissions(ArtifactPath artifactPath, OFBizPermission permission) {
+        this.artifactPath = artifactPath;
+        this.permission = permission;
+        this.node.accept(this);
+    }
+
+    protected void getChildNodePermissions(PathNode node, String key) {
+        if (node.childNodes != null) {
+            PathNode childNode = node.childNodes.get(key.toUpperCase());
+            if (childNode != null) {
+                childNode.accept(this);
+            }
+        }
+    }
+
+    @Override
+    public void visit(BranchNode node) {
+        this.permission.accumulatePermissions(node.permission);
+        if (this.artifactPath.hasNext()) {
+            String key = this.artifactPath.next();
+            if (node.substitutionNode != null) {
+                this.artifactPath.saveState();
+                node.substitutionNode.accept(this);
+                this.artifactPath.restoreState();
+            }
+            if (node.wildCardNode != null) {
+                this.artifactPath.saveState();
+                node.wildCardNode.accept(this);
+                this.artifactPath.restoreState();
+            }
+            this.getChildNodePermissions(node, key);
+        }
+    }
+
+    @Override
+    public void visit(SubstitutionNode node) {
+        if (this.artifactPath.hasNext()) {
+            this.getChildNodePermissions(node, this.artifactPath.next());
+        }
+    }
+
+    @Override
+    public void visit(WildCardNode node) {
+        if (this.artifactPath.hasNext() && node.childNodes != null) {
+            this.artifactPath.next();
+            String currentPath = this.artifactPath.getCurrentPath().toUpperCase();
+            for (Map.Entry<String, PathNode> entry : node.childNodes.entrySet()) {
+                if (currentPath.endsWith(entry.getKey())) {
+                    entry.getValue().accept(this);
+                    return;
+                }
+            }
+        }
+    }
+
+}

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/PermissionsGatherer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java?rev=897594&view=auto
==============================================================================
--- ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java (added)
+++ ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java Sun Jan 10 07:15:50 2010
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.context;
+
+import java.util.Collection;
+
+import javolution.text.TextBuilder;
+import javolution.util.FastList;
+
+import org.ofbiz.context.PathNode.BranchNode;
+import org.ofbiz.context.PathNode.SubstitutionNode;
+import org.ofbiz.context.PathNode.WildCardNode;
+
+public class TreeStringBuilder implements PathNodeVisitor {
+    protected final FastList<PathNode> currentPath = FastList.newInstance();
+    protected final PathNode node;
+    protected final TextBuilder stringBuilder = TextBuilder.newInstance();
+
+    public TreeStringBuilder(PathNode node) {
+        this.node = node;
+    }
+
+    protected void buildNodeString(PathNode node) {
+        if (node.childNodes != null) {
+            Collection<PathNode> childNodes = node.childNodes.values();
+            for (PathNode childNode : childNodes) {
+                childNode.accept(this);
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        this.node.accept(this);
+        return this.stringBuilder.toString();
+    }
+
+    @Override
+    public void visit(BranchNode node) {
+        this.currentPath.addLast(node);
+        if (node.permission != null) {
+            for (PathNode pathNode: this.currentPath) {
+                this.stringBuilder.append("/");
+                this.stringBuilder.append(pathNode.nodeName);
+            }
+            this.stringBuilder.append("[");
+            this.stringBuilder.append(node.permission);
+            this.stringBuilder.append("]");
+            this.stringBuilder.append("\n");
+        }
+        if (node.substitutionNode != null) {
+            node.substitutionNode.accept(this);
+        }
+        if (node.wildCardNode != null) {
+            node.wildCardNode.accept(this);
+        }
+        this.buildNodeString(node);
+        this.currentPath.removeLast();
+    }
+
+    @Override
+    public void visit(SubstitutionNode node) {
+        this.currentPath.addLast(node);
+        this.buildNodeString(node);
+        this.currentPath.removeLast();
+    }
+
+    @Override
+    public void visit(WildCardNode node) {
+        this.currentPath.addLast(node);
+        this.buildNodeString(node);
+        this.currentPath.removeLast();
+    }
+
+}

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author URL Id

Propchange: ofbiz/branches/executioncontext20091231/framework/context/src/org/ofbiz/context/TreeStringBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain