/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. */ package org.opensolaris.opengrok.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.opensolaris.opengrok.configuration.Configuration; import org.opensolaris.opengrok.configuration.RuntimeEnvironment; import org.opensolaris.opengrok.index.IgnoredNames; import static org.junit.Assert.*; /** * Various filesystem utilities used by the different test setups * * @author Trond Norbye */ public class FileUtilities { /** * Extract the source bundle to the given path. * @param sourceBundle bundle to extract * @param root target dir * @throws IOException */ @SuppressWarnings("resource") public static void extractArchive(File sourceBundle, File root) throws IOException { ZipFile zipfile = new ZipFile(sourceBundle); Enumeration e = zipfile.entries(); while (e.hasMoreElements()) { ZipEntry ze = e.nextElement(); File file = new File(root, ze.getName()); if (ze.isDirectory()) { file.mkdirs(); } else { InputStream in = null; FileOutputStream out = null; try { in = zipfile.getInputStream(ze); assertNotNull(in); out = new FileOutputStream(file); assertNotNull(out); copyFile(in, out); } finally { IOUtils.close(in); IOUtils.close(out); } } } } /** * Delete the given directory (rm -rf). * @param root directory to delete. */ public static void removeDirs(File root) { for (File f : root.listFiles()) { if (f.isDirectory()) { removeDirs(f); } else { f.delete(); } } root.delete(); } /** * Copy th given input to the given output 1:1. * @param in source to copy * @param out destination for copy * @throws IOException */ public static void copyFile(InputStream in, OutputStream out) throws IOException { byte[] array = new byte[8192]; int nr; while ((nr = in.read(array)) > 0) { out.write(array, 0, nr); } out.flush(); } /** * Get all files of the given directory and all its descendants obeying * {@link Configuration#getIgnoredNames()}. * @param root where to start the search * @param files where to store files found * @param directories if {@code true} add directories to files * as well. */ public static void getAllFiles(File root, List files, boolean directories) { assertNotNull(files); if (directories) { files.add(root); } IgnoredNames ignore = RuntimeEnvironment.getConfig().getIgnoredNames(); for (File f : root.listFiles()) { if (!ignore.match(f)) { if (f.isDirectory()) { getAllFiles(f, files, directories); } else { files.add(f); } } } } /** * Create an empty directory under {@code /tmp} or similar. * * @param prefix string to prefix the directory name with * @return a {@code File} object pointing to the directory * @throws IOException if the temporary directory cannot be created */ public static File createTemporaryDirectory(String prefix) throws IOException { File file = File.createTempFile(prefix, "opengrok"); if (!file.delete()) { throw new IOException( "Could not create delete temporary file " + file); } if (!file.mkdir()) { throw new IOException( "Could not create temporary directory " + file); } return file; } private FileUtilities() { } /** * Determine if given program is present in one of the directories * in PATH environment variable. * * @param progName name of the program * @return absolute path to the program or null */ public static File findProgInPath(String progName) { String systemPath = System.getenv("PATH"); if (systemPath == null) { return null; } String[] pathDirs = systemPath.split(File.pathSeparator); File absoluteFile = null; for (String dir : pathDirs) { File file = new File(dir, progName); if (file.isFile() && file.canExecute()) { absoluteFile = file; break; } } return absoluteFile; } }