From 22a3184d936e61dc04b5e3b241c85bbb1145868b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Wed, 22 Jun 2022 13:19:32 +0200 Subject: [PATCH] Migrate to Declarative Services for Adapters Fix https://github.com/eclipse-m2e/m2e-core/issues/585 --- org.eclipse.m2e.pde.ui/.project | 5 ++ .../org.eclipse.pde.ds.annotations.prefs | 8 +++ org.eclipse.m2e.pde.ui/META-INF/MANIFEST.MF | 8 ++- org.eclipse.m2e.pde.ui/OSGI-INF/.gitignore | 1 + org.eclipse.m2e.pde.ui/build.properties | 3 +- org.eclipse.m2e.pde.ui/plugin.xml | 58 ------------------- .../src/org/eclipse/m2e/pde/ui/Activator.java | 40 ------------- .../adapter/DependencyNodeAdapterFactory.java | 24 +++++--- .../adapter/MavenTargetAdapterFactory.java | 24 +++++--- .../MavenTargetBundleAdapterFactory.java | 16 +++-- .../MavenTargetDependencyAdapterFactory.java | 24 +++++--- .../editor/MavenTargetLocationEditor.java | 6 +- .../editor/MavenTargetLocationWizard.java | 3 +- .../org.eclipse.core.resources.prefs | 2 - 14 files changed, 85 insertions(+), 137 deletions(-) create mode 100644 org.eclipse.m2e.pde.ui/.settings/org.eclipse.pde.ds.annotations.prefs create mode 100644 org.eclipse.m2e.pde.ui/OSGI-INF/.gitignore delete mode 100644 org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/Activator.java delete mode 100644 org.eclipse.m2e.pde/.settings/org.eclipse.core.resources.prefs diff --git a/org.eclipse.m2e.pde.ui/.project b/org.eclipse.m2e.pde.ui/.project index aaeba7435..3c2ea713c 100644 --- a/org.eclipse.m2e.pde.ui/.project +++ b/org.eclipse.m2e.pde.ui/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/org.eclipse.m2e.pde.ui/.settings/org.eclipse.pde.ds.annotations.prefs b/org.eclipse.m2e.pde.ui/.settings/org.eclipse.pde.ds.annotations.prefs new file mode 100644 index 000000000..73a356b6d --- /dev/null +++ b/org.eclipse.m2e.pde.ui/.settings/org.eclipse.pde.ds.annotations.prefs @@ -0,0 +1,8 @@ +classpath=true +dsVersion=V1_3 +eclipse.preferences.version=1 +enabled=true +generateBundleActivationPolicyLazy=true +path=OSGI-INF +validationErrorLevel=error +validationErrorLevel.missingImplicitUnbindMethod=error diff --git a/org.eclipse.m2e.pde.ui/META-INF/MANIFEST.MF b/org.eclipse.m2e.pde.ui/META-INF/MANIFEST.MF index f9fbf26f1..ae8aaa80a 100644 --- a/org.eclipse.m2e.pde.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.m2e.pde.ui/META-INF/MANIFEST.MF @@ -19,6 +19,10 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.19.0", org.eclipse.core.databinding.property;bundle-version="1.8.100", org.eclipse.ui.workbench Bundle-ActivationPolicy: lazy -Bundle-Activator: org.eclipse.m2e.pde.ui.Activator Bundle-Vendor: Eclipse.org - m2e -Import-Package: aQute.bnd.osgi;version="[5.5.0,6.0.0)" +Import-Package: aQute.bnd.osgi;version="[5.5.0,6.0.0)", + org.slf4j;version="1.7.30" +Service-Component: OSGI-INF/org.eclipse.m2e.pde.ui.target.adapter.DependencyNodeAdapterFactory.xml, + OSGI-INF/org.eclipse.m2e.pde.ui.target.adapter.MavenTargetAdapterFactory.xml, + OSGI-INF/org.eclipse.m2e.pde.ui.target.adapter.MavenTargetBundleAdapterFactory.xml, + OSGI-INF/org.eclipse.m2e.pde.ui.target.adapter.MavenTargetDependencyAdapterFactory.xml diff --git a/org.eclipse.m2e.pde.ui/OSGI-INF/.gitignore b/org.eclipse.m2e.pde.ui/OSGI-INF/.gitignore new file mode 100644 index 000000000..24a7dd2c2 --- /dev/null +++ b/org.eclipse.m2e.pde.ui/OSGI-INF/.gitignore @@ -0,0 +1 @@ +/org.eclipse.m2e.*.xml diff --git a/org.eclipse.m2e.pde.ui/build.properties b/org.eclipse.m2e.pde.ui/build.properties index 6c480f39f..d9196947c 100644 --- a/org.eclipse.m2e.pde.ui/build.properties +++ b/org.eclipse.m2e.pde.ui/build.properties @@ -3,4 +3,5 @@ output.. = bin/ bin.includes = META-INF/,\ .,\ plugin.xml,\ - icons/ + icons/,\ + OSGI-INF/ diff --git a/org.eclipse.m2e.pde.ui/plugin.xml b/org.eclipse.m2e.pde.ui/plugin.xml index e71be8524..48a2f8f72 100644 --- a/org.eclipse.m2e.pde.ui/plugin.xml +++ b/org.eclipse.m2e.pde.ui/plugin.xml @@ -15,62 +15,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/Activator.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/Activator.java deleted file mode 100644 index bb5a608dd..000000000 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/Activator.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2020 Christoph Läubrich - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-v20.html - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Christoph Läubrich - initial API and implementation - *******************************************************************************/ -package org.eclipse.m2e.pde.ui; - -import java.util.HashSet; -import java.util.Set; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -public class Activator implements BundleActivator { - - public static final String ID = "org.eclipse.m2e.pde.ui"; - - private static final Set STOP_ACTIONS = new HashSet<>(); - - public static void runOnBundleStop(Runnable action) { - STOP_ACTIONS.add(action); - } - - @Override - public void start(BundleContext context) throws Exception { - - } - - @Override - public void stop(BundleContext context) throws Exception { - STOP_ACTIONS.forEach(Runnable::run); - } -} diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/DependencyNodeAdapterFactory.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/DependencyNodeAdapterFactory.java index 24a44e02b..67a0aa207 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/DependencyNodeAdapterFactory.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/DependencyNodeAdapterFactory.java @@ -16,21 +16,23 @@ import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.m2e.pde.ui.target.editor.MavenTargetLocationEditor; import org.eclipse.m2e.pde.ui.target.provider.DependencyNodeLabelProvider; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetTreeContentProvider; import org.eclipse.pde.ui.target.ITargetLocationHandler; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +@Component(service = IAdapterFactory.class, property = { + IAdapterFactory.SERVICE_PROPERTY_ADAPTABLE_CLASS + "=org.eclipse.aether.graph.DependencyNode", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ILabelProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ITreeContentProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.pde.ui.target.ITargetLocationHandler" }) public class DependencyNodeAdapterFactory implements IAdapterFactory { - public static final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); - public static final ILabelProvider LABEL_PROVIDER = new DependencyNodeLabelProvider(); - private static final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); - static { - Activator.runOnBundleStop(TREE_CONTENT_PROVIDER::dispose); - Activator.runOnBundleStop(LABEL_PROVIDER::dispose); - } + private final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); + private final ILabelProvider LABEL_PROVIDER = new DependencyNodeLabelProvider(); + private final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); @Override public T getAdapter(Object adaptableObject, Class adapterType) { @@ -51,4 +53,10 @@ public Class[] getAdapterList() { return new Class[] { ITreeContentProvider.class, ILabelProvider.class, ITargetLocationHandler.class }; } + @Deactivate + void dispose() { + TREE_CONTENT_PROVIDER.dispose(); + LABEL_PROVIDER.dispose(); + } + } diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetAdapterFactory.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetAdapterFactory.java index 6e27aab6a..0a7a384bd 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetAdapterFactory.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetAdapterFactory.java @@ -16,21 +16,23 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.m2e.pde.target.MavenTargetLocation; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.m2e.pde.ui.target.editor.MavenTargetLocationEditor; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetLocationLabelProvider; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetTreeContentProvider; import org.eclipse.pde.ui.target.ITargetLocationHandler; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +@Component(service = IAdapterFactory.class, property = { + IAdapterFactory.SERVICE_PROPERTY_ADAPTABLE_CLASS + "=org.eclipse.m2e.pde.target.MavenTargetLocation", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ILabelProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ITreeContentProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.pde.ui.target.ITargetLocationHandler" }) public class MavenTargetAdapterFactory implements IAdapterFactory { - public static final ILabelProvider LABEL_PROVIDER = new MavenTargetLocationLabelProvider(); - public static final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); - private static final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); - static { - Activator.runOnBundleStop(LABEL_PROVIDER::dispose); - Activator.runOnBundleStop(TREE_CONTENT_PROVIDER::dispose); - } + private final ILabelProvider LABEL_PROVIDER = new MavenTargetLocationLabelProvider(); + private final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); + private final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); @Override public Class[] getAdapterList() { return new Class[] { ILabelProvider.class, ITreeContentProvider.class, ITargetLocationHandler.class }; @@ -50,4 +52,10 @@ public T getAdapter(Object adaptableObject, Class adapterType) { return null; } + @Deactivate + void dispose() { + LABEL_PROVIDER.dispose(); + TREE_CONTENT_PROVIDER.dispose(); + } + } diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetBundleAdapterFactory.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetBundleAdapterFactory.java index d94c597c4..932ad5aff 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetBundleAdapterFactory.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetBundleAdapterFactory.java @@ -15,15 +15,16 @@ import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.m2e.pde.target.MavenTargetBundle; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetBundleLabelProvider; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +@Component(service = IAdapterFactory.class, property = { + IAdapterFactory.SERVICE_PROPERTY_ADAPTABLE_CLASS + "=org.eclipse.m2e.pde.target.MavenTargetBundle", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ILabelProvider" }) public class MavenTargetBundleAdapterFactory implements IAdapterFactory { - public static final ILabelProvider LABEL_PROVIDER = new MavenTargetBundleLabelProvider(); - static { - Activator.runOnBundleStop(LABEL_PROVIDER::dispose); - } + private final ILabelProvider LABEL_PROVIDER = new MavenTargetBundleLabelProvider(); @Override public T getAdapter(Object adaptableObject, Class adapterType) { if (adaptableObject instanceof MavenTargetBundle) { @@ -39,4 +40,9 @@ public Class[] getAdapterList() { return new Class[] { ILabelProvider.class }; } + @Deactivate + void dispose() { + LABEL_PROVIDER.dispose(); + } + } diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetDependencyAdapterFactory.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetDependencyAdapterFactory.java index 90b4b9678..6b1cd7895 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetDependencyAdapterFactory.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/adapter/MavenTargetDependencyAdapterFactory.java @@ -16,21 +16,23 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.m2e.pde.target.MavenTargetDependency; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.m2e.pde.ui.target.editor.MavenTargetLocationEditor; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetDependencyLabelProvider; import org.eclipse.m2e.pde.ui.target.provider.MavenTargetTreeContentProvider; import org.eclipse.pde.ui.target.ITargetLocationHandler; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +@Component(service = IAdapterFactory.class, property = { + IAdapterFactory.SERVICE_PROPERTY_ADAPTABLE_CLASS + "=org.eclipse.m2e.pde.target.MavenTargetDependency", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ILabelProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.jface.viewers.ITreeContentProvider", + IAdapterFactory.SERVICE_PROPERTY_ADAPTER_NAMES + "=org.eclipse.pde.ui.target.ITargetLocationHandler" }) public class MavenTargetDependencyAdapterFactory implements IAdapterFactory { - public static final ILabelProvider LABEL_PROVIDER = new MavenTargetDependencyLabelProvider(); - public static final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); - private static final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); - static { - Activator.runOnBundleStop(LABEL_PROVIDER::dispose); - Activator.runOnBundleStop(TREE_CONTENT_PROVIDER::dispose); - } + private final ILabelProvider LABEL_PROVIDER = new MavenTargetDependencyLabelProvider(); + private final ITreeContentProvider TREE_CONTENT_PROVIDER = new MavenTargetTreeContentProvider(); + private final MavenTargetLocationEditor LOCATION_EDITOR = new MavenTargetLocationEditor(); @Override public T getAdapter(Object adaptableObject, Class adapterType) { if (adaptableObject instanceof MavenTargetDependency) { @@ -50,4 +52,10 @@ public Class[] getAdapterList() { return new Class[] { ILabelProvider.class, ITreeContentProvider.class, ITargetLocationHandler.class }; } + @Deactivate + void dispose() { + LABEL_PROVIDER.dispose(); + TREE_CONTENT_PROVIDER.dispose(); + } + } diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationEditor.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationEditor.java index b5dfa439b..e3fc3ff59 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationEditor.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationEditor.java @@ -28,7 +28,6 @@ import org.eclipse.m2e.pde.target.MavenTargetDependency; import org.eclipse.m2e.pde.target.MavenTargetLocation; import org.eclipse.m2e.pde.target.MissingMetadataMode; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.pde.core.target.ITargetDefinition; import org.eclipse.pde.core.target.ITargetLocation; import org.eclipse.pde.ui.target.ITargetLocationHandler; @@ -140,7 +139,8 @@ public boolean canUpdate(ITargetDefinition target, TreePath treePath) { @Override public IStatus update(ITargetDefinition target, TreePath[] treePaths, IProgressMonitor monitor) { ITargetLocation[] targetLocations = target.getTargetLocations(); - IStatus status = new Status(IStatus.OK, Activator.ID, ITargetLocationHandler.STATUS_CODE_NO_CHANGE, "", null); + IStatus status = new Status(IStatus.OK, "org.eclipse.m2e.pde.ui", ITargetLocationHandler.STATUS_CODE_NO_CHANGE, + "", null); for (TreePath treePath : treePaths) { Object segment = treePath.getFirstSegment(); if (segment instanceof MavenTargetLocation) { @@ -256,7 +256,7 @@ public IStatus toggle(ITargetDefinition target, TreePath[] treePaths) { } } } - return toggled > 0 ? new Status(IStatus.OK, Activator.class.getPackageName(), STATUS_FORCE_RELOAD, "", null) + return toggled > 0 ? new Status(IStatus.OK, "org.eclipse.m2e.pde.ui", STATUS_FORCE_RELOAD, "", null) : Status.CANCEL_STATUS; } diff --git a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationWizard.java b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationWizard.java index b4da98f10..29455fb39 100644 --- a/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationWizard.java +++ b/org.eclipse.m2e.pde.ui/src/org/eclipse/m2e/pde/ui/target/editor/MavenTargetLocationWizard.java @@ -39,7 +39,6 @@ import org.eclipse.m2e.pde.target.MavenTargetRepository; import org.eclipse.m2e.pde.target.MissingMetadataMode; import org.eclipse.m2e.pde.target.TemplateFeatureModel; -import org.eclipse.m2e.pde.ui.Activator; import org.eclipse.pde.core.target.ITargetDefinition; import org.eclipse.pde.core.target.ITargetLocation; import org.eclipse.pde.ui.target.ITargetLocationWizard; @@ -390,7 +389,7 @@ public boolean performFinish() { featureSpecPage.update(featureModel, iscreate || targetLocation.getFeatureTemplate() == null); pluginListPage.update(featureModel); } catch (CoreException e) { - Platform.getLog(Activator.class).log(e.getStatus()); + Platform.getLog(MavenTargetLocationWizard.class).log(e.getStatus()); } featureModel.makeReadOnly(); } diff --git a/org.eclipse.m2e.pde/.settings/org.eclipse.core.resources.prefs b/org.eclipse.m2e.pde/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c020..000000000 --- a/org.eclipse.m2e.pde/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8