Merge "Fix checkListKey not checking actual/expected values"
[yangtools.git] / yang / yang-maven-plugin / src / main / java / org / opendaylight / yangtools / yang2sources / plugin / Util.java
index bcb7bc9b3c29cffc9bb03d8775add5bfe4f6531c..ee9a6897423788f38eeff1bbce37a10103f44411 100644 (file)
@@ -16,6 +16,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -26,6 +27,9 @@ import java.util.zip.ZipFile;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.MojoFailureException;
@@ -34,16 +38,7 @@ import org.apache.maven.project.MavenProject;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
-import org.sonatype.aether.RepositorySystem;
-import org.sonatype.aether.RepositorySystemSession;
-import org.sonatype.aether.collection.CollectRequest;
-import org.sonatype.aether.graph.DependencyFilter;
-import org.sonatype.aether.repository.RemoteRepository;
-import org.sonatype.aether.resolution.ArtifactResult;
-import org.sonatype.aether.resolution.DependencyRequest;
-import org.sonatype.aether.resolution.DependencyResolutionException;
-import org.sonatype.aether.util.artifact.JavaScopes;
-import org.sonatype.aether.util.filter.DependencyFilterUtils;
+import org.apache.maven.repository.RepositorySystem;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
@@ -88,7 +83,10 @@ final class Util {
 
     static Collection<File> listFiles(File root, File[] excludedFiles, Log log) throws FileNotFoundException {
         if (!root.exists()) {
-            throw new FileNotFoundException(root.toString());
+            if (log != null) {
+                log.warn(Util.message("YANG source directory %s not found. No code will be generated.", YangToSourcesProcessor.LOG_PREFIX, root.toString()));
+            }
+            return Collections.emptyList();
         }
         Collection<File> result = new ArrayList<>();
         Collection<File> yangFiles = FileUtils.listFiles(root, new String[] { YANG_SUFFIX }, true);
@@ -128,21 +126,12 @@ final class Util {
     private static Class<?> resolveClass(String codeGeneratorClass, Class<?> baseType) throws ClassNotFoundException {
         Class<?> clazz = Class.forName(codeGeneratorClass);
 
-        if (!isImplemented(baseType, clazz)) {
+        if (!baseType.isAssignableFrom(clazz)) {
             throw new IllegalArgumentException("Code generator " + clazz + " has to implement " + baseType);
         }
         return clazz;
     }
 
-    private static boolean isImplemented(Class<?> expectedIface, Class<?> byClazz) {
-        for (Class<?> iface : byClazz.getInterfaces()) {
-            if (iface.equals(expectedIface)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     static String message(String message, String logPrefix, Object... args) {
         String innerMessage = String.format(message, args);
         return String.format("%s %s", logPrefix, innerMessage);
@@ -165,30 +154,29 @@ final class Util {
      *
      * @param project
      *            current project
-     * @param log
-     *            logger
      * @param repoSystem
      *            repository system
-     * @param repoSession
-     *            repository system session
+     * @param localRepo
+     *            local repository
      * @param remoteRepos
      *            remote repositories
+     * @param log
+     *            logger
      */
-    static void checkClasspath(MavenProject project, Log log, RepositorySystem repoSystem,
-            RepositorySystemSession repoSession, List<RemoteRepository> remoteRepos) {
+    static void checkClasspath(MavenProject project, RepositorySystem repoSystem, ArtifactRepository localRepo,
+            List<ArtifactRepository> remoteRepos, Log log) {
         Plugin plugin = project.getPlugin(YangToSourcesMojo.PLUGIN_NAME);
         if (plugin == null) {
             log.warn(message("%s not found, dependencies version check skipped", YangToSourcesProcessor.LOG_PREFIX,
                     YangToSourcesMojo.PLUGIN_NAME));
         } else {
-            Map<org.sonatype.aether.artifact.Artifact, List<org.sonatype.aether.artifact.Artifact>> pluginDependencies = new HashMap<>();
-            getPluginTransitiveDependencies(plugin, pluginDependencies, repoSystem, repoSession, remoteRepos, log);
+            Map<Artifact, Collection<Artifact>> pluginDependencies = new HashMap<>();
+            getPluginTransitiveDependencies(plugin, pluginDependencies, repoSystem, localRepo, remoteRepos, log);
 
             Set<Artifact> projectDependencies = project.getDependencyArtifacts();
-            for (Map.Entry<org.sonatype.aether.artifact.Artifact, List<org.sonatype.aether.artifact.Artifact>> entry : pluginDependencies
-                    .entrySet()) {
+            for (Map.Entry<Artifact, Collection<Artifact>> entry : pluginDependencies.entrySet()) {
                 checkArtifact(entry.getKey(), projectDependencies, log);
-                for (org.sonatype.aether.artifact.Artifact dependency : entry.getValue()) {
+                for (Artifact dependency : entry.getValue()) {
                     checkArtifact(dependency, projectDependencies, log);
                 }
             }
@@ -204,43 +192,30 @@ final class Util {
      *            map, where founded transitive dependencies will be stored
      * @param repoSystem
      *            repository system
-     * @param repoSession
-     *            repository system session
+     * @param localRepository
+     *            local repository
      * @param remoteRepos
      *            list of remote repositories
      * @param log
      *            logger
      */
-    private static void getPluginTransitiveDependencies(Plugin plugin,
-            Map<org.sonatype.aether.artifact.Artifact, List<org.sonatype.aether.artifact.Artifact>> map,
-            RepositorySystem repoSystem, RepositorySystemSession repoSession, List<RemoteRepository> remoteRepos,
+    private static void getPluginTransitiveDependencies(Plugin plugin, Map<Artifact, Collection<Artifact>> map,
+            RepositorySystem repoSystem, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepos,
             Log log) {
-        for (Dependency dep : plugin.getDependencies()) {
-            String artifactCoords = dep.getGroupId() + ":" + dep.getArtifactId() + ":" + dep.getVersion();
-            org.sonatype.aether.artifact.Artifact artifact = new org.sonatype.aether.util.artifact.DefaultArtifact(
-                    artifactCoords);
-
-            if (!(map.containsKey(artifact))) {
-                DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE);
-                CollectRequest collectRequest = new CollectRequest();
-                collectRequest.setRoot(new org.sonatype.aether.graph.Dependency(artifact, JavaScopes.COMPILE));
-                collectRequest.setRepositories(remoteRepos);
-                DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter);
-
-                List<ArtifactResult> artifactResults;
-                try {
-                    artifactResults = repoSystem.resolveDependencies(repoSession, dependencyRequest)
-                            .getArtifactResults();
-                    List<org.sonatype.aether.artifact.Artifact> deps = new ArrayList<>();
-                    for (ArtifactResult ar : artifactResults) {
-                        deps.add(ar.getArtifact());
-                    }
-                    map.put(artifact, deps);
-                } catch (DependencyResolutionException e) {
-                    log.warn(message("Failed to resolve plugin dependencies, version check skipped",
-                            YangToSourcesProcessor.LOG_PREFIX));
-                }
-            }
+
+        List<Dependency> pluginDependencies = plugin.getDependencies();
+        for (Dependency dep : pluginDependencies) {
+            Artifact artifact = repoSystem.createDependencyArtifact(dep);
+
+            ArtifactResolutionRequest request = new ArtifactResolutionRequest();
+            request.setArtifact(artifact);
+            request.setResolveTransitively(true);
+            request.setLocalRepository(localRepository);
+            request.setRemoteRepositories(remoteRepos);
+
+            ArtifactResolutionResult result = repoSystem.resolve(request);
+            Set<Artifact> pluginDependencyDependencies = result.getArtifacts();
+            map.put(artifact, pluginDependencyDependencies);
         }
     }
 
@@ -256,9 +231,8 @@ final class Util {
      * @param log
      *            logger
      */
-    private static void checkArtifact(org.sonatype.aether.artifact.Artifact artifact, Collection<Artifact> dependencies,
-            Log log) {
-        for (Artifact d : dependencies) {
+    private static void checkArtifact(Artifact artifact, Collection<Artifact> dependencies, Log log) {
+        for (org.apache.maven.artifact.Artifact d : dependencies) {
             if (artifact.getGroupId().equals(d.getGroupId()) && artifact.getArtifactId().equals(d.getArtifactId())) {
                 if (!(artifact.getVersion().equals(d.getVersion()))) {
                     log.warn(message("Dependency resolution conflict:", YangToSourcesProcessor.LOG_PREFIX));
@@ -318,6 +292,7 @@ final class Util {
                 List<String> foundFilesForReporting = new ArrayList<>();
                 // is it jar file or directory?
                 if (file.isDirectory()) {
+                    //FIXME: code duplicate
                     File yangDir = new File(file, YangToSourcesProcessor.META_INF_YANG_STRING);
                     if (yangDir.exists() && yangDir.isDirectory()) {
                         File[] yangFiles = yangDir.listFiles(new FilenameFilter() {
@@ -373,6 +348,7 @@ final class Util {
             for (File file : filesOnCp) {
                 // is it jar file or directory?
                 if (file.isDirectory()) {
+                    //FIXME: code duplicate
                     File yangDir = new File(file, YangToSourcesProcessor.META_INF_YANG_STRING);
                     if (yangDir.exists() && yangDir.isDirectory()) {
                         File[] yangFiles = yangDir.listFiles(new FilenameFilter() {