/*******************************************************************************
* Copyright (c) 2009, 2013 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
* Patrick Higgins <patrick133t@yahoo.com> - [JUnit] JUnit not found when JDT installed as dropin - https://bugs.eclipse.org/bugs/show_bug.cgi?id=297663
*******************************************************************************/
package org.eclipse.jdt.internal.junit.buildpath;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Version;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.simpleconfigurator.manipulator.SimpleConfiguratorManipulator;
import org.eclipse.osgi.service.resolver.VersionRange;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.jdt.internal.junit.JUnitCorePlugin;
/**
* Utilities to read and write bundle and source information files.
*
* @since 3.5
*/
class P2Utils {
/**
* Finds the bundle info for the given arguments.
* <p>
* The first match will be returned if more than one bundle matches the arguments.
* </p>
*
* @param symbolicName the symbolic name
* @param version the bundle version
* @param isSourceBundle <code>true</code> if it is a source bundle <code>false</code> otherwise
* @return the bundle info or <code>null</code> if not found
*/
public static BundleInfo findBundle(String symbolicName, Version version, boolean isSourceBundle) {
Assert.isLegal(symbolicName != null);
Assert.isLegal(version != null);
return findBundle(symbolicName, new VersionRange(version, true, version, true), isSourceBundle);
}
/**
* Finds the bundle info for the given arguments.
* <p>
* The best match (latest version) will be returned if more than one bundle matches the arguments.
* </p>
*
* @param symbolicName the symbolic name
* @param versionRange the version range for the bundle version
* @param isSourceBundle <code>true</code> if it is a source bundle <code>false</code> otherwise
* @return the bundle info or <code>null</code> if not found
*/
public static BundleInfo findBundle(String symbolicName, VersionRange versionRange, boolean isSourceBundle) {
Assert.isLegal(symbolicName != null);
Assert.isLegal(versionRange != null);
SimpleConfiguratorManipulator manipulator= (SimpleConfiguratorManipulator)JUnitCorePlugin.getDefault().getService(SimpleConfiguratorManipulator.class.getName());
if (manipulator == null)
return null;
BundleInfo bestMatch= null;
Version bestVersion= null;
// A null bundleInfoPath means load the bundles.info according to the BundleContext property "org.eclipse.equinox.simpleconfigurator.configUrl"
String bundleInfoPath= null;
if (isSourceBundle)
bundleInfoPath= SimpleConfiguratorManipulator.SOURCE_INFO;
BundleContext context= JUnitCorePlugin.getDefault().getBundle().getBundleContext();
BundleInfo bundles[]= null;
try {
bundles= manipulator.loadConfiguration(context, bundleInfoPath);
} catch (IOException e) {
JUnitCorePlugin.log(e);
}
if (bundles != null) {
for (int j= 0; j < bundles.length; j++) {
BundleInfo bundleInfo= bundles[j];
if (symbolicName.equals(bundleInfo.getSymbolicName())) {
Version version= new Version(bundleInfo.getVersion());
if (versionRange.isIncluded(version)) {
IPath path= getBundleLocationPath(bundleInfo);
if (path.toFile().exists()) {
if (bestMatch == null || bestVersion.compareTo(version) < 0) {
bestMatch= bundleInfo;
bestVersion= version;
}
}
}
}
}
}
return bestMatch;
}
/**
* Returns the bundle location path.
*
* @param bundleInfo the bundle info or <code>null</code>
* @return the bundle location or <code>null</code> if it is not possible to convert to a path
*/
public static IPath getBundleLocationPath(BundleInfo bundleInfo) {
if (bundleInfo == null)
return null;
URI bundleLocation= bundleInfo.getLocation();
if (bundleLocation == null)
return null;
try {
URL localFileURL= FileLocator.toFileURL(URIUtil.toURL(bundleLocation));
URI localFileURI= new URI(localFileURL.toExternalForm());
return new Path(localFileURI.getPath());
} catch (IOException e) {
JUnitCorePlugin.log(e);
return null;
} catch (URISyntaxException e) {
JUnitCorePlugin.log(e);
return null;
}
}
}