From 2f264b7245465b61427736c4ba6c307e77598f1e Mon Sep 17 00:00:00 2001 From: Tim Ward Date: Thu, 10 Nov 2022 11:55:38 +0000 Subject: [PATCH] [m2e] Remove references to internal packages and avoid static methods The latest m2e updates have moved methods in internal packages. This breaks m2e support in Bndtools where we were going around the official API. This is primarily an attempt to remove the usage of internal types in an effort to remain compatible between versions. Furthermore we need to coexist in scenarios where: * A maven project change listener whiteboard is built in to M2E 2+ and replaces the one we created * Services are used for M2E objects such as IMaven - access these in a consistent way * Public lookup methods now exist, but we must still use reflection while 1.x is supported A good deal of cleanup will be possible once we have a base of 2.0, but for now this is a good next step. Known issues: The bndrun "Browse Repos" section populates, but then disappears again after about a second. Resolving is possible. Signed-off-by: Tim Ward --- bndtools.m2e/bnd.bnd | 2 +- .../bndtools/m2e/AbstractMavenRepository.java | 9 ++- bndtools.m2e/src/bndtools/m2e/Activator.java | 47 +++++++++--- .../src/bndtools/m2e/BndConfigurator.java | 28 +++---- .../src/bndtools/m2e/IndexConfigurator.java | 41 +++++----- .../bndtools/m2e/LaunchPropertyTester.java | 23 ++++-- .../src/bndtools/m2e/M2ETypeAccess.java | 8 ++ .../bndtools/m2e/MavenBndrunContainer.java | 69 +++++++---------- .../m2e/MavenDependenciesRepository.java | 15 +++- .../m2e/MavenImplicitProjectRepository.java | 7 +- .../m2e/MavenImplicitProjectRunListener.java | 16 +++- .../bndtools/m2e/MavenRunListenerHelper.java | 75 +++++++++++-------- .../src/bndtools/m2e/MavenRunProvider.java | 42 ++++++++--- .../m2e/MavenWorkspaceRepository.java | 7 +- .../m2e/ServiceAwareM2EConfigurator.java | 39 ++++++++++ .../m2e/WorkspaceProjectPostProcessor.java | 8 +- 16 files changed, 286 insertions(+), 150 deletions(-) create mode 100644 bndtools.m2e/src/bndtools/m2e/M2ETypeAccess.java create mode 100644 bndtools.m2e/src/bndtools/m2e/ServiceAwareM2EConfigurator.java diff --git a/bndtools.m2e/bnd.bnd b/bndtools.m2e/bnd.bnd index a15fe2590d..85902be2ad 100644 --- a/bndtools.m2e/bnd.bnd +++ b/bndtools.m2e/bnd.bnd @@ -45,7 +45,7 @@ Bundle-ActivationPolicy: lazy Import-Package: \ org.apache.maven.*;bundle-symbolic-name="${@bundlesymbolicname}";bundle-version="${range;[==,4);${@bundleversion}}";version=!,\ org.eclipse.aether.*;bundle-symbolic-name="${@bundlesymbolicname}";bundle-version="${range;[==,4);${@bundleversion}}";version=!,\ - org.eclipse.m2e.*;bundle-symbolic-name="${@bundlesymbolicname}";bundle-version="${range;[==,4);${@bundleversion}}";version=!,\ + org.eclipse.m2e.core.*;bundle-symbolic-name="${@bundlesymbolicname}";bundle-version="${range;[==,3);${@bundleversion}}";version=!,\ ${eclipse.importpackage},\ * diff --git a/bndtools.m2e/src/bndtools/m2e/AbstractMavenRepository.java b/bndtools.m2e/src/bndtools/m2e/AbstractMavenRepository.java index ca555b05cc..b9bc132466 100644 --- a/bndtools.m2e/src/bndtools/m2e/AbstractMavenRepository.java +++ b/bndtools.m2e/src/bndtools/m2e/AbstractMavenRepository.java @@ -7,7 +7,6 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; -import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.ArtifactKey; import org.eclipse.m2e.core.project.IMavenProjectChangedListener; import org.eclipse.m2e.core.project.IMavenProjectFacade; @@ -19,9 +18,13 @@ import aQute.bnd.service.RepositoryPlugin; public abstract class AbstractMavenRepository extends BaseRepository - implements MavenRunListenerHelper, Repository, RepositoryPlugin, IMavenProjectChangedListener { + implements Repository, RepositoryPlugin, IMavenProjectChangedListener { - final IMavenProjectRegistry mavenProjectRegistry = MavenPlugin.getMavenProjectRegistry(); + final IMavenProjectRegistry mavenProjectRegistry; + + protected AbstractMavenRepository(IMavenProjectRegistry mavenProjectRegistry) { + this.mavenProjectRegistry = mavenProjectRegistry; + } @Override public boolean canWrite() { diff --git a/bndtools.m2e/src/bndtools/m2e/Activator.java b/bndtools.m2e/src/bndtools/m2e/Activator.java index 513e50ab91..ae2a27590c 100644 --- a/bndtools.m2e/src/bndtools/m2e/Activator.java +++ b/bndtools.m2e/src/bndtools/m2e/Activator.java @@ -1,32 +1,59 @@ package bndtools.m2e; -import org.eclipse.m2e.core.internal.MavenPluginActivator; -import org.eclipse.m2e.core.internal.project.registry.MavenProjectManager; +import org.eclipse.m2e.core.MavenPlugin; +import org.eclipse.m2e.core.embedder.IMaven; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.osgi.annotation.bundle.Header; +import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; import aQute.bnd.osgi.Constants; @Header(name = Constants.BUNDLE_ACTIVATOR, value = "${@class}") public class Activator implements BundleActivator { + /** + * M2E version 2 has implicit support for whiteboard listeners and registers + * services. This activator helps us to work in both situations. + */ + private boolean isM2E_v2; + private MavenProjectChangedListenersTracker projectChangedListenersTracker; @Override public void start(BundleContext context) throws Exception { - projectChangedListenersTracker = new MavenProjectChangedListenersTracker(); - MavenProjectManager projectManager = MavenPluginActivator.getDefault() - .getMavenProjectManager(); - projectManager.addMavenProjectChangedListener(projectChangedListenersTracker); + Bundle bundle = FrameworkUtil.getBundle(MavenPlugin.class); + isM2E_v2 = bundle.getVersion() + .getMajor() == 2; + + if (!isM2E_v2) { + projectChangedListenersTracker = new MavenProjectChangedListenersTracker(); + IMavenProjectRegistry projectManager = MavenPlugin.getMavenProjectRegistry(); + projectManager.addMavenProjectChangedListener(projectChangedListenersTracker); + + registerM2EServices(context); + } + } + + /** + * These services should only be registered if running on M2E 1.x + * + * @param context + */ + private void registerM2EServices(BundleContext context) { + context.registerService(IMaven.class, MavenPlugin.getMaven(), null); + context.registerService(IMavenProjectRegistry.class, MavenPlugin.getMavenProjectRegistry(), null); } @Override public void stop(BundleContext context) throws Exception { - MavenProjectManager projectManager = MavenPluginActivator.getDefault() - .getMavenProjectManager(); - projectManager.removeMavenProjectChangedListener(projectChangedListenersTracker); - projectChangedListenersTracker.close(); + if (!isM2E_v2) { + IMavenProjectRegistry projectManager = MavenPlugin.getMavenProjectRegistry(); + projectManager.removeMavenProjectChangedListener(projectChangedListenersTracker); + projectChangedListenersTracker.close(); + } } } diff --git a/bndtools.m2e/src/bndtools/m2e/BndConfigurator.java b/bndtools.m2e/src/bndtools/m2e/BndConfigurator.java index 13268d4ad6..a76a33357a 100644 --- a/bndtools.m2e/src/bndtools/m2e/BndConfigurator.java +++ b/bndtools.m2e/src/bndtools/m2e/BndConfigurator.java @@ -33,18 +33,13 @@ import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.IJavaModelMarker; -import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.ArtifactKey; import org.eclipse.m2e.core.embedder.IMaven; -import org.eclipse.m2e.core.embedder.IMavenExecutionContext; -import org.eclipse.m2e.core.internal.MavenPluginActivator; -import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager; import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata; import org.eclipse.m2e.core.project.IMavenProjectFacade; -import org.eclipse.m2e.core.project.ResolverConfiguration; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant; import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant2; -import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator; import org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant; import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest; import org.osgi.service.component.annotations.Component; @@ -55,7 +50,7 @@ import aQute.bnd.osgi.Jar; import aQute.bnd.osgi.Packages; -public class BndConfigurator extends AbstractProjectConfigurator { +public class BndConfigurator extends ServiceAwareM2EConfigurator { private static final String ARTIFACT_PATTERN = "%s-%s.%s"; private static final String CLASSIFIER_ARTIFACT_PATTERN = "%s-%s-%s.%s"; @@ -190,7 +185,8 @@ public Set build(int kind, IProgressMonitor monitor) throws Exception public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { try { SubMonitor progress = SubMonitor.convert(monitor, 3); - execJarMojo(projectFacade, progress.split(1, SubMonitor.SUPPRESS_NONE), isTest); + execJarMojo(getMaven(), getRegistry(), projectFacade, + progress.split(1, SubMonitor.SUPPRESS_NONE), isTest); // We need to trigger a refresh IPath targetDirPath = Path.fromOSString(targetDirectory); @@ -299,19 +295,13 @@ private MavenProject getMavenProject(final IMavenProjectFacade projectFacade, IP return mavenProject; } - private void execJarMojo(final IMavenProjectFacade projectFacade, IProgressMonitor monitor, boolean isTest) + private void execJarMojo(IMaven maven, IMavenProjectRegistry projectRegistry, + final IMavenProjectFacade projectFacade, IProgressMonitor monitor, boolean isTest) throws CoreException { - final IMaven maven = MavenPlugin.getMaven(); - ProjectRegistryManager projectRegistryManager = MavenPluginActivator.getDefault() - .getMavenProjectManagerImpl(); + projectFacade.getResolverConfiguration() + .setResolveWorkspaceProjects(true); - ResolverConfiguration resolverConfiguration = new ResolverConfiguration(); - resolverConfiguration.setResolveWorkspaceProjects(true); - - IMavenExecutionContext context = projectRegistryManager.createExecutionContext(projectFacade.getPom(), - resolverConfiguration); - - context.execute((context1, monitor1) -> { + projectRegistry.execute(projectFacade, (context1, monitor1) -> { SubMonitor progress = SubMonitor.convert(monitor1); MavenProject mavenProject = getMavenProject(projectFacade, progress.split(1)); diff --git a/bndtools.m2e/src/bndtools/m2e/IndexConfigurator.java b/bndtools.m2e/src/bndtools/m2e/IndexConfigurator.java index ee61dab8ab..b22c628684 100644 --- a/bndtools.m2e/src/bndtools/m2e/IndexConfigurator.java +++ b/bndtools.m2e/src/bndtools/m2e/IndexConfigurator.java @@ -36,14 +36,13 @@ import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.IJavaModelMarker; -import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.ArtifactKey; import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.embedder.IMavenExecutionContext; import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant; -import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator; import org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant; import org.eclipse.m2e.core.project.configurator.MojoExecutionKey; import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest; @@ -51,7 +50,7 @@ import aQute.bnd.exceptions.Exceptions; import aQute.maven.api.Archive; -public class IndexConfigurator extends AbstractProjectConfigurator implements IResourceChangeListener { +public class IndexConfigurator extends ServiceAwareM2EConfigurator implements IResourceChangeListener { private static final String INDEXER_PLUGIN_ARTIFACT_ID = "bnd-indexer-maven-plugin"; private static final String INDEXER_PLUGIN_GROUP_ID = "biz.aQute.bnd"; @@ -67,6 +66,13 @@ private static final class IndexerWorkspaceRepository extends LocalArtifactRepos private final WorkspaceRepository wr = new WorkspaceRepository("index", getClass()); + private final IMavenProjectRegistry registry; + + public IndexerWorkspaceRepository(IMavenProjectRegistry registry) { + super(); + this.registry = registry; + } + @Override public boolean hasLocalMetadata() { return false; @@ -86,8 +92,7 @@ public Artifact find(Artifact artifact) { } private File find(String groupId, String artifactId, String version, String extension) { - IMavenProjectFacade found = MavenPlugin.getMavenProjectRegistry() - .getMavenProject(groupId, artifactId, version); + IMavenProjectFacade found = registry.getMavenProject(groupId, artifactId, version); if (found != null) { return getMavenOutputFile(extension, found, progress.split(1)); @@ -104,8 +109,7 @@ public File findArtifact(org.eclipse.aether.artifact.Artifact artifact) { @Override public List findVersions(org.eclipse.aether.artifact.Artifact artifact) { List versions = new ArrayList<>(); - for (IMavenProjectFacade facade : MavenPlugin.getMavenProjectRegistry() - .getProjects()) { + for (IMavenProjectFacade facade : registry.getProjects()) { ArtifactKey key = facade.getArtifactKey(); if (key.getArtifactId() .equals(artifact.getArtifactId()) @@ -132,8 +136,14 @@ private static final class RebuildIndexCheck extends WorkspaceJob { private boolean noMoreEvents; - public RebuildIndexCheck(String name, IResourceChangeEvent event, IMavenProjectFacade facade) { + private final IMaven maven; + private final IMavenProjectRegistry registry; + + public RebuildIndexCheck(IMaven maven, IMavenProjectRegistry registry, String name, IResourceChangeEvent event, + IMavenProjectFacade facade) { super(name); + this.maven = maven; + this.registry = registry; this.events.add(event); this.facade = facade; } @@ -176,8 +186,7 @@ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { IProject[] refs = facade.getProject() .getReferencedProjects(); for (int i = 0; !needsBuild && i < refs.length; i++) { - IMavenProjectFacade pf = MavenPlugin.getMavenProjectRegistry() - .getProject(refs[i]); + IMavenProjectFacade pf = registry.getProject(refs[i]); needsBuild = pf != null ? needsBuild(delta, keysToTypes, pf, progress.split(1)) : false; } @@ -199,8 +208,7 @@ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { list.size()); list.forEach(me -> { try { - MavenPlugin.getMaven() - .execute(getMavenProject(facade, indexMonitor), me, indexMonitor); + maven.execute(getMavenProject(facade, indexMonitor), me, indexMonitor); } catch (CoreException e) { logger.logError( "An error occurred attempting to build the index for project " + facade.getProject() @@ -310,11 +318,9 @@ public Set build(int kind, IProgressMonitor monitor) throws Exception final SubMonitor progress = SubMonitor.convert(monitor, "Executing indexer plugin", 2); - final IMaven maven = MavenPlugin.getMaven(); - IMavenExecutionContext context = maven.createExecutionContext(); context.getExecutionRequest() - .setWorkspaceReader(new IndexerWorkspaceRepository()); + .setWorkspaceReader(new IndexerWorkspaceRepository(getRegistry())); final MavenProject mavenProject = getMavenProject(projectFacade, progress.split(1)); @@ -361,8 +367,7 @@ private static MavenProject getMavenProject(final IMavenProjectFacade projectFac */ @Override public void resourceChanged(final IResourceChangeEvent event) { - projects: for (IMavenProjectFacade facade : MavenPlugin.getMavenProjectRegistry() - .getProjects()) { + projects: for (IMavenProjectFacade facade : getRegistry().getProjects()) { IProject currentProject = facade.getProject(); synchronized (pendingJobs) { RebuildIndexCheck existing = pendingJobs.get(currentProject); @@ -390,7 +395,7 @@ public void resourceChanged(final IResourceChangeEvent event) { .findMember(projects[i].getFullPath()) != null; } if (doFullCheck) { - RebuildIndexCheck job = new RebuildIndexCheck( + RebuildIndexCheck job = new RebuildIndexCheck(getMaven(), getRegistry(), "Checking index project " + currentProject.getName() + " for rebuild", event, facade); // If someone else beat us to the punch then don't diff --git a/bndtools.m2e/src/bndtools/m2e/LaunchPropertyTester.java b/bndtools.m2e/src/bndtools/m2e/LaunchPropertyTester.java index 8185a8293a..3595265e37 100644 --- a/bndtools.m2e/src/bndtools/m2e/LaunchPropertyTester.java +++ b/bndtools.m2e/src/bndtools/m2e/LaunchPropertyTester.java @@ -1,5 +1,8 @@ package bndtools.m2e; +import static bndtools.m2e.MavenRunListenerHelper.getMavenProjectFacade; +import static bndtools.m2e.MavenRunListenerHelper.hasBndTestingMavenPlugin; + import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.eclipse.core.expressions.PropertyTester; @@ -8,8 +11,9 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; -public class LaunchPropertyTester extends PropertyTester implements MavenRunListenerHelper { +public class LaunchPropertyTester extends PropertyTester { private static final ILogger logger = Logger .getLogger(LaunchPropertyTester.class); @@ -18,6 +22,13 @@ public class LaunchPropertyTester extends PropertyTester implements MavenRunList public static final String PROP_IS_TESTABLE_BND_MAVEN_PROJECT = "isTestableBndMavenProject"; static final String MAVEN_NATURE = "org.eclipse.m2e.core.maven2Nature"; + private final IMavenProjectRegistry mavenProjectRegistry; + + public LaunchPropertyTester(IMavenProjectRegistry mavenProjectRegistry) { + this.mavenProjectRegistry = mavenProjectRegistry; + + } + @Override public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { IResource resource = null; @@ -48,9 +59,9 @@ public boolean test(Object receiver, String property, Object[] args, Object expe switch (property) { case PROP_IS_IN_BND_MAVEN_PROJECT : try { - IMavenProjectFacade projectFacade = getMavenProjectFacade(resource); + IMavenProjectFacade projectFacade = getMavenProjectFacade(mavenProjectRegistry, resource); - return (projectFacade != null) && hasBndMavenPlugin(projectFacade); + return (projectFacade != null) && MavenRunListenerHelper.hasBndMavenPlugin(projectFacade); } catch (CoreException e) { logger.logError("Error testing '" + PROP_IS_IN_BND_MAVEN_PROJECT + "' property on java element.", e); @@ -58,9 +69,9 @@ public boolean test(Object receiver, String property, Object[] args, Object expe } case PROP_IS_RESOLVABLE_BND_MAVEN_PROJECT : try { - IMavenProjectFacade projectFacade = getMavenProjectFacade(resource); + IMavenProjectFacade projectFacade = getMavenProjectFacade(mavenProjectRegistry, resource); - return (projectFacade != null) && hasBndResolverMavenPlugin(projectFacade); + return (projectFacade != null) && MavenRunListenerHelper.hasBndResolverMavenPlugin(projectFacade); } catch (CoreException e) { logger.logError( "Error testing '" + PROP_IS_RESOLVABLE_BND_MAVEN_PROJECT + "' property on java element.", e); @@ -68,7 +79,7 @@ public boolean test(Object receiver, String property, Object[] args, Object expe } case PROP_IS_TESTABLE_BND_MAVEN_PROJECT : try { - IMavenProjectFacade projectFacade = getMavenProjectFacade(resource); + IMavenProjectFacade projectFacade = getMavenProjectFacade(mavenProjectRegistry, resource); return (projectFacade != null) && hasBndTestingMavenPlugin(projectFacade); } catch (CoreException e) { diff --git a/bndtools.m2e/src/bndtools/m2e/M2ETypeAccess.java b/bndtools.m2e/src/bndtools/m2e/M2ETypeAccess.java new file mode 100644 index 0000000000..e4ea741b50 --- /dev/null +++ b/bndtools.m2e/src/bndtools/m2e/M2ETypeAccess.java @@ -0,0 +1,8 @@ +package bndtools.m2e; + +import org.osgi.service.component.annotations.Component; + +@Component(service = M2ETypeAccess.class) +public class M2ETypeAccess { + +} diff --git a/bndtools.m2e/src/bndtools/m2e/MavenBndrunContainer.java b/bndtools.m2e/src/bndtools/m2e/MavenBndrunContainer.java index 1ed9ef94f6..daa4f667e0 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenBndrunContainer.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenBndrunContainer.java @@ -2,6 +2,8 @@ import static aQute.bnd.exceptions.Exceptions.unchecked; import static aQute.bnd.exceptions.FunctionWithException.asFunction; +import static bndtools.m2e.MavenRunListenerHelper.getMavenProject; +import static bndtools.m2e.MavenRunListenerHelper.lookupComponent; import java.io.File; import java.util.Map; @@ -18,13 +20,9 @@ import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.m2e.core.MavenPlugin; -import org.eclipse.m2e.core.embedder.IMavenExecutionContext; -import org.eclipse.m2e.core.internal.MavenPluginActivator; -import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager; +import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.project.IMavenProjectFacade; -import org.eclipse.m2e.core.project.IProjectConfigurationManager; -import org.eclipse.m2e.core.project.ResolverConfiguration; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import aQute.bnd.maven.lib.configuration.Bundles; import aQute.bnd.maven.lib.resolve.BndrunContainer; @@ -34,29 +32,22 @@ import aQute.bnd.version.Version; import biz.aQute.resolve.Bndrun; -public class MavenBndrunContainer implements MavenRunListenerHelper { +public class MavenBndrunContainer { private static final ILogger logger = Logger .getLogger(MavenBndrunContainer.class); private static final Version scopesVersion = new Version(4, 2, 0); - private static final IProjectConfigurationManager configurationManager = MavenPlugin - .getProjectConfigurationManager(); - private static final ProjectRegistryManager projectManager = MavenPluginActivator.getDefault() - .getMavenProjectManagerImpl(); - - private static final MavenRunListenerHelper helper = new MavenRunListenerHelper() {}; - + private final IMavenProjectRegistry mavenProjectRegistry; private final BndrunContainer bndrunContainer; - private final MavenProject mavenProject; - private final IMavenExecutionContext context; + private final IMavenProjectFacade mavenProjectFacade; private final IProgressMonitor monitor; - public static MavenBndrunContainer getBndrunContainer(IMavenProjectFacade projectFacade, - MojoExecution mojoExecution, IProgressMonitor monitor) { + public static MavenBndrunContainer getBndrunContainer(IMaven maven, IMavenProjectRegistry mavenProjectRegistry, + IMavenProjectFacade projectFacade, MojoExecution mojoExecution, IProgressMonitor monitor) { - MavenProject mavenProject = helper.getMavenProject(projectFacade); + MavenProject mavenProject = getMavenProject(projectFacade); Bundles bundles = null; boolean useMavenDependencies = true; @@ -95,29 +86,25 @@ public static MavenBndrunContainer getBndrunContainer(IMavenProjectFacade projec } } - return getBndrunContainer(projectFacade, bundles, useMavenDependencies, includeDependencyManagement, - scopeValues, monitor); + return getBndrunContainer(maven, mavenProjectRegistry, projectFacade, bundles, useMavenDependencies, + includeDependencyManagement, scopeValues, monitor); } - public static MavenBndrunContainer getBndrunContainer(IMavenProjectFacade projectFacade, Bundles bundles, + public static MavenBndrunContainer getBndrunContainer(IMaven maven, IMavenProjectRegistry mavenProjectRegistry, + IMavenProjectFacade projectFacade, Bundles bundles, boolean useMavenDependencies, boolean includeDependencyManagement, Set scopeValues, IProgressMonitor monitor) { - MavenProject mavenProject = helper.getMavenProject(projectFacade); + MavenProject mavenProject = getMavenProject(projectFacade); try { - ResolverConfiguration resolverConfiguration = configurationManager - .getResolverConfiguration(projectFacade.getProject()); - IMavenExecutionContext context = projectManager.createExecutionContext(projectFacade.getPom(), - resolverConfiguration); - - BndrunContainer bndrunContainer = context.execute(mavenProject, (c, m) -> { + BndrunContainer bndrunContainer = mavenProjectRegistry.execute(projectFacade, (c, m) -> { MavenSession mavenSession = c.getSession(); mavenSession.setCurrentProject(mavenProject); @SuppressWarnings("deprecation") Builder builder = new BndrunContainer.Builder(mavenProject, mavenSession, c.getRepositorySession(), - helper.lookupComponent(ProjectDependenciesResolver.class), - helper.lookupComponent(org.apache.maven.artifact.factory.ArtifactFactory.class), - helper.lookupComponent(RepositorySystem.class)); + lookupComponent(maven, ProjectDependenciesResolver.class), + lookupComponent(maven, org.apache.maven.artifact.factory.ArtifactFactory.class), + lookupComponent(maven, RepositorySystem.class)); Optional.ofNullable(bundles) .map(asFunction(b -> b.getFiles(mavenProject.getBasedir()))) @@ -131,12 +118,12 @@ public static MavenBndrunContainer getBndrunContainer(IMavenProjectFacade projec .collect(Collectors.toSet())); } - builder.setPostProcessor(new WorkspaceProjectPostProcessor(m)); + builder.setPostProcessor(new WorkspaceProjectPostProcessor(mavenProjectRegistry, m)); return builder.build(); }, monitor); - return new MavenBndrunContainer(bndrunContainer, mavenProject, context, monitor); + return new MavenBndrunContainer(bndrunContainer, mavenProjectRegistry, projectFacade, monitor); } catch (Exception e) { logger.logError("Failed to create Run for m2e project " + mavenProject.getName(), e); @@ -144,22 +131,22 @@ public static MavenBndrunContainer getBndrunContainer(IMavenProjectFacade projec } } - public MavenBndrunContainer(BndrunContainer bndrunContainer, MavenProject mavenProject, - IMavenExecutionContext context, IProgressMonitor monitor) { + public MavenBndrunContainer(BndrunContainer bndrunContainer, IMavenProjectRegistry mavenProjectRegistry, + IMavenProjectFacade projectFacade, IProgressMonitor monitor) { this.bndrunContainer = bndrunContainer; - this.mavenProject = mavenProject; - this.context = context; + this.mavenProjectRegistry = mavenProjectRegistry; + this.mavenProjectFacade = projectFacade; this.monitor = monitor; } public Bndrun init(File runFile, String task, File workingDir) throws Exception { - return context.execute( // + return mavenProjectRegistry.execute(mavenProjectFacade, (c, m) -> unchecked(() -> bndrunContainer.init(runFile, task, workingDir)), monitor); } public Map resolve() throws Exception { - return context.execute( // - (c, m) -> unchecked(() -> bndrunContainer.getDependencyResolver(mavenProject) + return mavenProjectRegistry.execute(mavenProjectFacade, + (c, m) -> unchecked(() -> bndrunContainer.getDependencyResolver(mavenProjectFacade.getMavenProject()) .resolve()), monitor); } diff --git a/bndtools.m2e/src/bndtools/m2e/MavenDependenciesRepository.java b/bndtools.m2e/src/bndtools/m2e/MavenDependenciesRepository.java index ebb99c3921..dbd1a9aa53 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenDependenciesRepository.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenDependenciesRepository.java @@ -11,9 +11,12 @@ import org.eclipse.aether.repository.WorkspaceRepository; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.project.IMavenProjectChangedListener; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,6 +32,14 @@ public class MavenDependenciesRepository extends MavenWorkspaceRepository { private final Set allScopes = Sets.of("compile", "provided", "runtime", "system", "test"); + @Reference + IMaven maven; + + @Reference + void setRegistry(IMavenProjectRegistry mavenProjectRegistry) { + this.mavenProjectRegistry = mavenProjectRegistry; + } + @Override public String getName() { return "Maven Dependencies"; @@ -47,8 +58,8 @@ Set collect(IMavenProjectFacade projectFacade, IProgressMonitor monito } try { - MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(projectFacade, null, - true, true, allScopes, monitor); + MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(maven, + mavenProjectRegistry, projectFacade, null, true, true, allScopes, monitor); mavenBndrunContainer.resolve() .values() diff --git a/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRepository.java b/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRepository.java index d8ac5f57d7..33beac8d5b 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRepository.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRepository.java @@ -17,6 +17,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.eclipse.m2e.core.project.MavenProjectChangedEvent; import org.osgi.resource.Capability; import org.osgi.resource.Requirement; @@ -41,7 +42,9 @@ public class MavenImplicitProjectRepository extends AbstractMavenRepository private final Run run; private final IPath bndrunFilePath; - public MavenImplicitProjectRepository(IMavenProjectFacade projectFacade, Run run) { + public MavenImplicitProjectRepository(IMavenProjectRegistry mavenProjectRegistry, + IMavenProjectFacade projectFacade, Run run) { + super(mavenProjectRegistry); this.projectFacade = projectFacade; this.run = run; @@ -125,7 +128,7 @@ public SortedSet versions(String bsn) throws Exception { } protected void createRepo(IMavenProjectFacade projectFacade, IProgressMonitor monitor) { - MavenProject mavenProject = getMavenProject(projectFacade); + MavenProject mavenProject = MavenRunListenerHelper.getMavenProject(projectFacade); try { BndrunContainer bndrunContainer = run.getPlugin(BndrunContainer.class); diff --git a/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRunListener.java b/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRunListener.java index 43c7627b00..7d21bcd753 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRunListener.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenImplicitProjectRunListener.java @@ -1,15 +1,24 @@ package bndtools.m2e; +import static bndtools.m2e.MavenRunListenerHelper.getResource; +import static bndtools.m2e.MavenRunListenerHelper.isMavenProject; + import org.bndtools.api.RunListener; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.osgi.framework.Constants; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import aQute.bnd.build.Run; import aQute.bnd.build.Workspace; @Component(property = Constants.SERVICE_RANKING + ":Integer=1000") -public class MavenImplicitProjectRunListener implements MavenRunListenerHelper, RunListener { +public class MavenImplicitProjectRunListener implements RunListener { + + @Reference + IMavenProjectRegistry mavenProjectRegistry; @Override public void create(Run run) throws Exception {} @@ -18,7 +27,7 @@ public void create(Run run) throws Exception {} public void end(Run run) throws Exception { IResource resource = getResource(run); - if (!isMavenProject(resource)) { + if (!isMavenProject(mavenProjectRegistry, resource)) { return; } @@ -28,7 +37,8 @@ public void end(Run run) throws Exception { if (repo != null) { mavenProjectRegistry.removeMavenProjectChangedListener(repo); - iWorkspace.removeResourceChangeListener(repo); + ResourcesPlugin.getWorkspace() + .removeResourceChangeListener(repo); } } diff --git a/bndtools.m2e/src/bndtools/m2e/MavenRunListenerHelper.java b/bndtools.m2e/src/bndtools/m2e/MavenRunListenerHelper.java index f8a8d71cc7..46f58b5071 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenRunListenerHelper.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenRunListenerHelper.java @@ -23,7 +23,6 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.m2e.core.MavenPlugin; import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.project.IMavenProjectFacade; import org.eclipse.m2e.core.project.IMavenProjectRegistry; @@ -34,11 +33,12 @@ public interface MavenRunListenerHelper { - IMaven maven = MavenPlugin.getMaven(); - IMavenProjectRegistry mavenProjectRegistry = MavenPlugin.getMavenProjectRegistry(); - IWorkspace iWorkspace = ResourcesPlugin.getWorkspace(); + // IMaven maven = MavenPlugin.getMaven(); + // IMavenProjectRegistry mavenProjectRegistry = + // MavenPlugin.getMavenProjectRegistry(); + // IWorkspace iWorkspace = ResourcesPlugin.getWorkspace(); - default IResource getResource(Run run) { + static IResource getResource(Run run) { File propertiesFile = run.getPropertiesFile(); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); @@ -54,7 +54,7 @@ default IResource getResource(Run run) { return shortest; } - default MavenProject getMavenProject(IMavenProjectFacade mavenProjectFacade) { + static MavenProject getMavenProject(IMavenProjectFacade mavenProjectFacade) { try { return mavenProjectFacade.getMavenProject(new NullProgressMonitor()); } catch (CoreException e) { @@ -62,56 +62,61 @@ default MavenProject getMavenProject(IMavenProjectFacade mavenProjectFacade) { } } - default IMavenProjectFacade getMavenProjectFacade(IResource resource) { + static IMavenProjectFacade getMavenProjectFacade(IMavenProjectRegistry mavenProjectRegistry, IResource resource) { return mavenProjectRegistry.getProject(resource.getProject()); } - default boolean isMavenProject(IResource resource) { - if ((resource != null) && (resource.getProject() != null) && (getMavenProjectFacade(resource) != null)) { + static boolean isMavenProject(IMavenProjectRegistry mavenProjectRegistry, IResource resource) { + if ((resource != null) && (resource.getProject() != null) + && (getMavenProjectFacade(mavenProjectRegistry, resource) != null)) { return true; } return false; } - default boolean hasBndMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { + static boolean hasBndMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { return getBndMavenPlugin(projectFacade).isPresent(); } - default Optional getBndMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { + static Optional getBndMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { return getBndMavenPluginById(projectFacade, "biz.aQute.bnd:bnd-maven-plugin"); } - default boolean hasBndResolverMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { + static boolean hasBndResolverMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { return getBndResolverMavenPlugin(projectFacade).isPresent(); } - default Optional getBndResolverMavenPlugin(IMavenProjectFacade projectFacade) + static Optional getBndResolverMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { return getBndMavenPluginById(projectFacade, "biz.aQute.bnd:bnd-resolver-maven-plugin"); } - default MojoExecution getBndResolverMojoExecution(IMavenProjectFacade projectFacade, IProgressMonitor monitor) + static MojoExecution getBndResolverMojoExecution(IMaven maven, IMavenProjectFacade projectFacade, + IProgressMonitor monitor) throws CoreException { - return getMojoExecution(projectFacade, "biz.aQute.bnd:bnd-resolver-maven-plugin", "bnd-resolver:resolve@", + return getMojoExecution(maven, projectFacade, "biz.aQute.bnd:bnd-resolver-maven-plugin", + "bnd-resolver:resolve@", exe -> true, monitor); } - default MojoExecution getBndResolverMojoExecution(IMavenProjectFacade projectFacade, + static MojoExecution getBndResolverMojoExecution(IMaven maven, IMavenProjectFacade projectFacade, Predicate predicate, IProgressMonitor monitor) throws CoreException { - return getMojoExecution(projectFacade, "biz.aQute.bnd:bnd-resolver-maven-plugin", "bnd-resolver:resolve@", + return getMojoExecution(maven, projectFacade, "biz.aQute.bnd:bnd-resolver-maven-plugin", + "bnd-resolver:resolve@", predicate, monitor); } - default boolean hasBndTestingMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { + static boolean hasBndTestingMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { return getBndTestingMavenPlugin(projectFacade).isPresent(); } - default Optional getBndTestingMavenPlugin(IMavenProjectFacade projectFacade) throws CoreException { + static Optional getBndTestingMavenPlugin(IMavenProjectFacade projectFacade) + throws CoreException { return getBndMavenPluginById(projectFacade, "biz.aQute.bnd:bnd-testing-maven-plugin"); } - default Optional getBndMavenPluginById(IMavenProjectFacade projectFacade, String id) + static Optional getBndMavenPluginById(IMavenProjectFacade projectFacade, String id) throws CoreException { return Optional.ofNullable(getMavenProject(projectFacade).getPlugin(id)) .map(Plugin::getExecutions) @@ -120,19 +125,21 @@ default Optional getBndMavenPluginById(IMavenProjectFacade proj .findFirst(); } - default MojoExecution getBndTestingMojoExecution(IMavenProjectFacade projectFacade, IProgressMonitor monitor) + static MojoExecution getBndTestingMojoExecution(IMaven maven, IMavenProjectFacade projectFacade, + IProgressMonitor monitor) throws CoreException { - return getMojoExecution(projectFacade, "biz.aQute.bnd:bnd-testing-maven-plugin", "bnd-testing:testing@", + return getMojoExecution(maven, projectFacade, "biz.aQute.bnd:bnd-testing-maven-plugin", "bnd-testing:testing@", exe -> true, monitor); } - default MojoExecution getBndTestingMojoExecution(IMavenProjectFacade projectFacade, + static MojoExecution getBndTestingMojoExecution(IMaven maven, IMavenProjectFacade projectFacade, Predicate predicate, IProgressMonitor monitor) throws CoreException { - return getMojoExecution(projectFacade, "biz.aQute.bnd:bnd-testing-maven-plugin", "bnd-testing:testing@", + return getMojoExecution(maven, projectFacade, "biz.aQute.bnd:bnd-testing-maven-plugin", "bnd-testing:testing@", predicate, monitor); } - default MojoExecution getMojoExecution(IMavenProjectFacade projectFacade, String pluginId, String executionPrefix, + static MojoExecution getMojoExecution(IMaven maven, IMavenProjectFacade projectFacade, String pluginId, + String executionPrefix, Predicate predicate, IProgressMonitor monitor) throws CoreException { MavenProject mavenProject = getMavenProject(projectFacade); Plugin plugin = getMavenProject(projectFacade).getPlugin(pluginId); @@ -165,7 +172,7 @@ default String createErrorMessage(String pluginId) { return builder.toString(); } - default boolean isOffline() { + static boolean isOffline(IMaven maven) { try { return maven.getSettings() .isOffline(); @@ -174,19 +181,27 @@ default boolean isOffline() { } } - default T lookupComponent(Class clazz) { + static T lookupComponent(IMaven maven, Class clazz) { try { Method lookupComponentMethod = maven.getClass() - .getMethod("lookupComponent", Class.class); + .getMethod("lookup", Class.class); return clazz.cast(lookupComponentMethod.invoke(maven, clazz)); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { - return null; + try { + Method lookupComponentMethod = maven.getClass() + .getMethod("lookupComponent", Class.class); + + return clazz.cast(lookupComponentMethod.invoke(maven, clazz)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e2) { + return null; + } } } - default boolean containsBndrun(MojoExecution mojoExecution, MavenProject mavenProject, File bndrunFile, + static boolean containsBndrun(IMaven maven, MojoExecution mojoExecution, MavenProject mavenProject, File bndrunFile, IProgressMonitor monitor) { try { Bndruns bndruns = maven.getMojoParameterValue(mavenProject, mojoExecution, "bndruns", Bndruns.class, diff --git a/bndtools.m2e/src/bndtools/m2e/MavenRunProvider.java b/bndtools.m2e/src/bndtools/m2e/MavenRunProvider.java index 25c1b9d95a..7569e6130a 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenRunProvider.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenRunProvider.java @@ -1,5 +1,12 @@ package bndtools.m2e; +import static bndtools.m2e.MavenRunListenerHelper.containsBndrun; +import static bndtools.m2e.MavenRunListenerHelper.getBndResolverMojoExecution; +import static bndtools.m2e.MavenRunListenerHelper.getBndTestingMojoExecution; +import static bndtools.m2e.MavenRunListenerHelper.getMavenProject; +import static bndtools.m2e.MavenRunListenerHelper.getMavenProjectFacade; +import static bndtools.m2e.MavenRunListenerHelper.isMavenProject; + import java.io.File; import java.util.function.Predicate; @@ -9,12 +16,15 @@ import org.bndtools.api.RunProvider; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.m2e.core.embedder.IMaven; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.osgi.framework.Constants; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; @@ -30,19 +40,25 @@ * that one does not check to see if the project is M2E. */ @Component(property = Constants.SERVICE_RANKING + ":Integer=3000") -public class MavenRunProvider implements MavenRunListenerHelper, RunProvider { +public class MavenRunProvider implements RunProvider { private static final Logger logger = LoggerFactory.getLogger(MavenRunProvider.class); private MavenWorkspaceRepository mavenWorkspaceRepository; + @Reference + IMaven maven; + @Reference + IMavenProjectRegistry mavenProjectRegistry; + @Override public Bndrun create(IResource targetResource, RunMode mode) throws Exception { - if (!isMavenProject(targetResource)) { + if (!isMavenProject(mavenProjectRegistry, targetResource)) { return null; } - final IMavenProjectFacade projectFacade = getMavenProjectFacade(targetResource); + final IMavenProjectFacade projectFacade = getMavenProjectFacade(mavenProjectRegistry, + targetResource); Bndrun bndrun = create0(targetResource, projectFacade, mode); if (bndrun == null) { @@ -51,11 +67,12 @@ public Bndrun create(IResource targetResource, RunMode mode) throws Exception { Workspace workspace = bndrun.getWorkspace(); final MavenImplicitProjectRepository implicitRepo = new MavenImplicitProjectRepository( // - projectFacade, bndrun); + mavenProjectRegistry, projectFacade, bndrun); mavenProjectRegistry.addMavenProjectChangedListener( // implicitRepo); - iWorkspace.addResourceChangeListener( // + ResourcesPlugin.getWorkspace() + .addResourceChangeListener( // implicitRepo, IResourceChangeEvent.POST_CHANGE); workspace.addBasicPlugin(implicitRepo); @@ -96,7 +113,7 @@ private Bndrun create0(IResource targetResource, IMavenProjectFacade projectFaca File location = targetResource.getLocation() .toFile(); bndrunFile = location; - bndrunMatchs = mojoExecution -> containsBndrun(mojoExecution, mavenProject, location, monitor); + bndrunMatchs = mojoExecution -> containsBndrun(maven, mojoExecution, mavenProject, location, monitor); } MojoExecution mojoExecution; @@ -105,7 +122,8 @@ private Bndrun create0(IResource targetResource, IMavenProjectFacade projectFaca case LAUNCH : case EDIT : case SOURCES : - if ((mojoExecution = getBndResolverMojoExecution(projectFacade, bndrunMatchs, monitor)) != null) { + if ((mojoExecution = getBndResolverMojoExecution(maven, projectFacade, bndrunMatchs, + monitor)) != null) { if (bndrunFile == null) { Bndruns bndruns = maven.getMojoParameterValue(mavenProject, mojoExecution, "bndruns", @@ -115,15 +133,15 @@ private Bndrun create0(IResource targetResource, IMavenProjectFacade projectFaca .get(0); } - MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(projectFacade, - mojoExecution, monitor); + MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(maven, + mavenProjectRegistry, projectFacade, mojoExecution, monitor); return mavenBndrunContainer.init(bndrunFile, mode.name(), new File(mavenProject.getBuild() .getDirectory())); } break; case TEST : - if ((mojoExecution = getBndTestingMojoExecution(projectFacade, bndrunMatchs, monitor)) != null) { + if ((mojoExecution = getBndTestingMojoExecution(maven, projectFacade, bndrunMatchs, monitor)) != null) { if (bndrunFile == null) { Bndruns bndruns = maven.getMojoParameterValue(mavenProject, mojoExecution, "bndruns", @@ -133,8 +151,8 @@ private Bndrun create0(IResource targetResource, IMavenProjectFacade projectFaca .get(0); } - MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(projectFacade, - mojoExecution, monitor); + MavenBndrunContainer mavenBndrunContainer = MavenBndrunContainer.getBndrunContainer(maven, + mavenProjectRegistry, projectFacade, mojoExecution, monitor); return mavenBndrunContainer.init(bndrunFile, mode.name(), new File(mavenProject.getBuild() .getDirectory())); diff --git a/bndtools.m2e/src/bndtools/m2e/MavenWorkspaceRepository.java b/bndtools.m2e/src/bndtools/m2e/MavenWorkspaceRepository.java index f2480aa19b..b00a43d064 100644 --- a/bndtools.m2e/src/bndtools/m2e/MavenWorkspaceRepository.java +++ b/bndtools.m2e/src/bndtools/m2e/MavenWorkspaceRepository.java @@ -28,12 +28,14 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.m2e.core.project.IMavenProjectChangedListener; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.eclipse.m2e.core.project.MavenProjectChangedEvent; import org.eclipse.osgi.service.datalocation.Location; import org.osgi.framework.namespace.IdentityNamespace; import org.osgi.resource.Resource; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.osgi.service.repository.ExpressionCombiner; import org.osgi.service.repository.RequirementExpression; import org.osgi.util.promise.Promise; @@ -67,7 +69,7 @@ IMavenProjectChangedListener.class, MavenWorkspaceRepository.class, RepositoryPlugin.class }) public class MavenWorkspaceRepository extends AbstractIndexingRepository - implements IMavenProjectChangedListener, MavenRunListenerHelper, PopulatedRepository, RepositoryPlugin, Actionable { + implements IMavenProjectChangedListener, PopulatedRepository, RepositoryPlugin, Actionable { enum Kind { ADDED(MavenProjectChangedEvent.KIND_ADDED), @@ -100,6 +102,9 @@ public static Kind get(MavenProjectChangedEvent event) { private final RequirementExpression identificationExpression; private final ProjectArtifactCollector projectArtifactCollector = new ProjectArtifactCollector(); + @Reference + IMavenProjectRegistry mavenProjectRegistry; + public MavenWorkspaceRepository() { super(); diff --git a/bndtools.m2e/src/bndtools/m2e/ServiceAwareM2EConfigurator.java b/bndtools.m2e/src/bndtools/m2e/ServiceAwareM2EConfigurator.java new file mode 100644 index 0000000000..c59a8de05a --- /dev/null +++ b/bndtools.m2e/src/bndtools/m2e/ServiceAwareM2EConfigurator.java @@ -0,0 +1,39 @@ +package bndtools.m2e; + +import org.eclipse.m2e.core.embedder.IMaven; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; +import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; + +public abstract class ServiceAwareM2EConfigurator extends AbstractProjectConfigurator { + + protected IMaven getMaven() { + IMaven service = getService(IMaven.class); + this.maven = service; + return service; + } + + protected IMavenProjectRegistry getRegistry() { + return getService(IMavenProjectRegistry.class); + } + + private T getService(Class clz) { + BundleContext ctx = FrameworkUtil.getBundle(IndexConfigurator.class) + .getBundleContext(); + if (ctx == null) { + throw new IllegalStateException("Bndtools M2E integration is not started"); + } + ServiceReference ref = ctx.getServiceReference(clz); + if (ref == null) { + throw new IllegalStateException(String.format("M2E service %s is missing", clz.getName())); + } + T service = ctx.getService(ref); + if (service == null) { + throw new IllegalStateException(String.format("M2E service %s is missing", clz.getName())); + } + return service; + } + +} diff --git a/bndtools.m2e/src/bndtools/m2e/WorkspaceProjectPostProcessor.java b/bndtools.m2e/src/bndtools/m2e/WorkspaceProjectPostProcessor.java index 6a73c0651e..3e893737bd 100644 --- a/bndtools.m2e/src/bndtools/m2e/WorkspaceProjectPostProcessor.java +++ b/bndtools.m2e/src/bndtools/m2e/WorkspaceProjectPostProcessor.java @@ -11,18 +11,22 @@ import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.IMavenProjectRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import aQute.bnd.maven.lib.resolve.PostProcessor; -class WorkspaceProjectPostProcessor implements MavenRunListenerHelper, PostProcessor { +class WorkspaceProjectPostProcessor implements PostProcessor { private static final Logger logger = LoggerFactory.getLogger(WorkspaceProjectPostProcessor.class); private final IProgressMonitor monitor; - WorkspaceProjectPostProcessor(IProgressMonitor monitor) { + private final IMavenProjectRegistry mavenProjectRegistry; + + WorkspaceProjectPostProcessor(IMavenProjectRegistry mavenProjectRegistry, IProgressMonitor monitor) { + this.mavenProjectRegistry = mavenProjectRegistry; this.monitor = monitor; }