001 package org.kuali.maven.plugins.graph.sanitize; 002 003 import java.util.Map; 004 005 import org.apache.maven.artifact.Artifact; 006 import org.kuali.maven.plugins.graph.pojo.MavenContext; 007 import org.kuali.maven.plugins.graph.pojo.State; 008 import org.kuali.maven.plugins.graph.tree.TreeHelper; 009 import org.slf4j.Logger; 010 import org.slf4j.LoggerFactory; 011 012 public class DuplicateSanitizer extends MavenContextSanitizer { 013 private static final Logger logger = LoggerFactory.getLogger(DuplicateSanitizer.class); 014 015 public DuplicateSanitizer() { 016 this(null); 017 } 018 019 public DuplicateSanitizer(Map<String, MavenContext> included) { 020 super(included, State.DUPLICATE); 021 } 022 023 @Override 024 protected void sanitize(MavenContext context, Map<String, MavenContext> included) { 025 String artifactId = TreeHelper.getArtifactId(context.getDependencyNode().getArtifact()); 026 MavenContext replacement = included.get(artifactId); 027 028 // Nothing more to do 029 if (replacement != null) { 030 logger.debug(artifactId + " meets duplicate node criteria"); 031 return; 032 } 033 034 Artifact related = context.getDependencyNode().getRelatedArtifact(); 035 if (related == null) { 036 // This is not ok. There was no exact match and related is null. 037 warnAndSwitch(State.UNKNOWN, artifactId, context, "No related artifact"); 038 return; 039 } 040 041 String relatedArtifactId = TreeHelper.getArtifactId(related); 042 replacement = included.get(relatedArtifactId); 043 if (replacement != null) { 044 /** 045 * This is ok. Kind of. Maven has marked this as a duplicate because it's a duplicate of a dependency above 046 * us in the tree. In reality, it is going to get switched out for another artifact because the node above 047 * us has its dependency on this artifact marked as "conflict". The "duplicate" label is a little bit 048 * counter intuitive but the overall build tree is in a consistent state. 049 */ 050 // Emit an "info" level log message and switch to CONFLICT 051 State switchTo = State.CONFLICT; 052 logger.info(getSwitchMessage(artifactId, switchTo)); 053 logger.info("No identical replacement for a 'duplicate' but the related artifact was found"); 054 context.setState(switchTo); 055 return; 056 } else { 057 // This is not ok. A node marked as duplicate has no replacement artifact included in the build 058 warnAndSwitch(State.UNKNOWN, artifactId, context, "No identical replacement. Related artifact not found"); 059 return; 060 } 061 } 062 063 }