diff options
author | Igor Fedorenko | 2013-01-24 04:24:23 +0000 |
---|---|---|
committer | Igor Fedorenko | 2013-02-16 16:41:50 +0000 |
commit | e03d2925e0632053312539edef7350e37783963f (patch) | |
tree | e22c59b784215ec6512729446c198f2322c3c56a /org.eclipse.m2e.core | |
parent | 293a1c09ed3ec5401093b7b3b783ea161838b6f0 (diff) | |
download | m2e-core-e03d2925e0632053312539edef7350e37783963f.tar.gz m2e-core-e03d2925e0632053312539edef7350e37783963f.tar.xz m2e-core-e03d2925e0632053312539edef7350e37783963f.zip |
initial prototype of build troubleshooting view
Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
Diffstat (limited to 'org.eclipse.m2e.core')
3 files changed, 118 insertions, 1 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/BuildDebugHook.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/BuildDebugHook.java new file mode 100644 index 00000000..e81d2cf6 --- /dev/null +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/BuildDebugHook.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2013 Igor Fedorenko + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Igor Fedorenko - initial API and implementation + *******************************************************************************/ + +package org.eclipse.m2e.core.internal.builder; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.runtime.IProgressMonitor; + +import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant; +import org.eclipse.m2e.core.project.configurator.MojoExecutionKey; + + +/** + * @noreference This internal interface can be changed or removed without notice. + * @since 1.4 + */ +public interface BuildDebugHook { + + public void buildStart(IMavenProjectFacade projectFacade, int kind, Map<String, String> args, + Map<MojoExecutionKey, List<AbstractBuildParticipant>> participants, IResourceDelta delta, IProgressMonitor monitor); + + public void buildParticipant(IMavenProjectFacade projectFacade, MojoExecutionKey mojoExecutionKey, + AbstractBuildParticipant participant, Set<File> files, IProgressMonitor monitor); + +} diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java index ae424ab9..616d2781 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilder.java @@ -11,8 +11,11 @@ package org.eclipse.m2e.core.internal.builder; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.ListIterator; import java.util.Map; import java.util.Set; @@ -204,4 +207,35 @@ public class MavenBuilder extends IncrementalProjectBuilder implements DeltaProv return projectFacade; } + + private static final List<BuildDebugHook> debugHooks = new ArrayList<BuildDebugHook>(); + + public static void addDebugHook(BuildDebugHook hook) { + synchronized(debugHooks) { + for(BuildDebugHook other : debugHooks) { + if(other == hook) { + return; + } + } + debugHooks.add(hook); + } + } + + public static void removeDebugHook(BuildDebugHook hook) { + synchronized(debugHooks) { + ListIterator<BuildDebugHook> iter = debugHooks.listIterator(); + while(iter.hasNext()) { + if(iter.next() == hook) { + iter.remove(); + break; + } + } + } + } + + public static Collection<BuildDebugHook> getDebugHooks() { + synchronized(debugHooks) { + return new ArrayList<BuildDebugHook>(debugHooks); + } + } } diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilderImpl.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilderImpl.java index 49907418..91aeee8d 100644 --- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilderImpl.java +++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/builder/MavenBuilderImpl.java @@ -16,10 +16,12 @@ import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD; import static org.eclipse.core.resources.IncrementalProjectBuilder.INCREMENTAL_BUILD; import java.io.File; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -83,6 +85,8 @@ public class MavenBuilderImpl { public Set<IProject> build(MavenSession session, IMavenProjectFacade projectFacade, int kind, Map<String, String> args, Map<MojoExecutionKey, List<AbstractBuildParticipant>> participants, IProgressMonitor monitor) throws CoreException { + Collection<BuildDebugHook> debugHooks = MavenBuilder.getDebugHooks(); + Set<IProject> dependencies = new HashSet<IProject>(); MavenProject mavenProject = projectFacade.getMavenProject(); @@ -106,13 +110,17 @@ public class MavenBuilderImpl { } } + debugBuildStart(debugHooks, projectFacade, kind, args, participants, delta, monitor); + Map<Throwable, MojoExecutionKey> buildErrors = new LinkedHashMap<Throwable, MojoExecutionKey>(); ThreadBuildContext.setThreadBuildContext(buildContext); MavenProjectMutableState snapshot = MavenProjectMutableState.takeSnapshot(mavenProject); try { for(Entry<MojoExecutionKey, List<AbstractBuildParticipant>> entry : participants.entrySet()) { + MojoExecutionKey mojoExecutionKey = entry.getKey(); for(InternalBuildParticipant participant : entry.getValue()) { - MojoExecutionKey mojoExecutionKey = entry.getKey(); + Set<File> debugRefreshFiles = !debugHooks.isEmpty() ? new LinkedHashSet<File>(buildContext.getFiles()) : null; + log.debug("Executing build participant {} for plugin execution {}", participant.getClass().getName(), mojoExecutionKey.toString()); String stringMojoExecutionKey = mojoExecutionKey.getKeyString(); @@ -149,6 +157,9 @@ public class MavenBuilderImpl { processMavenSessionErrors(session, mojoExecutionKey, buildErrors); } + + debugBuildParticipant(debugHooks, projectFacade, mojoExecutionKey, (AbstractBuildParticipant) participant, + diff(debugRefreshFiles, buildContext.getFiles()), monitor); } } } catch(Exception e) { @@ -164,9 +175,42 @@ public class MavenBuilderImpl { // Process errors and warnings MavenExecutionResult result = session.getResult(); processBuildResults(project, mavenProject, result, buildContext, buildErrors); + + debugBuildEnd(debugHooks, projectFacade, buildContext, monitor); + return dependencies; } + private void debugBuildParticipant(Collection<BuildDebugHook> hooks, IMavenProjectFacade projectFacade, + MojoExecutionKey mojoExecutionKey, AbstractBuildParticipant participant, Set<File> files, IProgressMonitor monitor) { + for(BuildDebugHook hook : hooks) { + hook.buildParticipant(projectFacade, mojoExecutionKey, participant, files, monitor); + } + } + + private Set<File> diff(Set<File> before, Set<File> after) { + if(before == null) { + return after; + } + Set<File> result = new LinkedHashSet<File>(after); + result.removeAll(before); + return result; + } + + private void debugBuildStart(Collection<BuildDebugHook> hooks, IMavenProjectFacade projectFacade, int kind, + Map<String, String> args, Map<MojoExecutionKey, List<AbstractBuildParticipant>> participants, + IResourceDelta delta, IProgressMonitor monitor) { + for(BuildDebugHook hook : hooks) { + hook.buildStart(projectFacade, kind, args, participants, delta, monitor); + } + } + + private void debugBuildEnd(Collection<BuildDebugHook> hooks, IMavenProjectFacade projectFacade, + AbstractEclipseBuildContext buildContext, IProgressMonitor monitor) { + for(BuildDebugHook hook : hooks) { + } + } + protected boolean isApplicable(InternalBuildParticipant participant, int kind, IResourceDelta delta) { return FULL_BUILD == kind || delta != null || participant.callOnEmptyDelta(); } |