blob: 48d73c0beb69e27d9b822ac92383e497ade661df [file] [log] [blame]
package org.eclipse.ant.core;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.util.FileUtils;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* Subclasses FileUtiles from Ant to extend its
* funtionalities.
*/
public class EclipseFileUtils extends FileUtils {
/** Indicates the default string encoding on this platform */
private static String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding();
/** instance of this library */
private static final String LIBRARY_NAME = "core_2_0_5";
private static boolean hasNatives = false;
static {
try {
System.loadLibrary(LIBRARY_NAME);
hasNatives = true;
} catch (UnsatisfiedLinkError e) {
logMissingNativeLibrary(e);
}
}
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, boolean overwrite, boolean preserveLastModified) throws IOException {
super.copyFile(sourceFile, destFile, filters, overwrite, preserveLastModified);
if (hasNatives)
internalCopyAttributes(toPlatformBytes(sourceFile.getAbsolutePath()), toPlatformBytes(destFile.getAbsolutePath()), preserveLastModified);
}
/**
* Copies file attributes from source to destination. The copyLastModified attribute
* indicates whether the lastModified attribute should be copied.
*/
protected static boolean copyAttributes(String source, String destination, boolean copyLastModified) {
if (hasNatives)
return internalCopyAttributes(toPlatformBytes(source), toPlatformBytes(destination), false);
return false; // not supported
}
/**
* Copies file attributes from source to destination. The copyLastModified attribute
* indicates whether the lastModified attribute should be copied.
*/
private static final native boolean internalCopyAttributes(byte[] source, byte[] destination, boolean copyLastModified);
private static void logMissingNativeLibrary(UnsatisfiedLinkError e) {
String libName = System.mapLibraryName(LIBRARY_NAME);
String message = Policy.bind("info.couldNotLoadLibrary", libName);
IStatus status = new Status(IStatus.INFO, AntPlugin.PI_ANT, IStatus.INFO, message, e);
AntPlugin.getPlugin().getLog().log(status);
}
/**
* Calling String.getBytes() creates a new encoding object and other garbage.
* This can be avoided by calling String.getBytes(String encoding) instead.
*/
protected static byte[] toPlatformBytes(String target) {
if (defaultEncoding == null)
return target.getBytes();
// try to use the default encoding
try {
return target.getBytes(defaultEncoding);
} catch (UnsupportedEncodingException e) {
// null the default encoding so we don't try it again
defaultEncoding = null;
return target.getBytes();
}
}
}