package org.kevoree.kcl.boot.maven; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.shared.dependency.tree.DependencyNode; import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder; import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException; import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor; import org.kevoree.microkernel.BootInfo; import org.kevoree.microkernel.BootInfoLine; import org.kevoree.microkernel.impl.BootInfoImpl; import org.kevoree.microkernel.impl.BootInfoLineImpl; import java.util.HashMap; import java.util.Map; /** * Created by duke on 8/18/14. */ public abstract class AbstractKCLMojo extends org.apache.maven.plugin.AbstractMojo { @org.apache.maven.plugins.annotations.Component private DependencyTreeBuilder dependencyTreeBuilder; @Parameter(required = true, readonly = true, defaultValue = "${project}") public MavenProject project; @Parameter(defaultValue = "${localRepository}") private ArtifactRepository localRepository; @Parameter public String main; public String buildKey(Artifact a) { return "mvn:" + a.getGroupId() + ":" + a.getArtifactId() + ":" + a.getBaseVersion(); } public BootInfo generate() throws DependencyTreeBuilderException { final BootInfoImpl bootInfo = new BootInfoImpl(); ArtifactFilter artifactFilter = new ScopeArtifactFilter(Artifact.SCOPE_COMPILE_PLUS_RUNTIME); DependencyNode graph = dependencyTreeBuilder.buildDependencyTree(project, localRepository, artifactFilter); final Map<String, String> alreadyProcess = new HashMap<String, String>(); graph.accept(new DependencyNodeVisitor() { @Override public boolean visit(DependencyNode dependencyNode) { if ("test".equalsIgnoreCase(dependencyNode.getArtifact().getScope())) { return false; } else { final String key = buildKey(dependencyNode.getArtifact()); BootInfoLine bootInfoLine = null; for (BootInfoLine line : bootInfo.getLines()) { if (line.getURL().equals(key)) { bootInfoLine = line; } } if (bootInfoLine == null) { bootInfoLine = new BootInfoLineImpl(); ((BootInfoLineImpl) bootInfoLine).setUrl(key); bootInfo.getLines().add(bootInfoLine); } for (DependencyNode child : dependencyNode.getChildren()) { if (!"test".equalsIgnoreCase(child.getArtifact().getScope())) { bootInfoLine.getDependencies().add(buildKey(child.getArtifact())); } } return true; } } @Override public boolean endVisit(DependencyNode dependencyNode) { return true; } }); if (main != null) { bootInfo.setMain(main); } return bootInfo; } }