blob: f8f219b0cfa03325376d746903f1133add60b86f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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.internal.junit.buildpath;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URL;
import org.osgi.framework.Bundle;
import org.osgi.framework.Version;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.jdt.junit.JUnitCore;
import org.eclipse.osgi.service.resolver.VersionRange;
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.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.junit.JUnitCorePlugin;
import org.eclipse.jdt.internal.junit.JUnitPreferencesConstants;
public class BuildPathSupport {
public static class JUnitPluginDescription {
private final String bundleId;
private final VersionRange versionRange;
private final String bundleRoot;
private final String binaryImportedRoot;
private final String sourceBundleId;
private final String repositorySource;
private final String javadocPreferenceKey;
private String resolvedVersion = null;
public JUnitPluginDescription(String bundleId, VersionRange versionRange, String bundleRoot, String binaryImportedRoot, String sourceBundleId, String repositorySource, String javadocPreferenceKey) {
this.bundleId= bundleId;
this.versionRange= versionRange;
this.bundleRoot= bundleRoot;
this.binaryImportedRoot= binaryImportedRoot;
this.sourceBundleId= sourceBundleId;
this.repositorySource= repositorySource;
this.javadocPreferenceKey= javadocPreferenceKey;
}
public IPath getBundleLocation() {
return getBundleLocation(bundleId, versionRange);
}
public IPath getSourceBundleLocation() {
return getSourceLocation(getBundleLocation());
}
private IPath getBundleLocation(String aBundleId, VersionRange aVersionRange) {
return getBundleLocation(aBundleId, aVersionRange, false);
}
private IPath getBundleLocation(String aBundleId, VersionRange aVersionRange, boolean isSourceBundle) {
BundleInfo bundleInfo = P2Utils.findBundle(aBundleId, aVersionRange, isSourceBundle);
if (bundleInfo != null) {
resolvedVersion = bundleInfo.getVersion();
return P2Utils.getBundleLocationPath(bundleInfo);
} else {
// p2's simple configurator is not available. Let's try with installed bundles from the running platform.
// Note: Source bundles are typically not available at run time!
Bundle[] bundles= Platform.getBundles(aBundleId, aVersionRange.toString());
Bundle bestMatch = null;
if (bundles != null) {
for (int i= 0; i < bundles.length; i++) {
Bundle bundle= bundles[i];
if (bestMatch == null || bundle.getState() > bestMatch.getState()) {
bestMatch= bundle;
}
}
}
if (bestMatch != null) {
try {
resolvedVersion = bestMatch.getVersion().toString();
URL rootUrl= bestMatch.getEntry("/"); //$NON-NLS-1$
URL fileRootUrl= FileLocator.toFileURL(rootUrl);
return new Path(fileRootUrl.getPath());
} catch (IOException ex) {
JUnitCorePlugin.log(ex);
}
}
}
return null;
}
public IClasspathEntry getLibraryEntry() {
IPath bundleLocation = getBundleLocation(bundleId, versionRange);
if (bundleLocation != null) {
IPath bundleRootLocation= null;
if (bundleRoot != null) {
bundleRootLocation= getLocationIfExists(bundleLocation, bundleRoot);
}
if (bundleRootLocation == null && binaryImportedRoot != null) {
bundleRootLocation= getLocationIfExists(bundleLocation, binaryImportedRoot);
}
if (bundleRootLocation == null) {
bundleRootLocation= getBundleLocation(bundleId, versionRange);
}
IPath srcLocation= getSourceLocation(bundleLocation);
String javadocLocation= Platform.getPreferencesService().getString(JUnitCorePlugin.CORE_PLUGIN_ID, javadocPreferenceKey, "", null); //$NON-NLS-1$
IClasspathAttribute[] attributes;
if (javadocLocation.length() == 0) {
attributes= new IClasspathAttribute[0];
} else {
attributes= new IClasspathAttribute[] { JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, javadocLocation) };
}
return JavaCore.newLibraryEntry(bundleRootLocation, srcLocation, null, getAccessRules(), attributes, false);
}
return null;
}
public IAccessRule[] getAccessRules() {
return new IAccessRule[0];
}
private IPath getSourceLocation(IPath bundleLocation) {
IPath srcLocation= null;
if (repositorySource != null) {
// Try source in workspace (from repository)
srcLocation= getLocationIfExists(bundleLocation, repositorySource);
}
if (srcLocation == null) {
if (bundleLocation != null) {
// Try exact version
Version version= new Version(resolvedVersion);
srcLocation= getBundleLocation(sourceBundleId, new VersionRange(version, true, version, true), true);
}
if (srcLocation == null) {
// Try version range
srcLocation= getBundleLocation(sourceBundleId, versionRange, true);
}
}
return srcLocation;
}
private IPath getLocationIfExists(IPath bundleLocationPath, final String entryInBundle) {
IPath srcLocation= null;
if (bundleLocationPath != null) {
File bundleFile= bundleLocationPath.toFile();
if (bundleFile.isDirectory()) {
File srcFile= null;
final int starIdx= entryInBundle.indexOf('*');
if (starIdx != -1) {
File[] files= bundleFile.listFiles(new FilenameFilter() {
private String pre= entryInBundle.substring(0, starIdx);
private String post= entryInBundle.substring(starIdx + 1);
@Override
public boolean accept(File dir, String name) {
return name.startsWith(pre) && name.endsWith(post);
}
});
if (files.length > 0) {
srcFile= files[0];
}
}
if (srcFile == null)
srcFile= new File(bundleFile, entryInBundle);
if (srcFile.exists()) {
srcLocation= new Path(srcFile.getPath());
if (srcFile.isDirectory()) {
srcLocation= srcLocation.addTrailingSeparator();
}
}
}
}
return srcLocation;
}
}
public static final JUnitPluginDescription JUNIT3_PLUGIN= new JUnitPluginDescription(
"org.junit", new VersionRange("[3.8.2,3.9)"), "junit.jar", "junit.jar", "org.junit.source", "source-bundle/", JUnitPreferencesConstants.JUNIT3_JAVADOC); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
public static final JUnitPluginDescription JUNIT4_PLUGIN= new JUnitPluginDescription(
"org.junit", new VersionRange("[4.7.0,5.0.0)"), "junit.jar", "junit.jar", "org.junit.source", "source-bundle/", JUnitPreferencesConstants.JUNIT4_JAVADOC); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
private static final JUnitPluginDescription HAMCREST_CORE_PLUGIN= new JUnitPluginDescription(
"org.hamcrest.core", new VersionRange("[1.1.0,2.0.0)"), null, "org.hamcrest.core_1.*.jar", "org.hamcrest.core.source", "source-bundle/", JUnitPreferencesConstants.HAMCREST_CORE_JAVADOC); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
public static final JUnitPluginDescription JUNIT_JUPITER_API_PLUGIN= new JUnitPluginDescription(
"org.junit.jupiter.api", new VersionRange("[5.0.0,6.0.0)"), "org.junit.jupiter.api.jar", "", "org.junit.jupiter.api.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_JUPITER_API_JAVADOC);
public static final JUnitPluginDescription JUNIT_JUPITER_ENGINE_PLUGIN= new JUnitPluginDescription(
"org.junit.jupiter.engine", new VersionRange("[5.0.0,6.0.0)"), "org.junit.jupiter.engine.jar", "", "org.junit.jupiter.engine.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_JUPITER_ENGINE_JAVADOC);
public static final JUnitPluginDescription JUNIT_JUPITER_MIGRATIONSUPPORT_PLUGIN= new JUnitPluginDescription(
"org.junit.jupiter.migrationsupport", new VersionRange("[5.0.0,6.0.0)"), "org.junit.jupiter.migrationsupport.jar", "", "org.junit.jupiter.migrationsupport.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_JUPITER_MIGRATIONSUPPORT_JAVADOC);
public static final JUnitPluginDescription JUNIT_JUPITER_PARAMS_PLUGIN= new JUnitPluginDescription(
"org.junit.jupiter.params", new VersionRange("[5.0.0,6.0.0)"), "org.junit.jupiter.params.jar", "", "org.junit.jupiter.params.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_JUPITER_PARAMS_JAVADOC);
public static final JUnitPluginDescription JUNIT_PLATFORM_COMMONS_PLUGIN= new JUnitPluginDescription(
"org.junit.platform.commons", new VersionRange("[1.0.0,2.0.0)"), "org.junit.platform.commons.jar", "", "org.junit.platform.commons.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_PLATFORM_COMMONS_JAVADOC);
public static final JUnitPluginDescription JUNIT_PLATFORM_ENGINE_PLUGIN= new JUnitPluginDescription(
"org.junit.platform.engine", new VersionRange("[1.0.0,2.0.0)"), "org.junit.platform.engine.jar", "", "org.junit.platform.engine.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_PLATFORM_ENGINE_JAVADOC);
public static final JUnitPluginDescription JUNIT_PLATFORM_LAUNCHER_PLUGIN= new JUnitPluginDescription(
"org.junit.platform.launcher", new VersionRange("[1.0.0,2.0.0)"), "org.junit.platform.launcher.jar", "", "org.junit.platform.launcher.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_PLATFORM_LAUNCHER_JAVADOC);
public static final JUnitPluginDescription JUNIT_PLATFORM_RUNNER_PLUGIN= new JUnitPluginDescription(
"org.junit.platform.runner", new VersionRange("[1.0.0,2.0.0)"), "org.junit.platform.runner.jar", "", "org.junit.platform.runner.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_PLATFORM_RUNNER_JAVADOC);
public static final JUnitPluginDescription JUNIT_PLATFORM_SUITE_API_PLUGIN= new JUnitPluginDescription(
"org.junit.platform.suite.api", new VersionRange("[1.0.0,2.0.0)"), "org.junit.platform.suite.api.jar", "", "org.junit.platform.suite.api.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_PLATFORM_SUITE_API_JAVADOC);
public static final JUnitPluginDescription JUNIT_VINTAGE_ENGINE_PLUGIN= new JUnitPluginDescription(
"org.junit.vintage.engine", new VersionRange("[4.12.0,5.0.0)"), "org.junit.vintage.engine.jar", "", "org.junit.vintage.engine.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_VINTAGE_ENGINE_JAVADOC);
public static final JUnitPluginDescription JUNIT_OPENTEST4J_PLUGIN= new JUnitPluginDescription(
"org.opentest4j", new VersionRange("[1.0.0,2.0.0)"), "org.opentest4j.jar", "", "org.opentest4j.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_OPENTEST4J_JAVADOC);
public static final JUnitPluginDescription JUNIT_APIGUARDIAN_PLUGIN= new JUnitPluginDescription(
"org.apiguardian", new VersionRange("[1.0.0,2.0.0)"), "org.apiguardian.jar", "", "org.apiguardian.source", "", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$
JUnitPreferencesConstants.JUNIT_APIGUARDIAN_JAVADOC);
public static final JUnitPluginDescription JUNIT4_AS_3_PLUGIN= new JUnitPluginDescription(
JUNIT4_PLUGIN.bundleId, JUNIT4_PLUGIN.versionRange, JUNIT4_PLUGIN.bundleRoot, JUNIT4_PLUGIN.binaryImportedRoot,
JUNIT4_PLUGIN.sourceBundleId, JUNIT4_PLUGIN.repositorySource, JUNIT3_PLUGIN.javadocPreferenceKey) {
@Override
public IAccessRule[] getAccessRules() {
return new IAccessRule[] {
JavaCore.newAccessRule(new Path("junit/"), IAccessRule.K_ACCESSIBLE), //$NON-NLS-1$
JavaCore.newAccessRule(new Path("**/*"), IAccessRule.K_NON_ACCESSIBLE) //$NON-NLS-1$
};
}
};
/**
* @return the JUnit3 classpath container
*/
public static IClasspathEntry getJUnit3ClasspathEntry() {
return JavaCore.newContainerEntry(JUnitCore.JUNIT3_CONTAINER_PATH);
}
/**
* @return the JUnit4 classpath container
*/
public static IClasspathEntry getJUnit4ClasspathEntry() {
return JavaCore.newContainerEntry(JUnitCore.JUNIT4_CONTAINER_PATH);
}
/**
* @return the JUnit5 classpath container
*/
public static IClasspathEntry getJUnit5ClasspathEntry() {
return JavaCore.newContainerEntry(JUnitCore.JUNIT5_CONTAINER_PATH);
}
/**
* @return the org.junit version 3 library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnit3LibraryEntry() {
return JUNIT3_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit version 4 library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnit4LibraryEntry() {
return JUNIT4_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit version 4 library with access rules for JUnit 3, or <code>null</code>
* if not available
*/
public static IClasspathEntry getJUnit4as3LibraryEntry() {
return JUNIT4_AS_3_PLUGIN.getLibraryEntry();
}
/**
* @return the org.hamcrest.core library, or <code>null</code> if not available
*/
public static IClasspathEntry getHamcrestCoreLibraryEntry() {
return HAMCREST_CORE_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.jupiter.api library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitJupiterApiLibraryEntry() {
return JUNIT_JUPITER_API_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.jupiter.engine library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitJupiterEngineLibraryEntry() {
return JUNIT_JUPITER_ENGINE_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.jupiter.migrationsupport library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitJupiterMigrationSupportLibraryEntry() {
return JUNIT_JUPITER_MIGRATIONSUPPORT_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.jupiter.params library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitJupiterParamsLibraryEntry() {
return JUNIT_JUPITER_PARAMS_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.platform.commons library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitPlatformCommonsLibraryEntry() {
return JUNIT_PLATFORM_COMMONS_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.platform.engine library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitPlatformEngineLibraryEntry() {
return JUNIT_PLATFORM_ENGINE_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.platform.launcher library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitPlatformLauncherLibraryEntry() {
return JUNIT_PLATFORM_LAUNCHER_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.platform.runner library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitPlatformRunnerLibraryEntry() {
return JUNIT_PLATFORM_RUNNER_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.platform.suite.api library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitPlatformSuiteApiLibraryEntry() {
return JUNIT_PLATFORM_SUITE_API_PLUGIN.getLibraryEntry();
}
/**
* @return the org.junit.vintage.engine library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitVintageEngineLibraryEntry() {
return JUNIT_VINTAGE_ENGINE_PLUGIN.getLibraryEntry();
}
/**
* @return the org.opentest4j library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitOpentest4jLibraryEntry() {
return JUNIT_OPENTEST4J_PLUGIN.getLibraryEntry();
}
/**
* @return the org.apiguardian library, or <code>null</code> if not available
*/
public static IClasspathEntry getJUnitApiGuardianLibraryEntry() {
return JUNIT_APIGUARDIAN_PLUGIN.getLibraryEntry();
}
}