Thread: [Japi-cvs] SF.net SVN: japi:[792] tools/todoScanner/trunk/src
Status: Beta
                
                Brought to you by:
                
                    christianhujer
                    
                
            | 
      
      
      From: <chr...@us...> - 2009-02-09 02:22:16
       | 
| Revision: 792
          http://japi.svn.sourceforge.net/japi/?rev=792&view=rev
Author:   christianhujer
Date:     2009-02-09 01:44:33 +0000 (Mon, 09 Feb 2009)
Log Message:
-----------
Improved TodoScanner to match all keywords from the SUN code conventions.
Modified Paths:
--------------
    tools/todoScanner/trunk/src/prj/net/sf/japi/tools/todoScanner/TodoScanner.java
Added Paths:
-----------
    tools/todoScanner/trunk/src/tst/test/
    tools/todoScanner/trunk/src/tst/test/net/
    tools/todoScanner/trunk/src/tst/test/net/sf/
    tools/todoScanner/trunk/src/tst/test/net/sf/japi/
    tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/
    tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/
    tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/TodoScannerTest.java
Modified: tools/todoScanner/trunk/src/prj/net/sf/japi/tools/todoScanner/TodoScanner.java
===================================================================
--- tools/todoScanner/trunk/src/prj/net/sf/japi/tools/todoScanner/TodoScanner.java	2009-02-01 22:35:44 UTC (rev 791)
+++ tools/todoScanner/trunk/src/prj/net/sf/japi/tools/todoScanner/TodoScanner.java	2009-02-09 01:44:33 UTC (rev 792)
@@ -8,9 +8,15 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import net.sf.japi.io.args.ArgParser;
 import net.sf.japi.io.args.BasicCommand;
+import net.sf.japi.io.args.Option;
 import org.jetbrains.annotations.NotNull;
 
 /** Scanner for comments of specific formats like to do comments.
@@ -21,6 +27,18 @@
     /** The file encoding that is used for reading and writing files as weil es parsing substitutions from {@link System#in}. */
     private final Charset encoding = Charset.defaultCharset();
 
+    /** The default list of keywords. */
+    private static final List<String> defaultKeywords = Collections.unmodifiableList(Arrays.asList("TODO", "FIXME", "XXX"));
+
+    /** The list of keywords to scan for. */
+    private final List<String> keywords = new ArrayList<String>(defaultKeywords);
+
+    /** Lazy-initialized pattern. */
+    private Pattern pattern;
+
+    /** Lazy-initialized matcher. */
+    private Matcher matcher;
+
     /** Main program.
      * @param args Command line arguments (try --help).
      */
@@ -28,9 +46,27 @@
         ArgParser.simpleParseAndRun(new TodoScanner(), args);
     }
 
+    /** Clears the list of keywords. */
+    @Option({"c", "clear"})
+    public void clearListOfKeywords() {
+        keywords.clear();
+    }
+
+    /** Adds an entry to the list of keywords.
+     * @param keyword Keyword to add to the list of keywords.
+     */
+    @Option({"a", "add"})
+    public void addKeyword(@NotNull final String keyword) {
+        keywords.add(keyword);
+        // pattern and matcher are no longer up-to-date, delete them.
+        pattern = null;
+        matcher = null;
+    }
+
     /** {@inheritDoc} */
     @SuppressWarnings({"InstanceMethodNamingConvention"})
     public int run(@NotNull final List<String> args) throws Exception {
+        init();
         if (args.size() == 0) {
             scanForTodos(System.in);
         } else {
@@ -72,9 +108,40 @@
         final BufferedReader in = cin instanceof BufferedReader ? (BufferedReader) cin : new BufferedReader(cin);
         int lineNumber = 0;
         for (String line; (line = in.readLine()) != null; lineNumber++) {
-            if (line.matches("TODO")) {
+            if (isMatching(line)) {
                 System.out.println(lineNumber + ": " + line);
             }
         }
     }
+
+    /** Initializes pattern and matcher to match any of the keywords */
+    public void init() {
+        if (pattern == null) {
+            final StringBuilder regex = new StringBuilder();
+            regex.append("\\b(");
+            boolean first = true;
+            for (final String keyword : keywords) {
+                if (!first) {
+                    regex.append("|");
+                }
+                regex.append(keyword);
+                first = false;
+            }
+            regex.append(")\\b");
+            pattern = Pattern.compile(regex.toString());
+            assert matcher == null;
+            matcher = pattern.matcher("");
+        }
+        assert matcher != null;
+    }
+
+    /** Returns whether or not the string contains one of the keywords.
+     * @param s String to test.
+     * @return <code>true</code> if the string contains one of the keywords, otherwise <code>false</code>.
+     */
+    public boolean isMatching(@NotNull final CharSequence s) {
+        matcher.reset(s);
+        return matcher.find();
+    }
+
 }
Added: tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/TodoScannerTest.java
===================================================================
--- tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/TodoScannerTest.java	                        (rev 0)
+++ tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/TodoScannerTest.java	2009-02-09 01:44:33 UTC (rev 792)
@@ -0,0 +1,37 @@
+package test.net.sf.japi.tools.todoScanner;
+
+import net.sf.japi.tools.todoScanner.TodoScanner;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Unit test for {@link TodoScanner}.
+ * @author <a href="mailto:ch...@ri...">Christian Hujer</a>
+ */
+public class TodoScannerTest {
+
+    /** Tests if the default setting works. */
+    @Test
+    public void testDefault() {
+        final TodoScanner todoScanner = new TodoScanner();
+        todoScanner.init();
+        Assert.assertFalse(todoScanner.isMatching("OTTODO"));
+        Assert.assertFalse(todoScanner.isMatching("XXXX"));
+        Assert.assertFalse(todoScanner.isMatching("FIXMEE"));
+        Assert.assertTrue(todoScanner.isMatching("TODO"));
+        Assert.assertTrue(todoScanner.isMatching("XXX"));
+        Assert.assertTrue(todoScanner.isMatching("FIXME"));
+        Assert.assertTrue(todoScanner.isMatching("// TODO:"));
+        Assert.assertTrue(todoScanner.isMatching("// XXX:"));
+        Assert.assertTrue(todoScanner.isMatching("// FIXME:"));
+        Assert.assertTrue(todoScanner.isMatching("//TODO:"));
+        Assert.assertTrue(todoScanner.isMatching("//XXX:"));
+        Assert.assertTrue(todoScanner.isMatching("//FIXME:"));
+        Assert.assertTrue(todoScanner.isMatching("/*TODO:"));
+        Assert.assertTrue(todoScanner.isMatching("/*XXX:"));
+        Assert.assertTrue(todoScanner.isMatching("/*FIXME:"));
+        Assert.assertTrue(todoScanner.isMatching("#TODO:"));
+        Assert.assertTrue(todoScanner.isMatching("#XXX:"));
+        Assert.assertTrue(todoScanner.isMatching("#FIXME:"));
+    }
+}
Property changes on: tools/todoScanner/trunk/src/tst/test/net/sf/japi/tools/todoScanner/TodoScannerTest.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + LF
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |