X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fmaven-yang-plugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fyang2sources%2Fplugin%2FUtil.java;h=e3b0b31215bef2a6deac7457d152d19ec81d1115;hb=ff1b4a79cca00743a00c3b0b1100bd0ab2b2fb31;hp=653c0bff6d5b6c1fca52c9ff891df60be1385ba2;hpb=3556bca9524bd19e738ac0d86c4e8b4d5add0a21;p=controller.git diff --git a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/Util.java b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/Util.java index 653c0bff6d..e3b0b31215 100644 --- a/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/Util.java +++ b/opendaylight/sal/yang-prototype/code-generator/maven-yang-plugin/src/main/java/org/opendaylight/controller/yang2sources/plugin/Util.java @@ -7,21 +7,31 @@ */ package org.opendaylight.controller.yang2sources.plugin; +import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; +import java.util.Enumeration; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.apache.commons.io.FileUtils; import org.apache.maven.artifact.Artifact; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; +import org.opendaylight.controller.yang.model.api.Module; +import org.opendaylight.controller.yang.model.api.SchemaContext; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -81,23 +91,6 @@ final class Util { } } - static String[] listFilesAsArrayOfPaths(File rootDir) - throws FileNotFoundException { - String[] filesArray = new String[] {}; - Collection yangFiles = listFiles(rootDir); - - // If collection is empty, return empty array [] rather then [null] - // array, that is created by default - return yangFiles.isEmpty() ? filesArray : Collections2.transform( - yangFiles, new Function() { - - @Override - public String apply(File input) { - return input.getPath(); - } - }).toArray(filesArray); - } - private static void toCache(final File rootDir, final Collection yangFiles) { cache.put(rootDir, yangFiles); @@ -137,7 +130,7 @@ final class Util { return String.format("%s %s", logPrefix, innerMessage); } - public static List getClassPath(MavenProject project) { + static List getClassPath(MavenProject project) { List dependencies = Lists.newArrayList(); for (Artifact element : project.getArtifacts()) { File asFile = element.getFile(); @@ -155,13 +148,117 @@ final class Util { : false; } - public static boolean acceptedFilter(String name, List filter) { - for (String f : filter) { - if (name.endsWith(f)) { - return true; + static T checkNotNull(T obj, String paramName) { + return Preconditions.checkNotNull(obj, "Parameter " + paramName + + " is null"); + } + + final static class YangsInZipsResult implements Closeable { + final List yangStreams; + private final List zipInputStreams; + + private YangsInZipsResult(List yangStreams, + List zipInputStreams) { + this.yangStreams = yangStreams; + this.zipInputStreams = zipInputStreams; + } + + @Override + public void close() throws IOException { + for (InputStream is : yangStreams) { + is.close(); + } + for (Closeable is : zipInputStreams) { + is.close(); } } - return false; + } + + static YangsInZipsResult findYangFilesInDependenciesAsStream(Log log, + MavenProject project) + throws MojoFailureException { + List yangsFromDependencies = new ArrayList<>(); + List zips = new ArrayList<>(); + try { + List filesOnCp = Util.getClassPath(project); + log.info(Util.message( + "Searching for yang files in following dependencies: %s", + YangToSourcesProcessor.LOG_PREFIX, filesOnCp)); + + for (File file : filesOnCp) { + List foundFilesForReporting = new ArrayList<>(); + // is it jar file or directory? + if (file.isDirectory()) { + File yangDir = new File(file, + YangToSourcesProcessor.META_INF_YANG_STRING); + if (yangDir.exists() && yangDir.isDirectory()) { + File[] yangFiles = yangDir + .listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".yang") + && new File(dir, name).isFile(); + } + }); + for (File yangFile : yangFiles) { + yangsFromDependencies.add(new NamedFileInputStream( + yangFile)); + } + } + + } else { + ZipFile zip = new ZipFile(file); + zips.add(zip); + + Enumeration entries = zip.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String entryName = entry.getName(); + + if (entryName + .startsWith(YangToSourcesProcessor.META_INF_YANG_STRING_JAR)) { + if (entry.isDirectory() == false + && entryName.endsWith(".yang")) { + foundFilesForReporting.add(entryName); + // This will be closed after all strams are + // parsed. + InputStream entryStream = zip + .getInputStream(entry); + yangsFromDependencies.add(entryStream); + } + } + } + } + if (foundFilesForReporting.size() > 0) { + log.info(Util.message("Found %d yang files in %s: %s", + YangToSourcesProcessor.LOG_PREFIX, + foundFilesForReporting.size(), file, + foundFilesForReporting)); + } + + } + } catch (Exception e) { + throw new MojoFailureException(e.getMessage(), e); + } + return new YangsInZipsResult(yangsFromDependencies, zips); + } + + final static class ContextHolder { + private final SchemaContext context; + private final Set yangModules; + + ContextHolder(SchemaContext context, Set yangModules) { + this.context = context; + this.yangModules = yangModules; + } + + SchemaContext getContext() { + return context; + } + + Set getYangModules() { + return yangModules; + } } }