rsitze      02/02/22 07:39:04

  Modified:    java     build.xml
               java/test/utils TestSrcContent.java
  Log:
  Updated tests to check for inappropriate use of System.{out|err}.println
  
  Revision  Changes    Path
  1.113     +9 -0      xml-axis/java/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/build.xml,v
  retrieving revision 1.112
  retrieving revision 1.113
  diff -u -r1.112 -r1.113
  --- build.xml 20 Feb 2002 18:59:20 -0000      1.112
  +++ build.xml 22 Feb 2002 15:39:04 -0000      1.113
  @@ -82,6 +82,8 @@
     <property name="clutil.jar" value="lib/clutil.jar"/>
     <property name="tt-bytecode.jar" value="lib/tt-bytecode.jar"/>
   
  +  <property name="regexp.jar" value="test/lib/jakarta-oro-2.0.5.jar"/>
  +
     <property name="junit.jar" value="lib/junit.jar"/>
   
     <property name="packages" value="org.*,javax.*"/>
  @@ -107,6 +109,7 @@
     <path id="classpath">
       <pathelement location="${clutil.jar}"/>
       <pathelement location="${xerces.jar}"/>
  +    <pathelement location="${regexp.jar}"/>
       <pathelement location="${junit.jar}"/>
       <pathelement location="${excalibur.jar}"/>
       <pathelement location="${java.home}/../lib/tools.jar"/>
  @@ -124,6 +127,10 @@
         classname="javax.servlet.Servlet"
         classpathref="classpath"/>
   
  +    <available property="regexp.present"
  +      classname="org.apache.oro.text.regex.Pattern"
  +      classpathref="classpath"/>
  +
       <available property="junit.present"
         classname="junit.framework.TestCase"
         classpathref="classpath"/>
  @@ -190,6 +197,7 @@
       <echo message=""/>
       <echo message="--- Optional Libraries ---" />
       <echo message="servlet.present=${servlet.present}" />
  +    <echo message="regexp.present=${regexp.present}" />
       <echo message="junit.present=${junit.present}" />
       <echo message="activation.present=${activation.present}" />
       <echo message="mailapi.present=${mailapi.present}" />
  @@ -317,6 +325,7 @@
           <path refid="classpath"/>
         </classpath>
         <include name="test/**/*.java" />
  +      <exclude name="test/lib/*.java"/>
         <exclude name="test/inout/*.java" />
         <exclude name="test/wsdl/*/*.java" />
         <exclude name="test/wsdl/interop3/groupE/**/*.java" />
  
  
  
  1.2       +114 -32   xml-axis/java/test/utils/TestSrcContent.java
  
  Index: TestSrcContent.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/utils/TestSrcContent.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestSrcContent.java       19 Feb 2002 17:38:23 -0000      1.1
  +++ TestSrcContent.java       22 Feb 2002 15:39:04 -0000      1.2
  @@ -14,20 +14,28 @@
   import junit.framework.TestCase;
   import junit.framework.TestSuite;
   
  +import org.apache.oro.text.regex.Pattern;
  +import org.apache.oro.text.regex.PatternMatcher;
  +import org.apache.oro.text.regex.PatternCompiler;
  +import org.apache.oro.text.regex.Perl5Matcher;
  +import org.apache.oro.text.regex.Perl5Compiler;
  +import org.apache.oro.text.regex.MalformedPatternException;
  +
   import org.apache.axis.utils.JavaUtils;
   
   /**
    * This TestCase verifies that content of the source files adheres
  - * to certain coding practices by looking for "illegal" strings:
  + * to certain coding practices by matching regular expressions
  + * (string patterns):
    *
    * - Verify that Log4J logger is not being used directly
    *   ("org.apache.log4j" is not in source files).
    *
  - * - !! Someday: look for System.out.println .... !!
  - *
  + * - Verify that System.out.println is not used except
  + *   in wsdl to/from java tooling.
    *
  - * To add new strings to "avoid", search for and append to the
  - * private attribute 'avoidStrings'.
  + * To add new patterns, search for and append to the
  + * private attribute 'avoidPatterns'.
    *
    * Based on code in TestMessages.java.
    */
  @@ -40,6 +48,10 @@
           return new TestSuite(TestSrcContent.class);
       }
   
  +    private final String LS = System.getProperty("line.separator");
  +
  +    private String errors = "";
  +
       /**
        * If this test is run from xml-axis/java, then walk through the source
        * tree (xml-axis/java/src), calling checkFile for each file.
  @@ -48,62 +60,132 @@
           String baseDir = System.getProperty("user.dir");
           File   srcDir = new File(baseDir, "src");
   
  -        if (srcDir.exists() && !walkTree(srcDir)) {
  -            throw new AssertionFailedError("Unexpected source file content");
  +        if (srcDir.exists()) {
  +            walkTree(srcDir);
  +        }
  +
  +        if (!errors.equals("")) {
  +            throw new AssertionFailedError(errors);
           }
       } // testSourceFiles
   
  +
       /**
        * Walk the source tree
        */
  -    private boolean walkTree(File srcDir) {
  -        boolean cleanWalk = true;
  -
  +    private void walkTree(File srcDir) {
           File[] files = srcDir.listFiles();
           for (int i = 0; i < files.length; ++i) {
  -
  -            // beware 'shortcuts' in logic operations...
               if (files[i].isDirectory()) {
  -                cleanWalk = walkTree(files[i]) && cleanWalk;
  +                walkTree(files[i]);
               }
  -            else if (files[i].getName().endsWith(".java")) {
  -                cleanWalk = checkFile(files[i]) && cleanWalk;
  +            else {
  +                checkFile(files[i]);
               }
           }
  -
  -        return cleanWalk;
       } // walkTree
   
  +
  +    static private class FileNameContentPattern
  +    {
  +        private PatternCompiler compiler = new Perl5Compiler();
  +        private PatternMatcher matcher = new Perl5Matcher();
  +
  +        private Pattern namePattern = null;
  +        private Pattern contentPattern = null;
  +        private boolean expectContent = true;
  +
  +        FileNameContentPattern(String namePattern,
  +                               String contentPattern,
  +                               boolean expectContentInFile)
  +        {
  +            try {
  +                this.namePattern = compiler.compile(namePattern);
  +                this.contentPattern = compiler.compile(contentPattern);
  +                this.expectContent = expectContentInFile;
  +            }
  +            catch (MalformedPatternException e) {
  +                throw new AssertionFailedError(e.getMessage());
  +            }
  +        }
  +
  +        /**
  +         * This is not a match IFF
  +         *  - the name matches, AND
  +         *  - the content is not as expected
  +         */
  +        boolean noMatch(String name, String content)
  +        {
  +            return
  +                matcher.matches(name, namePattern) &&
  +                matcher.contains(content, contentPattern) != expectContent;
  +        }
  +
  +        String getContent() { return contentPattern.getPattern(); }
  +
  +        boolean getExpectContent() { return expectContent; }
  +    };
  +
       /**
        * Check for the following in the input file:
  -     *     string "org.apache.log4j.Category" in file.
  +     *     "org.apache.log4j"
        */
  -    private static final String avoidStrings[] =
  +    private static final FileNameContentPattern avoidPatterns[] =
           {
  -            "org.apache.log4j"
  -        };
  +            // For escape ('\'), remember that Java gets first dibs..
  +            // so double-escape for pattern-matcher to see it.
   
  -    private boolean checkFile(File file) {
  -        boolean cleanFile = true;
  +            // Verify that java files do not use Log4j
  +            new FileNameContentPattern(".+\\.java",
  +                                       "org\\.apache\\.log4j", false),
  +
  +            // Verify that axis java files do not use System.out.println
  +            // or System.err.println, expect:
  +            //   - AxisFault.java,
  +            //   - Version.java
  +            //   - client/AdminClient.java
  +            //   - providers/BSFProvider.java
  +            //   - utils/tcpmon.java
  +            //   - tooling in 'org/apache/axis/wsdl'
  +            //
  +            new FileNameContentPattern(".+([\\\\/])"
  +                                       + "java\\1src\\1org\\1apache\\1axis\\1"
  +                                       + "(?!AxisFault\\.java"
  +                                       + "|client\\1AdminClient\\.java"
  +                                       + "|utils\\1tcpmon\\.java"
  +                                       + "|providers\\1BSFProvider\\.java"
  +                                       + "|Version\\.java"
  +                                       + "|wsdl\\1)"
  +                                       + "([a-zA-Z0-9_]+\\1)*"
  +                                       + "[^\\\\/]+\\.java",
  +                                       "System\\.(out|err)\\.println", false)
  +        };
   
  +    private void checkFile(File file) {
           try {
               FileInputStream fis = new FileInputStream(file);
               byte[] bytes = new byte[fis.available()];
               fis.read(bytes);
  -            String string = new String(bytes);
  +            String content = new String(bytes);
   
  -            for (int i = 0; i < avoidStrings.length; i++) {
  -                if (string.indexOf(avoidStrings[i]) >= 0) {
  -                    System.out.println(file.getPath() + ": Unexpected '" + 
avoidStrings[i]);
  -                    cleanFile = false;
  +            for (int i = 0; i < avoidPatterns.length; i++) {
  +                if (avoidPatterns[i].noMatch(file.getPath(), content)) {
  +                //                if (content.indexOf(avoidStrings[i]) >= 0) {
  +                    errors = errors
  +                        + "File: " + file.getPath() + ": "
  +                        + (avoidPatterns[i].getExpectContent()
  +                           ? "Expected: "
  +                           : "Unexpected: ")
  +                        + avoidPatterns[i].getContent()
  +                        + LS;
                   }
               }
           }
           catch (Throwable t) {
  -            System.out.println(file.getPath() + ": " + t.getMessage());
  -            cleanFile = false;
  +            errors = errors
  +                + "File: " + file.getPath()
  +                + ": " + t.getMessage()
  +                + LS;
           }
  -
  -        return cleanFile;
       } // checkFile
   }
  
  
  


Reply via email to