Search in sources :

Example 1 with AbstractBuildParticipant

use of org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant in project bndtools by bndtools.

the class BndConfigurator method getBuildParticipant.

@Override
public AbstractBuildParticipant getBuildParticipant(final IMavenProjectFacade projectFacade, MojoExecution execution, IPluginExecutionMetadata executionMetadata) {
    return new MojoExecutionBuildParticipant(execution, true, true) {

        @Override
        public Set<IProject> build(int kind, IProgressMonitor monitor) throws Exception {
            // build mojo like normal
            final Set<IProject> build = super.build(kind, monitor);
            // nothing to do if configuration build
            if (kind == AbstractBuildParticipant2.PRECONFIGURE_BUILD) {
                return build;
            }
            final IProject project = projectFacade.getProject();
            IMarker[] imarkers = project.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
            if (imarkers != null && Arrays.stream(imarkers).map(m -> m.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)).anyMatch(s -> s == IMarker.SEVERITY_ERROR)) {
                // there are compile errors, don't build jar
                return build;
            }
            // now we make sure jar is built in separate job, doing this during maven builder will throw lifecycle
            // errors
            Job job = new WorkspaceJob("Executing " + project.getName() + " jar:jar goal") {

                @Override
                public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
                    SubMonitor progress = SubMonitor.convert(monitor, 3);
                    execJarMojo(projectFacade, progress.newChild(1, SubMonitor.SUPPRESS_NONE));
                    // Find the maven output directory (usually "target")
                    MavenProject mvnProject = getMavenProject(projectFacade, progress.newChild(1));
                    IPath buildDirPath = Path.fromOSString(mvnProject.getBuild().getDirectory());
                    IPath projectPath = project.getLocation();
                    IPath relativeBuildDirPath = buildDirPath.makeRelativeTo(projectPath);
                    IFolder buildDir = project.getFolder(relativeBuildDirPath);
                    if (buildDir != null) {
                        // TODO: there *may* be a remaining issue here if a source-generation plugin gets triggered
                        // by the above invocation of the jar:jar goal.
                        // This could cause Eclipse to think that the Java sources are dirty and queue the project
                        // for rebuilding, thus entering an infinite loop.
                        // One solution would be to find the output artifact jar and refresh ONLY that. However we
                        // have not been able to create the condition we
                        // are worried about so we are deferring any extra work on this until it's shown to be a
                        // real problem.
                        buildDir.refreshLocal(IResource.DEPTH_INFINITE, progress.newChild(1));
                    } else {
                        Logger.getLogger(BndConfigurator.class).logError(String.format("Project build folder '%s' does not exist, or is not a child of the project path '%s'", buildDirPath, projectPath), null);
                        progress.worked(1);
                    }
                    return Status.OK_STATUS;
                }
            };
            job.setRule(project);
            job.schedule();
            return build;
        }
    };
}
Also used : Arrays(java.util.Arrays) MavenExecutionPlan(org.apache.maven.lifecycle.MavenExecutionPlan) IFolder(org.eclipse.core.resources.IFolder) AbstractBuildParticipant(org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant) SubMonitor(org.eclipse.core.runtime.SubMonitor) AbstractProjectConfigurator(org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator) CoreException(org.eclipse.core.runtime.CoreException) AtomicReference(java.util.concurrent.atomic.AtomicReference) ProjectRegistryManager(org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager) ArrayList(java.util.ArrayList) ResolverConfiguration(org.eclipse.m2e.core.project.ResolverConfiguration) IStatus(org.eclipse.core.runtime.IStatus) Component(org.osgi.service.component.annotations.Component) MavenPluginActivator(org.eclipse.m2e.core.internal.MavenPluginActivator) IProject(org.eclipse.core.resources.IProject) MavenProject(org.apache.maven.project.MavenProject) IPath(org.eclipse.core.runtime.IPath) Jar(aQute.bnd.osgi.Jar) IMarker(org.eclipse.core.resources.IMarker) ILogger(org.bndtools.api.ILogger) Analyzer(aQute.bnd.osgi.Analyzer) Job(org.eclipse.core.runtime.jobs.Job) IMavenProjectFacade(org.eclipse.m2e.core.project.IMavenProjectFacade) IPluginExecutionMetadata(org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata) Collection(java.util.Collection) MojoExecution(org.apache.maven.plugin.MojoExecution) BndProjectInfo(org.bndtools.build.api.IProjectDecorator.BndProjectInfo) Set(java.util.Set) Status(org.eclipse.core.runtime.Status) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) File(java.io.File) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) IJavaModelMarker(org.eclipse.jdt.core.IJavaModelMarker) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) AbstractBuildParticipant2(org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant2) List(java.util.List) IMavenExecutionContext(org.eclipse.m2e.core.embedder.IMavenExecutionContext) Packages(aQute.bnd.osgi.Packages) ICallable(org.eclipse.m2e.core.embedder.ICallable) IResource(org.eclipse.core.resources.IResource) Path(org.eclipse.core.runtime.Path) MavenPlugin(org.eclipse.m2e.core.MavenPlugin) Logger(org.bndtools.api.Logger) IProjectDecorator(org.bndtools.build.api.IProjectDecorator) ProjectConfigurationRequest(org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest) Reference(org.osgi.service.component.annotations.Reference) IMaven(org.eclipse.m2e.core.embedder.IMaven) IPath(org.eclipse.core.runtime.IPath) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) SubMonitor(org.eclipse.core.runtime.SubMonitor) IProject(org.eclipse.core.resources.IProject) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) MavenProject(org.apache.maven.project.MavenProject) IMarker(org.eclipse.core.resources.IMarker) Job(org.eclipse.core.runtime.jobs.Job) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) IFolder(org.eclipse.core.resources.IFolder)

Example 2 with AbstractBuildParticipant

use of org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant in project bndtools by bndtools.

the class IndexConfigurator method getBuildParticipant.

/**
 * We have to temporarily override the ongoing maven build by creating a new context. This allows us to replace the
 * workspace repository with our own.
 */
@Override
public AbstractBuildParticipant getBuildParticipant(final IMavenProjectFacade projectFacade, MojoExecution execution, final IPluginExecutionMetadata executionMetadata) {
    return new MojoExecutionBuildParticipant(execution, true, false) {

        @Override
        public Set<IProject> build(int kind, IProgressMonitor monitor) throws Exception {
            if (appliesToBuildKind(kind)) {
                final IProject project = projectFacade.getProject();
                IMarker[] imarkers = project.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
                if (imarkers != null && Arrays.stream(imarkers).map(m -> m.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)).anyMatch(s -> s == IMarker.SEVERITY_ERROR)) {
                    // there are compile errors, don't index
                    return null;
                }
                final SubMonitor progress = SubMonitor.convert(monitor, "Executing indexer plugin", 2);
                final IMaven maven = MavenPlugin.getMaven();
                IMavenExecutionContext context = maven.createExecutionContext();
                context.getExecutionRequest().setWorkspaceReader(new IndexerWorkspaceRepository());
                final MavenProject mavenProject = getMavenProject(projectFacade, progress.newChild(1));
                context.execute(new ICallable<Void>() {

                    @Override
                    public Void call(IMavenExecutionContext context, IProgressMonitor monitor) throws CoreException {
                        maven.execute(mavenProject, getMojoExecution(), monitor);
                        IPath buildDirPath = Path.fromOSString(mavenProject.getBuild().getDirectory());
                        IProject project = projectFacade.getProject();
                        IPath projectPath = project.getLocation();
                        IPath relativeBuildDirPath = buildDirPath.makeRelativeTo(projectPath);
                        IFolder buildDir = project.getFolder(relativeBuildDirPath);
                        buildDir.refreshLocal(IResource.DEPTH_INFINITE, progress.newChild(1));
                        return null;
                    }
                }, progress.newChild(1));
            }
            return null;
        }
    };
}
Also used : ArtifactKey(org.eclipse.m2e.core.embedder.ArtifactKey) Arrays(java.util.Arrays) IFolder(org.eclipse.core.resources.IFolder) ResourcesPlugin(org.eclipse.core.resources.ResourcesPlugin) AbstractBuildParticipant(org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant) SubMonitor(org.eclipse.core.runtime.SubMonitor) AbstractProjectConfigurator(org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator) Exceptions(aQute.lib.exceptions.Exceptions) HashMap(java.util.HashMap) CoreException(org.eclipse.core.runtime.CoreException) ArrayList(java.util.ArrayList) IStatus(org.eclipse.core.runtime.IStatus) IProject(org.eclipse.core.resources.IProject) MavenProject(org.apache.maven.project.MavenProject) IPath(org.eclipse.core.runtime.IPath) LocalArtifactRepository(org.apache.maven.repository.LocalArtifactRepository) IResourceDelta(org.eclipse.core.resources.IResourceDelta) Map(java.util.Map) Artifact(org.apache.maven.artifact.Artifact) IMarker(org.eclipse.core.resources.IMarker) WorkspaceRepository(org.eclipse.aether.repository.WorkspaceRepository) MojoExecutionKey(org.eclipse.m2e.core.project.configurator.MojoExecutionKey) Job(org.eclipse.core.runtime.jobs.Job) IMavenProjectFacade(org.eclipse.m2e.core.project.IMavenProjectFacade) IPluginExecutionMetadata(org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata) FULL_BUILD(org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD) MojoExecution(org.apache.maven.plugin.MojoExecution) Set(java.util.Set) Status(org.eclipse.core.runtime.Status) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) POST_BUILD(org.eclipse.core.resources.IResourceChangeEvent.POST_BUILD) File(java.io.File) WorkspaceReader(org.eclipse.aether.repository.WorkspaceReader) IResourceChangeEvent(org.eclipse.core.resources.IResourceChangeEvent) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) IJavaModelMarker(org.eclipse.jdt.core.IJavaModelMarker) WorkspaceJob(org.eclipse.core.resources.WorkspaceJob) List(java.util.List) IMavenExecutionContext(org.eclipse.m2e.core.embedder.IMavenExecutionContext) ICallable(org.eclipse.m2e.core.embedder.ICallable) IResource(org.eclipse.core.resources.IResource) Path(org.eclipse.core.runtime.Path) IResourceChangeListener(org.eclipse.core.resources.IResourceChangeListener) MavenPlugin(org.eclipse.m2e.core.MavenPlugin) ProjectConfigurationRequest(org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest) IMaven(org.eclipse.m2e.core.embedder.IMaven) IPath(org.eclipse.core.runtime.IPath) SubMonitor(org.eclipse.core.runtime.SubMonitor) IProject(org.eclipse.core.resources.IProject) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) MavenProject(org.apache.maven.project.MavenProject) CoreException(org.eclipse.core.runtime.CoreException) IMavenExecutionContext(org.eclipse.m2e.core.embedder.IMavenExecutionContext) IMarker(org.eclipse.core.resources.IMarker) IMaven(org.eclipse.m2e.core.embedder.IMaven) MojoExecutionBuildParticipant(org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant) IFolder(org.eclipse.core.resources.IFolder)

Aggregations

File (java.io.File)2 ArrayList (java.util.ArrayList)2 Arrays (java.util.Arrays)2 List (java.util.List)2 Set (java.util.Set)2 MojoExecution (org.apache.maven.plugin.MojoExecution)2 MavenProject (org.apache.maven.project.MavenProject)2 IFolder (org.eclipse.core.resources.IFolder)2 IMarker (org.eclipse.core.resources.IMarker)2 IProject (org.eclipse.core.resources.IProject)2 IResource (org.eclipse.core.resources.IResource)2 WorkspaceJob (org.eclipse.core.resources.WorkspaceJob)2 CoreException (org.eclipse.core.runtime.CoreException)2 IPath (org.eclipse.core.runtime.IPath)2 IProgressMonitor (org.eclipse.core.runtime.IProgressMonitor)2 IStatus (org.eclipse.core.runtime.IStatus)2 Path (org.eclipse.core.runtime.Path)2 Status (org.eclipse.core.runtime.Status)2 SubMonitor (org.eclipse.core.runtime.SubMonitor)2 Job (org.eclipse.core.runtime.jobs.Job)2