diff --git a/org.eclipse.buildship.core/.project b/org.eclipse.buildship.core/.project
index 77f2ee269..1b5226c4e 100644
--- a/org.eclipse.buildship.core/.project
+++ b/org.eclipse.buildship.core/.project
@@ -20,6 +20,11 @@
+
+ org.eclipse.pde.ds.core.builder
+
+
+
org.eclipse.jdt.core.javanature
diff --git a/org.eclipse.buildship.core/META-INF/MANIFEST.MF b/org.eclipse.buildship.core/META-INF/MANIFEST.MF
index aca41c542..bf297c321 100644
--- a/org.eclipse.buildship.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.buildship.core/META-INF/MANIFEST.MF
@@ -21,7 +21,8 @@ Require-Bundle: org.eclipse.core.expressions,
com.google.gson;bundle-version="[2.7.0,3.0.0)",
org.eclipse.buildship.compat;visibility:=reexport
Bundle-ActivationPolicy: lazy
-Import-Package: org.slf4j;version="1.7.2"
+Import-Package: org.osgi.service.component.annotations;version="1.3.0";resolution:=optional,
+ org.slf4j;version="1.7.2"
Export-Package: org.eclipse.buildship.core,
org.eclipse.buildship.core.internal;x-friends:="org.eclipse.buildship.ui,org.eclipse.buildship.kotlin",
org.eclipse.buildship.core.internal.configuration;x-friends:="org.eclipse.buildship.ui,org.eclipse.buildship.kotlin",
@@ -46,3 +47,4 @@ Export-Package: org.eclipse.buildship.core,
org.eclipse.buildship.core.internal.util.variable;x-friends:="org.eclipse.buildship.ui,org.eclipse.buildship.kotlin",
org.eclipse.buildship.core.internal.workspace;x-friends:="org.eclipse.buildship.ui,org.eclipse.buildship.kotlin",
org.eclipse.buildship.core.invocation
+Service-Component: OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml
diff --git a/org.eclipse.buildship.core/OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml b/org.eclipse.buildship.core/OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml
new file mode 100644
index 000000000..a6b20b166
--- /dev/null
+++ b/org.eclipse.buildship.core/OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/org.eclipse.buildship.core/build.properties b/org.eclipse.buildship.core/build.properties
index 28e0c598f..7e8aa6281 100644
--- a/org.eclipse.buildship.core/build.properties
+++ b/org.eclipse.buildship.core/build.properties
@@ -6,7 +6,8 @@ bin.includes = .,\
META-INF/,\
about.html,\
plugin.xml,\
- .options
+ .options,\
+ OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml
src.includes = plugin.xml,\
schema/,\
build.properties,\
diff --git a/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/CorePlugin.java b/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/CorePlugin.java
index 13fdf5f7b..9c0da3b59 100644
--- a/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/CorePlugin.java
+++ b/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/CorePlugin.java
@@ -12,6 +12,7 @@
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import org.osgi.framework.Bundle;
@@ -95,7 +96,6 @@ public final class CorePlugin extends Plugin {
// service tracker for each service to allow to register other service implementations of the
// same type but with higher prioritization, useful for testing
private ServiceTracker loggerServiceTracker;
- private ServiceTracker publishedGradleVersionsServiceTracker;
private ServiceTracker workspaceOperationsServiceTracker;
private ServiceTracker internalGradleWorkspaceServiceTracker;
private ServiceTracker processStreamsProviderServiceTracker;
@@ -110,6 +110,9 @@ public final class CorePlugin extends Plugin {
private DefaultExternalLaunchConfigurationManager externalLaunchConfigurationManager;
private ToolingApiOperationManager operationManager;
private ExtensionManager extensionManager;
+
+ private static Map, ServiceTracker, ?>> trackers = new ConcurrentHashMap<>();
+
@Override
public void start(BundleContext bundleContext) throws Exception {
@@ -141,7 +144,6 @@ private void registerServices(BundleContext context) {
// initialize service trackers before the services are created
this.loggerServiceTracker = createServiceTracker(context, Logger.class);
- this.publishedGradleVersionsServiceTracker = createServiceTracker(context, PublishedGradleVersionsWrapper.class);
this.workspaceOperationsServiceTracker = createServiceTracker(context, WorkspaceOperations.class);
this.internalGradleWorkspaceServiceTracker = createServiceTracker(context, InternalGradleWorkspace.class);
this.processStreamsProviderServiceTracker = createServiceTracker(context, ProcessStreamsProvider.class);
@@ -250,7 +252,6 @@ private void unregisterServices() {
this.processStreamsProviderServiceTracker.close();
this.internalGradleWorkspaceServiceTracker.close();
this.workspaceOperationsServiceTracker.close();
- this.publishedGradleVersionsServiceTracker.close();
this.loggerServiceTracker.close();
}
@@ -263,7 +264,7 @@ public static Logger logger() {
}
public static PublishedGradleVersionsWrapper publishedGradleVersions() {
- return (PublishedGradleVersionsWrapper) getInstance().publishedGradleVersionsServiceTracker.getService();
+ return getService(PublishedGradleVersionsWrapper.class);
}
public static WorkspaceOperations workspaceOperations() {
@@ -309,4 +310,20 @@ public static ToolingApiOperationManager operationManager() {
public static ExtensionManager extensionManager() {
return getInstance().extensionManager;
}
+
+ private static T getService(Class service) {
+ BundleContext context = plugin.getBundle().getBundleContext();
+ if(context == null) {
+ return null;
+ }
+ return service.cast(trackers.computeIfAbsent(service, key -> {
+ ServiceTracker, ?> tracker = new ServiceTracker<>(context, key, null);
+ tracker.open();
+ return tracker;
+ }).getService());
+ }
+
+
}
+
+
diff --git a/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/util/gradle/PublishedGradleVersionsWrapper.java b/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/util/gradle/PublishedGradleVersionsWrapper.java
index 886a3db18..63fc3f583 100644
--- a/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/util/gradle/PublishedGradleVersionsWrapper.java
+++ b/org.eclipse.buildship.core/src/main/java/org/eclipse/buildship/core/internal/util/gradle/PublishedGradleVersionsWrapper.java
@@ -18,58 +18,60 @@
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
-
+import org.osgi.service.component.annotations.Component;
import org.eclipse.buildship.core.internal.CorePlugin;
import org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersions.LookupStrategy;
/**
- * Wraps the {@link PublishedGradleVersions} functionality in a background job that handles all
- * exceptions gracefully. If an exception occurs while calling the underlying
- * {@link PublishedGradleVersions} instance, default version information is provided. This handles,
- * for example, those scenarios where the versions cannot be retrieved because the user is behind a
- * proxy or offline.
+ * Wraps the {@link PublishedGradleVersions} functionality in a background job
+ * that handles all exceptions gracefully. If an exception occurs while calling
+ * the underlying {@link PublishedGradleVersions} instance, default version
+ * information is provided. This handles, for example, those scenarios where the
+ * versions cannot be retrieved because the user is behind a proxy or offline.
*/
+@Component(property = { "service.ranking:Integer=1" }, service = PublishedGradleVersionsWrapper.class)
public final class PublishedGradleVersionsWrapper {
- private final AtomicReference publishedGradleVersions;
+ private final AtomicReference publishedGradleVersions;
- public PublishedGradleVersionsWrapper() {
- this.publishedGradleVersions = new AtomicReference();
- new LoadVersionsJob().schedule();
- }
+ public PublishedGradleVersionsWrapper() {
+ this.publishedGradleVersions = new AtomicReference();
+ new LoadVersionsJob().schedule();
+ }
- public List getVersions() {
- PublishedGradleVersions versions = this.publishedGradleVersions.get();
- return versions != null ? versions.getVersions() : ImmutableList.of(GradleVersion.current());
- }
+ public List getVersions() {
+ PublishedGradleVersions versions = this.publishedGradleVersions.get();
+ return versions != null ? versions.getVersions() : ImmutableList.of(GradleVersion.current());
+ }
- /**
- * Loads the published Gradle versions in the background.
- * @author Stefan Oehme
- */
- private final class LoadVersionsJob extends Job {
+ /**
+ * Loads the published Gradle versions in the background.
+ *
+ * @author Stefan Oehme
+ */
+ private final class LoadVersionsJob extends Job {
- public LoadVersionsJob() {
- super("Loading available Gradle versions");
- setSystem(true);
- }
+ public LoadVersionsJob() {
+ super("Loading available Gradle versions");
+ setSystem(true);
+ }
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- try {
- PublishedGradleVersions versions = PublishedGradleVersions.create(LookupStrategy.REMOTE_IF_NOT_CACHED);
- PublishedGradleVersionsWrapper.this.publishedGradleVersions.set(versions);
- } catch (RuntimeException e) {
- CorePlugin.logger().warn("Could not load Gradle version information", e);
- }
- return Status.OK_STATUS;
- }
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ PublishedGradleVersions versions = PublishedGradleVersions.create(LookupStrategy.REMOTE_IF_NOT_CACHED);
+ PublishedGradleVersionsWrapper.this.publishedGradleVersions.set(versions);
+ } catch (RuntimeException e) {
+ CorePlugin.logger().warn("Could not load Gradle version information", e);
+ }
+ return Status.OK_STATUS;
+ }
- @Override
- protected void canceling() {
- Thread.currentThread().interrupt();
- }
+ @Override
+ protected void canceling() {
+ Thread.currentThread().interrupt();
+ }
- }
+ }
}