2828import java .util .Map ;
2929import java .util .Set ;
3030import java .util .concurrent .ConcurrentHashMap ;
31- import java .util .concurrent .atomic .AtomicBoolean ;
31+ import java .util .concurrent .atomic .AtomicReference ;
3232import java .util .function .Predicate ;
3333
3434import org .slf4j .Logger ;
@@ -86,6 +86,10 @@ public class MavenBuilderImpl {
8686
8787 private final Map <IProject , ProjectBuildState > deltaState = new ConcurrentHashMap <>();
8888
89+ private enum DeltaType {
90+ INCREMENTAL , IRRELEVANT , FULL_BUILD , UNKOWN ;
91+ }
92+
8993 public MavenBuilderImpl (DeltaProvider deltaProvider ) {
9094 this .deltaProvider = deltaProvider ;
9195 this .incrementalBuildFrameworks = loadIncrementalBuildFrameworks ();
@@ -118,13 +122,14 @@ public Set<IProject> build(MavenSession session, IMavenProjectFacade projectFaca
118122
119123 DeltaProvider deltaProvider = getDeltaProvider ();
120124 IResourceDelta delta = deltaProvider .getDelta (project );
121- if (!hasRelevantDelta (projectFacade , delta )) {
125+ DeltaType deltaType = hasRelevantDelta (projectFacade , delta );
126+ if (deltaType == DeltaType .IRRELEVANT ) {
122127 return Set .of (project );
123128 }
124129 ProjectBuildState buildState = deltaState .computeIfAbsent (project , ProjectBuildState ::new );
125130 final BuildResultCollector participantResults = new BuildResultCollector ();
126131 List <BuildContext > incrementalContexts = setupProjectBuildContext (project , kind , delta , participantResults ,
127- buildState );
132+ buildState , deltaType );
128133
129134 debugBuildStart (debugHooks , projectFacade , kind , args , participants , delta , monitor );
130135
@@ -200,15 +205,15 @@ public Set<IProject> build(MavenSession session, IMavenProjectFacade projectFaca
200205 return dependencies ;
201206 }
202207
203- private boolean hasRelevantDelta (IMavenProjectFacade projectFacade , IResourceDelta resourceDelta )
208+ private DeltaType hasRelevantDelta (IMavenProjectFacade projectFacade , IResourceDelta resourceDelta )
204209 throws CoreException {
205210 if (resourceDelta == null ) {
206- return true ;
211+ return DeltaType . FULL_BUILD ;
207212 }
208213 IProject project = projectFacade .getProject ();
209214 IPath buildOutputLocation = projectFacade .getBuildOutputLocation ();
210215 if (project == null || buildOutputLocation == null ) {
211- return true ;
216+ return DeltaType . UNKOWN ;
212217 }
213218
214219 Predicate <IPath > isOutput = toPrefixPredicate (projectFacade .getOutputLocation ());
@@ -218,7 +223,7 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
218223 IPath projectPath = project .getFullPath ();
219224 List <IPath > moduleLocations = projectFacade .getMavenProjectModules ().stream ()
220225 .map (module -> projectPath .append (module )).toList ();
221- AtomicBoolean hasRelevantDelta = new AtomicBoolean ( );
226+ AtomicReference < DeltaType > deltaType = new AtomicReference <>( DeltaType . IRRELEVANT );
222227 resourceDelta .accept (delta -> {
223228 IResource resource = delta .getResource ();
224229 if (resource instanceof IFile ) {
@@ -227,7 +232,8 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
227232 //anything in the build output is not interesting for a change as it is produced by the build
228233 // ... unless a classpath resource that existed before has been deleted, possibly by another builder
229234 if (isOutputOrTestOutput .test (fullPath ) && !resource .exists ()) {
230- hasRelevantDelta .set (true );
235+ //in this case we should perform a full build as we can't know what mojo has placed data possible here...
236+ deltaType .set (DeltaType .FULL_BUILD );
231237 return false ;
232238 }
233239 return true ;
@@ -239,12 +245,12 @@ private boolean hasRelevantDelta(IMavenProjectFacade projectFacade, IResourceDel
239245 }
240246 }
241247 //anything else has changed, so mark this as relevant an leave the loop
242- hasRelevantDelta .set (true );
248+ deltaType .set (DeltaType . INCREMENTAL );
243249 return false ;
244250 }
245251 return true ;
246252 });
247- return hasRelevantDelta .get ();
253+ return deltaType .get ();
248254 }
249255
250256 private static Predicate <IPath > toPrefixPredicate (IPath location ) {
@@ -255,12 +261,13 @@ private static Predicate<IPath> toPrefixPredicate(IPath location) {
255261 }
256262
257263 private List <IIncrementalBuildFramework .BuildContext > setupProjectBuildContext (IProject project , int kind ,
258- IResourceDelta delta , IIncrementalBuildFramework .BuildResultCollector results , ProjectBuildState buildState )
264+ IResourceDelta delta , IIncrementalBuildFramework .BuildResultCollector results , ProjectBuildState buildState ,
265+ DeltaType deltaType )
259266 throws CoreException {
260267 List <IIncrementalBuildFramework .BuildContext > contexts = new ArrayList <>();
261268
262- BuildDelta buildDelta = delta != null ? new ProjectBuildStateDelta ( buildState , new EclipseResourceBuildDelta ( delta ))
263- : null ;
269+ BuildDelta buildDelta = deltaType == DeltaType . FULL_BUILD || delta == null ? null
270+ : new ProjectBuildStateDelta ( buildState , new EclipseResourceBuildDelta ( delta )) ;
264271 for (IIncrementalBuildFramework framework : incrementalBuildFrameworks ) {
265272 contexts .add (framework .setupProjectBuildContext (project , kind , buildDelta , results ));
266273 }
@@ -438,7 +445,7 @@ public void clean(MavenSession session, IMavenProjectFacade projectFacade,
438445
439446 final BuildResultCollector participantResults = new BuildResultCollector ();
440447 List <BuildContext > incrementalContexts = setupProjectBuildContext (project , IncrementalProjectBuilder .CLEAN_BUILD ,
441- null , participantResults , null );
448+ null , participantResults , null , DeltaType . UNKOWN );
442449
443450 Map <Throwable , MojoExecutionKey > buildErrors = new LinkedHashMap <>();
444451 try {
0 commit comments