blob: 95b97df3bb2e631ba2251f4752e3cb05a5c3b417 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.jdt.core.tests.model;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
public class ModelTestsUtil {
static private void collectAllFiles(File root, ArrayList collector, FileFilter fileFilter) {
File[] files = root.listFiles(fileFilter);
for (int i = 0; i < files.length; i++) {
final File currentFile = files[i];
if (currentFile.isDirectory()) {
collectAllFiles(currentFile, collector, fileFilter);
} else {
collector.add(currentFile);
}
}
}
static public boolean convertToIndependantLineDelimiter(File file) {
return file.getName().endsWith(".java");
}
/**
* Copy file from src (path to the original file) to dest (path to the destination file).
*/
static public void copy(File src, File dest) throws IOException {
// read source bytes
byte[] srcBytes = read(src);
if (convertToIndependantLineDelimiter(src)) {
String contents = new String(srcBytes);
contents = org.eclipse.jdt.core.tests.util.Util.convertToIndependantLineDelimiter(contents);
srcBytes = contents.getBytes();
}
// write bytes to dest
FileOutputStream out = new FileOutputStream(dest);
try {
out.write(srcBytes);
} finally {
out.close();
}
}
/**
* Copy the given source directory (and all its contents) to the given target directory.
*/
static public void copyDirectory(File source, File target) throws IOException {
if (!target.exists()) {
target.mkdirs();
}
File[] files = source.listFiles();
if (files == null) return;
for (int i = 0; i < files.length; i++) {
File sourceChild = files[i];
String name = sourceChild.getName();
if (name.equals("CVS") || name.equals(".svn")) continue;
File targetChild = new File(target, name);
if (sourceChild.isDirectory()) {
copyDirectory(sourceChild, targetChild);
} else {
copy(sourceChild, targetChild);
}
}
}
public static File[] getAllFiles(File root, FileFilter fileFilter) {
ArrayList files = new ArrayList();
if (root.isDirectory()) {
collectAllFiles(root, files, fileFilter);
File[] result = new File[files.size()];
files.toArray(result);
return result;
} else {
return null;
}
}
/**
* Returns the specified compilation unit in the given project, root, and
* package fragment or <code>null</code> if it does not exist.
*/
static public IClassFile getClassFile(IJavaProject project, String rootPath, String packageName, String className) throws JavaModelException {
IPackageFragment pkg= getPackageFragment(project, rootPath, packageName);
if (pkg == null) {
return null;
}
return pkg.getClassFile(className);
}
/**
* Returns compilation unit with given name in given project and package.
* @param javaProject
* @param packageName
* @param unitName
* @return org.eclipse.jdt.core.ICompilationUnit
*/
static public ICompilationUnit getCompilationUnit(IJavaProject javaProject, String packageName, String unitName) throws JavaModelException {
if (javaProject == null) return null;
IType type = javaProject.findType(packageName, unitName);
if (type != null) {
return type.getCompilationUnit();
}
return null;
}
/**
* Returns all compilation units of a given project.
* @param javaProject Project to collect units
* @return List of org.eclipse.jdt.core.ICompilationUnit
*/
static public List getCompilationUnits(IJavaProject javaProject) throws JavaModelException {
IPackageFragmentRoot[] fragmentRoots = javaProject.getPackageFragmentRoots();
int length = fragmentRoots.length;
List allUnits = new ArrayList();
for (int i=0; i<length; i++) {
if (fragmentRoots[i] instanceof JarPackageFragmentRoot) continue;
IJavaElement[] packages= fragmentRoots[i].getChildren();
for (int k= 0; k < packages.length; k++) {
IPackageFragment pack = (IPackageFragment) packages[k];
ICompilationUnit[] units = pack.getCompilationUnits();
for (int u=0; u<units.length; u++) {
allUnits.add(units[u]);
}
}
}
return allUnits;
}
/**
* Returns all compilation units of a given project.
* @param root The package fragment root to collect units
* @return List of org.eclipse.jdt.core.ICompilationUnit
*/
static public List getCompilationUnits(IPackageFragmentRoot root) throws JavaModelException {
List allUnits = new ArrayList();
if (!(root instanceof JarPackageFragmentRoot)) {
IJavaElement[] packages= root.getChildren();
for (int k= 0; k < packages.length; k++) {
IPackageFragment pack = (IPackageFragment) packages[k];
ICompilationUnit[] units = pack.getCompilationUnits();
for (int u=0; u<units.length; u++) {
allUnits.add(units[u]);
}
}
}
return allUnits;
}
static public IPackageFragmentRoot getExternalJarFile(IJavaProject project, String jarSimpleName) throws JavaModelException {
IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
if (roots == null || roots.length == 0) {
return null;
}
for (int i = 0; i < roots.length; i++) {
IPackageFragmentRoot root = roots[i];
if (root.isExternal() && root.getElementName().equals(jarSimpleName)) {
return root;
}
}
return null;
}
/**
* Returns the IPath to the external java class library (e.g. jclMin.jar)
*/
static public IPath getExternalJCLPath() {
return new Path(getExternalJCLPathString(""));
}
/**
* Returns the IPath to the external java class library (e.g. jclMin.jar)
*/
static public IPath getExternalJCLPath(String compliance) {
return new Path(getExternalJCLPathString(compliance));
}
/**
* Returns the java.io path to the external java class library (e.g. jclMin.jar)
*/
static public String getExternalJCLPathString() {
return getExternalJCLPathString("");
}
/**
* Returns the java.io path to the external java class library (e.g. jclMin.jar)
*/
static public String getExternalJCLPathString(String compliance) {
return getExternalPath() + "jclMin" + compliance + ".jar";
}
/**
* Returns the IPath to the root source of the external java class library (e.g. "src")
*/
static public IPath getExternalJCLRootSourcePath() {
return new Path("src");
}
/**
* Returns the IPath to the source of the external java class library (e.g. jclMinsrc.zip)
*/
static public IPath getExternalJCLSourcePath() {
return new Path(getExternalJCLSourcePathString(""));
}
/**
* Returns the IPath to the source of the external java class library (e.g. jclMinsrc.zip)
*/
static public IPath getExternalJCLSourcePath(String compliance) {
return new Path(getExternalJCLSourcePathString(compliance));
}
/**
* Returns the java.io path to the source of the external java class library (e.g. jclMinsrc.zip)
*/
static public String getExternalJCLSourcePathString() {
return getExternalJCLSourcePathString("");
}
/**
* Returns the java.io path to the source of the external java class library (e.g. jclMinsrc.zip)
*/
static public String getExternalJCLSourcePathString(String compliance) {
return getExternalPath() + "jclMin" + compliance + "src.zip";
}
/*
* Returns the OS path to the external directory that contains external jar files.
* This path ends with a File.separatorChar.
*/
static public String getExternalPath() {
try {
String path = getWorkspaceRoot().getLocation().toFile().getParentFile().getCanonicalPath();
if (path.charAt(path.length()-1) != File.separatorChar)
path += File.separatorChar;
return path;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* Returns the specified package fragment in the given project and root, or
* <code>null</code> if it does not exist.
* The rootPath must be specified as a project relative path. The empty
* path refers to the default package fragment.
*/
static public IPackageFragment getPackageFragment(IJavaProject project, String rootPath, String packageName) throws JavaModelException {
IPackageFragmentRoot root= getPackageFragmentRoot(project, rootPath);
if (root == null) {
return null;
}
return root.getPackageFragment(packageName);
}
/**
* Returns the specified package fragment root in the given project, or
* <code>null</code> if it does not exist.
* If relative, the rootPath must be specified as a project relative path.
* The empty path refers to the package fragment root that is the project
* folder itself.
* If absolute, the rootPath refers to either an external jar, or a resource
* internal to the workspace
*/
static public IPackageFragmentRoot getPackageFragmentRoot(
IJavaProject project,
String rootPath)
throws JavaModelException {
if (project == null) {
return null;
}
IPath path = new Path(rootPath);
if (path.isAbsolute()) {
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
IResource resource = workspaceRoot.findMember(path);
IPackageFragmentRoot root;
if (resource == null) {
// external jar
root = project.getPackageFragmentRoot(rootPath);
} else {
// resource in the workspace
root = project.getPackageFragmentRoot(resource);
}
return root;
} else {
IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
if (roots == null || roots.length == 0) {
return null;
}
for (int i = 0; i < roots.length; i++) {
IPackageFragmentRoot root = roots[i];
if (!root.isExternal()
&& root.getUnderlyingResource().getProjectRelativePath().equals(path)) {
return root;
}
}
}
return getExternalJarFile(project, rootPath);
}
static public String getPluginDirectoryPath() {
return getPluginDirectoryPath("model");
}
/**
* Returns the OS path to the directory that contains this plugin.
*
* @param type May be one of the following value
*/
static public String getPluginDirectoryPath(String type) {
try {
StringBuffer bundleName = new StringBuffer("org.eclipse.jdt.core.tests");
if (type != null) {
bundleName.append('.');
bundleName.append(type);
}
URL platformURL = Platform.getBundle(bundleName.toString()).getEntry("/");
return new File(FileLocator.toFileURL(platformURL).getFile()).getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
static public String getSourceWorkspacePath(String workspace) {
return getPluginDirectoryPath() + java.io.File.separator + workspace;
}
/**
* Returns the IWorkspace this test suite is running on.
*/
static public IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
static public IWorkspaceRoot getWorkspaceRoot() {
return getWorkspace().getRoot();
}
static public byte[] read(java.io.File file) throws java.io.IOException {
int fileLength;
byte[] fileBytes = new byte[fileLength = (int) file.length()];
java.io.FileInputStream stream = new java.io.FileInputStream(file);
int bytesRead = 0;
int lastReadSize = 0;
try {
while ((lastReadSize != -1) && (bytesRead != fileLength)) {
lastReadSize = stream.read(fileBytes, bytesRead, fileLength - bytesRead);
bytesRead += lastReadSize;
}
return fileBytes;
} finally {
stream.close();
}
}
/**
* Remove all white spaces from a string.
*
* @param input The input string
* @return A new string without any whitespaces
*/
public static String removeWhiteSpace(String input) {
StringTokenizer tokenizer = new StringTokenizer(input);
StringBuffer buffer = new StringBuffer();
while (tokenizer.hasMoreTokens()) {
buffer.append(tokenizer.nextToken());
}
return buffer.toString();
}
/**
* Check locally for the required JCL files, <jclName>.jar and <jclName>src.zip.
* If not available, copy from the project resources.
*/
static public void setupExternalJCL(String jclName) throws IOException {
String externalPath = getExternalPath();
String separator = java.io.File.separator;
String resourceJCLDir = getPluginDirectoryPath() + separator + "JCL";
java.io.File jclDir = new java.io.File(externalPath);
java.io.File jclMin =
new java.io.File(externalPath + jclName + ".jar");
java.io.File jclMinsrc = new java.io.File(externalPath + jclName + "src.zip");
if (!jclDir.exists()) {
if (!jclDir.mkdir()) {
//mkdir failed
throw new IOException("Could not create the directory " + jclDir);
}
//copy the two files to the JCL directory
java.io.File resourceJCLMin =
new java.io.File(resourceJCLDir + separator + jclName + ".jar");
copy(resourceJCLMin, jclMin);
java.io.File resourceJCLMinsrc =
new java.io.File(resourceJCLDir + separator + jclName + "src.zip");
copy(resourceJCLMinsrc, jclMinsrc);
} else {
//check that the two files, jclMin.jar and jclMinsrc.zip are present
//copy either file that is missing or less recent than the one in workspace
java.io.File resourceJCLMin =
new java.io.File(resourceJCLDir + separator + jclName + ".jar");
if ((jclMin.lastModified() < resourceJCLMin.lastModified())
|| (jclMin.length() != resourceJCLMin.length())) {
copy(resourceJCLMin, jclMin);
}
java.io.File resourceJCLMinsrc =
new java.io.File(resourceJCLDir + separator + jclName + "src.zip");
if ((jclMinsrc.lastModified() < resourceJCLMinsrc.lastModified())
|| (jclMinsrc.length() != resourceJCLMinsrc.length())) {
copy(resourceJCLMinsrc, jclMinsrc);
}
}
}
static public void setUpJCLClasspathVariables(String compliance) throws JavaModelException, IOException {
if ("1.7".equals(compliance)) {
if (JavaCore.getClasspathVariable("JCL17_LIB") == null) {
setupExternalJCL("jclMin1.7");
JavaCore.setClasspathVariables(
new String[] {"JCL17_LIB", "JCL17_SRC", "JCL_SRCROOT"},
new IPath[] {getExternalJCLPath(compliance), getExternalJCLSourcePath(compliance), getExternalJCLRootSourcePath()},
null);
}
} else if ("1.5".equals(compliance)) {
if (JavaCore.getClasspathVariable("JCL15_LIB") == null) {
setupExternalJCL("jclMin1.5");
JavaCore.setClasspathVariables(
new String[] {"JCL15_LIB", "JCL15_SRC", "JCL_SRCROOT"},
new IPath[] {getExternalJCLPath(compliance), getExternalJCLSourcePath(compliance), getExternalJCLRootSourcePath()},
null);
}
} else {
if (JavaCore.getClasspathVariable("JCL_LIB") == null) {
setupExternalJCL("jclMin");
JavaCore.setClasspathVariables(
new String[] {"JCL_LIB", "JCL_SRC", "JCL_SRCROOT"},
new IPath[] {getExternalJCLPath(), getExternalJCLSourcePath(), getExternalJCLRootSourcePath()},
null);
}
}
}
/**
* Remove all white spaces at the deginning of each lines from a string.
*
* @param input The input string
* @return A new string without any whitespaces
*/
public static String trimLinesLeadingWhitespaces(String input) {
StringTokenizer tokenizer = new StringTokenizer(input, "\r\n\f");
StringBuffer buffer = new StringBuffer();
while (tokenizer.hasMoreTokens()) {
String line = tokenizer.nextToken();
int length = line.length();
int size = 0;
int idx = -1;
if (length > 0) {
loop: while ((idx+1) < length) {
char ch = line.charAt(++idx);
switch (ch) {
case '\t':
size += 4;
break;
case '*':
case ' ':
break;
default:
break loop;
}
}
}
if (length > 0 && idx > 0 && idx < length) {
int splitLineIndex = line.indexOf("||", idx);
if (splitLineIndex > 0) {
int commentStart = line.indexOf("/*", splitLineIndex);
if (commentStart >= 80-((size*3)/4)) {
StringBuffer newLine = new StringBuffer(line.substring(idx-1, splitLineIndex).trim());
newLine.append('\n');
newLine.append(line.substring(splitLineIndex).trim());
newLine.append('\n');
buffer.append(newLine);
continue;
}
}
buffer.append(line.substring(idx).trim());
} else {
buffer.append(line);
}
buffer.append('\n');
}
return buffer.toString();
}
}