/******************************************************************************* * Copyright (c) 2007 BEA Systems, Inc. * 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: * 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"); } }