Inter-File grouping defect fix

Change-Id: Ic77bab1ccb4a770ad09666127ec2ed7c35b7bbad
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
index dd20d07..c1f4b84 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
@@ -287,4 +287,9 @@
     public void setInGrouping(boolean inGrouping) {
         this.inGrouping = inGrouping;
     }
+
+    @Override
+    public YangNode clone(YangUses yangUses) throws CloneNotSupportedException {
+        return (YangNode) super.clone();
+    }
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
index 2070669..4cfd430 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
@@ -341,7 +341,9 @@
     @Override
     public YangLeaf clone()
             throws CloneNotSupportedException {
-        return (YangLeaf) super.clone();
+        YangLeaf cl = (YangLeaf) super.clone();
+        cl.yangSchemaNodeIdentifier = yangSchemaNodeIdentifier.clone();
+        return cl;
     }
 
     /**
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
index 9398249..b7f6931 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafList.java
@@ -359,7 +359,9 @@
     @Override
     public YangLeafList clone()
             throws CloneNotSupportedException {
-        return (YangLeafList) super.clone();
+        YangLeafList cll  = (YangLeafList) super.clone();
+        cll.yangSchemaNodeIdentifier = yangSchemaNodeIdentifier.clone();
+        return cll;
     }
 
     /**
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNameSpace.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNameSpace.java
deleted file mode 100644
index 72da0fa..0000000
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNameSpace.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2016-present 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.datamodel;
-
-import java.io.Serializable;
-
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.datamodel.utils.Parsable;
-import org.onosproject.yangutils.datamodel.utils.YangConstructType;
-
-/*
- *  Reference:RFC 6020.
- *  The "namespace" statement defines the XML namespace that all
- *  identifiers defined by the module are qualified by, with the
- *  exception of data node identifiers defined inside a grouping.
- *  The argument to the "namespace" statement is the URI of the
- *  namespace.
- */
-
-/**
- * Represents name space to be used for the XML data tree.
- */
-public class YangNameSpace extends DefaultLocationInfo
-        implements Parsable, Serializable {
-
-    private static final long serialVersionUID = 806201647L;
-
-    private String uri;
-
-    /**
-     * Creats a YANG name space object.
-     */
-    public YangNameSpace() {
-    }
-
-    /**
-     * Returns the name space URI.
-     *
-     * @return the URI
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * Sets the name space URI.
-     *
-     * @param uri the URI to set
-     */
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    /**
-     * Returns the type of the parsed data.
-     *
-     * @return returns NAMESPACE_DATA
-     */
-    @Override
-    public YangConstructType getYangConstructType() {
-        return YangConstructType.NAMESPACE_DATA;
-    }
-
-    /**
-     * Validates the data on entering the corresponding parse tree node.
-     *
-     * @throws DataModelException a violation of data model rules
-     */
-    @Override
-    public void validateDataOnEntry() throws DataModelException {
-        // TODO auto-generated method stub, to be implemented by parser
-    }
-
-    /**
-     * Validates the data on exiting the corresponding parse tree node.
-     *
-     * @throws DataModelException a violation of data model rules
-     */
-    @Override
-    public void validateDataOnExit() throws DataModelException {
-        // TODO auto-generated method stub, to be implemented by parser
-    }
-}
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 92af172..e57cc82 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -19,6 +19,7 @@
 import org.onosproject.yangutils.datamodel.utils.Parsable;
 
 import java.io.Serializable;
+import java.util.HashMap;
 import java.util.Map;
 
 import static org.onosproject.yangutils.datamodel.TraversalType.CHILD;
@@ -413,6 +414,9 @@
         clonedNode.setChild(null);
         clonedNode.setNextSibling(null);
         clonedNode.setPreviousSibling(null);
+        clonedNode.yangSchemaNodeIdentifier =
+                clonedNode.yangSchemaNodeIdentifier.clone();
+        clonedNode.ysnContextInfoMap = new HashMap<>();
         return clonedNode;
     }
 
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNodeIdentifier.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNodeIdentifier.java
index 558e3a0..13ac938 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNodeIdentifier.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNodeIdentifier.java
@@ -24,7 +24,7 @@
  * Namespace will be present only if node is module/sub-module or augmented node.
  */
 public class YangSchemaNodeIdentifier extends DefaultLocationInfo
-        implements Serializable {
+        implements Serializable, Cloneable {
 
     private static final long serialVersionUID = 806201648L;
 
@@ -104,6 +104,11 @@
     }
 
     @Override
+    public YangSchemaNodeIdentifier clone() throws CloneNotSupportedException {
+        return (YangSchemaNodeIdentifier) super.clone();
+    }
+
+    @Override
     public int hashCode() {
         return Objects.hash(name, namespace);
     }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
index 6143483..04f579f 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
@@ -549,4 +549,14 @@
     public void setName(String name) {
         nodeIdentifier.setName(name);
     }
+
+    @Override
+    public YangNode clone(YangUses node) throws CloneNotSupportedException {
+        YangNode clnNode = (YangNode) super.clone();
+        clnNode.setParent(null);
+        clnNode.setChild(null);
+        clnNode.setNextSibling(null);
+        clnNode.setPreviousSibling(null);
+        return clnNode;
+    }
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 2a1c8b4..2c019f6 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -334,11 +334,28 @@
                                                 info));
         }
 
-        YangSchemaNode node = getRefSchema(info);
-        if (node != null) {
+        /*
+         * For second level and below cloned nodes code shouldn't be
+         * generated also they needn't be added in parent, since
+         * generated code will be under grouping, cloned node is only
+         * used for YANG namespace.
+         */
+        YangNode n = (YangNode) info;
+        if (n.getReferredSchema() != null &&
+                !(((YangNode) n.getReferredSchema()).getParent() instanceof
+                        YangGrouping)) {
+            return;
+        }
+        /*
+         * If first level cloned node, then it needs to be imported in the
+         * generated code. In case uses under grouping, it would further have
+         * second level uses, hence needn't add in parent grouping.
+         */
+        YangSchemaNode rn = getRefSchema(info);
+        if (rn != null) {
             YangNode parent = ((YangNode) info).getParent();
             if (!(parent instanceof YangGrouping)) {
-                addCurNodeInfoInParentTempFile((YangNode) node, isMultiInstance,
+                addCurNodeInfoInParentTempFile((YangNode) rn, isMultiInstance,
                                                config, parent);
             }
             return;
@@ -647,4 +664,22 @@
         }
         return AUGMENTED + name;
     }
+
+    /**
+     * Generated java code during exit.
+     *
+     * @param type generated file type
+     * @param node current YANG node
+     * @throws IOException when fails to generate java files
+     */
+    public static void  generateJava(int type, YangNode node)
+            throws IOException {
+        /*
+         * Call for file generation if node is not under uses.
+         */
+        if(node.getReferredSchema() == null) {
+            ((TempJavaCodeFragmentFilesContainer) node)
+                .getTempJavaCodeFragmentFiles().generateJavaFile(type, node);
+        }
+    }
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
index b1d8a1c..eccbf1c 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
@@ -27,6 +27,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents case information extended to support java code generation.
@@ -109,6 +110,9 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
+            if (getReferredSchema() != null) {
+                return;
+            }
             generateCodeOfAugmentableNode(this, yangPlugin);
         } catch (IOException e) {
             throw new TranslatorException(
@@ -126,7 +130,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for case node " +
                     getName() + " in " +
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
index d37b59f..0caf8cc 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
@@ -28,6 +28,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents choice information extended to support java code generation.
@@ -111,9 +112,6 @@
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
             generateCodeAndUpdateInParent(this, yangPlugin, false);
-            if (getReferredSchema() != null) {
-                throw new InvalidNodeForTranslatorException();
-            }
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for choice node " +
@@ -130,7 +128,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(INTERFACE_MASK, this);
+            generateJava(INTERFACE_MASK, this);
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for choice node " +
                     getName() + " in " +
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
index 4efaf2c..6f9fd51 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
@@ -28,6 +28,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents container information extended to support java code generation.
@@ -111,9 +112,6 @@
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
             generateCodeAndUpdateInParent(this, yangPlugin, false);
-            if (getReferredSchema() != null) {
-                throw new InvalidNodeForTranslatorException();
-            }
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for container node " +
@@ -132,7 +130,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for container node " +
                     getName() + " in " +
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
index f4273b5..ac00154 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
@@ -29,6 +29,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.FAIL_AT_ENTRY;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.FAIL_AT_EXIT;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
@@ -130,7 +131,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_ENUM_CLASS, this);
+            generateJava(GENERATE_ENUM_CLASS, this);
         } catch (IOException e) {
             throw new TranslatorException(getErrorMsg(FAIL_AT_EXIT, this,
                                                       e.getLocalizedMessage()));
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
index 6ab5a03..d8f26bd 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
@@ -28,6 +28,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents YANG list information extended to support java code generation.
@@ -111,9 +112,6 @@
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
             generateCodeAndUpdateInParent(this, yangPlugin, true);
-            if (getReferredSchema() != null) {
-                throw new InvalidNodeForTranslatorException();
-            }
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for list node " +
@@ -132,7 +130,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for list node " +
                     getName() + " in " +
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
index 8f2c300..4605c52 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
@@ -32,6 +32,7 @@
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents type define information extended to support java code generation.
@@ -150,7 +151,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_TYPEDEF_CLASS, this);
+            generateJava(GENERATE_TYPEDEF_CLASS, this);
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code for typedef node " + getName()
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
index 3ca66f9..ce04f68 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
@@ -28,6 +28,7 @@
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateJava;
 
 /**
  * Represents union information extended to support java code generation.
@@ -131,7 +132,7 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_UNION_CLASS, this);
+            generateJava(GENERATE_UNION_CLASS, this);
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for union node " + getName() + " in " +
                     getLineNumber() + " at " +