blob: eb9b3028e08761f47b05e97c0ad8a059eb0905c6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009, 2011 Mia-Software.
* 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:
* Nicolas Bros (Mia-Software) - initial API and implementation
* Nicolas Guyomar (Mia-Software) - Bug 340339 - Need some Utils class for Folder/File/Project management
* Nicolas Guyomar (Mia-Software) - Bug 342451 - To be able to edit derived facet attributes and derived facet references in a table
* Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
* Thomas Cicognani (Soft-Maint) - Bug 398079 - org.eclipse.modisco.facet.util.core.internal.exported.FileUtils.copyFolderFromBundle
*******************************************************************************/
package org.eclipse.modisco.facet.util.core.internal.exported;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.Enumeration;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.osgi.framework.Bundle;
/**
* @since 0.2
*/
public final class FileUtils {
// This class has been copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.FileUtils
private static final int COPY_BUFFER_SIZE = 512 * 1024;
private FileUtils() {
// Nothing
}
/** Get the contents of a file from a Bundle */
public static String getFileContents(final Bundle bundle, final String path) throws IOException {
InputStream source;
URL url = bundle.getResource(path);
if (url == null) {
return null;
}
source = url.openStream();
return FileUtils.readInputStream(source);
}
public static String readInputStream(final InputStream stream) throws IOException {
return readInputStream(stream, "UTF-8"); //$NON-NLS-1$
}
public static String readInputStream(final InputStream stream, final String charset)
throws IOException {
final int bufferSize = 65536;
final char[] buffer = new char[bufferSize];
StringBuilder builder = new StringBuilder();
Reader reader = new InputStreamReader(stream, charset);
int read;
do {
read = reader.read(buffer, 0, buffer.length);
if (read > 0) {
builder.append(buffer, 0, read);
}
} while (read >= 0);
reader.close();
return builder.toString();
}
/**
* Copy a folder contents from a bundle
*
* @param folderPath
* Folder path to copy
* @param project
* Copy folder into this {@link IProject}
* @param destinationPath
* Destination path
* @param bundleContainingResources
* Bundle which has resources to copy
* @param recurse
* <code>true</code> to copy recursively
* @throws IOException
* @throws CoreException
* @since 0.3
*/
public static void copyFolderFromBundle(final String folderPath, final IProject project,
final String destinationPath, final Bundle bundleContainingResources,
final boolean recurse)
throws IOException, CoreException {
@SuppressWarnings("unchecked")
// @SuppressWarnings("unchecked") findEntries returns a raw type.
final Enumeration<URL> files = bundleContainingResources.findEntries(folderPath, "*.*", recurse); //$NON-NLS-1$
while (files.hasMoreElements()) {
final URL element = files.nextElement();
String filename = element.getFile().replace(folderPath, ""); //$NON-NLS-1$
if (!filename.startsWith("/")) { //$NON-NLS-1$
filename = "/" + filename; //$NON-NLS-1$
}
copyFileFromBundle(element.getFile(), project, destinationPath + filename, bundleContainingResources);
}
}
public static IFile copyFileFromBundle(final String sourcePath, final IProject project,
final String destinationPath, final Bundle bundleContainingResources)
throws IOException, CoreException {
InputStream source;
URL url = bundleContainingResources.getResource(sourcePath);
if (url != null) {
source = url.openStream();
} else {
url = bundleContainingResources.getEntry(sourcePath);
if (url == null) {
throw new IOException(sourcePath + " not found."); //$NON-NLS-1$
}
source = url.openStream();
}
IFile javaFile = project.getFile(destinationPath);
if (javaFile.exists()) {
try {
javaFile.delete(true, new NullProgressMonitor());
} catch (CoreException e) {
// problem deleting the file : try to close the project before deleting
if (project.isOpen()) {
try {
project.close(new NullProgressMonitor());
javaFile.delete(true, new NullProgressMonitor());
} finally {
project.open(new NullProgressMonitor());
}
}
}
}
if (!javaFile.getParent().exists()) {
FolderUtils.createFolder((IFolder) javaFile.getParent());
}
javaFile.create(source, true, new NullProgressMonitor());
return javaFile;
}
/**
* Copies the source file to the target file.
*
* @return <code>true</code> if successful, <code>false</code> otherwise
*/
public static final boolean copyFile(final File source, final File destination) {
boolean result = false;
FileInputStream sourceFile = null;
FileOutputStream destinationFile = null;
try {
// File creation
destination.createNewFile();
sourceFile = new FileInputStream(source);
destinationFile = new FileOutputStream(destination);
// 0.5 MiB buffer for reading
byte[] buffer = new byte[FileUtils.COPY_BUFFER_SIZE];
int nbRead;
while ((nbRead = sourceFile.read(buffer)) != -1) {
destinationFile.write(buffer, 0, nbRead);
}
// Copied
result = true;
} catch (java.io.FileNotFoundException f) {
result = false;
} catch (java.io.IOException e) {
result = false;
} finally {
try {
if (sourceFile != null) {
sourceFile.close();
}
if (destinationFile != null) {
destinationFile.close();
}
} catch (Exception e) {
result = false;
}
}
return result;
}
}