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 rd...@apache.org on 2008/12/07 09:00:35 UTC
svn commit: r724100 - in /james/jsieve/trunk: ./ stage/jmock/
stage/jmock/jars/ util/ util/src/main/java/org/apache/jsieve/util/
util/src/test/java/org/apache/jsieve/util/
Author: rdonkin
Date: Sun Dec 7 00:00:35 2008
New Revision: 724100
URL: http://svn.apache.org/viewvc?rev=724100&view=rev
Log:
Add API for generating a Sieve script from a parse tree (https://issues.apache.org/jira/browse/JSIEVE-43). AStart implementation by creating low level API. Starting to work in util for now, but this will need to be reviewed later JSIEVE-43
Added:
james/jsieve/trunk/stage/jmock/
james/jsieve/trunk/stage/jmock/jars/
james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.LICENSE
james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.jar (with props)
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/HaltTraversalException.java
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeHandler.java
james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeTraverser.java
james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/
james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/SimpleNodeTraverserTest.java
Modified:
james/jsieve/trunk/include.properties
james/jsieve/trunk/util/build.xml
Modified: james/jsieve/trunk/include.properties
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/include.properties?rev=724100&r1=724099&r2=724100&view=diff
==============================================================================
--- james/jsieve/trunk/include.properties (original)
+++ james/jsieve/trunk/include.properties Sun Dec 7 00:00:35 2008
@@ -68,3 +68,4 @@
mail.jar=${lib.dir}/javax.mail/jars/mail-1.4.1.jar
activation.jar=${lib.dir}/javax.activation/jars/activation-1.1.1.jar
+jmock.jar=${lib.dir}/jmock/jars/jmock-1.1.0.jar
Added: james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.LICENSE
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.LICENSE?rev=724100&view=auto
==============================================================================
--- james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.LICENSE (added)
+++ james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.LICENSE Sun Dec 7 00:00:35 2008
@@ -0,0 +1,25 @@
+Copyright (c) 2000-2007, jMock.org
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of
+conditions and the following disclaimer. Redistributions in binary form must reproduce
+the above copyright notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the distribution.
+
+Neither the name of jMock nor the names of its contributors may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
Added: james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.jar
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.jar?rev=724100&view=auto
==============================================================================
Binary file - no diff available.
Propchange: james/jsieve/trunk/stage/jmock/jars/jmock-1.1.0.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: james/jsieve/trunk/util/build.xml
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/util/build.xml?rev=724100&r1=724099&r2=724100&view=diff
==============================================================================
--- james/jsieve/trunk/util/build.xml (original)
+++ james/jsieve/trunk/util/build.xml Sun Dec 7 00:00:35 2008
@@ -49,7 +49,6 @@
<path id="project.class.path">
<pathelement location="${commons-logging.jar}"/>
<pathelement location="${log4j.jar}"/>
- <pathelement location="${junit.jar}"/>
<pathelement location='${lib.jsieve.dir}/${name}-${version}.jar'/>
<pathelement location="${mailet.jar}"/>
<path refid="mail.class.path"/>
@@ -59,6 +58,8 @@
<path id="project.test.class.path">
<path refid="project.class.path"/>
+ <pathelement location="${junit.jar}"/>
+ <pathelement location="${jmock.jar}"/>
</path>
<!--
@@ -320,13 +321,8 @@
-->
<classpath id="junit.class.path">
<pathelement location="${testconf.dir}"/>
- <fileset dir="${dist.dir}/lib">
- <include name="**/*.jar"/>
- </fileset>
- <pathelement location="${dist.dir}/conf/"/>
- <pathelement path="${java.class.path}"/>
- <pathelement location="${junit.jar}"/>
- <path refid='mail.class.path'/>
+ <pathelement location='${build.classes.test}'/>
+ <path refid='project.test.class.path'/>
</classpath>
<formatter type="plain"/>
<batchtest fork="yes" todir="${dist.dir}/reports">
Added: james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/HaltTraversalException.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/HaltTraversalException.java?rev=724100&view=auto
==============================================================================
--- james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/HaltTraversalException.java (added)
+++ james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/HaltTraversalException.java Sun Dec 7 00:00:35 2008
@@ -0,0 +1,44 @@
+/****************************************************************
+ * 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.jsieve.util;
+
+import org.apache.jsieve.exception.SieveException;
+
+/**
+ * Indicators that the node traversal should be abandoned.
+ */
+public class HaltTraversalException extends SieveException {
+
+ private static final long serialVersionUID = 0L;
+
+ public HaltTraversalException() {
+ }
+
+ public HaltTraversalException(String message) {
+ super(message);
+ }
+
+ public HaltTraversalException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public HaltTraversalException(Throwable cause) {
+ super(cause);
+ }
+}
Added: james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeHandler.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeHandler.java?rev=724100&view=auto
==============================================================================
--- james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeHandler.java (added)
+++ james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeHandler.java Sun Dec 7 00:00:35 2008
@@ -0,0 +1,205 @@
+/****************************************************************
+ * 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.jsieve.util;
+
+import org.apache.jsieve.parser.generated.ASTargument;
+import org.apache.jsieve.parser.generated.ASTarguments;
+import org.apache.jsieve.parser.generated.ASTblock;
+import org.apache.jsieve.parser.generated.ASTcommand;
+import org.apache.jsieve.parser.generated.ASTcommands;
+import org.apache.jsieve.parser.generated.ASTstart;
+import org.apache.jsieve.parser.generated.ASTstring;
+import org.apache.jsieve.parser.generated.ASTstring_list;
+import org.apache.jsieve.parser.generated.ASTtest;
+import org.apache.jsieve.parser.generated.ASTtest_list;
+import org.apache.jsieve.parser.generated.SimpleNode;
+
+/**
+ * Presents a low level reporting view of a Sieve node tree.
+ *
+ * @see NodeTraverser
+ */
+public interface NodeHandler {
+
+ /**
+ * Starts a tree traversal.
+ * @throws HaltTraversalException
+ */
+ public void start() throws HaltTraversalException;
+
+ /**
+ * Ends a tree traveral.
+ * @throws HaltTraversalException
+ */
+ public void end() throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(SimpleNode node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(SimpleNode node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTstart node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTstart node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTcommands node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTcommands node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTcommand node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTcommand node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTblock node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTblock node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTarguments node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTarguments node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTargument node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTargument node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTtest node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTtest node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTtest_list node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTtest_list node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTstring node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTstring node) throws HaltTraversalException;
+
+ /**
+ * Starts traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void start(ASTstring_list node) throws HaltTraversalException;
+
+ /**
+ * Ends traversal of given node.
+ * @param node not null
+ * @throws HaltTraversalException
+ */
+ public void end(ASTstring_list node) throws HaltTraversalException;
+}
Added: james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeTraverser.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeTraverser.java?rev=724100&view=auto
==============================================================================
--- james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeTraverser.java (added)
+++ james/jsieve/trunk/util/src/main/java/org/apache/jsieve/util/NodeTraverser.java Sun Dec 7 00:00:35 2008
@@ -0,0 +1,157 @@
+/****************************************************************
+ * 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.jsieve.util;
+
+import org.apache.jsieve.exception.SieveException;
+import org.apache.jsieve.parser.generated.ASTargument;
+import org.apache.jsieve.parser.generated.ASTarguments;
+import org.apache.jsieve.parser.generated.ASTblock;
+import org.apache.jsieve.parser.generated.ASTcommand;
+import org.apache.jsieve.parser.generated.ASTcommands;
+import org.apache.jsieve.parser.generated.ASTstart;
+import org.apache.jsieve.parser.generated.ASTstring;
+import org.apache.jsieve.parser.generated.ASTstring_list;
+import org.apache.jsieve.parser.generated.ASTtest;
+import org.apache.jsieve.parser.generated.ASTtest_list;
+import org.apache.jsieve.parser.generated.Node;
+import org.apache.jsieve.parser.generated.SieveParserVisitor;
+import org.apache.jsieve.parser.generated.SimpleNode;
+
+/**
+ * Traverses nodes.
+ * Once instance can be safely shared between threads.
+ */
+public class NodeTraverser {
+
+ /**
+ * Traverses the tree structure rooted at the given node.
+ * The nodes contained are reported to the handler.
+ * @param root not null
+ * @param handler not null
+ * @throws SieveException when traversal fails
+ * @throws HaltTraversalException when traversal is halted by handler
+ */
+ public void traverse(final NodeHandler handler, final Node root) throws SieveException {
+ final TraversalWorker worker = new TraversalWorker(handler);
+ handler.start();
+ root.jjtAccept(worker, null);
+ handler.end();
+ }
+
+
+ /**
+ * <p>Traverses a nodal tree structure.
+ * An inner worker:
+ * </p>
+ * <ul>
+ * <li>Allows a more fluent public API</li>
+ * <li>Isolated the monotheaded code</li>
+ * </ul>
+ */
+ private static final class TraversalWorker implements SieveParserVisitor {
+
+ private final NodeHandler handler;
+
+ /**
+ * Constructs a traversal worker.
+ * @param handler not null
+ */
+ public TraversalWorker(final NodeHandler handler) {
+ super();
+ this.handler = handler;
+ }
+
+ public Object visit(SimpleNode node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTstart node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTcommands node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTcommand node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTblock node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTarguments node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTargument node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTtest node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTtest_list node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTstring node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+
+ public Object visit(ASTstring_list node, Object data) throws SieveException {
+ handler.start(node);
+ node.childrenAccept(this, null);
+ handler.end(node);
+ return null;
+ }
+ }
+}
Added: james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/SimpleNodeTraverserTest.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/SimpleNodeTraverserTest.java?rev=724100&view=auto
==============================================================================
--- james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/SimpleNodeTraverserTest.java (added)
+++ james/jsieve/trunk/util/src/test/java/org/apache/jsieve/util/SimpleNodeTraverserTest.java Sun Dec 7 00:00:35 2008
@@ -0,0 +1,73 @@
+/****************************************************************
+ * 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.jsieve.util;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.jsieve.ConfigurationManager;
+import org.apache.jsieve.parser.generated.ASTarguments;
+import org.apache.jsieve.parser.generated.ASTcommand;
+import org.apache.jsieve.parser.generated.ASTcommands;
+import org.apache.jsieve.parser.generated.ASTstart;
+import org.apache.jsieve.parser.generated.Node;
+import org.jmock.Mock;
+import org.jmock.MockObjectTestCase;
+
+public class SimpleNodeTraverserTest extends MockObjectTestCase {
+
+ Mock mock;
+ NodeHandler handler;
+
+ NodeTraverser subject;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ mock = mock(NodeHandler.class);
+ handler = (NodeHandler) mock.proxy();
+
+ subject = new NodeTraverser();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testTraverseSimpleScript() throws Exception {
+ mock.expects(once()).method("start").id("1");
+ mock.expects(once()).method("start").with(isA(ASTstart.class)).after("1").id("2");
+ mock.expects(once()).method("start").with(isA(ASTcommands.class)).after("2").id("3");
+ mock.expects(once()).method("start").with(isA(ASTcommand.class)).after("3").id("4");
+ mock.expects(once()).method("start").with(isA(ASTarguments.class)).after("4").id("5");
+ mock.expects(once()).method("end").with(isA(ASTarguments.class)).after("5").id("6");
+ mock.expects(once()).method("end").with(isA(ASTcommand.class)).after("6").id("7");
+ mock.expects(once()).method("end").with(isA(ASTcommands.class)).after("7").id("8");
+ mock.expects(once()).method("end").with(isA(ASTstart.class)).after("8").id("9");
+ mock.expects(once()).method("end").after("9");
+ traverse("Keep;");
+ }
+
+ private void traverse(String script) throws Exception {
+ subject.traverse(handler, parse(script));
+ }
+
+ private Node parse(String script) throws Exception {
+ return new ConfigurationManager().build().parse(
+ new ByteArrayInputStream(script.getBytes()));
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org