Renamed yang-to-sources-plugin to maven-yang-plugin.
[controller.git] / opendaylight / sal / yang-prototype / code-generator / maven-yang-plugin / src / main / java / org / opendaylight / controller / yang2sources / plugin / Util.java
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
new file mode 100644 (file)
index 0000000..98a5d85
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.yang2sources.plugin;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Maps;
+
+final class Util {
+
+    static final String YANG_SUFFIX = "yang";
+
+    // Cache for listed directories and found yang files. Typically yang files
+    // are utilized twice. First: code is generated during generate-sources
+    // phase Second: yang files are copied as resources during
+    // generate-resources phase. This cache ensures that yang files are listed
+    // only once.
+    private static Map<String, Collection<File>> cache = Maps
+            .newHashMapWithExpectedSize(10);
+
+    /**
+     * List files recursively and return as array of String paths. Use cache of
+     * size 1.
+     */
+    static Collection<File> listFiles(String rootDir) {
+
+        if (cache.get(rootDir) != null)
+            return cache.get(rootDir);
+
+        Collection<File> yangFiles = FileUtils.listFiles(new File(rootDir),
+                new String[] { YANG_SUFFIX }, true);
+
+        toCache(rootDir, yangFiles);
+        return yangFiles;
+    }
+
+    static String[] listFilesAsArrayOfPaths(String rootDir) {
+        String[] filesArray = new String[] {};
+        Collection<File> 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<File, String>() {
+
+                    @Override
+                    public String apply(File input) {
+                        return input.getPath();
+                    }
+                }).toArray(filesArray);
+    }
+
+    private static void toCache(final String rootDir,
+            final Collection<File> yangFiles) {
+        cache.put(rootDir, yangFiles);
+    }
+
+    /**
+     * Instantiate object from fully qualified class name
+     */
+    static <T> T getInstance(String codeGeneratorClass, Class<T> baseType)
+            throws ClassNotFoundException, InstantiationException,
+            IllegalAccessException {
+        return baseType.cast(resolveClass(codeGeneratorClass, baseType)
+                .newInstance());
+    }
+
+    private static Class<?> resolveClass(String codeGeneratorClass,
+            Class<?> baseType) throws ClassNotFoundException {
+        Class<?> clazz = Class.forName(codeGeneratorClass);
+
+        if (!isImplemented(baseType, 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);
+    }
+}