aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java
new file mode 100644
index 00000000..ebf244a5
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java
@@ -0,0 +1,164 @@
+/*
+ * 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.taskdefs.optional.depend;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Stack;
+import java.util.Vector;
+
+/**
+ * An iterator which iterates through the contents of a java directory. The
+ * iterator should be created with the directory at the root of the Java
+ * namespace.
+ *
+ */
+public class DirectoryIterator implements ClassFileIterator {
+
+ /**
+ * This is a stack of current iterators supporting the depth first
+ * traversal of the directory tree.
+ */
+ private Stack enumStack;
+
+ /**
+ * The current directory iterator. As directories encounter lower level
+ * directories, the current iterator is pushed onto the iterator stack
+ * and a new iterator over the sub directory becomes the current
+ * directory. This implements a depth first traversal of the directory
+ * namespace.
+ */
+ private Enumeration currentEnum;
+
+ /**
+ * Creates a directory iterator. The directory iterator is created to
+ * scan the root directory. If the changeInto flag is given, then the
+ * entries returned will be relative to this directory and not the
+ * current directory.
+ *
+ * @param rootDirectory the root if the directory namespace which is to
+ * be iterated over
+ * @param changeInto if true then the returned entries will be relative
+ * to the rootDirectory and not the current directory.
+ * @exception IOException if there is a problem reading the directory
+ * information.
+ */
+ public DirectoryIterator(File rootDirectory, boolean changeInto)
+ throws IOException {
+ super();
+
+ enumStack = new Stack();
+
+ Vector filesInRoot = getDirectoryEntries(rootDirectory);
+
+ currentEnum = filesInRoot.elements();
+ }
+
+ /**
+ * Get a vector covering all the entries (files and subdirectories in a
+ * directory).
+ *
+ * @param directory the directory to be scanned.
+ * @return a vector containing File objects for each entry in the
+ * directory.
+ */
+ private Vector getDirectoryEntries(File directory) {
+ Vector files = new Vector();
+
+ // File[] filesInDir = directory.listFiles();
+ String[] filesInDir = directory.list();
+
+ if (filesInDir != null) {
+ int length = filesInDir.length;
+
+ for (int i = 0; i < length; ++i) {
+ files.addElement(new File(directory, filesInDir[i]));
+ }
+ }
+
+ return files;
+ }
+
+ /**
+ * Template method to allow subclasses to supply elements for the
+ * iteration. The directory iterator maintains a stack of iterators
+ * covering each level in the directory hierarchy. The current iterator
+ * covers the current directory being scanned. If the next entry in that
+ * directory is a subdirectory, the current iterator is pushed onto the
+ * stack and a new iterator is created for the subdirectory. If the
+ * entry is a file, it is returned as the next element and the iterator
+ * remains valid. If there are no more entries in the current directory,
+ * the topmost iterator on the stack is popped off to become the
+ * current iterator.
+ *
+ * @return the next ClassFile in the iteration.
+ */
+ public ClassFile getNextClassFile() {
+ ClassFile nextElement = null;
+
+ try {
+ while (nextElement == null) {
+ if (currentEnum.hasMoreElements()) {
+ File element = (File) currentEnum.nextElement();
+
+ if (element.isDirectory()) {
+
+ // push the current iterator onto the stack and then
+ // iterate through this directory.
+ enumStack.push(currentEnum);
+
+ Vector files = getDirectoryEntries(element);
+
+ currentEnum = files.elements();
+ } else {
+
+ // we have a file. create a stream for it
+ FileInputStream inFileStream
+ = new FileInputStream(element);
+
+ if (element.getName().endsWith(".class")) {
+
+ // create a data input stream from the jar
+ // input stream
+ ClassFile javaClass = new ClassFile();
+
+ javaClass.read(inFileStream);
+
+ nextElement = javaClass;
+ }
+ }
+ } else {
+ // this iterator is exhausted. Can we pop one off the stack
+ if (enumStack.empty()) {
+ break;
+ } else {
+ currentEnum = (Enumeration) enumStack.pop();
+ }
+ }
+ }
+ } catch (IOException e) {
+ nextElement = null;
+ }
+
+ return nextElement;
+ }
+
+}
+