1414package org .eclipse .m2e .core .internal .builder .plexusbuildapi ;
1515
1616import java .io .File ;
17+ import java .io .IOException ;
18+ import java .io .OutputStream ;
1719import java .util .List ;
1820import java .util .Map ;
1921
2022import org .eclipse .core .resources .IContainer ;
2123import org .eclipse .core .resources .IResource ;
2224import org .eclipse .core .resources .IResourceDelta ;
25+ import org .eclipse .core .runtime .Adapters ;
2326import org .eclipse .core .runtime .IPath ;
2427import org .eclipse .core .runtime .Path ;
2528
2629import org .codehaus .plexus .util .DirectoryScanner ;
2730import org .codehaus .plexus .util .Scanner ;
2831
32+ import org .sonatype .plexus .build .incremental .BuildContext ;
2933import org .sonatype .plexus .build .incremental .EmptyScanner ;
34+ import org .sonatype .plexus .build .incremental .ThreadBuildContext ;
3035
3136import org .eclipse .m2e .core .internal .builder .IIncrementalBuildFramework ;
37+ import org .eclipse .m2e .core .internal .builder .IIncrementalBuildFramework .BuildDelta ;
38+ import org .eclipse .m2e .core .internal .builder .IIncrementalBuildFramework .BuildResultCollector ;
3239
3340
34- public class EclipseIncrementalBuildContext extends AbstractEclipseBuildContext {
41+ public class EclipseIncrementalBuildContext implements BuildContext , IIncrementalBuildFramework . BuildContext {
3542
36- private final IResourceDelta delta ;
43+ private final BuildDelta delta ;
44+
45+ private BuildResultCollector results ;
46+
47+ private Map <String , Object > context ;
48+
49+ private File baseDir ;
3750
3851 public EclipseIncrementalBuildContext (IResourceDelta delta , Map <String , Object > context ,
3952 IIncrementalBuildFramework .BuildResultCollector results ) {
40- super (context , results );
53+ this (new EclipseResourceBuildDelta (delta ), context , results ,
54+ delta .getResource ().getProject ().getLocation ().toFile ());
55+ }
56+
57+ public EclipseIncrementalBuildContext (BuildDelta delta , Map <String , Object > context ,
58+ IIncrementalBuildFramework .BuildResultCollector results , File baseDir ) {
4159 this .delta = delta ;
60+ this .context = context ;
61+ this .results = results ;
62+ this .baseDir = baseDir ;
4263 }
4364
4465 @ Override
4566 public boolean hasDelta (String relPath ) {
46- IPath path = new Path (relPath );
47- return hasDelta (path );
48- }
49-
50- protected boolean hasDelta (IPath path ) {
51- return delta == null || path == null || delta .findMember (path ) != null ;
67+ return hasDelta (new File (baseDir , relPath ));
5268 }
5369
5470 @ Override
@@ -63,7 +79,7 @@ public boolean hasDelta(List relPaths) {
6379
6480 @ Override
6581 public boolean hasDelta (File file ) {
66- return hasDelta (getRelativePath ( file ) );
82+ return delta . hasDelta (file );
6783 }
6884
6985 @ Override
@@ -77,36 +93,53 @@ public Scanner newDeleteScanner(File basedir) {
7793 return new ResourceDeltaScanner (reldelta , true );
7894 }
7995
96+ private IResourceDelta getDelta (File file ) {
97+ IResourceDelta adapt = Adapters .adapt (delta , IResourceDelta .class );
98+ if (adapt == null ) {
99+ return null ;
100+ }
101+ IPath relpath = getRelativePath (file );
102+ if (relpath == null ) {
103+ return null ;
104+ }
105+ return adapt .findMember (relpath );
106+ }
107+
108+ private IPath getRelativePath (File file ) {
109+ IResource adapt = Adapters .adapt (delta , IResource .class );
110+ if (adapt == null ) {
111+ return null ;
112+ }
113+ IPath basepath = adapt .getLocation ();
114+ IPath path = Path .fromOSString (file .getAbsolutePath ());
115+ if (!basepath .isPrefixOf (path )) {
116+ return null ;
117+ }
118+ return path .removeFirstSegments (basepath .segmentCount ());
119+ }
120+
80121 @ Override
81122 public Scanner newScanner (File basedir ) {
82123 return newScanner (basedir , false );
83124 }
84125
85126 @ Override
86127 public Scanner newScanner (File basedir , boolean ignoreDelta ) {
87- if (!ignoreDelta ) {
88- IResourceDelta reldelta = getDelta (basedir );
89-
90- if (reldelta == null || !isContentChange (reldelta )) {
91- return new EmptyScanner (basedir );
92- }
93-
94- return new ResourceDeltaScanner (reldelta , false );
128+ DirectoryScanner ds ;
129+ if (ignoreDelta ) {
130+ ds = new DirectoryScanner ();
131+ } else {
132+ ds = new DirectoryScanner () {
133+ @ Override
134+ protected boolean isSelected (String name , File file ) {
135+ return hasDelta (file );
136+ }
137+ };
95138 }
96-
97- DirectoryScanner ds = new DirectoryScanner ();
98139 ds .setBasedir (basedir );
99140 return ds ;
100141 }
101142
102- private IResourceDelta getDelta (File file ) {
103- IPath relpath = getRelativePath (file );
104- if (relpath == null ) {
105- return null ;
106- }
107- return delta .findMember (relpath );
108- }
109-
110143 static boolean isContentChange (IResourceDelta delta ) {
111144 int kind = delta .getKind ();
112145 if (IResourceDelta .ADDED == kind ) {
@@ -141,13 +174,68 @@ static boolean isRemove(IResourceDelta delta) {
141174 }
142175
143176 @ Override
144- protected IResource getBaseResource () {
145- return delta . getResource () ;
177+ public boolean isIncremental () {
178+ return true ;
146179 }
147180
148181 @ Override
149- public boolean isIncremental () {
150- return true ;
182+ public void refresh (File file ) {
183+ results .refresh (file );
184+ }
185+
186+ @ Override
187+ public OutputStream newFileOutputStream (File file ) throws IOException {
188+ return new ChangedFileOutputStream (file , this );
189+ }
190+
191+ @ Override
192+ public void setValue (String key , Object value ) {
193+ context .put (key , value );
194+ }
195+
196+ @ Override
197+ public Object getValue (String key ) {
198+ return context .get (key );
199+ }
200+
201+ /**
202+ * @deprecated Use addMessage instead
203+ */
204+ @ Deprecated
205+ @ Override
206+ public void addError (File file , int line , int column , String message , Throwable cause ) {
207+ addMessage (file , line , column , message , BuildContext .SEVERITY_ERROR , cause );
208+ }
209+
210+ /**
211+ * @deprecated
212+ * @deprecated Use addMessage instead
213+ */
214+ @ Deprecated
215+ @ Override
216+ public void addWarning (File file , int line , int column , String message , Throwable cause ) {
217+ addMessage (file , line , column , message , BuildContext .SEVERITY_WARNING , cause );
218+ }
219+
220+ @ Override
221+ public void addMessage (File file , int line , int column , String message , int severity , Throwable cause ) {
222+ results .addMessage (file , line , column , message , severity , cause );
223+ }
224+
225+ @ Override
226+ public void removeMessages (File file ) {
227+ results .removeMessages (file );
228+ }
229+
230+ @ Override
231+ public boolean isUptodate (File target , File source ) {
232+ return target != null && target .exists () && source != null && source .exists ()
233+ && target .lastModified () > source .lastModified ();
234+ }
235+
236+ @ Override
237+ public void release () {
238+ ThreadBuildContext .setThreadBuildContext (null );
151239 }
152240
153241}
0 commit comments