[ONOS-3871]Yang file-scanner implementation and UT.
Change-Id: I6eb5fd72b8a919ce7776443c59694c5e5411400d
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java
new file mode 100644
index 0000000..ca5da57
--- /dev/null
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.utils.io.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * Provides the IO services for Yangutils-maven-Plugin.
+ */
+public final class YangFileScanner {
+
+ /**
+ * Default constructor.
+ */
+ private YangFileScanner() {
+ }
+
+ /**
+ * Returns the list of yang files.
+ *
+ * @param root specified directory
+ * @return list of yang files.
+ * @throws IOException when files get deleted while performing the operations.
+ */
+ public static List<String> getYangFiles(String root) throws IOException {
+
+ List<String> store = new LinkedList<>();
+ Stack<String> stack = new Stack<>();
+ stack.push(root);
+ File file;
+ File[] filelist;
+ try {
+ while (!stack.empty()) {
+ root = stack.pop();
+ file = new File(root);
+ filelist = file.listFiles();
+ if (filelist == null) {
+ continue;
+ }
+ for (File current : filelist) {
+ if (current.isDirectory()) {
+ stack.push(current.toString());
+ } else {
+ String yangFile = current.getCanonicalPath();
+ if (yangFile.endsWith(".yang")) {
+ store.add(yangFile);
+ }
+ }
+ }
+ }
+ return store;
+ } catch (IOException e) {
+ throw new IOException("IOException occured");
+ }
+ }
+}
diff --git a/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java b/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java
new file mode 100644
index 0000000..405d34b
--- /dev/null
+++ b/utils/yangutils/src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.utils.io.impl;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import java.io.File;
+import java.util.List;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Unit tests for searching yang files.
+ */
+public class YangFileScannerTest {
+
+ private final Logger log = getLogger(getClass());
+
+ String baseDir = "target/UnitTestCase";
+
+ /**
+ * Checks an empty directory.
+ */
+ @Test
+ public void testWithSingleEmptyDirectoryInRoot() {
+ try {
+ File dir = new File(baseDir);
+ dir.mkdirs();
+ List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+ } catch (IOException e) {
+ log.info("IO Exception throwed");
+ }
+ }
+
+ /**
+ * Checks multiple empty directories in root directory.
+ */
+ @Test
+ public void testWithMultiEmptyDirectoriesInRoot() {
+ try {
+ String dir = "emptyDir";
+ String dir1 = "emptyDir1";
+ String dir2 = "emptyDir2";
+ String dir3 = "emptyDir3";
+ String dir4 = "emptyDir4";
+ File firstpath = createDirectory(dir);
+ File firstpath1 = createDirectory(dir1);
+ File firstpath2 = createDirectory(dir2);
+ File firstpath3 = createDirectory(dir3);
+ File firstpath4 = createDirectory(dir4);
+ List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+ } catch (IOException e) {
+ log.info("IO Exception throwed");
+ }
+ }
+
+ /**
+ * Checks one directory with one .yang file.
+ */
+ @Test
+ public void testWithSingleDirectorySingleFileInRoot() {
+ try {
+ String dir1 = "level1";
+ String firstFileName1 = "secondFile.yang";
+ File firstpath1 = createDirectory(dir1);
+ createFile(firstpath1, firstFileName1);
+ List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+ } catch (IOException e) {
+ log.info("IO Exception throwed");
+ }
+ }
+
+ /**
+ * Checks one directory with many .yang file.
+ */
+ @Test
+ public void testWithSingleDirectoryMultiFilesInRoot() {
+ try {
+ String dir2 = "level2";
+ String firstFileName2 = "thirdFile.yang";
+ String firstFileName3 = "fourthFile.yang";
+ String firstFileName4 = "fifthFile.yang";
+ String firstFileName5 = "sixthFile.yang";
+ File firstpath2 = createDirectory(dir2);
+ createFile(firstpath2, firstFileName2);
+ createFile(firstpath2, firstFileName3);
+ createFile(firstpath2, firstFileName4);
+ createFile(firstpath2, firstFileName5);
+ List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+ } catch (IOException e) {
+ log.info("IO Exception throwed");
+ }
+ }
+
+ /**
+ * Checks multi directories with many .yang file.
+ */
+ @Test
+ public void testWithMultiDirectoriesMultiFiles() {
+ try {
+ String dir2 = "newDir1/newDir2/newDir3/newDir4";
+ File dir3 = new File("target/UnitTestCase/newDir1");
+ File dir4 = new File("target/UnitTestCase/newDir1/newDir2");
+ File dir5 = new File("target/UnitTestCase/newDir1/newDir2/newDir3");
+ File dir6 = new File("target/UnitTestCase/newDir1/newDir2/newDir3/newDir4");
+ String firstFileName2 = "thirdFile.yang";
+ String firstFileName3 = "fourthFile.yang";
+ String firstFileName4 = "fifthFile.yang";
+ String firstFileName5 = "sixthFile.yang";
+ File firstpath2 = createDirectory(dir2);
+ createFile(firstpath2, firstFileName2);
+ createFile(firstpath2, firstFileName3);
+ createFile(firstpath2, firstFileName4);
+ createFile(dir3, firstFileName5);
+ createFile(dir3, firstFileName2);
+ createFile(dir3, firstFileName3);
+ createFile(dir3, firstFileName4);
+ createFile(dir3, firstFileName5);
+ createFile(dir4, firstFileName2);
+ createFile(dir4, firstFileName3);
+ createFile(dir4, firstFileName4);
+ createFile(dir4, firstFileName5);
+ createFile(dir5, firstFileName2);
+ createFile(dir5, firstFileName3);
+ createFile(dir5, firstFileName4);
+ createFile(dir5, firstFileName5);
+ createFile(dir6, firstFileName2);
+ createFile(dir6, firstFileName3);
+ createFile(dir6, firstFileName4);
+ createFile(dir6, firstFileName5);
+ List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+ } catch (IOException e) {
+ log.info("IO Exception throwed");
+ }
+ }
+
+ /**
+ * Method used for creating multiple directories inside the target file.
+ *
+ * @param path directory path
+ * @return directory path
+ */
+ public File createDirectory(String path) {
+ File myDir = new File(baseDir + File.separator + path);
+ myDir.mkdirs();
+ return myDir;
+ }
+
+ /**
+ * Method used for creating file inside the specified directory.
+ *
+ * @param myDir my current dirctory
+ * @param fileName file name
+ * @throws IOException io exception when fails to create a file.
+ */
+ public void createFile(File myDir, String fileName) throws IOException {
+ File file = null;
+ try {
+ file = new File(myDir + File.separator + fileName);
+ file.createNewFile();
+ } catch (final IOException e) {
+ throw new IOException("IOException occured");
+ }
+ }
+}