All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pathvisio.libgpml.util.FileUtils Maven / Gradle / Ivy

/*******************************************************************************
 * PathVisio, a tool for data visualization and analysis using biological pathways
 * Copyright 2006-2022 BiGCaT Bioinformatics, WikiPathways
 * 
 * Licensed 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.pathvisio.libgpml.util;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.pathvisio.libgpml.debug.Logger;

/**
 * Collection of static utility methods dealing with files.
 * 
 * @author unknown
 */
public class FileUtils {

	/**
	 * Returns all files in a directory
	 * 
	 * @param directory The directory to get the files from
	 * @param recursive Whether to include sub directories or not
	 * @return A list of files in the given directory
	 */
	public static List getFiles(File directory, boolean recursive) {
		List fileList = new ArrayList();

		if (!directory.isDirectory()) { // File is not a directory, return file itself (if has correct extension)
			fileList.add(directory);
			return fileList;
		}

		// Get all files in this directory
		File[] files = directory.listFiles();

		// Recursively add the files
		for (File f : files) {
			if (f.isDirectory()) {
				if (recursive)
					fileList.addAll(getFiles(f, true));
			} else
				fileList.add(f);
		}

		return fileList;
	}

	/**
	 * Returns all files in a directory
	 * 
	 * @param directory the directory to get the files from
	 * @param extension the extension of the files to get, without the dot so e.g.
	 *                  "gpml"
	 * @param recursive whether to include subdirectories or not
	 * @return A list of files with given extension present in the given directory
	 */
	public static List getFiles(File directory, final String extension, boolean recursive) {
		List fileList = new ArrayList();

		if (!directory.isDirectory()) { // File is not a directory, return file itself (if has correct extension)
			if (directory.getName().endsWith("." + extension))
				fileList.add(directory);
			return fileList;
		}

		// Get all files in this directory
		File[] files = directory.listFiles(new FileFilter() {
			public boolean accept(File f) {
				return (f.isDirectory() || f.getName().endsWith("." + extension)) ? true : false;
			}
		});

		// Recursively add the files
		for (File f : files) {
			if (f.isDirectory()) {
				if (recursive)
					fileList.addAll(getFiles(f, extension, true));
			} else
				fileList.add(f);
		}

		return fileList;
	}

	/**
	 * Determines the number of lines in the given file.
	 * 
	 * @param fileName the file to get the number of lines from
	 * @return the number of lines, or -1 if unable to determine the number of lines
	 */
	public static int getNrLines(String fileName) {
		int nrLines = -1;
		try {
			RandomAccessFile randFile = new RandomAccessFile(fileName, "r");
			long lastRec = randFile.length();
			randFile.close();
			FileReader fileRead = new FileReader(fileName);
			LineNumberReader lineRead = new LineNumberReader(fileRead);
			lineRead.skip(lastRec);
			nrLines = lineRead.getLineNumber() - 1;
			fileRead.close();
			lineRead.close();
		} catch (IOException e) {
			Logger.log.error("Unable to determine number of lines in file " + fileName, e);
		}
		return nrLines;
	}

	/**
	 * Returns file name extension.
	 * 
	 * @param fileName file as a String
	 * @return fragment of the filename after the '.'. Returns null if there was no
	 *         '.'.
	 */
	public static String getExtension(String fileName) {
		int dot = fileName.lastIndexOf('.');
		String ext = null;
		if (dot >= 0) {
			ext = fileName.substring(dot + 1, fileName.length());
		}
		return ext;
	}

	/**
	 * Removes the file extension (everything from the last occurence of '.')
	 */
	public static String removeExtension(String fname) {
		int dot = fname.lastIndexOf('.');
		if (dot > 0)
			fname = fname.substring(0, dot);
		return fname;
	}

	/**
	 * Replaces file extension with something else. If there was no extension
	 * previously, the new one will simply be added.
	 * 
	 * @param fname     the file name to use.
	 * @param extension the new extension to use. Should not include dot.
	 */
	public static File replaceExtension(File fname, String extension) {
		return new File(removeExtension(fname.toString()) + "." + extension);
	}

	/**
	 * Downloads a remote file given by an URL to the given local file
	 * 
	 * @param url    the URL that specifies the location of the file to download
	 * @param toFile the local file to which the remote file will be downloaded
	 * @throws IOException
	 */
	public static void downloadFile(URL url, File toFile) throws IOException {
		OutputStream out = null;
		URLConnection conn = null;
		InputStream in = null;
		out = new BufferedOutputStream(new FileOutputStream(toFile));
		conn = url.openConnection();
		conn.setUseCaches(false);
		in = conn.getInputStream();
		byte[] buffer = new byte[1024];
		int numRead;
		long numWritten = 0;
		while ((numRead = in.read(buffer)) != -1) {
			out.write(buffer, 0, numRead);
			numWritten += numRead;
		}

		if (in != null) {
			in.close();
		}
		if (out != null) {
			out.close();
		}
	}

	/**
	 * Maps a file from one point in the directory tree to another point. For
	 * example, with this function you can map from
	 *
	 * /home/username/input/pathways/human/metabolomic/pathway.gpml to
	 * /tmp/output/pathways/human/metabolomic/pathway.gpml
	 * 
	 * @param f       the file.
	 * @param srcDir  the source directory.
	 * @param destDir the destination directory.
	 * @return the file.
	 */
	public static File mapFileTree(File f, File srcDir, File destDir) {
		List components = new ArrayList();
		File dest = destDir;
		File src = f;

		// unwind source
		while (!src.equals(srcDir) && src != null) {
			components.add(f.getName());
			src = src.getParentFile();
		}

		// rewind dest
		for (String s : components) {
			dest = new File(destDir, s);
		}
		return dest;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy