antoine     2003/07/15 16:19:15

  Modified:    src/main/org/apache/tools/ant DirectoryScanner.java
               src/testcases/org/apache/tools/ant DirectoryScannerTest.java
  Log:
  Fix the following (remark of Stefan Bodewig on July 15th 2003 on the dev list)
  * You go a long way to avoid redundantly adding patterns in
  DirectoryScanner#checkIncludePatterns (the parent check).  If the
  patterns come in reversed, you'll still have duplicate roots, no?  Say
  a/b/c is added before a/b is.  You may avoid this by sorting the
  include patterns first.
  
  Revision  Changes    Path
  1.45      +28 -13    ant/src/main/org/apache/tools/ant/DirectoryScanner.java
  
  Index: DirectoryScanner.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- DirectoryScanner.java     15 Jul 2003 14:18:07 -0000      1.44
  +++ DirectoryScanner.java     15 Jul 2003 23:19:15 -0000      1.45
  @@ -658,34 +658,49 @@
               String newpattern = 
                   SelectorUtils.rtrimWildcardTokens(includes[icounter]);
               // check whether the candidate new pattern has a parent
  -            boolean hasParent=false;
  +            boolean hasParent = false;
               Enumeration myenum = newroots.keys();
  +            // logically, there should be at most one child pattern present
  +            // let's use a vector though to be sure
  +            Vector vdelete = new Vector();
               while (myenum.hasMoreElements()) {
  -                String existingpattern= (String) myenum.nextElement();
  +                String existingpattern = (String) myenum.nextElement();
  +                // check whether the existing pattern is a child of the new 
pattern
  +                if (existingpattern.length() >= newpattern.length()) {
  +                    if (existingpattern.indexOf(newpattern) == 0) {
  +                        vdelete.add(existingpattern);
  +                    }
  +                }
  +                // check whether the new pattern is a child of the existing 
pattern
                   if (existingpattern.length() <= newpattern.length()) {
  -                    if (newpattern.indexOf(existingpattern)==0) {
  -                        hasParent=true;
  +                    if (newpattern.indexOf(existingpattern) == 0) {
  +                        hasParent = true;
  +                        break;
                       }
                   }
               }
  +            // add the new pattern if does not have parents
               if (!hasParent) {
  -                newroots.put(newpattern,includes[icounter]);
  +                newroots.put(newpattern, includes[icounter]);
  +                // remove child patterns
  +                for (int icounter2 = 0; icounter2 < vdelete.size(); 
icounter2++) {
  +                    newroots.remove(vdelete.elementAt(icounter2));
  +                }
               }
           }
   
           Enumeration enum2 = newroots.keys();
           while (enum2.hasMoreElements()) {
               String currentelement = (String) enum2.nextElement();
  -            File myfile=new File(basedir, currentelement);
  +            File myfile = new File(basedir, currentelement);
               if (myfile.exists()) {
                   if (myfile.isDirectory()) {
  -                    if (isIncluded(currentelement) 
  -                        && currentelement.length()>0) {
  -                        accountForIncludedDir(currentelement,myfile,true);
  +                    if (isIncluded(currentelement)
  +                        && currentelement.length() > 0) {
  +                        accountForIncludedDir(currentelement, myfile, true);
                       }  else {
                           if (currentelement.length() > 0) {
  -                            if (currentelement.charAt(currentelement.length()
  -                                                      -1 ) 
  +                            if 
(currentelement.charAt(currentelement.length()-1)
                                   != File.separatorChar) {
                                   currentelement = 
                                       currentelement + File.separatorChar;
  @@ -694,10 +709,10 @@
                           scandir(myfile, currentelement, true);
                       }
                   } else {
  -                    String originalpattern= 
  +                    String originalpattern =
                           (String) newroots.get(currentelement);
                       if (originalpattern.equals(currentelement)) {
  -                        accountForIncludedFile(currentelement,myfile);
  +                        accountForIncludedFile(currentelement, myfile);
                       }
                   }
               }
  
  
  
  1.12      +16 -0     
ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java
  
  Index: DirectoryScannerTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/DirectoryScannerTest.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- DirectoryScannerTest.java 11 Jul 2003 12:59:29 -0000      1.11
  +++ DirectoryScannerTest.java 15 Jul 2003 23:19:15 -0000      1.12
  @@ -133,6 +133,22 @@
           ds.scan();
           compareFiles(ds, new String[] {"alpha/beta/beta.xml", 
"alpha/beta/gamma/gamma.xml"} ,new String[] {"", "alpha", "alpha/beta", 
"alpha/beta/gamma"});
       }
  +    // father and child pattern test
  +    public void testOrderOfIncludePatternsIrrelevant() {
  +        String [] expectedFiles = {"alpha/beta/beta.xml", 
"alpha/beta/gamma/gamma.xml"};
  +        String [] expectedDirectories = {"alpha/beta", "alpha/beta/gamma" };
  +        DirectoryScanner ds = new DirectoryScanner();
  +        ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
  +        ds.setIncludes(new String[] {"alpha/be?a/**", "alpha/beta/gamma/"});
  +        ds.scan();
  +        compareFiles(ds, expectedFiles, expectedDirectories);
  +        // redo the test, but the 2 include patterns are inverted
  +        ds = new DirectoryScanner();
  +        ds.setBasedir(new File(getProject().getBaseDir(), "tmp"));
  +        ds.setIncludes(new String[] {"alpha/beta/gamma/", "alpha/be?a/**"});
  +        ds.scan();
  +        compareFiles(ds, expectedFiles, expectedDirectories);
  +    }
       public void tearDown() {
           getProject().executeTarget("cleanup");
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to