You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/02/14 18:26:13 UTC

svn commit: r910050 - in /james/mailet/standard/trunk/src: main/java/org/apache/james/transport/matchers/ test/java/org/apache/james/transport/matchers/

Author: norman
Date: Sun Feb 14 17:26:13 2010
New Revision: 910050

URL: http://svn.apache.org/viewvc?rev=910050&view=rev
Log:
Add And,Not,Or and XOR Matcher. Part of JAMES-948. Thx to Ralph B Holland for the patch

Added:
    james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/And.java
    james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Not.java
    james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Or.java
    james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Xor.java
    james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/AndTest.java
    james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/OrTest.java
    james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/XorTest.java

Added: james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/And.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/And.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/And.java (added)
+++ james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/And.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,109 @@
+package org.apache.james.transport.matchers;
+
+/****************************************************************
+ * 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.                                           *
+ ****************************************************************/
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Mail;
+import javax.mail.MessagingException;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.base.CompositeMatcherBase;
+
+/**
+ * This matcher performs And conjunction between the two recipients
+ * 
+ */
+public class And extends CompositeMatcherBase {
+
+    /**
+     * This is the And CompositeMatcher - consider it to be an intersection of
+     * the results. If any match returns an empty recipient result the matching
+     * is short-circuited.
+     * 
+     * @return Collection of Recipient from the And composition results of the
+     *         child Matchers.
+     */
+    public Collection match(Mail mail) throws MessagingException {
+        Collection finalResult = null;
+        Matcher matcher = null;
+        boolean first = true;
+        for (Iterator matcherIter = iterator(); matcherIter.hasNext();) {
+            matcher = (Matcher) (matcherIter.next());
+            Collection result = matcher.match(mail);
+
+            if (result == null) {
+                // short-circuit
+                // log("Matching with " +
+                // matcher.getMatcherConfig().getMatcherName() +
+                // " result.size()=0");
+                return new ArrayList(0);
+            }
+            if (result.size() == 0) {
+                return result;
+            }
+
+            // log("Matching with " +
+            // matcher.getMatcherConfig().getMatcherName() +
+            // " result.size()="+result.size());
+
+            if (first) {
+                finalResult = result;
+                first = false;
+            } else {
+                // Check if we need to And ...
+                // if the finalResult and the subsequent result are the same
+                // collection, then it contains the same recipients
+                // so we can short-circuit building the AND of the two
+                if (finalResult != result) {
+                    if (result != null) {
+                        // the two results are different collections, so we AND
+                        // them
+                        // Ensure that the finalResult only contains recipients
+                        // in the result collection
+                        Collection newResult = new ArrayList();
+                        MailAddress recipient = null;
+                        for (Iterator i = finalResult.iterator(); i.hasNext();) {
+                            recipient = (MailAddress) i.next();
+                            // log("recipient="+recipient.toString());
+                            if (result.contains(recipient)) {
+                                newResult.add(recipient);
+                            }
+                        }
+                        recipient = null;
+                        // basically the finalResult gets replaced with a
+                        // smaller result
+                        // otherwise finalResult would have been equal to result
+                        // (in all cases)
+                        finalResult = newResult;
+                    } else {
+                        finalResult = result;
+                    }
+                }
+            }
+            result = null;
+        }
+        matcher = null;
+        // log("answer is "+finalResult.toString());
+        return finalResult;
+    }
+
+}

Added: james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Not.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Not.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Not.java (added)
+++ james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Not.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,60 @@
+package org.apache.james.transport.matchers;
+
+/****************************************************************
+ * 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.                                           *
+ ****************************************************************/
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.CompositeMatcherBase;
+
+import javax.mail.MessagingException;
+
+public class Not extends CompositeMatcherBase {
+
+    /**
+     * This is the Not CompositeMatcher - consider what wasn't in the result set
+     * of each child matcher. Of course it is easier to understand if it only
+     * includes one matcher in the composition, the normal recommended use. @See
+     * CompositeMatcher interface.
+     * 
+     * @return Collectiom of Recipient from the Negated composition of the child
+     *         Matcher(s).
+     */
+    public Collection match(Mail mail) throws MessagingException {
+        Collection finalResult = mail.getRecipients();
+        Matcher matcher = null;
+        for (Iterator matcherIter = iterator(); matcherIter.hasNext();) {
+            matcher = (Matcher) (matcherIter.next());
+            // log("Matching with " +
+            // matcher.getMatcherConfig().getMatcherName());
+            Collection result = matcher.match(mail);
+            if (result == finalResult) {
+                // Not is an empty list
+                finalResult = null;
+            } else if (result != null) {
+                finalResult = new ArrayList(finalResult);
+                finalResult.removeAll(result);
+            }
+        }
+        return finalResult;
+    }
+}

Added: james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Or.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Or.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Or.java (added)
+++ james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Or.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,105 @@
+/****************************************************************
+ * 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.james.transport.matchers;
+
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Mail;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.base.CompositeMatcherBase;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+import javax.mail.MessagingException;
+
+public class Or extends CompositeMatcherBase {
+
+    /**
+     * This is the Or CompositeMatcher - consider it to be a union of the
+     * results. If any match results in a full set of recipients the matching is
+     * short-circuited.
+     * 
+     * @return Collection of Recipient from the Or composition results of the
+     *         child matchers.
+     */
+    public Collection match(Mail mail) throws MessagingException {
+        Collection finalResult = null;
+        Matcher matcher = null;
+        boolean first = true;
+
+        // the size of the complete set of recipients
+        int size = mail.getRecipients().size();
+
+        // Loop through until the finalResult is full or all the child matchers
+        // have been executed
+        for (Iterator matcherIter = iterator(); matcherIter.hasNext();) {
+            matcher = (Matcher) matcherIter.next();
+            // log("Matching with "
+            // + matcher
+            // .getMatcherConfig()
+            // .getMatcherName()
+            // );
+            Collection result = matcher.match(mail);
+            if (first) {
+                if (result == null) {
+                    result = new ArrayList(0);
+                }
+                finalResult = result;
+                first = false;
+            } else {
+                // Check if we need to Or ...
+                // if the finalResult and the subsequent result are the same
+                // collection, then it contains the same recipients
+                // so we can short-circuit building the OR of the two
+                if (finalResult != result) {
+                    if (result != null) {
+                        if (finalResult == null) {
+                            finalResult = result;
+                        } else {
+                            // the two results are different collections, so we
+                            // must OR them
+                            // Ensure that the finalResult only contains one
+                            // copy of the recipients in the result collection
+                            MailAddress recipient = null;
+                            for (Iterator i = result.iterator(); i.hasNext();) {
+                                recipient = (MailAddress) i.next();
+                                if (!finalResult.contains(recipient)) {
+                                    finalResult.add(recipient);
+                                }
+                            }
+                            recipient = null;
+                        }
+                    }
+                }
+            }
+            if (finalResult.size() == size) {
+                // we have a complete set of recipients, no need to OR in
+                // anymore
+                // i.e. short-circuit the Or
+                break;
+            }
+            result = null;
+            matcher = null;
+        }
+        // log("OrMatch: end.");
+        return finalResult;
+    }
+
+}

Added: james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Xor.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Xor.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Xor.java (added)
+++ james/mailet/standard/trunk/src/main/java/org/apache/james/transport/matchers/Xor.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,93 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.transport.matchers;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Mail;
+import javax.mail.MessagingException;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.base.CompositeMatcherBase;
+
+public class Xor extends CompositeMatcherBase {
+
+    /**
+     * This is the Xor CompositeMatcher - consider it to be the inequality
+     * operator for recipients. If any recipients match other matcher results
+     * then the result does not include that recipient.
+     * 
+     * @return Collection of Recipients from the Xor composition of the child
+     *         matchers.
+     */
+    public Collection match(Mail mail) throws MessagingException {
+        Collection finalResult = null;
+        Matcher matcher = null;
+        boolean first = true;
+        for (Iterator matcherIter = iterator(); matcherIter.hasNext();) {
+            matcher = (Matcher) (matcherIter.next());
+            Collection result = matcher.match(mail);
+            if (result == null) {
+                result = new ArrayList(0);
+            }
+            // log("Matching with " +
+            // matcher.getMatcherConfig().getMatcherName() +
+            // " result="+result.toString() );
+
+            if (first) {
+                finalResult = result;
+                first = false;
+            } else {
+                // Check if we need to Xor ...
+                // if the finalResult and the subsequent result are the same
+                // collection, then it contains the same recipients
+                // so we can short-circuit building the XOR and return an empty
+                // set
+                if (finalResult == result) {
+                    // the XOR of the same collection is empty
+                    finalResult.clear();
+                    // log("same collection - so clear");
+                } else {
+                    // the two results are different collections, so we XOR them
+                    // Ensure that the finalResult does not contain recipients
+                    // in the result collection
+                    MailAddress recipient = null;
+                    for (Iterator i = result.iterator(); i.hasNext();) {
+                        recipient = (MailAddress) (i.next());
+                        if (!finalResult.contains(recipient)) {
+                            finalResult.add(recipient);
+                        } else {
+                            finalResult.remove(recipient);
+                        }
+                    }
+                    recipient = null;
+                    // log("xor recipients into new finalResult="+finalResult);
+                }
+                // basically the finalResult gets replaced with a smaller result
+                // otherwise finalResult would have been equal to result (in all
+                // cases)
+            }
+            result = null;
+        }
+        return finalResult;
+    }
+
+}

Added: james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/AndTest.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/AndTest.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/AndTest.java (added)
+++ james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/AndTest.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.james.transport.matchers;
+
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.CompositeMatcher;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.ParseException;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collection;
+
+import junit.framework.TestCase;
+
+public class AndTest extends TestCase {
+
+    private FakeMailContext context;
+    private FakeMail mockedMail;
+
+    private CompositeMatcher matcher;
+
+    public AndTest(String arg0) throws UnsupportedEncodingException {
+        super(arg0);
+    }
+
+    private void setupMockedMail() throws ParseException {
+        mockedMail = new FakeMail();
+        mockedMail.setRecipients(Arrays.asList(new MailAddress[] {
+        new MailAddress("test@james.apache.org"),
+        new MailAddress("test2@james.apache.org") }));
+
+    }
+
+    /**
+     * Setup a composite Or matcher and test it
+     * @throws MessagingException
+     */
+    private void setupMatcher() throws MessagingException {
+        context = new FakeMailContext();
+        matcher = new And();
+        FakeMatcherConfig mci = new FakeMatcherConfig("And",context);
+        matcher.init(mci);
+    }
+    
+    private void setupChild(String match) throws MessagingException
+    {
+        Matcher child = null;
+        if (match.equals("All"))
+        {
+            child = new All();
+        }
+        else
+        {
+            child = new RecipientIs();
+        }
+        FakeMatcherConfig sub = new FakeMatcherConfig(match,context);
+        child.init(sub);
+        matcher.add(child);
+        
+    }
+
+    // test if all recipients was returned
+    public void testAndIntersectSameTwice() throws MessagingException {
+        setupMockedMail();
+        setupMatcher();
+        setupChild("RecipientIs=test@james.apache.org");
+        setupChild("RecipientIs=test@james.apache.org");
+        setupChild("All");
+            
+        Collection matchedRecipients = matcher.match(mockedMail);
+
+        assertNotNull(matchedRecipients);
+        assertEquals(1,matchedRecipients.size());
+        MailAddress address = (MailAddress)matchedRecipients.iterator().next();
+        assertEquals(address,"test@james.apache.org");
+    }
+    
+    public void testAndNoIntersect() throws MessagingException {
+        setupMockedMail();
+        setupMatcher();
+        setupChild("RecipientIs=test@james.apache.org");
+        setupChild("RecipientIs=test2@james.apache.org");
+            
+        Collection matchedRecipients = matcher.match(mockedMail);
+
+        assertNotNull(matchedRecipients);
+        assertEquals(0,matchedRecipients.size());
+    }
+    
+
+}

Added: james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/OrTest.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/OrTest.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/OrTest.java (added)
+++ james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/OrTest.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,96 @@
+/****************************************************************
+ * 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.james.transport.matchers;
+
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.CompositeMatcher;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.ParseException;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+public class OrTest extends TestCase {
+
+    private FakeMail mockedMail;
+
+    private CompositeMatcher matcher;
+
+    public OrTest(String arg0) throws UnsupportedEncodingException {
+        super(arg0);
+    }
+
+    private void setupMockedMail() throws ParseException {
+        mockedMail = new FakeMail();
+        mockedMail.setRecipients(Arrays.asList(new MailAddress[] {
+        new MailAddress("test@james.apache.org"),
+        new MailAddress("test2@james.apache.org") }));
+
+    }
+
+    /**
+     * Setup a composite Or matcher and test it
+     * @throws MessagingException
+     */
+    private void setupMatcher() throws MessagingException {
+        FakeMailContext context = new FakeMailContext();
+        matcher = new Or();
+        FakeMatcherConfig mci = new FakeMatcherConfig("Or",context);
+        matcher.init(mci);
+        Matcher child = null;
+        FakeMatcherConfig sub = null;
+        child = new RecipientIs();
+        sub = new FakeMatcherConfig("RecipientIsRegex=test@james.apache.org",context);
+        child.init(sub);
+        matcher.add(child);
+        child = new RecipientIs();
+        sub = new FakeMatcherConfig("RecipientIsRegex=test2@james.apache.org",context);
+        child.init(sub);
+        matcher.add(child);
+    }
+
+    // test if all recipients was returned
+    public void testAllRecipientsReturned() throws MessagingException {
+        setupMockedMail();
+        setupMatcher();
+
+        Collection matchedRecipients = matcher.match(mockedMail);
+
+        assertNotNull(matchedRecipients);
+        assertEquals(matchedRecipients.size(), mockedMail.getRecipients().size());
+        
+        // Now ensure they match the actual recipients
+        Iterator iterator = matchedRecipients.iterator(); 
+        MailAddress address = (MailAddress)iterator.next();
+        assertEquals(address,"test@james.apache.org");
+        address = (MailAddress)iterator.next();
+        assertEquals(address,"test2@james.apache.org");
+    }
+
+}

Added: james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/XorTest.java
URL: http://svn.apache.org/viewvc/james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/XorTest.java?rev=910050&view=auto
==============================================================================
--- james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/XorTest.java (added)
+++ james/mailet/standard/trunk/src/test/java/org/apache/james/transport/matchers/XorTest.java Sun Feb 14 17:26:13 2010
@@ -0,0 +1,118 @@
+/****************************************************************
+ * 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.james.transport.matchers;
+
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.Matcher;
+import org.apache.mailet.CompositeMatcher;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.ParseException;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+public class XorTest extends TestCase {
+
+    private FakeMailContext context;
+    private FakeMail mockedMail;
+
+    private CompositeMatcher matcher;
+
+    public XorTest(String arg0) throws UnsupportedEncodingException {
+        super(arg0);
+    }
+
+    private void setupMockedMail() throws ParseException {
+        mockedMail = new FakeMail();
+        mockedMail.setRecipients(Arrays.asList(new MailAddress[] {
+        new MailAddress("test@james.apache.org"),
+        new MailAddress("test2@james.apache.org") }));
+
+    }
+
+    /**
+     * Setup a composite Or matcher and test it
+     * @throws MessagingException
+     */
+    private void setupMatcher() throws MessagingException {
+        context = new FakeMailContext();
+        matcher = new Xor();
+        FakeMatcherConfig mci = new FakeMatcherConfig("Xor",context);
+        matcher.init(mci);
+    }
+    
+    private void setupChild(String match) throws MessagingException
+    {
+        Matcher child = null;
+        if (match.equals("All"))
+        {
+            child = new All();
+        }
+        else
+        {
+            child = new RecipientIs();
+        }
+        FakeMatcherConfig sub = new FakeMatcherConfig(match,context);
+        child.init(sub);
+        matcher.add(child);
+        
+    }
+
+    // test if all recipients was returned
+    public void testIntersectSame() throws MessagingException {
+        setupMockedMail();
+        setupMatcher();
+        setupChild("RecipientIsRegex=test@james.apache.org");
+        setupChild("RecipientIsRegex=test@james.apache.org");
+            
+        Collection matchedRecipients = matcher.match(mockedMail);
+
+        assertNotNull(matchedRecipients);
+        assertEquals(0,matchedRecipients.size());
+    }
+    
+    public void testNoIntersect() throws MessagingException {
+        setupMockedMail();
+        setupMatcher();
+        setupChild("RecipientIsRegex=test@james.apache.org");
+        setupChild("RecipientIsRegex=test2@james.apache.org");
+            
+        Collection matchedRecipients = matcher.match(mockedMail);
+
+        assertNotNull(matchedRecipients);
+        assertEquals(2,matchedRecipients.size());
+        
+        Iterator iterator = matchedRecipients.iterator();
+        MailAddress address = (MailAddress)iterator.next();
+        assertEquals(address,"test@james.apache.org");
+        address = (MailAddress)iterator.next();
+        assertEquals(address,"test2@james.apache.org");
+    }
+    
+
+}



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