blob: a2c936538eec0e73ea91f102064c7a3cbb171859 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 BEA Systems, Inc.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* wharley@bea.com - initial API and implementation
*
*******************************************************************************/
package org.eclipse.jdt.apt.pluggable.tests;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
/**
* Helper class to support compilation and results checking for tests running in batch mode.
* @since 3.3.1
*/
public class IdeTestUtils {
/**
* Name of the subdirectory within the test bundle where target resources are stored.
*/
public static final String RESOURCES_DIR = "resources";
/**
* Copy files from a bundle into a project in the target workspace. Newlines will be
* converted according to {@link #shouldConvertToIndependentLineDelimiter(File)}.
* Directories named "CVS" will be ignored.
*
* @param proj
* the project within which the files will be created.
* @param resourceFolderName
* the name of the folder within the plug-in that the files will be copied
* from, relative to <code>[plugin-root]/resources</code>
* @param destFolderName
* the name of the folder within the target workspace that the files will
* be copied to, relative to the project
* @throws Exception
* might be an IOException or a CoreException
*/
public static void copyResources(IProject proj, String resourceFolderName, String destFolderName) throws Exception {
String destFolderOSName = proj.getFolder( destFolderName ).getLocation().toOSString(); //$NON-NLS-1$
File destFolder = new File(destFolderOSName);
File resourceFolder = TestUtils.concatPath(getPluginDirectoryPath(), RESOURCES_DIR, resourceFolderName);
copyResources(resourceFolder, destFolder);
proj.refreshLocal(IResource.DEPTH_INFINITE, null);
}
/**
* @return the absolute filesystem-based path of the root of the bundle filesystem.
* This will cause the bundle to be extracted to a temporary directory on the filesystem
* if necessary; see {@link FileLocator#toFileURL(URL)}.
*/
public static String getPluginDirectoryPath() {
try {
URL platformURL = Platform.getBundle("org.eclipse.jdt.apt.pluggable.tests").getEntry("/");
return new File(FileLocator.toFileURL(platformURL).getFile()).getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* Copy a file from one location to another, unless the destination file already exists and has
* the same timestamp and file size. Create the destination location if necessary. Convert line
* delimiters according to {@link #shouldConvertToIndependentLineDelimiter(File)}.
*
* @param src
* the full path to the resource location.
* @param destFolder
* the full path to the destination location.
* @throws IOException
*/
private static void copyResource(File src, File dest) throws IOException {
if (dest.exists() &&
src.lastModified() < dest.lastModified() &&
src.length() == dest.length())
{
return;
}
// read source bytes
byte[] srcBytes = null;
srcBytes = read(src);
if (shouldConvertToIndependentLineDelimiter(src)) {
String contents = new String(srcBytes);
contents = TestUtils.convertToIndependentLineDelimiter(contents);
srcBytes = contents.getBytes();
}
File destFolder = dest.getParentFile();
if (!destFolder.exists()) {
if (!destFolder.mkdirs()) {
throw new IOException("Unable to create directory " + destFolder);
}
}
// write bytes to dest
FileOutputStream out = null;
try {
out = new FileOutputStream(dest);
out.write(srcBytes);
out.flush();
} finally {
if (out != null) {
out.close();
}
}
}
private static void copyResources(File resourceFolder, File destFolder) throws IOException {
if (resourceFolder == null) {
return;
}
// Copy all resources in this folder
String[] children = resourceFolder.list();
if (null == children) {
return;
}
// if there are any children, (recursively) copy them
for (String child : children) {
if ("CVS".equals(child)) {
continue;
}
File childRes = new File(resourceFolder, child);
File childDest = new File(destFolder, child);
if (childRes.isDirectory()) {
copyResources(childRes, childDest);
}
else {
copyResource(childRes, childDest);
}
}
}
private static byte[] read(java.io.File file) throws java.io.IOException {
int fileLength;
byte[] fileBytes = new byte[fileLength = (int) file.length()];
java.io.FileInputStream stream = null;
try {
stream = new java.io.FileInputStream(file);
int bytesRead = 0;
int lastReadSize = 0;
while ((lastReadSize != -1) && (bytesRead != fileLength)) {
lastReadSize = stream.read(fileBytes, bytesRead, fileLength - bytesRead);
bytesRead += lastReadSize;
}
} finally {
if (stream != null) {
stream.close();
}
}
return fileBytes;
}
/**
* @return true if this file's end-of-line delimiters should be replaced with
* a platform-independent value, e.g. for compilation.
*/
private static boolean shouldConvertToIndependentLineDelimiter(File file) {
return file.getName().endsWith(".java");
}
}