You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2008/11/19 23:37:21 UTC

svn commit: r719102 [1/2] - in /lenya/sandbox/access_control_redesign/src/modules-core/ac/java: src/ src/org/apache/lenya/ac/attr/ src/org/apache/lenya/ac/attr/antlr/ src/org/apache/lenya/ac/attr/impl/ src/org/apache/lenya/ac/file/ src/org/apache/lenya...

Author: andreas
Date: Wed Nov 19 14:37:20 2008
New Revision: 719102

URL: http://svn.apache.org/viewvc?rev=719102&view=rev
Log:
Committing changes to ac module.

Added:
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions.tokens
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions__.g
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluator.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluatorFactory.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.tokens
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsLexer.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsParser.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions__.g
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ParseException.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeImpl.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeManagerImpl.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeRuleImpl.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeSetImpl.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/EmptyAttributeSet.java
Modified:
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileAccreditableManager.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileGroup.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileIPRange.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileItemManager.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FilePolicyManager.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUser.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUserManager.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroup.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroupable.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractUser.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AnonymousAuthenticator.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/DefaultAccessController.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/DefaultPolicy.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/PolicyBuilder.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/URLPolicy.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/UserAuthenticator.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/cms/ac/SitemapPolicyManager.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/cms/cocoon/components/modules/input/AccessControlModule.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/test/org/apache/lenya/ac/impl/IdentityTest.java
    lenya/sandbox/access_control_redesign/src/modules-core/ac/java/test/org/apache/lenya/ac/impl/PolicyTest.java

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions.tokens
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions.tokens?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions.tokens (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions.tokens Wed Nov 19 14:37:20 2008
@@ -0,0 +1,9 @@
+RIGHTPAR=8
+EQUALS=6
+AND=5
+LITERAL=10
+LEFTPAR=7
+WS=12
+QUOT=11
+OR=4
+ID=9

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions__.g
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions__.g?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions__.g (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/Expressions__.g Wed Nov 19 14:37:20 2008
@@ -0,0 +1,36 @@
+lexer grammar Expressions;
+@members {
+
+    private ErrorHandler errorHandler;
+    
+    public void setErrorHandler(ErrorHandler handler) {
+    	this.errorHandler = handler;
+    }
+
+    public void emitErrorMessage(String msg) {
+    	this.errorHandler.error(msg);
+    }
+}
+@header {
+package org.apache.lenya.ac.attr.antlr;
+import org.apache.lenya.ac.ErrorHandler;
+}
+
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 106
+LITERAL: '"' ('a'..'z'|'A'..'Z'|'_'|' '|'.')* '"';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 107
+ID: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*;
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 108
+EQUALS: '==';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 109
+QUOT: '"';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 110
+OR: '||';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 111
+AND: '&&';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 112
+LEFTPAR: '(';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 113
+RIGHTPAR: ')';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 114
+WS: (' '|'\t')+ {skip();} ;

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluator.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluator.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluator.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluator.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,112 @@
+/*
+ * 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.apache.lenya.ac.attr.antlr;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.RecognitionException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.lenya.ac.attr.AttributeSet;
+import org.apache.lenya.ac.attr.AttributeOwner;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluator;
+import org.apache.lenya.ac.attr.ErrorHandler;
+import org.apache.lenya.ac.attr.Message;
+import org.apache.lenya.ac.attr.SimpleErrorHandler;
+import org.apache.lenya.ac.attr.ValidationResult;
+import org.apache.lenya.util.Assert;
+
+/**
+ * ANTLR-based attribute rule evaluator.
+ */
+public class AntlrEvaluator extends AbstractLogEnabled implements AttributeRuleEvaluator {
+    
+    /**
+     * @param logger The logger.
+     */
+    public AntlrEvaluator(Logger logger) {
+        enableLogging(logger);
+    }
+
+    protected static final String UNDEFINED_VALUE = "undefined";
+
+    public boolean isComplied(AttributeOwner user, String rule) {
+        ErrorHandler handler = new SimpleErrorHandler();
+        ExpressionsParser parser = getParser(rule, handler);
+        try {
+            String[] names = user.getAttributeNames();
+            for (int i = 0; i < names.length; i++) {
+                String[] values = user.getAttributeValues(names[i]);
+                if (values == null) {
+                    parser.memory.put(names[i], UNDEFINED_VALUE);
+                }
+                else {
+                    if (values.length == 1) {
+                        parser.memory.put(names[i], values[0]);
+                    } else {
+                        parser.memory.put(names[i], values);
+                    }
+                }
+            }
+            boolean result = parser.prog();
+            Message[] errors = handler.getErrors();
+            if (errors.length == 0) {
+                return result;
+            }
+            else {
+                getLogger().error("Invalid rule: " + rule);
+                for (int i = 0; i < errors.length; i++) {
+                    getLogger().error(errors[i].getText());
+                }
+                return false;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public ValidationResult validate(String rule, AttributeSet attrs) {
+        ErrorHandler handler = new SimpleErrorHandler();
+        ExpressionsParser parser = getParser(rule, handler);
+        ValidationResult result;
+        try {
+            String[] names = attrs.getAttributeNames();
+            for (int i = 0; i < names.length; i++) {
+                parser.memory.put(attrs.getAttribute(names[i]).getAlias(), UNDEFINED_VALUE);
+            }
+            parser.prog();
+            result = new ValidationResult(handler.getErrors());
+        } catch (RecognitionException e) {
+            throw new RuntimeException(e);
+        }
+        return result;
+    }
+
+    protected ExpressionsParser getParser(String rule, ErrorHandler handler) {
+        Assert.notNull("rule", rule);
+        CharStream stream = new ANTLRStringStream(rule);
+        ExpressionsLexer lexer = new ExpressionsLexer(stream);
+        lexer.setErrorHandler(handler);
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        ExpressionsParser parser = new ExpressionsParser(tokens);
+        parser.setErrorHandler(handler);
+        return parser;
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluatorFactory.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluatorFactory.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluatorFactory.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/AntlrEvaluatorFactory.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,33 @@
+/*
+ * 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.apache.lenya.ac.attr.antlr;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluator;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluatorFactory;
+
+/**
+ * Factory for ANTLR-based attribute rule evaluators.
+ */
+public class AntlrEvaluatorFactory extends AbstractLogEnabled implements AttributeRuleEvaluatorFactory {
+
+    public AttributeRuleEvaluator getEvaluator() {
+        return new AntlrEvaluator(getLogger());
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g Wed Nov 19 14:37:20 2008
@@ -0,0 +1,114 @@
+grammar Expressions;
+
+@header {
+package org.apache.lenya.ac.attr.antlr;
+import java.util.HashMap;
+import org.apache.lenya.ac.attr.ErrorHandler;
+}
+
+@lexer::header {
+package org.apache.lenya.ac.attr.antlr;
+import org.apache.lenya.ac.attr.ErrorHandler;
+}
+
+@members {
+/** Map variable name to object holding value */
+    HashMap memory = new HashMap();
+    private ErrorHandler errorHandler;
+    
+    public void setErrorHandler(ErrorHandler handler) {
+    	this.errorHandler = handler;
+    }
+    
+    public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
+        String hdr = getErrorHeader(e);
+        String msg;
+    	if (e instanceof FailedPredicateException) {
+  	        msg = ((FailedPredicateException) e).predicateText;
+    	}
+  	    else {
+            msg = getErrorMessage(e, tokenNames);
+  	    }
+        emitErrorMessage(hdr+" "+msg);
+    }
+
+    public void emitErrorMessage(String msg) {
+    	this.errorHandler.error(msg);
+    }
+}
+
+@lexer::members {
+
+    private ErrorHandler errorHandler;
+    
+    public void setErrorHandler(ErrorHandler handler) {
+    	this.errorHandler = handler;
+    }
+
+    public void emitErrorMessage(String msg) {
+    	this.errorHandler.error(msg);
+    }
+}
+
+prog returns [boolean value]
+    : e=orExpression {$value = $e.value; }
+    ;
+
+orExpression returns [boolean value]
+    :   e=andExpression {$value = $e.value; }
+    ( OR e=andExpression {$value = $value || $e.value; } )*
+    ;
+    
+andExpression returns [boolean value]
+    :   e=comparison {$value = $e.value;}
+    ( AND e=comparison {$value = $value && $e.value;} )*
+    ;
+    
+comparison returns [boolean value]
+    :   a=atom EQUALS b=atom {
+            if ($a.value instanceof String && $b.value instanceof String) {
+                $value = $a.value.equals($b.value);
+            }
+            else if ($a.value instanceof String && $b.value.getClass().isArray()) {
+                $value = java.util.Arrays.asList((String[]) $b.value).contains($a.value);
+            }
+            else if ($a.value.getClass().isArray() && $b.value instanceof String) {
+                $value = java.util.Arrays.asList((String[]) $a.value).contains($b.value);
+            }
+            else {
+                throw new FailedPredicateException(input, $a.text + " == " + $b.text,
+                    "Incompatible arguments for comparison: " + $a.value + ", " + $b.value);
+            }
+        }
+    |   LEFTPAR e=orExpression RIGHTPAR {$value = $e.value;}
+    ;
+
+atom returns [Object value]
+    :   quotedString {$value = $quotedString.value;}
+    |   ID
+        {
+            Object v = memory.get($ID.text);
+            if ( v != null ) {
+                $value = v;
+            }
+            else {
+            	$value = "undefined";
+                throw new FailedPredicateException(input, $ID.text,
+                    "Undefined variable \"" + $ID.text + "\"");
+            }
+        }
+    ;
+
+quotedString returns [String value]
+      : LITERAL {$value = $LITERAL.text.substring(1, $LITERAL.text.length() - 1);}
+      ;
+      
+LITERAL: '"' ('a'..'z'|'A'..'Z'|'_'|' '|'.')* '"';
+ID: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*;
+EQUALS: '==';
+QUOT: '"';
+OR: '||';
+AND: '&&';
+LEFTPAR: '(';
+RIGHTPAR: ')';
+WS: (' '|'\t')+ {skip();} ;

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.tokens
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.tokens?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.tokens (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.tokens Wed Nov 19 14:37:20 2008
@@ -0,0 +1,9 @@
+RIGHTPAR=8
+EQUALS=6
+AND=5
+LITERAL=10
+LEFTPAR=7
+WS=12
+QUOT=11
+OR=4
+ID=9

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsLexer.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsLexer.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsLexer.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsLexer.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,505 @@
+// $ANTLR 3.0.1 /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g 2008-11-19 22:26:32
+
+package org.apache.lenya.ac.attr.antlr;
+import org.apache.lenya.ac.attr.ErrorHandler;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+public class ExpressionsLexer extends Lexer {
+    public static final int RIGHTPAR=8;
+    public static final int EQUALS=6;
+    public static final int AND=5;
+    public static final int LITERAL=10;
+    public static final int LEFTPAR=7;
+    public static final int WS=12;
+    public static final int EOF=-1;
+    public static final int Tokens=13;
+    public static final int QUOT=11;
+    public static final int OR=4;
+    public static final int ID=9;
+
+
+        private ErrorHandler errorHandler;
+        
+        public void setErrorHandler(ErrorHandler handler) {
+        	this.errorHandler = handler;
+        }
+
+        public void emitErrorMessage(String msg) {
+        	this.errorHandler.error(msg);
+        }
+
+    public ExpressionsLexer() {;} 
+    public ExpressionsLexer(CharStream input) {
+        super(input);
+    }
+    public String getGrammarFileName() { return "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g"; }
+
+    // $ANTLR start LITERAL
+    public final void mLITERAL() throws RecognitionException {
+        try {
+            int _type = LITERAL;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:106:8: ( '\"' ( 'a' .. 'z' | 'A' .. 'Z' | '_' | ' ' | '.' )* '\"' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:106:10: '\"' ( 'a' .. 'z' | 'A' .. 'Z' | '_' | ' ' | '.' )* '\"'
+            {
+            match('\"'); 
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:106:14: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | ' ' | '.' )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==' '||LA1_0=='.'||(LA1_0>='A' && LA1_0<='Z')||LA1_0=='_'||(LA1_0>='a' && LA1_0<='z')) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:
+            	    {
+            	    if ( input.LA(1)==' '||input.LA(1)=='.'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+            match('\"'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LITERAL
+
+    // $ANTLR start ID
+    public final void mID() throws RecognitionException {
+        try {
+            int _type = ID;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:107:3: ( ( 'a' .. 'z' | 'A' .. 'Z' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' )* )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:107:5: ( 'a' .. 'z' | 'A' .. 'Z' ) ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' )*
+            {
+            if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse =
+                    new MismatchedSetException(null,input);
+                recover(mse);    throw mse;
+            }
+
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:107:25: ( 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( ((LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:
+            	    {
+            	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end ID
+
+    // $ANTLR start EQUALS
+    public final void mEQUALS() throws RecognitionException {
+        try {
+            int _type = EQUALS;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:108:7: ( '==' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:108:9: '=='
+            {
+            match("=="); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end EQUALS
+
+    // $ANTLR start QUOT
+    public final void mQUOT() throws RecognitionException {
+        try {
+            int _type = QUOT;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:109:5: ( '\"' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:109:7: '\"'
+            {
+            match('\"'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end QUOT
+
+    // $ANTLR start OR
+    public final void mOR() throws RecognitionException {
+        try {
+            int _type = OR;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:110:3: ( '||' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:110:5: '||'
+            {
+            match("||"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end OR
+
+    // $ANTLR start AND
+    public final void mAND() throws RecognitionException {
+        try {
+            int _type = AND;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:111:4: ( '&&' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:111:6: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end AND
+
+    // $ANTLR start LEFTPAR
+    public final void mLEFTPAR() throws RecognitionException {
+        try {
+            int _type = LEFTPAR;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:112:8: ( '(' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:112:10: '('
+            {
+            match('('); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end LEFTPAR
+
+    // $ANTLR start RIGHTPAR
+    public final void mRIGHTPAR() throws RecognitionException {
+        try {
+            int _type = RIGHTPAR;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:113:9: ( ')' )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:113:11: ')'
+            {
+            match(')'); 
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end RIGHTPAR
+
+    // $ANTLR start WS
+    public final void mWS() throws RecognitionException {
+        try {
+            int _type = WS;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:114:3: ( ( ' ' | '\\t' )+ )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:114:5: ( ' ' | '\\t' )+
+            {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:114:5: ( ' ' | '\\t' )+
+            int cnt3=0;
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( (LA3_0=='\t'||LA3_0==' ') ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:
+            	    {
+            	    if ( input.LA(1)=='\t'||input.LA(1)==' ' ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse =
+            	            new MismatchedSetException(null,input);
+            	        recover(mse);    throw mse;
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
+                }
+                cnt3++;
+            } while (true);
+
+            skip();
+
+            }
+
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end WS
+
+    public void mTokens() throws RecognitionException {
+        // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:8: ( LITERAL | ID | EQUALS | QUOT | OR | AND | LEFTPAR | RIGHTPAR | WS )
+        int alt4=9;
+        switch ( input.LA(1) ) {
+        case '\"':
+            {
+            int LA4_1 = input.LA(2);
+
+            if ( (LA4_1==' '||LA4_1=='\"'||LA4_1=='.'||(LA4_1>='A' && LA4_1<='Z')||LA4_1=='_'||(LA4_1>='a' && LA4_1<='z')) ) {
+                alt4=1;
+            }
+            else {
+                alt4=4;}
+            }
+            break;
+        case 'A':
+        case 'B':
+        case 'C':
+        case 'D':
+        case 'E':
+        case 'F':
+        case 'G':
+        case 'H':
+        case 'I':
+        case 'J':
+        case 'K':
+        case 'L':
+        case 'M':
+        case 'N':
+        case 'O':
+        case 'P':
+        case 'Q':
+        case 'R':
+        case 'S':
+        case 'T':
+        case 'U':
+        case 'V':
+        case 'W':
+        case 'X':
+        case 'Y':
+        case 'Z':
+        case 'a':
+        case 'b':
+        case 'c':
+        case 'd':
+        case 'e':
+        case 'f':
+        case 'g':
+        case 'h':
+        case 'i':
+        case 'j':
+        case 'k':
+        case 'l':
+        case 'm':
+        case 'n':
+        case 'o':
+        case 'p':
+        case 'q':
+        case 'r':
+        case 's':
+        case 't':
+        case 'u':
+        case 'v':
+        case 'w':
+        case 'x':
+        case 'y':
+        case 'z':
+            {
+            alt4=2;
+            }
+            break;
+        case '=':
+            {
+            alt4=3;
+            }
+            break;
+        case '|':
+            {
+            alt4=5;
+            }
+            break;
+        case '&':
+            {
+            alt4=6;
+            }
+            break;
+        case '(':
+            {
+            alt4=7;
+            }
+            break;
+        case ')':
+            {
+            alt4=8;
+            }
+            break;
+        case '\t':
+        case ' ':
+            {
+            alt4=9;
+            }
+            break;
+        default:
+            NoViableAltException nvae =
+                new NoViableAltException("1:1: Tokens : ( LITERAL | ID | EQUALS | QUOT | OR | AND | LEFTPAR | RIGHTPAR | WS );", 4, 0, input);
+
+            throw nvae;
+        }
+
+        switch (alt4) {
+            case 1 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:10: LITERAL
+                {
+                mLITERAL(); 
+
+                }
+                break;
+            case 2 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:18: ID
+                {
+                mID(); 
+
+                }
+                break;
+            case 3 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:21: EQUALS
+                {
+                mEQUALS(); 
+
+                }
+                break;
+            case 4 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:28: QUOT
+                {
+                mQUOT(); 
+
+                }
+                break;
+            case 5 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:33: OR
+                {
+                mOR(); 
+
+                }
+                break;
+            case 6 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:36: AND
+                {
+                mAND(); 
+
+                }
+                break;
+            case 7 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:40: LEFTPAR
+                {
+                mLEFTPAR(); 
+
+                }
+                break;
+            case 8 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:48: RIGHTPAR
+                {
+                mRIGHTPAR(); 
+
+                }
+                break;
+            case 9 :
+                // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:1:57: WS
+                {
+                mWS(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+ 
+
+}
\ No newline at end of file

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsParser.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsParser.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsParser.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ExpressionsParser.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,431 @@
+// $ANTLR 3.0.1 /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g 2008-11-19 22:26:30
+
+package org.apache.lenya.ac.attr.antlr;
+import java.util.HashMap;
+import org.apache.lenya.ac.attr.ErrorHandler;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+public class ExpressionsParser extends Parser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "OR", "AND", "EQUALS", "LEFTPAR", "RIGHTPAR", "ID", "LITERAL", "QUOT", "WS"
+    };
+    public static final int RIGHTPAR=8;
+    public static final int EQUALS=6;
+    public static final int AND=5;
+    public static final int LITERAL=10;
+    public static final int LEFTPAR=7;
+    public static final int WS=12;
+    public static final int EOF=-1;
+    public static final int QUOT=11;
+    public static final int OR=4;
+    public static final int ID=9;
+
+        public ExpressionsParser(TokenStream input) {
+            super(input);
+        }
+        
+
+    public String[] getTokenNames() { return tokenNames; }
+    public String getGrammarFileName() { return "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g"; }
+
+
+    /** Map variable name to object holding value */
+        HashMap memory = new HashMap();
+        private ErrorHandler errorHandler;
+        
+        public void setErrorHandler(ErrorHandler handler) {
+        	this.errorHandler = handler;
+        }
+        
+        public void displayRecognitionError(String[] tokenNames, RecognitionException e) {
+            String hdr = getErrorHeader(e);
+            String msg;
+        	if (e instanceof FailedPredicateException) {
+      	        msg = ((FailedPredicateException) e).predicateText;
+        	}
+      	    else {
+                msg = getErrorMessage(e, tokenNames);
+      	    }
+            emitErrorMessage(hdr+" "+msg);
+        }
+
+        public void emitErrorMessage(String msg) {
+        	this.errorHandler.error(msg);
+        }
+
+
+
+    // $ANTLR start prog
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:53:1: prog returns [boolean value] : e= orExpression ;
+    public final boolean prog() throws RecognitionException {
+        boolean value = false;
+
+        boolean e = false;
+
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:54:5: (e= orExpression )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:54:7: e= orExpression
+            {
+            pushFollow(FOLLOW_orExpression_in_prog50);
+            e=orExpression();
+            _fsp--;
+
+            value = e; 
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return value;
+    }
+    // $ANTLR end prog
+
+
+    // $ANTLR start orExpression
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:57:1: orExpression returns [boolean value] : e= andExpression ( OR e= andExpression )* ;
+    public final boolean orExpression() throws RecognitionException {
+        boolean value = false;
+
+        boolean e = false;
+
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:58:5: (e= andExpression ( OR e= andExpression )* )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:58:9: e= andExpression ( OR e= andExpression )*
+            {
+            pushFollow(FOLLOW_andExpression_in_orExpression77);
+            e=andExpression();
+            _fsp--;
+
+            value = e; 
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:59:5: ( OR e= andExpression )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==OR) ) {
+                    alt1=1;
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:59:7: OR e= andExpression
+            	    {
+            	    match(input,OR,FOLLOW_OR_in_orExpression87); 
+            	    pushFollow(FOLLOW_andExpression_in_orExpression91);
+            	    e=andExpression();
+            	    _fsp--;
+
+            	    value = value || e; 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return value;
+    }
+    // $ANTLR end orExpression
+
+
+    // $ANTLR start andExpression
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:62:1: andExpression returns [boolean value] : e= comparison ( AND e= comparison )* ;
+    public final boolean andExpression() throws RecognitionException {
+        boolean value = false;
+
+        boolean e = false;
+
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:63:5: (e= comparison ( AND e= comparison )* )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:63:9: e= comparison ( AND e= comparison )*
+            {
+            pushFollow(FOLLOW_comparison_in_andExpression125);
+            e=comparison();
+            _fsp--;
+
+            value = e;
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:64:5: ( AND e= comparison )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0==AND) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:64:7: AND e= comparison
+            	    {
+            	    match(input,AND,FOLLOW_AND_in_andExpression135); 
+            	    pushFollow(FOLLOW_comparison_in_andExpression139);
+            	    e=comparison();
+            	    _fsp--;
+
+            	    value = value && e;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return value;
+    }
+    // $ANTLR end andExpression
+
+
+    // $ANTLR start comparison
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:67:1: comparison returns [boolean value] : (a= atom EQUALS b= atom | LEFTPAR e= orExpression RIGHTPAR );
+    public final boolean comparison() throws RecognitionException {
+        boolean value = false;
+
+        atom_return a = null;
+
+        atom_return b = null;
+
+        boolean e = false;
+
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:68:5: (a= atom EQUALS b= atom | LEFTPAR e= orExpression RIGHTPAR )
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( ((LA3_0>=ID && LA3_0<=LITERAL)) ) {
+                alt3=1;
+            }
+            else if ( (LA3_0==LEFTPAR) ) {
+                alt3=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("67:1: comparison returns [boolean value] : (a= atom EQUALS b= atom | LEFTPAR e= orExpression RIGHTPAR );", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:68:9: a= atom EQUALS b= atom
+                    {
+                    pushFollow(FOLLOW_atom_in_comparison173);
+                    a=atom();
+                    _fsp--;
+
+                    match(input,EQUALS,FOLLOW_EQUALS_in_comparison175); 
+                    pushFollow(FOLLOW_atom_in_comparison179);
+                    b=atom();
+                    _fsp--;
+
+
+                                if (a.value instanceof String && b.value instanceof String) {
+                                    value = a.value.equals(b.value);
+                                }
+                                else if (a.value instanceof String && b.value.getClass().isArray()) {
+                                    value = java.util.Arrays.asList((String[]) b.value).contains(a.value);
+                                }
+                                else if (a.value.getClass().isArray() && b.value instanceof String) {
+                                    value = java.util.Arrays.asList((String[]) a.value).contains(b.value);
+                                }
+                                else {
+                                    throw new FailedPredicateException(input, input.toString(a.start,a.stop) + " == " + input.toString(b.start,b.stop),
+                                        "Incompatible arguments for comparison: " + a.value + ", " + b.value);
+                                }
+                            
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:83:9: LEFTPAR e= orExpression RIGHTPAR
+                    {
+                    match(input,LEFTPAR,FOLLOW_LEFTPAR_in_comparison191); 
+                    pushFollow(FOLLOW_orExpression_in_comparison195);
+                    e=orExpression();
+                    _fsp--;
+
+                    match(input,RIGHTPAR,FOLLOW_RIGHTPAR_in_comparison197); 
+                    value = e;
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return value;
+    }
+    // $ANTLR end comparison
+
+    public static class atom_return extends ParserRuleReturnScope {
+        public Object value;
+    };
+
+    // $ANTLR start atom
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:86:1: atom returns [Object value] : ( quotedString | ID );
+    public final atom_return atom() throws RecognitionException {
+        atom_return retval = new atom_return();
+        retval.start = input.LT(1);
+
+        Token ID2=null;
+        String quotedString1 = null;
+
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:87:5: ( quotedString | ID )
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==LITERAL) ) {
+                alt4=1;
+            }
+            else if ( (LA4_0==ID) ) {
+                alt4=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("86:1: atom returns [Object value] : ( quotedString | ID );", 4, 0, input);
+
+                throw nvae;
+            }
+            switch (alt4) {
+                case 1 :
+                    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:87:9: quotedString
+                    {
+                    pushFollow(FOLLOW_quotedString_in_atom222);
+                    quotedString1=quotedString();
+                    _fsp--;
+
+                    retval.value = quotedString1;
+
+                    }
+                    break;
+                case 2 :
+                    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:88:9: ID
+                    {
+                    ID2=(Token)input.LT(1);
+                    match(input,ID,FOLLOW_ID_in_atom234); 
+
+                                Object v = memory.get(ID2.getText());
+                                if ( v != null ) {
+                                    retval.value = v;
+                                }
+                                else {
+                                	retval.value = "undefined";
+                                    throw new FailedPredicateException(input, ID2.getText(),
+                                        "Undefined variable \"" + ID2.getText() + "\"");
+                                }
+                            
+
+                    }
+                    break;
+
+            }
+            retval.stop = input.LT(-1);
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return retval;
+    }
+    // $ANTLR end atom
+
+
+    // $ANTLR start quotedString
+    // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:102:1: quotedString returns [String value] : LITERAL ;
+    public final String quotedString() throws RecognitionException {
+        String value = null;
+
+        Token LITERAL3=null;
+
+        try {
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:103:7: ( LITERAL )
+            // /Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g:103:9: LITERAL
+            {
+            LITERAL3=(Token)input.LT(1);
+            match(input,LITERAL,FOLLOW_LITERAL_in_quotedString267); 
+            value = LITERAL3.getText().substring(1, LITERAL3.getText().length() - 1);
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return value;
+    }
+    // $ANTLR end quotedString
+
+
+ 
+
+    public static final BitSet FOLLOW_orExpression_in_prog50 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_andExpression_in_orExpression77 = new BitSet(new long[]{0x0000000000000012L});
+    public static final BitSet FOLLOW_OR_in_orExpression87 = new BitSet(new long[]{0x0000000000000680L});
+    public static final BitSet FOLLOW_andExpression_in_orExpression91 = new BitSet(new long[]{0x0000000000000012L});
+    public static final BitSet FOLLOW_comparison_in_andExpression125 = new BitSet(new long[]{0x0000000000000022L});
+    public static final BitSet FOLLOW_AND_in_andExpression135 = new BitSet(new long[]{0x0000000000000680L});
+    public static final BitSet FOLLOW_comparison_in_andExpression139 = new BitSet(new long[]{0x0000000000000022L});
+    public static final BitSet FOLLOW_atom_in_comparison173 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_EQUALS_in_comparison175 = new BitSet(new long[]{0x0000000000000600L});
+    public static final BitSet FOLLOW_atom_in_comparison179 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LEFTPAR_in_comparison191 = new BitSet(new long[]{0x0000000000000680L});
+    public static final BitSet FOLLOW_orExpression_in_comparison195 = new BitSet(new long[]{0x0000000000000100L});
+    public static final BitSet FOLLOW_RIGHTPAR_in_comparison197 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_quotedString_in_atom222 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ID_in_atom234 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LITERAL_in_quotedString267 = new BitSet(new long[]{0x0000000000000002L});
+
+}
\ No newline at end of file

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions__.g
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions__.g?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions__.g (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions__.g Wed Nov 19 14:37:20 2008
@@ -0,0 +1,36 @@
+lexer grammar Expressions;
+@members {
+
+    private ErrorHandler errorHandler;
+    
+    public void setErrorHandler(ErrorHandler handler) {
+    	this.errorHandler = handler;
+    }
+
+    public void emitErrorMessage(String msg) {
+    	this.errorHandler.error(msg);
+    }
+}
+@header {
+package org.apache.lenya.ac.attr.antlr;
+import org.apache.lenya.ac.attr.ErrorHandler;
+}
+
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 106
+LITERAL: '"' ('a'..'z'|'A'..'Z'|'_'|' '|'.')* '"';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 107
+ID: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9')*;
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 108
+EQUALS: '==';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 109
+QUOT: '"';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 110
+OR: '||';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 111
+AND: '&&';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 112
+LEFTPAR: '(';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 113
+RIGHTPAR: ')';
+// $ANTLR src "/Users/nobby/apache/lenya/pure-https/trunk/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/Expressions.g" 114
+WS: (' '|'\t')+ {skip();} ;

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ParseException.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ParseException.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ParseException.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/antlr/ParseException.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,41 @@
+/*
+ * 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.apache.lenya.ac.attr.antlr;
+
+/**
+ * Thrown in attribute rule evaluators if an attribute is not defined.
+ */
+public class ParseException extends RuntimeException {
+
+    public ParseException() {
+        super();
+    }
+
+    public ParseException(String arg0, Throwable arg1) {
+        super(arg0, arg1);
+    }
+
+    public ParseException(String arg0) {
+        super(arg0);
+    }
+
+    public ParseException(Throwable arg0) {
+        super(arg0);
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeImpl.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeImpl.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeImpl.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeImpl.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,50 @@
+/*
+ * 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.apache.lenya.ac.attr.impl;
+
+import org.apache.lenya.ac.attr.Attribute;
+import org.apache.lenya.util.Assert;
+
+public class AttributeImpl implements Attribute {
+
+    private String description;
+    private String name;
+    private String alias;
+    
+    public AttributeImpl(String name, String alias, String description) {
+        Assert.notNull("name", name);
+        Assert.notNull("alias", alias);
+        Assert.notNull("description", description);
+        this.name = name;
+        this.alias = alias;
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return this.description;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getAlias() {
+        return this.alias;
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeManagerImpl.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeManagerImpl.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeManagerImpl.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeManagerImpl.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,82 @@
+/*
+ * 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.apache.lenya.ac.attr.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.activity.Initializable;
+import org.apache.avalon.framework.component.Component;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.ServiceSelector;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.lenya.ac.attr.AttributeManager;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluator;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluatorFactory;
+import org.apache.lenya.ac.attr.AttributeSet;
+
+public class AttributeManagerImpl extends AbstractLogEnabled implements Serviceable,
+        AttributeManager, Disposable, Initializable, ThreadSafe, Component {
+
+    private ServiceManager manager;
+    private ServiceSelector attrSetSelector;
+    private AttributeRuleEvaluatorFactory evaluatorFactory;
+    private Map name2attributeSet = new HashMap();
+
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+    }
+
+    public synchronized AttributeSet getAttributeSet(String name) {
+        AttributeSet attrs = (AttributeSet) this.name2attributeSet.get(name);
+        if (attrs == null) {
+            try {
+                attrs = (AttributeSet) this.attrSetSelector.select(name);
+            } catch (ServiceException e) {
+                throw new RuntimeException(e);
+            }
+            this.name2attributeSet.put(name, attrs);
+        }
+        return attrs;
+    }
+
+    public AttributeRuleEvaluator getEvaluator() {
+        return this.evaluatorFactory.getEvaluator();
+    }
+
+    public void dispose() {
+        if (this.attrSetSelector != null) {
+            this.manager.release(this.attrSetSelector);
+        }
+        if (this.evaluatorFactory != null) {
+            this.manager.release(this.evaluatorFactory);
+        }
+    }
+
+    public void initialize() throws Exception {
+        this.attrSetSelector = (ServiceSelector) this.manager
+                .lookup(AttributeSet.ROLE + "Selector");
+        this.evaluatorFactory = (AttributeRuleEvaluatorFactory) this.manager
+                .lookup(AttributeRuleEvaluatorFactory.ROLE);
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeRuleImpl.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeRuleImpl.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeRuleImpl.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeRuleImpl.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,84 @@
+/*
+ * 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.apache.lenya.ac.attr.impl;
+
+import org.apache.lenya.ac.AccessControlException;
+import org.apache.lenya.ac.attr.AttributeOwner;
+import org.apache.lenya.ac.attr.AttributeRule;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluator;
+import org.apache.lenya.ac.attr.AttributeSet;
+import org.apache.lenya.ac.attr.Message;
+import org.apache.lenya.ac.attr.ValidationResult;
+import org.apache.lenya.util.Assert;
+
+/**
+ * Attribute rule implementation.
+ */
+public class AttributeRuleImpl implements AttributeRule {
+    
+    /**
+     * @param rule
+     * @param attrSet
+     * @param evaluator
+     * @throws AccessControlException if the rule is not valid.
+     */
+    public AttributeRuleImpl(String rule, AttributeSet attrSet, AttributeRuleEvaluator evaluator)
+            throws AccessControlException {
+        Assert.notNull("rule", rule);
+        Assert.notNull("attribute set", attrSet);
+        Assert.notNull("evaluator", evaluator);
+        
+        ValidationResult result = evaluator.validate(rule, attrSet);
+        if (!result.succeeded()) {
+            StringBuffer msg = new StringBuffer();
+            Message[] messages = result.getMessages();
+            for (int i = 0; i < messages.length; i++) {
+                if (i > 0) {
+                    msg.append("; ");
+                }
+                msg.append(messages[i].getText());
+            }
+            throw new AccessControlException("The rule is not valid: " + msg.toString());
+        }
+        
+        this.rule = rule;
+        this.attributeSet = attrSet;
+        this.evaluator = evaluator;
+    }
+    
+    private String rule;
+    private AttributeSet attributeSet;
+    private AttributeRuleEvaluator evaluator;
+
+    public AttributeSet getAttributeSet() {
+        return this.attributeSet;
+    }
+
+    public String getRule() {
+        return this.rule;
+    }
+
+    public boolean matches(AttributeOwner owner) {
+        return this.evaluator.isComplied(owner, getRule());
+    }
+
+    public String toString() {
+        return getRule();
+    }
+    
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeSetImpl.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeSetImpl.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeSetImpl.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/AttributeSetImpl.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,80 @@
+/*
+ * 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.apache.lenya.ac.attr.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.lenya.ac.attr.Attribute;
+import org.apache.lenya.ac.attr.AttributeSet;
+import org.apache.lenya.util.Assert;
+
+/**
+ * SAML attribute translator implementation.
+ */
+public class AttributeSetImpl extends AbstractLogEnabled implements AttributeSet, Configurable {
+
+    private static final String CONF_ATTRIBUTE = "Attribute";
+    private static final String CONF_ATTRIBUTE_NAME = "name";
+    private static final String CONF_ATTRIBUTE_ALIAS = "alias";
+    private static final String CONF_ATTRIBUTE_DESCRIPTION = "description";
+
+    /**
+     * Separator for multiple values.
+     */
+    public static final String MULTIVALUE_SEPARATOR = ";";
+
+    private Map name2attr;
+    private String name;
+
+    public void configure(Configuration attrTransConfig) throws ConfigurationException {
+        this.name2attr = new HashMap();
+        this.name = attrTransConfig.getAttribute(CONF_ATTRIBUTE_NAME);
+        Configuration[] transList = attrTransConfig.getChildren();
+        for (int i = 0; i < transList.length; i++) {
+            if (!transList[i].getName().equals(CONF_ATTRIBUTE))
+                throw new ConfigurationException("Invalid child config element: "
+                        + transList[i].getName());
+            String name = transList[i].getAttribute(CONF_ATTRIBUTE_NAME);
+            String alias = transList[i].getAttribute(CONF_ATTRIBUTE_ALIAS, name);
+            String descr = transList[i].getAttribute(CONF_ATTRIBUTE_DESCRIPTION, "");
+            Attribute attr = new AttributeImpl(name, alias, descr);
+            this.name2attr.put(name, attr);
+        }
+    }
+
+    public Attribute getAttribute(String name) {
+        Assert.isTrue("Attribute '" + name + "' exists", this.name2attr.containsKey(name));
+        return (Attribute) this.name2attr.get(name);
+    }
+
+    public String[] getAttributeNames() {
+        Set names = this.name2attr.keySet();
+        return (String[]) names.toArray(new String[names.size()]);
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+}

Added: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/EmptyAttributeSet.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/EmptyAttributeSet.java?rev=719102&view=auto
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/EmptyAttributeSet.java (added)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/attr/impl/EmptyAttributeSet.java Wed Nov 19 14:37:20 2008
@@ -0,0 +1,41 @@
+/*
+ * 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.apache.lenya.ac.attr.impl;
+
+import org.apache.lenya.ac.attr.Attribute;
+import org.apache.lenya.ac.attr.AttributeSet;
+
+/**
+ * An empty attribute set.
+ */
+public class EmptyAttributeSet implements AttributeSet {
+    
+    private static final String NAME = "empty";
+
+    public Attribute getAttribute(String name) {
+        throw new RuntimeException("No attributes defined.");
+    }
+
+    public String[] getAttributeNames() {
+        return new String[0];
+    }
+
+    public String getName() {
+        return NAME;
+    }
+
+}

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileAccreditableManager.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileAccreditableManager.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileAccreditableManager.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileAccreditableManager.java Wed Nov 19 14:37:20 2008
@@ -28,6 +28,7 @@
 import java.util.Set;
 
 import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.util.NetUtils;
 import org.apache.excalibur.source.Source;
@@ -38,6 +39,7 @@
 import org.apache.lenya.ac.RoleManager;
 import org.apache.lenya.ac.UserManager;
 import org.apache.lenya.ac.UserType;
+import org.apache.lenya.ac.attr.AttributeManager;
 import org.apache.lenya.ac.impl.AbstractAccreditableManager;
 import org.apache.lenya.util.Assert;
 
@@ -204,4 +206,17 @@
         }
     }
 
+    private AttributeManager attributeMgr;
+
+    public AttributeManager getAttributeManager() {
+        if (this.attributeMgr == null) {
+            try {
+                this.attributeMgr = (AttributeManager) this.manager.lookup(AttributeManager.ROLE);
+            } catch (ServiceException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return this.attributeMgr;
+    }
+
 }

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileGroup.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileGroup.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileGroup.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileGroup.java Wed Nov 19 14:37:20 2008
@@ -28,6 +28,7 @@
 import org.apache.avalon.framework.configuration.DefaultConfigurationSerializer;
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.lenya.ac.AccessControlException;
+import org.apache.lenya.ac.Accreditable;
 import org.apache.lenya.ac.Item;
 import org.apache.lenya.ac.ItemManager;
 import org.apache.lenya.ac.impl.AbstractGroup;
@@ -132,4 +133,5 @@
         assert (_configurationDirectory != null) && _configurationDirectory.isDirectory();
         this.configurationDirectory = _configurationDirectory;
     }
+
 }
\ No newline at end of file

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileIPRange.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileIPRange.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileIPRange.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileIPRange.java Wed Nov 19 14:37:20 2008
@@ -163,4 +163,5 @@
 
         return config;
     }
+
 }
\ No newline at end of file

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileItemManager.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileItemManager.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileItemManager.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileItemManager.java Wed Nov 19 14:37:20 2008
@@ -494,4 +494,13 @@
         return this.accreditableManager;
     }
 
+    protected boolean containsItem(String id) {
+        try {
+            loadItems();
+        } catch (AccessControlException e) {
+            throw new IllegalStateException(e.getMessage());
+        }
+        return this.items.containsKey(id);
+    }
+
 }

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FilePolicyManager.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FilePolicyManager.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FilePolicyManager.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FilePolicyManager.java Wed Nov 19 14:37:20 2008
@@ -534,7 +534,7 @@
         Set grantedRoles = new HashSet();
         Policy policy = getPolicy(accreditableManager, url);
         for (int i = 0; i < roles.length; i++) {
-            if (policy.check(identity, roles[i]) == Policy.RESULT_GRANTED) {
+            if (policy.check(identity, roles[i], accreditableManager) == Policy.RESULT_GRANTED) {
                 grantedRoles.add(roles[i]);
             }
         }

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUser.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUser.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUser.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUser.java Wed Nov 19 14:37:20 2008
@@ -31,6 +31,7 @@
 import org.apache.lenya.ac.GroupManager;
 import org.apache.lenya.ac.Item;
 import org.apache.lenya.ac.ItemManager;
+import org.apache.lenya.ac.ManagedUser;
 import org.apache.lenya.ac.impl.AbstractUser;
 import org.apache.lenya.ac.impl.ItemConfiguration;
 
@@ -38,7 +39,7 @@
  * File-based user implementation.
  * @version $Id$
  */
-public class FileUser extends AbstractUser implements Item, Serializable {
+public class FileUser extends AbstractUser implements Item, Serializable, ManagedUser {
 
     /**
      * 

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUserManager.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUserManager.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUserManager.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/file/FileUserManager.java Wed Nov 19 14:37:20 2008
@@ -138,4 +138,8 @@
         return SUFFIX;
     }
 
+    public boolean contains(String userId) {
+        return containsItem(userId);
+    }
+
 }
\ No newline at end of file

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroup.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroup.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroup.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroup.java Wed Nov 19 14:37:20 2008
@@ -29,13 +29,17 @@
 import org.apache.lenya.ac.Group;
 import org.apache.lenya.ac.Groupable;
 import org.apache.lenya.ac.ItemManager;
-
+import org.apache.lenya.ac.attr.AttributeOwner;
+import org.apache.lenya.ac.attr.AttributeRule;
+import org.apache.lenya.ac.attr.AttributeRuleEvaluator;
 
 /**
  * A group is a set of {@link Groupable}s.
  */
-public abstract class AbstractGroup extends AbstractItem implements Accreditable, Group {
+public abstract class AbstractGroup extends AbstractItem implements Group {
     
+    private static final long serialVersionUID = 1L;
+
     /**
      * Creates a new group.
      * @param itemManager The item manager.
@@ -106,14 +110,6 @@
     }
 
     /**
-     * @see org.apache.lenya.ac.Accreditable#getAccreditables()
-     */
-    public Accreditable[] getAccreditables() {
-        Accreditable[] accreditables = { this };
-        return accreditables;
-    }
-    
-    /**
      * Delete a group
      * @throws AccessControlException if the delete failed
      */
@@ -121,4 +117,27 @@
         removeAllMembers();
     }
 
+    public boolean matches(AttributeOwner user) {
+        AttributeRule rule = getRule();
+        return rule == null ? false : rule.matches(user);
+    }
+
+    protected AttributeRuleEvaluator getAttributeRuleEvaluator() {
+        return getItemManager().getAccreditableManager().getAttributeManager().getEvaluator();
+    }
+
+    private AttributeRule rule;
+
+    public void setRule(AttributeRule rule) {
+        this.rule = rule;
+    }
+
+    public AttributeRule getRule() {
+        return this.rule;
+    }
+
+    public Accreditable[] getAccreditablesToAuthorize() {
+        Accreditable[] accrs = { this };
+        return accrs;
+    }
 }

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroupable.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroupable.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroupable.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractGroupable.java Wed Nov 19 14:37:20 2008
@@ -81,20 +81,10 @@
         }
     }
 
-    /**
-     * @see org.apache.lenya.ac.Accreditable#getAccreditables()
-     */
-    public Accreditable[] getAccreditables() {
+    public Accreditable[] getAccreditablesToAuthorize() {
         Set accreditables = new HashSet();
         accreditables.add(this);
-
-        Group[] _groups = getGroups();
-
-        for (int i = 0; i < _groups.length; i++) {
-            Accreditable[] groupAccreditables = _groups[i].getAccreditables();
-            accreditables.addAll(Arrays.asList(groupAccreditables));
-        }
-
+        accreditables.addAll(Arrays.asList(getGroups()));
         return (Accreditable[]) accreditables.toArray(new Accreditable[accreditables.size()]);
     }
     

Modified: lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractUser.java
URL: http://svn.apache.org/viewvc/lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractUser.java?rev=719102&r1=719101&r2=719102&view=diff
==============================================================================
--- lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractUser.java (original)
+++ lenya/sandbox/access_control_redesign/src/modules-core/ac/java/src/org/apache/lenya/ac/impl/AbstractUser.java Wed Nov 19 14:37:20 2008
@@ -18,8 +18,15 @@
 
 package org.apache.lenya.ac.impl;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.lenya.ac.AccessControlException;
+import org.apache.lenya.ac.Group;
 import org.apache.lenya.ac.ItemManager;
 import org.apache.lenya.ac.Password;
 import org.apache.lenya.ac.User;
@@ -116,7 +123,7 @@
      * @return Returns the defaultDocumentLocale.
      */
     public String getDefaultDocumentLocale() {
-        return defaultDocumentLocale;
+        return this.defaultDocumentLocale;
     }
 
     /**
@@ -130,7 +137,7 @@
      * @return Returns the defaultMenuLocale.
      */
     public String getDefaultMenuLocale() {
-        return defaultMenuLocale;
+        return this.defaultMenuLocale;
     }
 
     /**
@@ -168,4 +175,63 @@
         return this.encryptedPassword.equals(Password.encrypt(password));
     }
 
+    private Map attributes = new HashMap();
+
+    public String[] getAttributeValues(String name) throws AccessControlException {
+        return (String[]) this.attributes.get(name);
+    }
+
+    public String[] getAttributeNames() {
+        Set names = this.attributes.keySet();
+        return (String[]) names.toArray(new String[names.size()]);
+    }
+
+    /**
+     * Sets an attribute.
+     * @param name The name.
+     * @param values The values.
+     * @throws AccessControlException if the attribute name is not supported.
+     */
+    public void setAttributeValues(String name, String[] values) throws AccessControlException {
+        this.attributes.put(name, values);
+    }
+
+    protected boolean hasAttributes() {
+        return !this.attributes.isEmpty();
+    }
+
+    /**
+     * @return The explicitly assigned groups, which excludes groups that contain this user because
+     *         it matches the group's rule.
+     */
+    protected Group[] getExplicitlyAssignedGroups() {
+        return super.getGroups();
+    }
+
+    public Group[] getGroups() {
+        Set groups = new HashSet();
+        groups.addAll(Arrays.asList(getExplicitlyAssignedGroups()));
+        groups.addAll(Arrays.asList(getRuleGroups()));
+        return (Group[]) groups.toArray(new Group[groups.size()]);
+    }
+    
+    
+    protected Group[] getRuleGroups() {
+        Set ruleGroups = new HashSet();
+        if (hasAttributes()) {
+            try {
+                Group[] groups = getItemManager().getAccreditableManager().getGroupManager()
+                        .getGroups();
+                for (int i = 0; i < groups.length; i++) {
+                    if (groups[i].matches(this)) {
+                        ruleGroups.add(groups[i]);
+                    }
+                }
+            } catch (AccessControlException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return (Group[]) ruleGroups.toArray(new Group[ruleGroups.size()]);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org