/******************************************************************************* * Copyright (c) 2003, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.jst.server.tomcat.core.internal; import java.io.*; import java.net.URL; import org.eclipse.core.runtime.*; import org.eclipse.osgi.util.NLS; import org.eclipse.wst.server.core.util.PublishHelper; /** * Utility class with an assortment of useful file methods. */ public class FileUtil { // size of the buffer private static final int BUFFER = 10240; // the buffer private static byte[] buf = new byte[BUFFER]; /** * FileUtil cannot be created. Use static methods. */ private FileUtil() { super(); } /** * Copys a directory from a to b. * * @param from java.lang.String * @param to java.lang.String * @param monitor a progress monitor, or <code>null</code> */ public static void copyDirectory(String from, String to, IProgressMonitor monitor) { try { File fromDir = new File(from); File toDir = new File(to); File[] files = fromDir.listFiles(); toDir.mkdir(); // cycle through files int size = files.length; monitor = ProgressUtil.getMonitorFor(monitor); monitor.beginTask(NLS.bind(Messages.copyingTask, new String[] {from, to}), size * 50); for (int i = 0; i < size; i++) { File current = files[i]; String fromFile = current.getAbsolutePath(); String toFile = to; if (!toFile.endsWith(File.separator)) toFile += File.separator; toFile += current.getName(); if (current.isFile()) { copyFile(fromFile, toFile); monitor.worked(50); } else if (current.isDirectory()) { monitor.subTask(NLS.bind(Messages.copyingTask, new String[] {fromFile, toFile})); copyDirectory(fromFile, toFile, ProgressUtil.getSubMonitorFor(monitor, 50)); } if (monitor.isCanceled()) return; } monitor.done(); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Error copying directory", e); } } /** * Copy a file from a to b. Closes the input stream after use. * * @param in java.io.InputStream * @param to java.lang.String * @return a status */ public static IStatus copyFile(InputStream in, String to) { OutputStream out = null; try { out = new FileOutputStream(to); int avail = in.read(buf); while (avail > 0) { out.write(buf, 0, avail); avail = in.read(buf); } return Status.OK_STATUS; } catch (Exception e) { Trace.trace(Trace.SEVERE, "Error copying file", e); return new Status(IStatus.ERROR, TomcatPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorCopyingFile, new String[] {to, e.getLocalizedMessage()}), e); } finally { try { if (in != null) in.close(); } catch (Exception ex) { // ignore } try { if (out != null) out.close(); } catch (Exception ex) { // ignore } } } /** * Copy a file from a to b. * * @param from java.lang.String * @param to java.lang.String * @return a status */ public static IStatus copyFile(String from, String to) { try { return copyFile(new FileInputStream(from), to); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Error copying file", e); return new Status(IStatus.ERROR, TomcatPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorCopyingFile, new String[] {to, e.getLocalizedMessage()}), e); } } /** * Copy a file from a to b. * * @param from java.net.URL * @param to java.lang.String * @return a status */ public static IStatus copyFile(URL from, String to) { try { return copyFile(from.openStream(), to); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Error copying file", e); return new Status(IStatus.ERROR, TomcatPlugin.PLUGIN_ID, 0, NLS.bind(Messages.errorCopyingFile, new String[] {to, e.getLocalizedMessage()}), e); } } /** * Copys a directory from a to b, only modifying as needed * and deleting old files and directories. * * @param from a directory * @param to a directory * @param monitor a progress monitor * @deprecated will be removed in next release */ public static void smartCopyDirectory(String from, String to, IProgressMonitor monitor) { try { File fromDir = new File(from); File toDir = new File(to); File[] fromFiles = fromDir.listFiles(); int fromSize = fromFiles.length; monitor = ProgressUtil.getMonitorFor(monitor); monitor.beginTask(NLS.bind(Messages.copyingTask, new String[] {from, to}), 550); File[] toFiles = null; // delete old files and directories from this directory if (toDir.exists() && toDir.isDirectory()) { toFiles = toDir.listFiles(); int toSize = toFiles.length; // check if this exact file exists in the new directory for (int i = 0; i < toSize; i++) { String name = toFiles[i].getName(); boolean isDir = toFiles[i].isDirectory(); boolean found = false; for (int j = 0; j < fromSize; j++) { if (name.equals(fromFiles[j].getName()) && isDir == fromFiles[j].isDirectory()) found = true; } // delete file if it can't be found or isn't the correct type if (!found) { if (isDir) PublishHelper.deleteDirectory(toFiles[i], null); else toFiles[i].delete(); } if (monitor.isCanceled()) return; } } else { if (toDir.isFile()) toDir.delete(); toDir.mkdir(); } monitor.worked(50); // cycle through files and only copy when it doesn't exist // or is newer toFiles = toDir.listFiles(); int toSize = toFiles.length; int dw = 0; if (toSize > 0) dw = 500 / toSize; for (int i = 0; i < fromSize; i++) { File current = fromFiles[i]; // check if this is a new or newer file boolean copy = true; if (!current.isDirectory()) { String name = current.getName(); long mod = current.lastModified(); for (int j = 0; j < toSize; j++) { if (name.equals(toFiles[j].getName()) && mod <= toFiles[j].lastModified()) copy = false; } } if (copy) { String fromFile = current.getAbsolutePath(); String toFile = to; if (!toFile.endsWith(File.separator)) toFile += File.separator; toFile += current.getName(); if (current.isFile()) { copyFile(fromFile, toFile); monitor.worked(dw); } else if (current.isDirectory()) { monitor.subTask(NLS.bind(Messages.copyingTask, new String[] {fromFile, toFile})); smartCopyDirectory(fromFile, toFile, ProgressUtil.getSubMonitorFor(monitor, dw)); } } if (monitor.isCanceled()) return; } monitor.worked(500 - dw * toSize); monitor.done(); } catch (Exception e) { Trace.trace(Trace.SEVERE, "Error smart copying directory " + from + " - " + to, e); } } }