Added getParent() method to DataSchemaNode and DataNodeContainer. Fixed Bugs.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / IdentitySchemaNodeBuilder.java
index 74099b5334b6d6440032148dbd6aac9ec88150c8..81e17a63cdb57925f6784c209d436564094d583c 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -18,8 +17,10 @@ import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.YangNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.util.Comparators;
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     private boolean isBuilt;
@@ -32,33 +33,37 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
     IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname) {
         super(moduleName, line, qname);
         instance = new IdentitySchemaNodeImpl(qname);
+        instance.setDerivedIdentities(derivedIdentities);
     }
 
     @Override
-    public IdentitySchemaNode build() {
+    public IdentitySchemaNode build(YangNode parent) {
         if (!isBuilt) {
+            if (!(parentBuilder instanceof ModuleBuilder)) {
+                throw new YangParseException(moduleName, line, "Identity can be defined only under module (was" + parentBuilder + ")");
+            }
             instance.setPath(schemaPath);
             instance.setDescription(description);
             instance.setReference(reference);
             instance.setStatus(status);
 
-            if (baseIdentity == null && baseIdentityBuilder != null) {
-                baseIdentity = baseIdentityBuilder.build();
-            }
-            if (baseIdentity != null) {
-                instance.setBaseIdentity(baseIdentity);
+            if (baseIdentity == null) {
+                if(baseIdentityBuilder != null) {
+                    baseIdentityBuilder.addDerivedIdentity(instance);
+                    baseIdentity = baseIdentityBuilder.build(null);
+                }
+            } else {
+                if(baseIdentity instanceof IdentitySchemaNodeImpl) {
+                    ((IdentitySchemaNodeImpl)baseIdentity).toBuilder().addDerivedIdentity(instance);
+                }
             }
-
-            instance.setDerivedIdentities(derivedIdentities);
+            instance.setBaseIdentity(baseIdentity);
 
             // UNKNOWN NODES
-            if (unknownNodes == null) {
-                unknownNodes = new ArrayList<>();
-                for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
-                    unknownNodes.add(b.build());
-                }
-                Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
+            for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
+                unknownNodes.add(b.build(null));
             }
+            Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
             instance.setUnknownSchemaNodes(unknownNodes);
 
             isBuilt = true;
@@ -83,8 +88,10 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
         this.baseIdentity = baseType;
     }
 
-    public void addDerivedIdentity(IdentitySchemaNode derived) {
-        derivedIdentities.add(derived);
+    public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
+        if (derivedIdentity != null) {
+            derivedIdentities.add(derivedIdentity);
+        }
     }
 
     @Override