You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ma...@apache.org on 2008/03/17 23:13:06 UTC

svn commit: r638096 - in /ant/ivy/core/trunk: ./ src/java/org/apache/ivy/plugins/matcher/ test/java/org/apache/ivy/plugins/matcher/

Author: maartenc
Date: Mon Mar 17 15:12:58 2008
New Revision: 638096

URL: http://svn.apache.org/viewvc?rev=638096&view=rev
Log:
IMPROVEMENT: Smarter determination if an expression is exact or not for RegexpPatternMatcher and GlobPatternMatcher

Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcher.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/GlobPatternMatcher.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcher.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/AbstractPatternMatcherTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcherTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactPatternMatcherTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/GlobPatternMatcherTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcherTest.java

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Mon Mar 17 15:12:58 2008
@@ -71,6 +71,7 @@
 - IMPROVEMENT: add branch attribute in ivy:install task (IVY-727)
 - IMPROVEMENT: Parse description information in ivy files (IVY-766)
 - IMPROVEMENT: Parse description and home page from poms (IVY-767)
+- IMPROVEMENT: Smarter determination if an expression is exact or not for RegexpPatternMatcher and GlobPatternMatcher
 
 - FIX: Ivy reports a conflict when the same file is supposed to be retrieved at the same location twice (or more) (IVY-743)
 - FIX: StackOverflowError when configuration extends itself (IVY-696)

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcher.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcher.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcher.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcher.java Mon Mar 17 15:12:58 2008
@@ -56,7 +56,7 @@
         }
 
         public boolean isExact() {
-            return false;
+            return regexp.isExact(); // && exact.isExact();
         }
     }
 }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/GlobPatternMatcher.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/GlobPatternMatcher.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/GlobPatternMatcher.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/GlobPatternMatcher.java Mon Mar 17 15:12:58 2008
@@ -56,8 +56,12 @@
 
     private static class GlobMatcher implements Matcher {
         private Pattern pattern;
+        private String expression;
 
+        private Boolean exact;
+        
         public GlobMatcher(String expression) throws PatternSyntaxException {
+            this.expression = expression;
             try {
                 pattern = new GlobCompiler().compile(expression);
             } catch (MalformedPatternException e) {
@@ -73,7 +77,25 @@
         }
 
         public boolean isExact() {
-            return false;
+            if (exact == null) {
+                exact = calculateExact();
+            }
+            return exact.booleanValue();
+        }
+        
+        private Boolean calculateExact() {
+            Boolean result = Boolean.TRUE;
+            
+            char[] expressionChars = expression.toCharArray();
+            for (int i = 0; i < expressionChars.length; i++) {
+                char ch = expressionChars[i];
+                if (ch == '*' || ch == '?' || ch == '[' || ch == ']') {
+                    result = Boolean.FALSE;
+                    break;
+                }
+            }
+            
+            return result;
         }
     }
 

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcher.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcher.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcher.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcher.java Mon Mar 17 15:12:58 2008
@@ -27,7 +27,7 @@
  */
 public final/* @Immutable */class RegexpPatternMatcher extends AbstractPatternMatcher {
     public static final RegexpPatternMatcher INSTANCE = new RegexpPatternMatcher();
-
+    
     /*
      * NOTE: Regexp compiler does ~200K compilation/s - If necessary look into using ThreadLocal
      * Pattern to cut on useless object creation - If expression are reused over and over a LRU
@@ -44,11 +44,15 @@
 
     private static/* @Immutable */class RegexpMatcher implements Matcher {
         private Pattern pattern;
+        private String expression;
+        
+        private Boolean exact;
 
         public RegexpMatcher(String expression) throws PatternSyntaxException {
             if (expression == null) {
                 throw new NullPointerException();
             }
+            this.expression = expression;
             pattern = Pattern.compile(expression);
         }
 
@@ -60,7 +64,25 @@
         }
 
         public boolean isExact() {
-            return false;
+            if (exact == null) {
+                exact = calculateExact();
+            }
+            return exact.booleanValue();
+        }
+        
+        private Boolean calculateExact() {
+            Boolean result = Boolean.TRUE;
+            
+            char[] expressionChars = expression.toCharArray();
+            for (int i = 0; i < expressionChars.length; i++) {
+                char ch = expressionChars[i];
+                if (!Character.isLetterOrDigit(ch) && !Character.isWhitespace(ch) && ('-' != ch) && ('_' != ch)) {
+                    result = Boolean.FALSE;
+                    break;
+                }
+            }
+            
+            return result;
         }
     }
 }

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/AbstractPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/AbstractPatternMatcherTest.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/AbstractPatternMatcherTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/AbstractPatternMatcherTest.java Mon Mar 17 15:12:58 2008
@@ -25,13 +25,10 @@
 public abstract class AbstractPatternMatcherTest extends TestCase {
     protected PatternMatcher patternMatcher;
 
-    protected boolean exact;
-
     protected abstract void setUp() throws Exception;
 
-    protected void setUp(PatternMatcher matcher, boolean exact) {
+    protected void setUp(PatternMatcher matcher) {
         this.patternMatcher = matcher;
-        this.exact = exact;
     }
 
     public void testAnyExpression() {
@@ -42,16 +39,34 @@
     }
 
     public void testIsExact() {
+        // '*' is a special matcher
         Matcher matcher = patternMatcher.getMatcher("*");
         assertEquals(false, matcher.isExact());
         matcher.matches("The words aren't what they were.");
         assertEquals(false, matcher.isExact());
 
-        matcher = patternMatcher.getMatcher("some expression");
-        assertEquals(exact, matcher.isExact());
-        matcher.matches("The words aren't what they were.");
-        assertEquals(exact, matcher.isExact());
+        // test some exact patterns for this matcher
+        String[] expressions = getExactExpressions();
+        for (int i = 0; i < expressions.length; i++) {
+            matcher = patternMatcher.getMatcher(expressions[i]);
+            assertTrue("Expression '" + expressions[i] + "' should be exact", matcher.isExact());
+            matcher.matches("The words aren't what they were.");
+            assertTrue("Expression '" + expressions[i] + "' should be exact", matcher.isExact());
+        }
+        
+        // test some inexact patterns for this matcher
+        expressions = getInexactExpressions();
+        for (int i = 0; i < expressions.length; i++) {
+            matcher = patternMatcher.getMatcher(expressions[i]);
+            assertFalse("Expression '" + expressions[i] + "' should be inexact", matcher.isExact());
+            matcher.matches("The words aren't what they were.");
+            assertFalse("Expression '" + expressions[i] + "' should be inexact", matcher.isExact());
+        }
+        
     }
+
+    protected abstract String[] getExactExpressions();
+    protected abstract String[] getInexactExpressions();
 
     public void testNullInput() {
         Matcher matcher = patternMatcher.getMatcher("some expression");

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcherTest.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcherTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactOrRegexpPatternMatcherTest.java Mon Mar 17 15:12:58 2008
@@ -25,22 +25,35 @@
 public class ExactOrRegexpPatternMatcherTest extends AbstractPatternMatcherTest {
 
     protected void setUp() throws Exception {
-        setUp(new ExactOrRegexpPatternMatcher(), false);
+        setUp(new ExactOrRegexpPatternMatcher());
+    }
+
+    protected String[] getExactExpressions() {
+        return new String[] {"abc", "123", "abc-123", "abc_123"};
+    }
+
+    protected String[] getInexactExpressions() {
+        return new String[] {"abc+", "12.3", "abc-123*", "abc_123\\d"};
     }
 
     public void testImplementation() {
         Matcher matcher = patternMatcher.getMatcher(".");
+        assertFalse(matcher.isExact());
         assertFalse(matcher.matches(""));
         assertTrue("Exact match failed", matcher.matches("."));
         assertTrue("Regexp match failed", matcher.matches("a"));
         assertFalse(matcher.matches("aa"));
 
         matcher = patternMatcher.getMatcher(".*");
+        assertFalse(matcher.isExact());
         assertTrue("Exact match failed", matcher.matches(".*"));
         assertTrue("Regexp match failed", matcher.matches(""));
         assertTrue(matcher.matches("a"));
         assertTrue(matcher.matches("aa"));
 
+        matcher = patternMatcher.getMatcher("abc-123_ABC");
+        assertTrue(matcher.isExact());
+        
         try {
             matcher = patternMatcher.getMatcher("(");
             fail("Should fail on invalid regexp syntax");

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactPatternMatcherTest.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactPatternMatcherTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/ExactPatternMatcherTest.java Mon Mar 17 15:12:58 2008
@@ -23,7 +23,15 @@
 public class ExactPatternMatcherTest extends AbstractPatternMatcherTest {
 
     protected void setUp() throws Exception {
-        setUp(new ExactPatternMatcher(), true);
+        setUp(new ExactPatternMatcher());
+    }
+
+    protected String[] getExactExpressions() {
+        return new String[] {"abc", "123", "abc-123", "abc_123"};
+    }
+
+    protected String[] getInexactExpressions() {
+        return new String[0]; // there are no inexact expressions possible
     }
 
     public void testImplementation() {

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/GlobPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/GlobPatternMatcherTest.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/GlobPatternMatcherTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/GlobPatternMatcherTest.java Mon Mar 17 15:12:58 2008
@@ -25,11 +25,20 @@
 public class GlobPatternMatcherTest extends AbstractPatternMatcherTest {
 
     protected void setUp() throws Exception {
-        setUp(new GlobPatternMatcher(), false);
+        setUp(new GlobPatternMatcher());
+    }
+
+    protected String[] getExactExpressions() {
+        return new String[] {"abc", "123", "abc-123", "abc_123"};
+    }
+
+    protected String[] getInexactExpressions() {
+        return new String[] {"abc*", "12?3", "abc[123]"};
     }
 
     public void testValidRegexpSyntaxAsNormalCharacter() {
         Matcher matcher = patternMatcher.getMatcher(".");
+        assertTrue(matcher.isExact());
         assertFalse(matcher.matches(""));
         assertTrue(matcher.matches("."));
         assertFalse(matcher.matches("a"));
@@ -38,6 +47,7 @@
 
     public void testRegexpSyntaxAndGlob() {
         Matcher matcher = patternMatcher.getMatcher(".*");
+        assertFalse(matcher.isExact());
         assertTrue(matcher.matches(".*"));
         assertFalse(matcher.matches(""));
         assertFalse(matcher.matches("a"));
@@ -47,6 +57,8 @@
     }
 
     public void testImplementation() {
+        Matcher matcher = patternMatcher.getMatcher("abc-123_ABC");
+        assertTrue(matcher.isExact());
     }
 
     public void testQuoteMeta() {

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcherTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcherTest.java?rev=638096&r1=638095&r2=638096&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcherTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/matcher/RegexpPatternMatcherTest.java Mon Mar 17 15:12:58 2008
@@ -25,7 +25,15 @@
 public class RegexpPatternMatcherTest extends AbstractPatternMatcherTest {
 
     protected void setUp() throws Exception {
-        setUp(new RegexpPatternMatcher(), false);
+        setUp(new RegexpPatternMatcher());
+    }
+
+    protected String[] getExactExpressions() {
+        return new String[] {"abc", "123", "abc-123", "abc_123"};
+    }
+
+    protected String[] getInexactExpressions() {
+        return new String[] {"abc+", "12.3", "abc-123*", "abc_123\\d"};
     }
 
     public void testImplementation() {