From f5c157187c86e9d6a4c0c36850aba67a01e407a6 Mon Sep 17 00:00:00 2001 From: Lars Vogel Date: Fri, 22 Apr 2022 13:01:07 +0200 Subject: [PATCH] Moving PublishedGradleVersionsWrapper to a declarative OSGi service With this change the PublishedGradleVersionsWrapper is published as declarative OSGi service instead registering it via the activator. For #1151 --- org.eclipse.buildship.core/.project | 5 ++ .../META-INF/MANIFEST.MF | 4 +- ....gradle.PublishedGradleVersionsWrapper.xml | 8 ++ org.eclipse.buildship.core/build.properties | 3 +- .../buildship/core/internal/CorePlugin.java | 25 +++++- .../PublishedGradleVersionsWrapper.java | 80 ++++++++++--------- 6 files changed, 80 insertions(+), 45 deletions(-) create mode 100644 org.eclipse.buildship.core/OSGI-INF/org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersionsWrapper.xml 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(); + } - } + } }