You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by lu...@apache.org on 2015/06/17 14:57:33 UTC

svn commit: r1686005 - in /oodt/trunk/commons/src: main/java/org/apache/oodt/commons/io/DirectorySelector.java test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java

Author: luca
Date: Wed Jun 17 12:57:32 2015
New Revision: 1686005

URL: http://svn.apache.org/r1686005
Log:
Inserting new DirectorySelector class to support recursive crawling and selection of directories containing specified files (OODT-854)

Added:
    oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java   (with props)
    oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java   (with props)

Added: oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java
URL: http://svn.apache.org/viewvc/oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java?rev=1686005&view=auto
==============================================================================
--- oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java (added)
+++ oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java Wed Jun 17 12:57:32 2015
@@ -0,0 +1,104 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more contributor
+// license agreements.  See the NOTICE.txt 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.oodt.commons.io;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class that traverses a directory tree 
+ * and selects those directories that contain ALL of the requested files.
+ * If no requested files are specified, an empty list will be returned.
+ * 
+ * @author Luca Cinquini
+ */
+public class DirectorySelector {
+	
+	private List<String> files;
+	
+	private FileFilter directoryFilter;
+	
+	/**
+	 * Creates a new directory selector for the specified files
+	 * 
+	 * @param files the list of files that this class will look for
+	 */
+	public DirectorySelector(List<String> files) {
+		
+		// list of requested files
+		this.files = files;
+		
+		// File filter that selects directories
+		this.directoryFilter = new FileFilter() {
+			public boolean accept(File file) {
+				return file.isDirectory();
+			}
+		};
+		
+	}
+	
+    /**
+     * Looks for files in all sub-directories starting from rootDir.
+     * 
+     * @param rootDir starting root directory
+     * @return list of matching sub-directories as 'file:///path/to/dir' URIs
+     */
+	public List<String> traverseDir(File rootDir) {
+				
+		List<String> subDirs = new ArrayList<String>();
+		
+		if (rootDir.exists() && files!=null && files.size()>0) {
+			this.traverseDir(rootDir, subDirs);
+		}
+		
+		return subDirs;
+		
+	}
+	
+	/**
+	 * Internal recursion method.
+	 * 
+	 * @param dir
+	 * @param subDirs
+	 */
+    private void traverseDir(File dir, List<String> subDirs) {
+    	
+    	// loop over required files,
+    	// include only if all files are found
+		boolean include = true;
+     	for (String file : files) {
+     		File requiredFile = new File(dir, file);
+     		if (!requiredFile.exists()) {
+     			include = false;
+     		}
+     	}
+     	
+     	// include this directory
+     	if (include) {
+    		subDirs.add("file://"+dir.getAbsolutePath());
+    	}
+    	
+    	// recursion over sub-directories
+    	File[] subdirs = dir.listFiles( directoryFilter );
+        for (File subdir : subdirs) {
+        	traverseDir(subdir, subDirs);
+        }
+    	
+    }
+
+}

Propchange: oodt/trunk/commons/src/main/java/org/apache/oodt/commons/io/DirectorySelector.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java
URL: http://svn.apache.org/viewvc/oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java?rev=1686005&view=auto
==============================================================================
--- oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java (added)
+++ oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java Wed Jun 17 12:57:32 2015
@@ -0,0 +1,84 @@
+package org.apache.oodt.commons.io;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class DirectorySelectorTest extends TestCase {
+	
+	File workingDir;
+	String relPath = "org/apache/oodt/commons/io/";
+	File thisDir;
+	String thisClass = "DirectorySelectorTest.class";
+	
+	public DirectorySelectorTest(String name) {
+		
+		super(name);
+		
+		workingDir = new File(DirectorySelectorTest.class.getProtectionDomain().getCodeSource().getLocation().getPath());
+		thisDir = new File(workingDir, relPath);
+
+	}
+	
+	/**
+	 * Tests starting from directory containing this class file,
+	 * no recursion involved
+	 */
+	public void testPositiveSelectionWithoutRecursion() {
+		
+		DirectorySelector ds = new DirectorySelector(Arrays.asList( new String[] { thisClass } ));
+		List<String> dirs = ds.traverseDir(thisDir);
+		assertEquals(1, dirs.size());
+		assertEquals("file://"+thisDir.getAbsolutePath(), dirs.get(0));
+		
+	}
+	
+	/**
+	 * Tests starting from top-level tests directory,
+	 * involves recursion
+	 */
+	public void testPositiveSelectionWithRecursion() {
+		
+		DirectorySelector ds = new DirectorySelector(Arrays.asList( new String[] { thisClass } ));
+		List<String> dirs = ds.traverseDir(workingDir);
+		assertEquals(1, dirs.size());
+		assertEquals("file://"+thisDir.getAbsolutePath(), dirs.get(0));
+		
+	}
+	
+	/**
+	 * Tests that no directories are selected if passing an invalid file.
+	 */
+	public void testNegativeSelectionForInvalidFile() {
+		
+		DirectorySelector ds = new DirectorySelector(Arrays.asList( new String[] { "doesNotExist.txt" } ));
+		List<String> dirs = ds.traverseDir(workingDir);
+		assertEquals(0, dirs.size());
+
+	}
+	
+	/**
+	 * Tests that no directories are returned when no files are specified.
+	 */
+	public void testNegativeSelectionForNoFiles() {
+		
+		DirectorySelector ds = new DirectorySelector(Arrays.asList( new String[] {} ));
+		List<String> dirs = ds.traverseDir(workingDir);
+		assertEquals(0, dirs.size());
+		
+	}
+	
+	/**
+	 * Tests that no directories are returned when starting from an invalid directory.
+	 */
+	public void testNegativeSelectionForInvalidDirectory() {
+		
+		DirectorySelector ds = new DirectorySelector(Arrays.asList( new String[] { thisClass } ));
+		List<String> dirs = ds.traverseDir( new File("/tmp/does/not/exist") );
+		assertEquals(0, dirs.size());
+		
+	}
+
+}

Propchange: oodt/trunk/commons/src/test/java/org/apache/oodt/commons/io/DirectorySelectorTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain