27
27
import java .io .Serializable ;
28
28
import java .util .*;
29
29
import java .util .concurrent .CopyOnWriteArrayList ;
30
+ import java .util .function .Consumer ;
30
31
import java .util .function .Function ;
31
32
import java .util .stream .Collectors ;
32
33
@@ -237,6 +238,16 @@ private String createRepresentation(Artifact o1) {
237
238
}
238
239
239
240
public void mergeDuplicates () {
241
+ mergeDuplicates (null );
242
+ }
243
+
244
+ /**
245
+ * Merges the artifacts in an inventory recognized as duplicates.
246
+ *
247
+ * @param artifactPostProcessor The processor processed the artifacts before and after merge. It may be used
248
+ * to establish consistency or to apply adjustments. May be <code>null</code>.
249
+ */
250
+ public void mergeDuplicates (Consumer <Artifact > artifactPostProcessor ) {
240
251
final Map <String , Set <Artifact >> artifactMap = new HashMap <>();
241
252
242
253
for (Artifact artifact : artifacts ) {
@@ -261,6 +272,12 @@ public void mergeDuplicates() {
261
272
set = new HashSet <>();
262
273
}
263
274
set .add (artifact );
275
+
276
+ // postprocess incoming
277
+ if (artifactPostProcessor != null ) {
278
+ artifactPostProcessor .accept (artifact );
279
+ }
280
+
264
281
artifactMap .put (key , set );
265
282
}
266
283
}
@@ -271,13 +288,18 @@ public void mergeDuplicates() {
271
288
final Iterator <Artifact > it = set .iterator ();
272
289
273
290
// skip first
274
- final Artifact ref = it .next ();
291
+ final Artifact referenceArtifact = it .next ();
275
292
276
293
while (it .hasNext ()) {
277
294
Artifact a = it .next ();
278
295
279
296
// merge content before removing
280
- ref .merge (a );
297
+ referenceArtifact .merge (a );
298
+
299
+ // postprocess merged
300
+ if (artifactPostProcessor != null ) {
301
+ artifactPostProcessor .accept (referenceArtifact );
302
+ }
281
303
282
304
// remove
283
305
artifacts .remove (a );
0 commit comments