cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From reinh...@apache.org
Subject svn commit: r669183 - in /cocoon/whiteboard/corona/trunk/corona-sitemap/src: main/java/org/apache/cocoon/corona/sitemap/node/ test/java/org/apache/cocoon/corona/sitemap/node/
Date Wed, 18 Jun 2008 14:25:56 GMT
Author: reinhard
Date: Wed Jun 18 07:25:56 2008
New Revision: 669183

URL: http://svn.apache.org/viewvc?rev=669183&view=rev
Log:
. implement match/when/otherwise as proposed by Mark Lundquist (http://cocoon.markmail.org/message/wj4zpfcgxsmlcpp7)
  
  custom matchers and "or" are missing.
  

Added:
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
  (with props)
Removed:
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/SelectNode.java
Modified:
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/AbstractSitemapNode.java
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/GenerateNode.java
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/InvocationResult.java
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/MatchNode.java
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/OtherwiseNode.java
    cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/WhenNode.java

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/AbstractSitemapNode.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/AbstractSitemapNode.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/AbstractSitemapNode.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/AbstractSitemapNode.java
Wed Jun 18 07:25:56 2008
@@ -113,7 +113,7 @@
             return;
         }
 
-        // check whether for special parameter fields
+        // check for special parameter fields
         Map<String, Field> parameterFields = this.getParameterFields();
         for (Entry<String, String> entry : parameters.entrySet()) {
             String key = entry.getKey();

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/GenerateNode.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/GenerateNode.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/GenerateNode.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/GenerateNode.java
Wed Jun 18 07:25:56 2008
@@ -30,7 +30,7 @@
     private static final String GENERATOR_CATEGORY = "generator:";
 
     @Parameter
-    private final String type = "file"; // "file" is the default type
+    private String type = "file"; // "file" is the default type
 
     @Parameter
     private String src;

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/InvocationResult.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/InvocationResult.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/InvocationResult.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/InvocationResult.java
Wed Jun 18 07:25:56 2008
@@ -19,6 +19,7 @@
 package org.apache.cocoon.corona.sitemap.node;
 
 public enum InvocationResult {
+
     NONE(false, false), PROCESSED(true, false), COMPLETED(true, true);
 
     private boolean isCompleted;

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/MatchNode.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/MatchNode.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/MatchNode.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/MatchNode.java
Wed Jun 18 07:25:56 2008
@@ -18,34 +18,86 @@
  */
 package org.apache.cocoon.corona.sitemap.node;
 
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.cocoon.corona.sitemap.Invocation;
 import org.apache.cocoon.corona.sitemap.node.annotations.Parameter;
 import org.apache.cocoon.corona.sitemap.util.WildcardMatcherHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
-@Node(name="match")
+@Node(name = "match")
 public class MatchNode extends AbstractSitemapNode {
 
+    private final Log logger = LogFactory.getLog(this.getClass());
+
+    private static final Map<String, Pattern> patterns = new HashMap<String, Pattern>();
+
+    @Parameter
+    private String name;
+
+    @Parameter
+    private String value;
+
     @Parameter
     private String pattern;
 
     @Parameter
-    private String name;
+    private String regexp;
+
+    @Parameter
+    private String equals;
+
+    @Parameter
+    private String contains;
+
+    @Parameter
+    private String wildcard;
+
+    private boolean inMatchingMode;
 
     /**
      * {@inheritDoc}
-     *
+     * 
      * @see org.apache.cocoon.corona.sitemap.node.AbstractSitemapNode#invoke(org.apache.cocoon.corona.sitemap.Invocation)
      */
     @Override
     public InvocationResult invoke(Invocation invocation) {
-        if (invocation.isErrorInvocation()) {
-            // we're not responsible for errors
+        if (invocation.isErrorInvocation() && !this.hasHandleErrorsParent(this.getParent()))
{
+            if (this.logger.isDebugEnabled()) {
+                this.logger
+                        .debug("Stop here because it's an error invocation and this node
is defined outside of <handle-errors>.");
+            }
+            return InvocationResult.NONE;
+        }
+
+        // try to resolve the test value in the case that it is an expression
+        String testValue = invocation.resolveParameter(this.value);
+        if (testValue == null) {
+            testValue = invocation.getRequestURI();
+        }
+
+        // find out the matching method
+        Map<String, String> matchingAttribute = this.prepareMatching();
+        this.inMatchingMode = matchingAttribute.size() == 1;
+
+        // if there are NO matching attributes (regexp, equals, ...) set, execute the children
+        if (!this.inMatchingMode) {
+            InvocationResult invocationResult = super.invoke(invocation);
+
+            if (invocationResult.isProcessed()) {
+                return InvocationResult.COMPLETED;
+            }
+
             return InvocationResult.NONE;
         }
 
-        Map<String, String> matches = this.getMatches(invocation.getRequestURI());
+        // if there are matching attributes, invoke the matcher and execute the children
afterwards
+        Map<String, String> matches = this.getMatches(matchingAttribute, testValue);
         if (matches == null) {
             // do not ask our children, there was no match
             return InvocationResult.NONE;
@@ -62,25 +114,173 @@
         return InvocationResult.NONE;
     }
 
-    private Map<String, String> getMatches(String request) {
-        if (request == null) {
+    protected boolean hasHandleErrorsParent(SitemapNode parent) {
+        SitemapNode currentNode = parent;
+
+        while (currentNode != null) {
+            if (currentNode instanceof ErrorNode) {
+                return true;
+            }
+            currentNode = currentNode.getParent();
+        }
+
+        return false;
+    }
+
+    protected Map<String, String> getMatches(Map<String, String> matchingAttributes,
String value) {
+        String matchingAttributeType = null;
+        String matchingAttributeValue = null;
+        Map<String, String> matches = null;
+        if (matchingAttributes.size() == 1) {
+            for (Entry<String, String> attribute : matchingAttributes.entrySet()) {
+                matchingAttributeType = attribute.getKey();
+                matchingAttributeValue = attribute.getValue();
+            }
+
+            if ("wildcard".equals(matchingAttributeType)) {
+                if (this.logger.isDebugEnabled()) {
+                    this.logger.debug("Invoking wildcard matcher: test=" + value + ", wildcard="
+                            + matchingAttributeValue);
+                }
+
+                matches = getWildcardMatches(value, matchingAttributeValue);
+            } else if ("regexp".equals(matchingAttributeType)) {
+                if (this.logger.isDebugEnabled()) {
+                    this.logger.debug("Invoking regexp matcher: test=" + value + ", regexp="
+ matchingAttributeValue);
+                }
+
+                matches = getReqexpMatches(value, matchingAttributeValue);
+            } else if ("contains".equals(matchingAttributeType)) {
+                if (this.logger.isDebugEnabled()) {
+                    this.logger.debug("Invoking contains matcher: test=" + value + ", contains="
+                            + matchingAttributeValue);
+                }
+
+                matches = getContainsMatches(value, matchingAttributeValue);
+            } else if ("pattern".equals(matchingAttributeType)) {
+                if (this.logger.isDebugEnabled()) {
+                    this.logger.debug("Invoking wildcard matcher: test=" + value + ", pattern="
+                            + matchingAttributeValue);
+                }
+
+                matches = getWildcardMatches(value, matchingAttributeValue);
+            } else if ("equals".equals(matchingAttributeType)) {
+                if (this.logger.isDebugEnabled()) {
+                    this.logger.debug("Invoking equals matcher: test=" + value + ", equals="
+ matchingAttributeValue);
+                }
+
+                matches = getEqualsMatches(value, matchingAttributeValue);
+            }
+        }
+
+        return matches;
+    }
+
+    protected Map<String, String> prepareMatching() {
+        // determine the matching type and check if there are conflicting match attributes
+        Map<String, String> matchingAttributes = new HashMap<String, String>();
+        if (this.pattern != null) {
+            matchingAttributes.put("pattern", this.pattern);
+        }
+        if (this.regexp != null) {
+            matchingAttributes.put("regexp", this.regexp);
+        }
+        if (this.equals != null) {
+            matchingAttributes.put("equals", this.equals);
+        }
+        if (this.contains != null) {
+            matchingAttributes.put("contains", this.contains);
+        }
+        if (this.wildcard != null) {
+            matchingAttributes.put("wildcard", this.wildcard);
+        }
+        if (matchingAttributes.size() > 1) {
+            String message = "Only one matching attribute (regexp, equals, contains, wildcard,
pattern) can be set: "
+                    + matchingAttributes;
+            this.logger.error(message);
+            throw new RuntimeException(message);
+        }
+        return matchingAttributes;
+    }
+
+    private static Map<String, String> getContainsMatches(String value, String matchingAttributeValue)
{
+        if (value == null) {
             return null;
         }
 
-        if (request.startsWith("/")) {
-            return WildcardMatcherHelper.match(this.pattern, request.substring(1));
+        if (value.contains(matchingAttributeValue)) {
+            Map<String, String> result = new HashMap<String, String>();
+            result.put("0", value);
+            return result;
         }
 
-        return WildcardMatcherHelper.match(this.pattern, request);
+        return null;
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * @see org.apache.cocoon.corona.sitemap.node.AbstractSitemapNode#toString()
-     */
-    @Override
-    public String toString() {
-        return "MatchNode(" + this.pattern + ")";
+    private static Map<String, String> getEqualsMatches(String value, String matchingAttributeValue)
{
+        if (value == null) {
+            return null;
+        }
+
+        if (value.equals(matchingAttributeValue)) {
+            Map<String, String> result = new HashMap<String, String>();
+            result.put("0", value);
+            return result;
+        }
+
+        return null;
+    }
+
+    private static Map<String, String> getReqexpMatches(String value, String matchingAttributeValue)
{
+        if (value == null) {
+            return null;
+        }
+
+        Pattern pattern = patterns.get(matchingAttributeValue);
+        if (pattern == null) {
+            pattern = Pattern.compile(matchingAttributeValue);
+            patterns.put(matchingAttributeValue, pattern);
+        }
+
+        Matcher matcher = null;
+        if (value.startsWith("/")) {
+            matcher = pattern.matcher(value.substring(1));
+        } else {
+            matcher = pattern.matcher(value);
+        }
+
+        if (matcher.matches()) {
+            Map<String, String> result = new HashMap<String, String>();
+            for (int i = 0; i <= matcher.groupCount(); i++) {
+                result.put(Integer.toString(i), matcher.group(i));
+            }
+            return result;
+        }
+
+        return null;
+    }
+
+    private static Map<String, String> getWildcardMatches(String value, String wildcard)
{
+        if (value == null) {
+            return null;
+        }
+
+        if (value.startsWith("/")) {
+            return WildcardMatcherHelper.match(wildcard, value.substring(1));
+        }
+
+        return WildcardMatcherHelper.match(wildcard, value);
+    }
+
+    public boolean isInMatchingMode() {
+        return this.inMatchingMode;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return this.value;
     }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/OtherwiseNode.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/OtherwiseNode.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/OtherwiseNode.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/OtherwiseNode.java
Wed Jun 18 07:25:56 2008
@@ -18,7 +18,38 @@
  */
 package org.apache.cocoon.corona.sitemap.node;
 
-@Node(name="otherwise")
-public class OtherwiseNode extends AbstractSitemapNode {
+import org.apache.cocoon.corona.sitemap.Invocation;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
+@Node(name = "otherwise")
+public class OtherwiseNode extends WhenNode {
+
+    private final Log logger = LogFactory.getLog(this.getClass());
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.apache.cocoon.corona.sitemap.node.WhenNode#invoke(org.apache.cocoon.corona.sitemap.Invocation)
+     */
+    @Override
+    public InvocationResult invoke(Invocation invocation) {
+        if (invocation.isErrorInvocation() && !this.hasHandleErrorsParent(this.getParent()))
{
+            if (this.logger.isDebugEnabled()) {
+                this.logger
+                        .debug("Stop here because it's an error invocation and this node
is defined outside of <handle-errors>.");
+            }
+            return InvocationResult.NONE;
+        }
+
+        this.checkParent();
+
+        InvocationResult invocationResult = super.invoke(invocation);
+
+        if (invocationResult.isProcessed()) {
+            return InvocationResult.COMPLETED;
+        }
+
+        return InvocationResult.NONE;
+    }
 }

Modified: cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/WhenNode.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/WhenNode.java?rev=669183&r1=669182&r2=669183&view=diff
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/WhenNode.java
(original)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/main/java/org/apache/cocoon/corona/sitemap/node/WhenNode.java
Wed Jun 18 07:25:56 2008
@@ -18,7 +18,38 @@
  */
 package org.apache.cocoon.corona.sitemap.node;
 
-@Node(name="when")
-public class WhenNode extends AbstractSitemapNode {
+import org.apache.cocoon.corona.sitemap.Invocation;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+@Node(name = "when")
+public class WhenNode extends MatchNode {
+
+    private final Log logger = LogFactory.getLog(this.getClass());
+
+    @Override
+    public InvocationResult invoke(Invocation invocation) {
+        this.checkParent();
+
+        return super.invoke(invocation);
+    }
+
+    protected void checkParent() {
+        if (this.getParent() instanceof MatchNode) {
+            MatchNode parentMatchNode = (MatchNode) this.getParent();
+            this.setValue(parentMatchNode.getValue());
+
+            if (parentMatchNode.isInMatchingMode()) {
+                String message = "The parent node was already in matching mode. "
+                        + "Hence it's not allowed to set when/otherwise nodes as children.";
+                this.logger.error(message);
+                throw new RuntimeException(message);
+            }
+        } else {
+            String message = "The parent node has to be a match node.";
+            this.logger.error(message);
+            throw new RuntimeException(message);
+        }
+    }
 
 }

Added: cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
URL: http://svn.apache.org/viewvc/cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java?rev=669183&view=auto
==============================================================================
--- cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
(added)
+++ cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
Wed Jun 18 07:25:56 2008
@@ -0,0 +1,111 @@
+/*
+ * 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.cocoon.corona.sitemap.node;
+
+import static junit.framework.Assert.*;
+
+import java.util.Map;
+
+import junitx.util.PrivateAccessor;
+
+import org.junit.Test;
+
+public class MatchNodeTest {
+
+    @Test
+    public void regexpMatchingAttribute() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "regexp", "([a-zA-Z\\-]+)/(.*)");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"abc/44");
+        assertTrue(matches.containsValue("abc/44"));
+        assertTrue(matches.containsValue("abc"));
+        assertTrue(matches.containsValue("44"));
+        assertEquals(3, matches.size());
+    }
+
+    @Test
+    public void regexpMatchingAttributeWithSlash() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "regexp", "([a-zA-Z\\-]+)/(.*)");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"/abc/44");
+        assertTrue(matches.containsValue("abc/44"));
+        assertTrue(matches.containsValue("abc"));
+        assertTrue(matches.containsValue("44"));
+        assertEquals(3, matches.size());
+    }
+
+    @Test
+    public void containsMatchingAttribute() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "contains", "123");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"000123456");
+        assertTrue(matches.containsValue("000123456"));
+        assertEquals(1, matches.size());
+    }
+
+    @Test
+    public void equalsMatchingAttribute() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "equals", "123");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"123");
+        assertTrue(matches.containsValue("123"));
+        assertEquals(1, matches.size());
+    }
+
+    @Test
+    public void wildcardMatchingPathAttribute() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "wildcard", "abc/*/*");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"abc/def/ghi");
+        assertTrue(matches.containsValue("abc/def/ghi"));
+        assertTrue(matches.containsValue("def"));
+        assertTrue(matches.containsValue("ghi"));
+        assertEquals(3, matches.size());
+    }
+
+    @Test
+    public void wildcardMatchingPathAttributeWithSlash() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "wildcard", "abc/*/*");
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"/abc/def/ghi");
+        assertTrue(matches.containsValue("abc/def/ghi"));
+        assertTrue(matches.containsValue("def"));
+        assertTrue(matches.containsValue("ghi"));
+        assertEquals(3, matches.size());
+    }
+
+    @Test
+    public void noMatchingAttribute() {
+        MatchNode matchNode = new MatchNode();
+        Map<String, String> matches = matchNode.getMatches(matchNode.prepareMatching(),
"123");
+        assertNull("If there is no match, null has to be returned.", matches);
+    }
+
+    @Test
+    public void moreThanOneMatchingAttribute() throws Exception {
+        MatchNode matchNode = new MatchNode();
+        PrivateAccessor.setField(matchNode, "pattern", "123");
+        PrivateAccessor.setField(matchNode, "equals", "123");
+        try {
+            matchNode.getMatches(matchNode.prepareMatching(), "123");
+            fail();
+        } catch (Exception e) {
+            // expected
+        }
+    }
+
+}

Propchange: cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/whiteboard/corona/trunk/corona-sitemap/src/test/java/org/apache/cocoon/corona/sitemap/node/MatchNodeTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Mime
View raw message