Author: rdonkin
Date: Fri Jul 24 06:38:40 2009
New Revision: 797335

URL: http://svn.apache.org/viewvc?rev=797335&view=rev
Log:
JSIEVE-56 Add setter for context, to allow MailAdapter implementations to 
access the environment of the current script execution 
https://issues.apache.org/jira/browse/JSIEVE-56

Modified:
    
james/jsieve/trunk/mailet/src/main/java/org/apache/jsieve/mailet/SieveMailAdapter.java
    james/jsieve/trunk/main/src/main/java/org/apache/jsieve/SieveFactory.java
    
james/jsieve/trunk/main/src/main/java/org/apache/jsieve/mail/MailAdapter.java
    
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
    
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/utils/SieveMailAdapter.java
    
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java

Modified: 
james/jsieve/trunk/mailet/src/main/java/org/apache/jsieve/mailet/SieveMailAdapter.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/mailet/src/main/java/org/apache/jsieve/mailet/SieveMailAdapter.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- 
james/jsieve/trunk/mailet/src/main/java/org/apache/jsieve/mailet/SieveMailAdapter.java
 (original)
+++ 
james/jsieve/trunk/mailet/src/main/java/org/apache/jsieve/mailet/SieveMailAdapter.java
 Fri Jul 24 06:38:40 2009
@@ -19,7 +19,6 @@
 
 package org.apache.jsieve.mailet;
 import java.io.IOException;
-import java.lang.ref.PhantomReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -42,6 +41,7 @@
 import org.apache.james.mime4j.field.address.Mailbox;
 import org.apache.james.mime4j.field.address.MailboxList;
 import org.apache.james.mime4j.field.address.parser.ParseException;
+import org.apache.jsieve.SieveContext;
 import org.apache.jsieve.exception.InternetAddressException;
 import org.apache.jsieve.exception.SieveException;
 import org.apache.jsieve.mail.Action;
@@ -464,6 +464,6 @@
             throw new SieveMailException(e);
         }
     }
-    
-    
+
+    public void setContext(SieveContext context) {}
 }

Modified: 
james/jsieve/trunk/main/src/main/java/org/apache/jsieve/SieveFactory.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/main/src/main/java/org/apache/jsieve/SieveFactory.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- james/jsieve/trunk/main/src/main/java/org/apache/jsieve/SieveFactory.java 
(original)
+++ james/jsieve/trunk/main/src/main/java/org/apache/jsieve/SieveFactory.java 
Fri Jul 24 06:38:40 2009
@@ -136,38 +136,47 @@
      */
     public void evaluate(MailAdapter mail, Node startNode)
             throws SieveException {
-        SieveContext context = new BaseSieveContext(commandManager,
+        final SieveContext context = new BaseSieveContext(commandManager,
                 comparatorManager, testManager, log);
-        SieveParserVisitor visitor = new SieveParserVisitorImpl(context);
         try {
-            // Evaluate the Nodes
-            startNode.jjtAccept(visitor, mail);
-
-        } catch (StopException ex) {
-            // Stop is OK
-        } catch (SieveException ex) {
-            if (log.isErrorEnabled())
-                log.error("Evaluation failed. Reason: " + ex.getMessage());
-            if (log.isDebugEnabled())
-                log.debug("Evaluation failed.", ex);
-            throw ex;
-        }
-
-        // If after evaluating all of the nodes or stopping, implicitKeep is
-        // still
-        // in effect, add a Keep to the list of Actions.
-        if (context.getCommandStateManager().isImplicitKeep())
-            mail.addAction(new ActionKeep());
-
-        // Execute the List of Actions
-        try {
-            mail.executeActions();
-        } catch (SieveException ex) {
-            if (log.isErrorEnabled())
-                log.error("Evaluation failed. Reason: " + ex.getMessage());
-            if (log.isDebugEnabled())
-                log.debug("Evaluation failed.", ex);
-            throw ex;
+            // Ensure that the context is set on the mail
+            mail.setContext(context);
+            
+            SieveParserVisitor visitor = new SieveParserVisitorImpl(context);
+            try {
+                // Evaluate the Nodes
+                startNode.jjtAccept(visitor, mail);
+    
+            } catch (StopException ex) {
+                // Stop is OK
+            } catch (SieveException ex) {
+                if (log.isErrorEnabled())
+                    log.error("Evaluation failed. Reason: " + ex.getMessage());
+                if (log.isDebugEnabled())
+                    log.debug("Evaluation failed.", ex);
+                throw ex;
+            }
+    
+            // If after evaluating all of the nodes or stopping, implicitKeep 
is
+            // still
+            // in effect, add a Keep to the list of Actions.
+            if (context.getCommandStateManager().isImplicitKeep())
+                mail.addAction(new ActionKeep());
+    
+            // Execute the List of Actions
+            try {
+                mail.executeActions();
+            } catch (SieveException ex) {
+                if (log.isErrorEnabled())
+                    log.error("Evaluation failed. Reason: " + ex.getMessage());
+                if (log.isDebugEnabled())
+                    log.debug("Evaluation failed.", ex);
+                throw ex;
+            }
+        } finally {
+            // Tidy up by ensuring that a reference to the context is not held 
by the adapter.
+            // This prevents leaks when the adapter stores the context in a 
thread local variable.
+            mail.setContext(null);
         }
     }
 

Modified: 
james/jsieve/trunk/main/src/main/java/org/apache/jsieve/mail/MailAdapter.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/main/src/main/java/org/apache/jsieve/mail/MailAdapter.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- 
james/jsieve/trunk/main/src/main/java/org/apache/jsieve/mail/MailAdapter.java 
(original)
+++ 
james/jsieve/trunk/main/src/main/java/org/apache/jsieve/mail/MailAdapter.java 
Fri Jul 24 06:38:40 2009
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.ListIterator;
 
+import org.apache.jsieve.SieveContext;
 import org.apache.jsieve.exception.InternetAddressException;
 import org.apache.jsieve.exception.SieveException;
 
@@ -70,6 +71,21 @@
  * </pre></code>
  */
 public interface MailAdapter {
+    
+    /**
+     * <p>Sets the context for the current sieve script execution.</p>
+     * <p>Sieve engines <code>MUST</code> set this property before any calls
+     * related to the execution of a script are made.</p>
+     * <p>Implementations intended to be shared between separate threads of
+     * execution <code>MUST</code> ensure that they manage concurrency 
contexts,
+     * for example by storage in a thread local variable. Engines 
<code>MUST</code>
+     * - for a script execution - ensure that all calls are made within the
+     * same thread of execution.</p>
+     * @param context the current context, 
+     * or null to clear the contest once the execution of a script has 
completed.
+     */
+    public void setContext(SieveContext context);
+    
     /**
      * Method getActions answers the List of Actions accumulated by the
      * receiver. Implementations may elect to supply an unmodifiable 
collection.

Modified: 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/main/src/test/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
 (original)
+++ 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
 Fri Jul 24 06:38:40 2009
@@ -31,6 +31,7 @@
 import javax.mail.Message;
 import javax.mail.MessagingException;
 
+import org.apache.jsieve.SieveContext;
 import org.apache.jsieve.exception.SieveException;
 import org.apache.jsieve.mail.Action;
 import org.apache.jsieve.mail.MailAdapter;
@@ -311,4 +312,6 @@
         }
     }
 
+    public void setContext(SieveContext context) {}
+
 }

Modified: 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/utils/SieveMailAdapter.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/main/src/test/java/org/apache/jsieve/utils/SieveMailAdapter.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/utils/SieveMailAdapter.java
 (original)
+++ 
james/jsieve/trunk/main/src/test/java/org/apache/jsieve/utils/SieveMailAdapter.java
 Fri Jul 24 06:38:40 2009
@@ -35,6 +35,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jsieve.SieveContext;
 import org.apache.jsieve.exception.SieveException;
 import org.apache.jsieve.mail.Action;
 import org.apache.jsieve.mail.MailAdapter;
@@ -296,4 +297,5 @@
         return contentAsLowerCaseString;
     }
 
+    public void setContext(SieveContext context) {}
 }

Modified: 
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
URL: 
http://svn.apache.org/viewvc/james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java?rev=797335&r1=797334&r2=797335&view=diff
==============================================================================
--- 
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
 (original)
+++ 
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/check/ScriptCheckMailAdapter.java
 Fri Jul 24 06:38:40 2009
@@ -32,6 +32,7 @@
 import javax.mail.Message;
 import javax.mail.MessagingException;
 
+import org.apache.jsieve.SieveContext;
 import org.apache.jsieve.exception.SieveException;
 import org.apache.jsieve.mail.Action;
 import org.apache.jsieve.mail.MailAdapter;
@@ -313,4 +314,6 @@
         return result;
     }
 
+    public void setContext(SieveContext context) {}
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to