Fix issue resulting in duplicate module in YANG gui.

Change-Id: I9d91c648706ef127a2674a27c6a83812aca293da
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
index 5b21e83..b8eaf6e 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
@@ -80,16 +80,15 @@
 public class YangCompilerManager implements YangCompilerService {
 
     private static final Logger log = getLogger(YangCompilerManager.class);
+    private static final String SLASH = File.separator;
     private final YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
     private final YangLinker yangLinker = new YangLinkerManager();
     private final Set<YangNode> yangNodeSet = new HashSet<>();
-
     // YANG file information set.
     private Set<YangFileInfo> yangFileInfoSet; //initialize in tool invocation;
     private YangFileInfo curYangFileInfo = new YangFileInfo();
     private Set<Path> genJavaPath = new LinkedHashSet<>();
     private YangModel model;
-    private static final String SLASH = File.separator;
 
     @Override
     public YangCompiledOutput compileYangFiles(YangCompilationParam param)
@@ -101,72 +100,6 @@
     }
 
     /**
-     * Returns YANG model for application.
-     *
-     * @param path    path for metadata file
-     * @param info    list of YANG node info
-     * @param modelId model id
-     * @param fromUt  if method is called from unit test
-     * @return YANG model
-     */
-    public static YangModel processYangModel(
-            String path, List<YangNodeInfo> info, String modelId, boolean fromUt) {
-        YangModel.Builder b = DefaultYangModel.builder();
-        YangModuleId id;
-        for (YangNodeInfo i : info) {
-            id = processModuleId(i.getNode());
-            String serFile = path + id.moduleName() + id.revision() + ".ser";
-            if (!fromUt) {
-                serializeModuleMetaData(serFile, i.getNode());
-            }
-            //take the absolute jar path and make a new path for our yang files.
-            String fileName = getFileName(i.getNode().getFileName());
-            YangModuleExtendedInfo module = new YangModuleExtendedInfo(
-                    id, new File(path + fileName), new File(serFile), i.isInterJar());
-            module.setSchema(i.getNode());
-            b.addModule(id, module);
-        }
-        return b.addModelId(modelId).build();
-    }
-
-    /**
-     * Returns the file name from provided absolute path.
-     *
-     * @param absPath absolute path
-     * @return file name
-     */
-    private static String getFileName(String absPath) {
-        String[] file = absPath.split(SLASH);
-        return file[file.length - 1];
-    }
-
-    /**
-     * Serializes YANG Node.
-     *
-     * @param serFileName path of resource directory
-     * @param node        YangNode
-     */
-    private static void serializeModuleMetaData(String serFileName, YangNode node) {
-        try (FileOutputStream outStream = new FileOutputStream(serFileName);
-             ObjectOutputStream objOutStream = new ObjectOutputStream(outStream)) {
-            objOutStream.writeObject(node);
-        } catch (IOException e) {
-            log.info("Error while serializing YANG node", e);
-        }
-    }
-
-    /**
-     * Returns YANG module id for a given YANG module node.
-     *
-     * @param module YANG module
-     * @return YANG module id for a given YANG module node
-     */
-    public static YangModuleId processModuleId(YangNode module) {
-        String rev = getDateInStringFormat(module);
-        return new DefaultYangModuleId(module.getName(), rev);
-    }
-
-    /**
      * Returns YANG node set.
      *
      * @return YANG node set
@@ -437,45 +370,13 @@
     }
 
     private void setNodeInfo(Set<YangFileInfo> yangFileInfoSet,
-        List<YangNodeInfo> infos) {
+                             List<YangNodeInfo> infos) {
         for (YangFileInfo i : yangFileInfoSet) {
             infos.add(new YangNodeInfo(i.getRootNode(), i.isInterJar()));
         }
     }
 
     /**
-     * Returns YANG model for serialization.
-     *
-     * @param path    path for metadata file
-     * @param list    set of YANG file info
-     * @param modelId model id
-     * @param fromUt  if method is called from unit test
-     * @return YANG model
-     */
-    private static YangModel getModelForSerialization(
-        String path, Set<YangFileInfo> list, String modelId, boolean fromUt) {
-        YangModel.Builder b = DefaultYangModel.builder();
-        YangModuleId id;
-        boolean interJar;
-
-        for (YangFileInfo info : list) {
-            YangNode node = info.getRootNode();
-            id = processModuleId(node);
-            interJar = info.isInterJar();
-            String serFile = path + id.moduleName() + id.revision() + ".ser";
-            if (!fromUt) {
-                serializeModuleMetaData(serFile, node);
-            }
-            //take the absolute jar path and make a new path for our yang files.
-            String fileName = getFileName(node.getFileName());
-            YangModuleExtendedInfo module = new YangModuleExtendedInfo(
-                id, new File(path + fileName), new File(serFile), interJar);
-            module.setSchema(node);
-            b.addModule(id, module);
-        }
-        return b.addModelId(modelId).build();
-    }
-    /**
      * Copies yang files to resource directory.
      *
      * @param path yang file paths
@@ -520,6 +421,105 @@
     }
 
     /**
+     * Returns YANG model for application.
+     *
+     * @param path    path for metadata file
+     * @param info    list of YANG node info
+     * @param modelId model id
+     * @param fromUt  if method is called from unit test
+     * @return YANG model
+     */
+    public static YangModel processYangModel(
+            String path, List<YangNodeInfo> info, String modelId, boolean fromUt) {
+        YangModel.Builder b = DefaultYangModel.builder();
+        YangModuleId id;
+        for (YangNodeInfo i : info) {
+            id = processModuleId(i.getNode());
+            String serFile = path + id.moduleName() + id.revision() + ".ser";
+            if (!fromUt) {
+                serializeModuleMetaData(serFile, i.getNode());
+            }
+            //take the absolute jar path and make a new path for our yang files.
+            String fileName = getFileName(i.getNode().getFileName());
+            YangModuleExtendedInfo module = new YangModuleExtendedInfo(
+                    id, new File(path + fileName), new File(serFile), i.isInterJar());
+            module.setSchema(i.getNode());
+            b.addModule(id, module);
+        }
+        return b.addModelId(modelId).build();
+    }
+
+    /**
+     * Returns the file name from provided absolute path.
+     *
+     * @param absPath absolute path
+     * @return file name
+     */
+    private static String getFileName(String absPath) {
+        String[] file = absPath.split(SLASH);
+        return file[file.length - 1];
+    }
+
+    /**
+     * Serializes YANG Node.
+     *
+     * @param serFileName path of resource directory
+     * @param node        YangNode
+     */
+    private static void serializeModuleMetaData(String serFileName, YangNode node) {
+        try (FileOutputStream outStream = new FileOutputStream(serFileName);
+             ObjectOutputStream objOutStream = new ObjectOutputStream(outStream)) {
+            objOutStream.writeObject(node);
+        } catch (IOException e) {
+            log.info("Error while serializing YANG node", e);
+        }
+    }
+
+    /**
+     * Returns YANG module id for a given YANG module node.
+     *
+     * @param module YANG module
+     * @return YANG module id for a given YANG module node
+     */
+    public static YangModuleId processModuleId(YangNode module) {
+        String rev = getDateInStringFormat(module);
+        return new DefaultYangModuleId(module.getName(), rev);
+    }
+
+    /**
+     * Returns YANG model for serialization.
+     *
+     * @param path    path for metadata file
+     * @param list    set of YANG file info
+     * @param modelId model id
+     * @param fromUt  if method is called from unit test
+     * @return YANG model
+     */
+    private static YangModel getModelForSerialization(
+            String path, Set<YangFileInfo> list, String modelId, boolean fromUt) {
+        YangModel.Builder b = DefaultYangModel.builder();
+        YangModuleId id;
+        boolean interJar;
+
+        for (YangFileInfo info : list) {
+            YangNode node = info.getRootNode();
+            id = processModuleId(node);
+            interJar = info.isInterJar();
+            String serFile = path + id.moduleName() + id.revision() + ".ser";
+            if (!fromUt) {
+                serializeModuleMetaData(serFile, node);
+            }
+            //take the absolute jar path and make a new path for our yang files.
+            String fileName = getFileName(node.getFileName());
+            YangModuleExtendedInfo module = new YangModuleExtendedInfo(
+                    id, new File(path + fileName), new File(serFile), interJar);
+            module.setSchema(node);
+            b.addModule(id, module);
+        }
+        return b.addModelId(modelId).build();
+    }
+
+    /**
      * Provides a list of files from list of strings.
      *
      * @param yangFileInfo set of yang file information
@@ -547,7 +547,7 @@
         YangModel model;
         try (FileInputStream fileInputStream = new FileInputStream(info);
              ObjectInputStream objectInputStream =
-                new ObjectInputStream(fileInputStream)) {
+                     new ObjectInputStream(fileInputStream)) {
             model = ((YangModel) objectInputStream.readObject());
         } catch (IOException | ClassNotFoundException e) {
             throw new IOException(info + " failed to fetch nodes due to " + e
@@ -609,10 +609,10 @@
             while (enumEntries.hasMoreElements()) {
                 JarEntry file = (JarEntry) enumEntries.nextElement();
                 if (file.getName().endsWith(YANG_META_DATA) ||
-                    file.getName().endsWith(".yang")) {
+                        file.getName().endsWith(".yang")) {
                     String name = getFileName(file.getName());
                     File serializedFile = new File(directory + SLASH +
-                                                  YANG_RESOURCES + SLASH + name);
+                                                           YANG_RESOURCES + SLASH + name);
                     if (file.isDirectory()) {
                         serializedFile.mkdirs();
                         continue;
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
index 0eaf59c..d1f8c20 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
@@ -29,7 +29,6 @@
 public class YangModuleExtendedInfo extends DefaultYangModule implements Serializable {
 
     private YangNode schema;
-    private boolean interJar;
 
     /**
      * Creates an instance of YANG module extended information.
@@ -39,7 +38,19 @@
      * @param metadata meta data resource path
      * @param interJar flag indicating if module is from inter-jar
      */
-    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata, boolean interJar) {
+    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata,
+                                  boolean interJar) {
+        super(id, yangSrc, metadata, interJar);
+    }
+
+    /**
+     * Creates an instance of YANG module extended information.
+     *
+     * @param id       module id
+     * @param yangSrc  YANG resource path
+     * @param metadata meta data resource path
+     */
+    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata) {
         super(id, yangSrc, metadata);
     }
 
@@ -60,22 +71,4 @@
     public void setSchema(YangNode schema) {
         this.schema = schema;
     }
-
-    /**
-     * Returns true if it's inter-jar node.
-     *
-     * @return true if inter-jar node, false otherwise
-     */
-    public boolean isInterJar() {
-        return interJar;
-    }
-
-    /**
-     * Sets true if it's inter-jar node.
-     *
-     * @param interJar true if inter-jar node, false otherwise
-     */
-    public void interJar(boolean interJar) {
-        this.interJar = interJar;
-    }
 }
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
index ba21f72..81f874a 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
@@ -64,7 +64,9 @@
     public Set<YangModuleId> getYangModulesId() {
         Set<YangModuleId> ids = new LinkedHashSet<>();
         for (Map.Entry<YangModuleId, YangModule> entry : moduleMap.entrySet()) {
-            ids.add(entry.getKey());
+            if (!entry.getValue().isInterJar()) {
+                ids.add(entry.getKey());
+            }
         }
         return ids;
     }
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
index 6b5824b..1127375 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
@@ -34,6 +34,7 @@
     private YangModuleId id;
     private File yangSrc;
     private File metadata;
+    private boolean interJar;
 
     /**
      * Creates an instance of default YANG module.
@@ -51,6 +52,25 @@
         this.metadata = metadata;
     }
 
+    /**
+     * Creates an instance of default YANG module.
+     *
+     * @param id       YANG module id
+     * @param yangSrc  YANG source file path
+     * @param metadata YANG metadata source file path
+     * @param interJar is this module is in dependent jar
+     */
+    public DefaultYangModule(YangModuleId id, File yangSrc, File metadata,
+                             boolean interJar) {
+        checkNotNull(yangSrc);
+        checkNotNull(metadata);
+        checkNotNull(id);
+        this.id = id;
+        this.yangSrc = yangSrc;
+        this.metadata = metadata;
+        this.interJar = interJar;
+    }
+
     @Override
     public YangModuleId getYangModuleId() {
         return id;
@@ -75,6 +95,16 @@
         }
     }
 
+    /**
+     * Returns true if it's inter-jar node.
+     *
+     * @return true if inter-jar node, false otherwise
+     */
+    public boolean isInterJar() {
+        return interJar;
+    }
+
+
     @Override
     public int hashCode() {
         return Objects.hash(id, yangSrc, metadata);
diff --git a/model/src/main/java/org/onosproject/yang/model/YangModel.java b/model/src/main/java/org/onosproject/yang/model/YangModel.java
index 558fbdf..5a7e766 100644
--- a/model/src/main/java/org/onosproject/yang/model/YangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/YangModel.java
@@ -31,7 +31,7 @@
     Set<YangModule> getYangModules();
 
     /**
-     * Returns set of YANG modules identifier.
+     * Returns set of YANG modules identifier which belongs to this artifact.
      *
      * @return YANG module identifier
      */
diff --git a/model/src/main/java/org/onosproject/yang/model/YangModule.java b/model/src/main/java/org/onosproject/yang/model/YangModule.java
index 506f3e6..1904a6e 100644
--- a/model/src/main/java/org/onosproject/yang/model/YangModule.java
+++ b/model/src/main/java/org/onosproject/yang/model/YangModule.java
@@ -43,4 +43,11 @@
      * @return stream
      */
     InputStream getMetadata();
+
+    /**
+     * Returns true if module is used as inter jar, false otherwise.
+     *
+     * @return true if module is used as inter jar, false otherwise
+     */
+    boolean isInterJar();
 }
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
index 6380f62..b7294c9 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
@@ -34,7 +34,6 @@
 
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
 import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.translate;
-import static org.onosproject.yang.compiler.utils.UtilConstants.AT;
 import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -75,6 +74,7 @@
     public static Set<YangNode> getNodes(
             YangModel model,
             ConcurrentMap<String, ConcurrentMap<String, YangSchemaNode>> yangSchemaStore) {
+        Set<YangNode> selfNodes = new HashSet<>();
         Set<YangNode> nodes = new HashSet<>();
         for (YangModule info : model.getYangModules()) {
             YangModuleExtendedInfo ex = (YangModuleExtendedInfo) info;
@@ -84,14 +84,17 @@
                 String date = getDateInStringFormat(node);
                 String revName = name;
                 if (date != null) {
-                    revName = name + AT + date;
+                    revName = name + "@" + date;
                 }
                 node = (YangNode) yangSchemaStore.get(name).get(revName);
+            } else {
+                selfNodes.add((YangNode) node);
             }
             nodes.add((YangNode) node);
         }
         //Target linking.
-        return addLinkerAndJavaInfo(nodes);
+        addLinkerAndJavaInfo(nodes);
+        return selfNodes;
     }
 
     /**