You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2008/09/18 17:28:09 UTC

svn commit: r696674 - in /ant/core/trunk/src/main/org/apache/tools/ant: DirectoryScanner.java util/VectorSet.java

Author: bodewig
Date: Thu Sep 18 08:28:08 2008
New Revision: 696674

URL: http://svn.apache.org/viewvc?rev=696674&view=rev
Log:
replace protected Vectors with a Vector subclass that has constant time access for contains

Added:
    ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java   (with props)
Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java

Modified: ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java?rev=696674&r1=696673&r2=696674&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/DirectoryScanner.java Thu Sep 18 08:28:08 2008
@@ -42,6 +42,7 @@
 import org.apache.tools.ant.types.selectors.TokenizedPattern;
 import org.apache.tools.ant.util.CollectionUtils;
 import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.VectorSet;
 
 /**
  * Class for scanning a directory for files/directories which match certain
@@ -1043,14 +1044,14 @@
      * Clear the result caches for a scan.
      */
     protected synchronized void clearResults() {
-        filesIncluded    = new Vector();
-        filesNotIncluded = new Vector();
-        filesExcluded    = new Vector();
-        filesDeselected  = new Vector();
-        dirsIncluded     = new Vector();
-        dirsNotIncluded  = new Vector();
-        dirsExcluded     = new Vector();
-        dirsDeselected   = new Vector();
+        filesIncluded    = new VectorSet();
+        filesNotIncluded = new VectorSet();
+        filesExcluded    = new VectorSet();
+        filesDeselected  = new VectorSet();
+        dirsIncluded     = new VectorSet();
+        dirsNotIncluded  = new VectorSet();
+        dirsExcluded     = new VectorSet();
+        dirsDeselected   = new VectorSet();
         everythingIncluded = (basedir != null);
         scannedDirs.clear();
     }

Added: ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java?rev=696674&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java Thu Sep 18 08:28:08 2008
@@ -0,0 +1,177 @@
+/*
+ *  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.tools.ant.util;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Vector;
+
+/**
+ * Subclass of Vector that won't store duplicate entries and shows
+ * HashSet's constant time performance characteristics for the
+ * contains method.
+ *
+ * <p>This is not a general purpose class but has been written because
+ * the protected members of {@link
+ * org.apache.tools.ant.DirectoryScanner DirectoryScanner} prohibited
+ * later revisions from using a more efficient collection.</p>
+ *
+ * <p>Methods are synchronized to keep Vector's contract.</p>
+ *
+ * @since Ant 1.8.0
+ */
+public class VectorSet extends Vector {
+    private final HashSet set = new HashSet();
+
+    public synchronized boolean add(Object o) {
+        if (set.add(o)) {
+            return super.add(o);
+        }
+        return false;
+    }
+
+    /**
+     * This implementation may not add the element at the given index
+     * if it is already contained in the collection.
+     */
+    public synchronized void add(int index, Object o) {
+        if (set.add(o)) {
+            super.add(index, o);
+        }
+    }
+
+    public void addElement(Object o) {
+        add(o);
+    }
+
+    public synchronized boolean addAll(Collection c) {
+        boolean changed = false;
+        for (Iterator i = c.iterator(); i.hasNext(); ) {
+            changed |= add(i.next());
+        }
+        return changed;
+    }
+
+    /**
+     * This implementation may not add all elements at the given index
+     * if any of them are already contained in the collection.
+     */
+    public synchronized boolean addAll(int index, Collection c) {
+        boolean changed = false;
+        for (Iterator i = c.iterator(); i.hasNext(); ) {
+            Object o = i.next();
+            boolean added = set.add(o);
+            if (added) {
+                super.add(index++, o);
+            }
+            changed |= added;
+        }
+        return changed;
+    }
+
+    public synchronized void clear() {
+        super.clear();
+        set.clear();
+    }
+
+    public Object clone() {
+        VectorSet vs = (VectorSet) super.clone();
+        vs.set.addAll(set);
+        return vs;
+    }
+
+    public synchronized boolean contains(Object o) {
+        return set.contains(o);
+    }
+
+    public synchronized boolean containsAll(Collection c) {
+        return set.containsAll(c);
+    }
+
+    public void insertElementAt(Object o, int index) {
+        add(index, o);
+    }
+
+    public synchronized Object remove(int index) {
+        Object o = super.remove(index);
+        set.remove(o);
+        return o;
+    }
+
+    public synchronized boolean remove(Object o) {
+        if (set.remove(o)) {
+            return super.remove(o);
+        }
+        return false;
+    }
+
+    public synchronized boolean removeAll(Collection c) {
+        boolean changed = false;
+        for (Iterator i = c.iterator(); i.hasNext(); ) {
+            changed |= remove(i.next());
+        }
+        return changed;
+    }
+
+    public void removeAllElements() {
+        clear();
+    }
+
+    public boolean removeElement(Object o) {
+        return remove(o);
+    }
+
+    public synchronized void removeElementAt(int index) {
+        remove(get(index));
+    }
+
+    public synchronized void removeRange(final int fromIndex, int toIndex) {
+        while (toIndex > fromIndex) {
+            remove(--toIndex);
+        }
+    }
+
+    public synchronized boolean retainAll(Collection c) {
+        if (super.retainAll(c)) {
+            clear();
+            addAll(c);
+            return true;
+        }
+        return false;
+    }
+
+    public synchronized Object set(int index, Object o) {
+        Object orig = get(index);
+        if (set.add(o)) {
+            super.set(index, o);
+            set.remove(orig);
+        } else {
+            int oldIndexOfO = indexOf(o);
+            remove(o);
+            remove(orig);
+            add(oldIndexOfO > index ? index : index - 1, o);
+        }
+        return orig;
+    }
+
+    public void setElementAt(Object o, int index) {
+        set(index, o);
+    }
+
+}
\ No newline at end of file

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java
------------------------------------------------------------------------------
    svn:eol-style = native