Merge "Bug 865: Removed uses of packageNameFromModule"
authorMartin Vitez <mvitez@cisco.com>
Tue, 15 Jul 2014 09:37:35 +0000 (09:37 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 15 Jul 2014 09:37:35 +0000 (09:37 +0000)
15 files changed:
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DerivableSchemaNode.java [new file with mode: 0644]
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java [new file with mode: 0644]
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/api/DataSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/AnyXmlBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ChoiceCaseBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/CopyUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingBuilderImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/LeafSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ListSchemaNodeBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/util/AbstractDocumentedDataNodeContainerBuilder.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/SchemaContextImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/impl/GroupingTest.java

diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DerivableSchemaNode.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/DerivableSchemaNode.java
new file mode 100644 (file)
index 0000000..2ffc3ad
--- /dev/null
@@ -0,0 +1,21 @@
+package org.opendaylight.yangtools.yang.model.api;
+
+import com.google.common.base.Optional;
+
+/**
+ * Schema Node which may be derived from other schema node
+ * using augmentation or uses statement.
+ *
+ */
+public interface DerivableSchemaNode extends DataSchemaNode {
+
+    /**
+     * If this node is added by uses, returns original node definition from
+     * grouping where it was defined.
+     *
+     * @return original node definition from grouping if this node is added by
+     *         uses, null otherwise
+     */
+    Optional<? extends SchemaNode> getOriginal();
+
+}
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/SchemaNodeUtils.java
new file mode 100644 (file)
index 0000000..f00a555
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 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.yangtools.yang.model.util;
+
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+
+import com.google.common.base.Optional;
+
+public class SchemaNodeUtils {
+
+    private SchemaNodeUtils() {
+        throw new UnsupportedOperationException("Utility class");
+    }
+
+    public static final Optional<SchemaNode> getOriginalIfPossible(final SchemaNode node) {
+        if(node instanceof DerivableSchemaNode) {
+            @SuppressWarnings("unchecked")
+            final Optional<SchemaNode> ret  = (Optional<SchemaNode>) (((DerivableSchemaNode) node).getOriginal());
+            return ret;
+        }
+        return Optional.absent();
+    }
+
+    public static final  SchemaNode getRootOriginalIfPossible(final SchemaNode data) {
+        Optional<SchemaNode> previous = Optional.absent();
+        Optional<SchemaNode> next = getOriginalIfPossible(data);
+        while(next.isPresent()) {
+            previous = next;
+            next = getOriginalIfPossible(next.get());
+        }
+        return previous.orNull();
+    }
+}
index c4d24d36024d164d2fa80c5531163c34bec57389..8d86c1d3b9483ef7267480ddaeda42b7f89a2a22 100644 (file)
@@ -15,7 +15,21 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
  */
 public interface DataSchemaNodeBuilder extends SchemaNodeBuilder, GroupingMember {
 
+    /**
+     * Get original builder definition from grouping, where it is defined.
+     *
+     * @return original builder definition from grouping if this node is added
+     *         by uses, null otherwise
+     */
+    SchemaNodeBuilder getOriginal();
 
+    /**
+     * Set original builder definition from grouping
+     *
+     * @param original
+     *            original builder definition from grouping
+     */
+    void setOriginal(SchemaNodeBuilder original);
 
     /**
      *
index e5762d8c27526bf596d91291e6025742d22c7b90..19cd4485b15c1833f2ab9e9a6cc9df4e634025d3 100644 (file)
@@ -7,26 +7,33 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.collect.ImmutableList;
 import java.util.List;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 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.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractSchemaNodeBuilder;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
 public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder {
     private AnyXmlSchemaNodeImpl instance;
 
     private boolean augmenting;
     private boolean addedByUses;
     private boolean configuration;
-
+    private AnyXmlSchemaNode originalNode;
+    private AnyXmlBuilder originalBuilder;
     private final ConstraintsBuilder constraints;
 
     public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
@@ -46,6 +53,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         status = base.getStatus();
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode = base;
         configuration = base.isConfiguration();
         unknownNodes.addAll(base.getUnknownSchemaNodes());
     }
@@ -64,9 +72,14 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         instance.augmenting = augmenting;
         instance.addedByUses = addedByUses;
         instance.configuration = configuration;
-
         instance.constraintsDef = constraints.toInstance();
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // UNKNOWN NODES
         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
             unknownNodes.add(b.build());
@@ -101,6 +114,17 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public AnyXmlBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof AnyXmlBuilder, "Original of anyxml cannot be " + builder);
+        this.originalBuilder = (AnyXmlBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -120,7 +144,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
         if (this == obj) {
             return true;
         }
@@ -153,13 +177,14 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         return "anyxml " + qname.getLocalName();
     }
 
-    private static final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode {
+    private static final class AnyXmlSchemaNodeImpl implements AnyXmlSchemaNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private String description;
         private String reference;
         private Status status;
         private boolean configuration;
+        private AnyXmlSchemaNode original;
         private ConstraintDefinition constraintsDef;
         private boolean augmenting;
         private boolean addedByUses;
@@ -205,6 +230,11 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             return addedByUses;
         }
 
+        @Override
+        public Optional<AnyXmlSchemaNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -230,7 +260,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
         }
 
         @Override
-        public boolean equals(Object obj) {
+        public boolean equals(final Object obj) {
             if (this == obj) {
                 return true;
             }
@@ -267,6 +297,7 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da
             sb.append("]");
             return sb.toString();
         }
+
     }
 
 }
index bfc549cbbf53ead652c40702c399bb6569ac4c69..f4aabb19445df58cf9cf8fd4ee1832244c9fab06 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -22,6 +19,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -29,11 +27,17 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuil
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.Comparators;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder,
 AugmentationTargetBuilder {
     private ChoiceNodeImpl instance;
@@ -42,6 +46,8 @@ AugmentationTargetBuilder {
     private boolean augmenting;
     private boolean addedByUses;
     private boolean configuration;
+    private ChoiceNode originalNode;
+    private ChoiceBuilder originalBuilder;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
     private final Set<AugmentationSchema> augmentations = new HashSet<>();
@@ -67,6 +73,7 @@ AugmentationTargetBuilder {
         status = base.getStatus();
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode =  base;
         configuration = base.isConfiguration();
         augmentations.addAll(base.getAvailableAugmentations());
 
@@ -100,6 +107,12 @@ AugmentationTargetBuilder {
         instance.constraints = constraints.toInstance();
         instance.defaultCase = defaultCase;
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // CASES
         final Set<ChoiceCaseNode> cases = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
         for (ChoiceCaseBuilder caseBuilder : caseBuilders) {
@@ -201,6 +214,17 @@ AugmentationTargetBuilder {
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public ChoiceBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof ChoiceBuilder, "Original of choice cannot be " + builder);
+        this.originalBuilder = (ChoiceBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -275,7 +299,7 @@ AugmentationTargetBuilder {
         return "choice " + qname.getLocalName();
     }
 
-    private static final class ChoiceNodeImpl implements ChoiceNode {
+    private static final class ChoiceNodeImpl implements ChoiceNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private String description;
@@ -283,6 +307,7 @@ AugmentationTargetBuilder {
         private Status status;
         private boolean augmenting;
         private boolean addedByUses;
+        private ChoiceNode original;
         private boolean configuration;
         private ConstraintDefinition constraints;
         private ImmutableSet<ChoiceCaseNode> cases;
@@ -330,6 +355,11 @@ AugmentationTargetBuilder {
             return addedByUses;
         }
 
+        @Override
+        public Optional<ChoiceNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -433,6 +463,7 @@ AugmentationTargetBuilder {
             sb.append("]");
             return sb.toString();
         }
+
     }
 
 }
index a090d733e9d5ac1d7fb8c48cced4b06c9a5ad4c8..c97eb14ebefd889e560a9afd96f43b01e65aaa89 100644 (file)
@@ -7,10 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -19,29 +15,34 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 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.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ChoiceCaseBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder,
 AugmentationTargetBuilder {
     private ChoiceCaseNodeImpl instance;
     // SchemaNode args
     private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     // DataSchemaNode args
     private boolean augmenting;
+    private ChoiceCaseNode originalNode;
+    private ChoiceCaseBuilder originalBuilder;
     private boolean addedByUses;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
@@ -56,17 +57,13 @@ AugmentationTargetBuilder {
 
     public ChoiceCaseBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
             final ChoiceCaseNode base) {
-
-        super(moduleName, line, qname);
-        this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
+        super(moduleName, line, qname, Preconditions.checkNotNull(path, "Schema Path must not be null"), base);
+        this.schemaPath = path;
         constraints = new ConstraintsBuilderImpl(moduleName, line, base.getConstraints());
 
-        description = base.getDescription();
-        reference = base.getReference();
-        status = base.getStatus();
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
-
+        originalNode = base;
         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
                 qname));
         augmentations.addAll(base.getAvailableAugmentations());
@@ -85,6 +82,12 @@ AugmentationTargetBuilder {
 
         instance.constraints = constraints.toInstance();
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // UNKNOWN NODES
         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
             unknownNodes.add(b.build());
@@ -129,6 +132,17 @@ AugmentationTargetBuilder {
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public ChoiceCaseBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof ChoiceCaseBuilder, "Original of case cannot be " + builder);
+        this.originalBuilder = (ChoiceCaseBuilder) builder;
+    }
+
     @Override
     public void addTypedef(final TypeDefinitionBuilder typedefBuilder) {
         throw new YangParseException(getModuleName(), typedefBuilder.getLine(), "Can not add type definition to choice case.");
@@ -201,11 +215,12 @@ AugmentationTargetBuilder {
         return "choice";
     }
 
-    private static final class ChoiceCaseNodeImpl extends AbstractDocumentedDataNodeContainer implements ChoiceCaseNode {
+    private static final class ChoiceCaseNodeImpl extends AbstractDocumentedDataNodeContainer implements ChoiceCaseNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private boolean augmenting;
         private boolean addedByUses;
+        private ChoiceCaseNode original;
         private ConstraintDefinition constraints;
         private ImmutableSet<AugmentationSchema> augmentations;
         private ImmutableList<UnknownSchemaNode> unknownNodes;
@@ -246,6 +261,11 @@ AugmentationTargetBuilder {
             return addedByUses;
         }
 
+        @Override
+        public Optional<ChoiceCaseNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
             return unknownNodes;
@@ -303,6 +323,7 @@ AugmentationTargetBuilder {
             sb.append("]");
             return sb.toString();
         }
+
     }
 
 }
index 45bf23e721a3c8be8d188693e33947db037a6794..c77444269c297c75acacc650254dc2cc26a1a707 100644 (file)
@@ -7,26 +7,31 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNodeContainerBuilder implements
         AugmentationTargetBuilder, DataSchemaNodeBuilder {
     private ContainerSchemaNodeImpl instance;
@@ -37,6 +42,8 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
     private boolean augmenting;
     private boolean addedByUses;
     private boolean configuration;
+    private ContainerSchemaNode originalNode;
+    private ContainerSchemaNodeBuilder originalBuilder;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
     private final List<AugmentationSchema> augmentations = new ArrayList<>();
@@ -58,6 +65,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
 
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode = base;
         configuration = base.isConfiguration();
         presence = base.isPresenceContainer();
 
@@ -85,6 +93,12 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
         instance.constraints = constraints.toInstance();
         instance.presence = presence;
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // AUGMENTATIONS
         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
             augmentations.add(builder.build());
@@ -139,6 +153,18 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public ContainerSchemaNodeBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof ContainerSchemaNodeBuilder, "Original of container cannot be "
+                + builder);
+        this.originalBuilder = (ContainerSchemaNodeBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -189,8 +215,6 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
         } else if (!path.equals(other.path)) {
             return false;
         }
-        // FIXME: Do we really need this? This actually triggers equals
-        // up to the root builder.
         if (getParent() == null) {
             if (other.getParent() != null) {
                 return false;
@@ -207,13 +231,14 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
     }
 
     private static final class ContainerSchemaNodeImpl extends AbstractDocumentedDataNodeContainer implements
-            ContainerSchemaNode {
+            ContainerSchemaNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
 
         private boolean augmenting;
         private boolean addedByUses;
         private boolean configuration;
+        private ContainerSchemaNode original;
         private ConstraintDefinition constraints;
 
         private ImmutableSet<AugmentationSchema> augmentations;
@@ -247,6 +272,11 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
             return addedByUses;
         }
 
+        @Override
+        public Optional<ContainerSchemaNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
@@ -314,6 +344,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDocumentedDataNode
         public String toString() {
             return "container " + qname.getLocalName();
         }
+
     }
 
 }
index ce7bfeebf883e40533105f1ae5c1c3067891053d..5cb69724010dc9766623936a8bbf7c54064719a9 100644 (file)
@@ -39,7 +39,8 @@ public final class CopyUtils {
      *            parent location
      * @return copy of given builder
      */
-    public static DataSchemaNodeBuilder copy(final DataSchemaNodeBuilder old, final Builder newParent, final boolean updateQName) {
+    public static DataSchemaNodeBuilder copy(final DataSchemaNodeBuilder old, final Builder newParent,
+            final boolean updateQName) {
         if (old instanceof AnyXmlBuilder) {
             return copy((AnyXmlBuilder) old, newParent, updateQName);
         } else if (old instanceof ChoiceBuilder) {
@@ -66,6 +67,7 @@ public final class CopyUtils {
         SchemaPath newSchemaPath = data.schemaPath;
 
         AnyXmlBuilder copy = new AnyXmlBuilder(newParent.getModuleName(), newParent.getLine(), newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -87,6 +89,7 @@ public final class CopyUtils {
         SchemaPath newSchemaPath = data.schemaPath;
 
         ChoiceBuilder copy = new ChoiceBuilder(newParent.getModuleName(), newParent.getLine(), newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -108,12 +111,15 @@ public final class CopyUtils {
         return copy;
     }
 
-    private static ChoiceCaseBuilder copy(final ChoiceCaseBuilder old, final Builder newParent, final boolean updateQName) {
+    private static ChoiceCaseBuilder copy(final ChoiceCaseBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
-        ChoiceCaseBuilder copy = new ChoiceCaseBuilder(newParent.getModuleName(), newParent.getLine(), newQName, newSchemaPath);
+        ChoiceCaseBuilder copy = new ChoiceCaseBuilder(newParent.getModuleName(), newParent.getLine(), newQName,
+                newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -148,6 +154,7 @@ public final class CopyUtils {
 
         ContainerSchemaNodeBuilder copy = new ContainerSchemaNodeBuilder(newParent.getModuleName(),
                 newParent.getLine(), newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -180,13 +187,15 @@ public final class CopyUtils {
         return copy;
     }
 
-    private static LeafSchemaNodeBuilder copy(final LeafSchemaNodeBuilder old, final Builder newParent, final boolean updateQName) {
+    private static LeafSchemaNodeBuilder copy(final LeafSchemaNodeBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
         LeafSchemaNodeBuilder copy = new LeafSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
                 newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -211,13 +220,15 @@ public final class CopyUtils {
         return copy;
     }
 
-    private static LeafListSchemaNodeBuilder copy(final LeafListSchemaNodeBuilder old, final Builder newParent, final boolean updateQName) {
+    private static LeafListSchemaNodeBuilder copy(final LeafListSchemaNodeBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
         LeafListSchemaNodeBuilder copy = new LeafListSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
                 newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -241,13 +252,15 @@ public final class CopyUtils {
         return copy;
     }
 
-    private static ListSchemaNodeBuilder copy(final ListSchemaNodeBuilder old, final Builder newParent, final boolean updateQName) {
+    private static ListSchemaNodeBuilder copy(final ListSchemaNodeBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
         ListSchemaNodeBuilder copy = new ListSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
                 newQName, newSchemaPath);
+        copy.setOriginal(old.getOriginal() == null ? old : old.getOriginal());
         copyConstraints(copy.getConstraints(), old.getConstraints());
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
@@ -287,7 +300,8 @@ public final class CopyUtils {
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
-        GroupingBuilderImpl copy = new GroupingBuilderImpl(newParent.getModuleName(), newParent.getLine(), newQName, newSchemaPath);
+        GroupingBuilderImpl copy = new GroupingBuilderImpl(newParent.getModuleName(), newParent.getLine(), newQName,
+                newSchemaPath);
         copy.setParent(newParent);
         copy.setDescription(old.getDescription());
         copy.setReference(old.getReference());
@@ -313,7 +327,8 @@ public final class CopyUtils {
         return copy;
     }
 
-    public static TypeDefinitionBuilder copy(final TypeDefinitionBuilder old, final Builder newParent, final boolean updateQName) {
+    public static TypeDefinitionBuilder copy(final TypeDefinitionBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
@@ -362,7 +377,8 @@ public final class CopyUtils {
         return type;
     }
 
-    private static ConstraintsBuilder copyConstraints(final ConstraintsBuilder newConstraints, final ConstraintsBuilder old) {
+    private static ConstraintsBuilder copyConstraints(final ConstraintsBuilder newConstraints,
+            final ConstraintsBuilder old) {
         newConstraints.getMustDefinitions().addAll(old.getMustDefinitions());
         newConstraints.addWhenCondition(old.getWhenCondition());
         newConstraints.setMandatory(old.isMandatory());
@@ -408,13 +424,14 @@ public final class CopyUtils {
         return copy;
     }
 
-    public static UnknownSchemaNodeBuilderImpl copy(final UnknownSchemaNodeBuilder old, final Builder newParent, final boolean updateQName) {
+    public static UnknownSchemaNodeBuilderImpl copy(final UnknownSchemaNodeBuilder old, final Builder newParent,
+            final boolean updateQName) {
         DataBean data = getdata(old, newParent, updateQName);
         QName newQName = data.qname;
         SchemaPath newSchemaPath = data.schemaPath;
 
-        UnknownSchemaNodeBuilderImpl c = new UnknownSchemaNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(),
-                newQName, newSchemaPath);
+        UnknownSchemaNodeBuilderImpl c = new UnknownSchemaNodeBuilderImpl(newParent.getModuleName(),
+                newParent.getLine(), newQName, newSchemaPath);
 
         c.setNodeType(old.getNodeType());
         c.setNodeParameter(old.getNodeParameter());
index 042756447f68c9376c466a9bf68395986c6bc76f..b1fb97a05e2c7d9cbd784f43ee6007384c8e97e9 100644 (file)
@@ -9,15 +9,12 @@ package org.opendaylight.yangtools.yang.parser.builder.impl;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 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.parser.builder.api.Builder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
@@ -31,9 +28,6 @@ public final class GroupingBuilderImpl extends AbstractDocumentedDataNodeContain
     private GroupingDefinitionImpl instance;
     // SchemaNode args
     private SchemaPath schemaPath;
-    private String description;
-    private String reference;
-    private Status status = Status.CURRENT;
     // DataSchemaNode args
     private boolean addedByUses;
 
@@ -44,14 +38,9 @@ public final class GroupingBuilderImpl extends AbstractDocumentedDataNodeContain
 
     public GroupingBuilderImpl(final String moduleName, final int line, final QName qname, final SchemaPath path,
             final GroupingDefinition base) {
-        super(moduleName, line, base.getQName(), path, base);
+        super(moduleName, line, base.getQName(), Preconditions.checkNotNull(path, "Schema Path must not be null"), base);
         schemaPath = path;
-
-        description = base.getDescription();
-        reference = base.getReference();
-        status = base.getStatus();
         addedByUses = base.isAddedByUses();
-
         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
                 qname));
     }
index 0c41a3bb7ae138d9663f420f4f96443efedf9d04..c39a82d0e6b71e2c12ee9fd30f4afe65e3069f86 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import java.util.List;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
@@ -19,9 +19,14 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractTypeAwareBuilder;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
 public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
     private LeafListSchemaNodeImpl instance;
     private boolean userOrdered;
@@ -33,6 +38,8 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
     // DataSchemaNode args
     private boolean augmenting;
     private boolean addedByUses;
+    private LeafListSchemaNode originalNode;
+    private LeafListSchemaNodeBuilder originalBuilder;
     private boolean configuration;
     private final ConstraintsBuilder constraints;
 
@@ -53,6 +60,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         status = base.getStatus();
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode = base;
         configuration = base.isConfiguration();
         this.type = base.getType();
         userOrdered = base.isUserOrdered();
@@ -82,6 +90,12 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             instance.type = type;
         }
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // UNKNOWN NODES
         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
             unknownNodes.add(b.build());
@@ -151,6 +165,18 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public LeafListSchemaNodeBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof LeafListSchemaNodeBuilder, "Original of leaf-list cannot be "
+                + builder);
+        this.originalBuilder = (LeafListSchemaNodeBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -216,7 +242,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         return "leaf-list " + qname.getLocalName();
     }
 
-    private static final class LeafListSchemaNodeImpl implements LeafListSchemaNode {
+    private static final class LeafListSchemaNodeImpl implements LeafListSchemaNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private String description;
@@ -224,6 +250,7 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
         private Status status;
         private boolean augmenting;
         private boolean addedByUses;
+        private LeafListSchemaNode original;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
@@ -270,6 +297,11 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im
             return addedByUses;
         }
 
+        @Override
+        public Optional<LeafListSchemaNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index 201705392b1be3edf919c12e596a0af296f10669..9edc6feae97c577a90c2e31b4471ffe39418e624 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import java.util.List;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
@@ -19,10 +19,15 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractTypeAwareBuilder;
 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+
 public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implements DataSchemaNodeBuilder {
     private LeafSchemaNodeImpl instance;
     private String defaultStr;
@@ -35,6 +40,8 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
     // DataSchemaNode args
     private boolean augmenting;
     private boolean addedByUses;
+    private LeafSchemaNode originalNode;
+    private LeafSchemaNodeBuilder originalBuilder;
     private boolean configuration;
     private final ConstraintsBuilder constraints;
 
@@ -54,6 +61,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         status = base.getStatus();
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode =base;
         configuration = base.isConfiguration();
         this.type = base.getType();
         unknownNodes.addAll(base.getUnknownSchemaNodes());
@@ -91,6 +99,12 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             instance.type = type;
         }
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // UNKNOWN NODES
         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
             unknownNodes.add(b.build());
@@ -165,6 +179,17 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public LeafSchemaNodeBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof LeafSchemaNodeBuilder, "Original of leaf cannot be " + builder);
+        this.originalBuilder = (LeafSchemaNodeBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -233,7 +258,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         return "leaf " + qname.getLocalName();
     }
 
-    private static final class LeafSchemaNodeImpl implements LeafSchemaNode {
+    private static final class LeafSchemaNodeImpl implements LeafSchemaNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private String description;
@@ -241,6 +266,7 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
         private Status status;
         private boolean augmenting;
         private boolean addedByUses;
+        private LeafSchemaNode original;
         private boolean configuration;
         private ConstraintDefinition constraintsDef;
         private TypeDefinition<?> type;
@@ -288,6 +314,11 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem
             return addedByUses;
         }
 
+        @Override
+        public Optional<LeafSchemaNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index a41a675f48ca8847f7f52235c9ea0b70ea9938d7..ba7f4aaf004d58d0d7db67334535298fa1501ea5 100644 (file)
@@ -7,10 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.builder.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -18,6 +14,7 @@ import java.util.Set;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
+import org.opendaylight.yangtools.yang.model.api.DerivableSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
@@ -25,10 +22,16 @@ import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuil
 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
+import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
 public final class ListSchemaNodeBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DataSchemaNodeBuilder,
 AugmentationTargetBuilder {
     private ListSchemaNodeImpl instance;
@@ -40,6 +43,8 @@ AugmentationTargetBuilder {
     // DataSchemaNode args
     private boolean augmenting;
     private boolean addedByUses;
+    private ListSchemaNodeBuilder originalBuilder;
+    private ListSchemaNode originalNode;
     private boolean configuration;
     private final ConstraintsBuilder constraints;
     // AugmentationTarget args
@@ -63,6 +68,7 @@ AugmentationTargetBuilder {
 
         augmenting = base.isAugmenting();
         addedByUses = base.isAddedByUses();
+        originalNode = base;
         configuration = base.isConfiguration();
 
         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
@@ -95,6 +101,12 @@ AugmentationTargetBuilder {
             instance.keyDefinition = ImmutableList.copyOf(keyDefinition);
         }
 
+        // ORIGINAL NODE
+        if (originalNode == null && originalBuilder != null) {
+            originalNode = originalBuilder.build();
+        }
+        instance.original = originalNode;
+
         // AUGMENTATIONS
         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
             augmentations.add(builder.build());
@@ -162,6 +174,17 @@ AugmentationTargetBuilder {
         this.addedByUses = addedByUses;
     }
 
+    @Override
+    public ListSchemaNodeBuilder getOriginal() {
+        return originalBuilder;
+    }
+
+    @Override
+    public void setOriginal(final SchemaNodeBuilder builder) {
+        Preconditions.checkArgument(builder instanceof ListSchemaNodeBuilder, "Original of list cannot be " + builder);
+        this.originalBuilder = (ListSchemaNodeBuilder) builder;
+    }
+
     @Override
     public boolean isConfiguration() {
         return configuration;
@@ -227,12 +250,13 @@ AugmentationTargetBuilder {
         return "list " + qname.getLocalName();
     }
 
-    private static final class ListSchemaNodeImpl extends AbstractDocumentedDataNodeContainer implements ListSchemaNode {
+    private static final class ListSchemaNodeImpl extends AbstractDocumentedDataNodeContainer implements ListSchemaNode, DerivableSchemaNode {
         private final QName qname;
         private final SchemaPath path;
         private ImmutableList<QName> keyDefinition;
         private boolean augmenting;
         private boolean addedByUses;
+        private ListSchemaNode original;
         private boolean configuration;
         private ConstraintDefinition constraints;
         private ImmutableSet<AugmentationSchema> augmentations;
@@ -270,6 +294,11 @@ AugmentationTargetBuilder {
             return addedByUses;
         }
 
+        @Override
+        public Optional<ListSchemaNode> getOriginal() {
+            return Optional.fromNullable(original);
+        }
+
         @Override
         public boolean isConfiguration() {
             return configuration;
index c986712e907bada90e7caae9cd60491ef20618b8..6877538607c62f64a4c7db3005b3729aaab4a96a 100644 (file)
@@ -11,10 +11,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DocumentedNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -64,6 +64,13 @@ public abstract class AbstractDocumentedDataNodeContainerBuilder extends Abstrac
         // addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName,
         // line, base.getUnknownSchemaNodes(), path, qname));
         usesNodes.addAll(base.getUses());
+
+        if (base instanceof DocumentedNode) {
+            DocumentedNode node = (DocumentedNode) base;
+            setDescription(node.getDescription());
+            setReference(node.getReference());
+            setStatus(node.getStatus());
+        }
     }
 
     @Override
index 52a71edc2121ae2d90a940ffea1e7032f6396a77..459ea32cdd4a1ca91ceaf698a1902ca1f1219a8f 100644 (file)
@@ -7,13 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.impl;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.SetMultimap;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -25,7 +18,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
+
 import javax.annotation.concurrent.Immutable;
+
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
@@ -44,6 +39,14 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
+
 @Immutable
 final class SchemaContextImpl implements SchemaContext {
     private static final Supplier<HashSet<Module>> URI_SET_SUPPLIER = new Supplier<HashSet<Module>>() {
index 0ef04835dc0814c3691f660a8635df915d2cbaa6..043c3c7f2944d006aa354734f4205f8d20ed581d 100644 (file)
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
@@ -41,6 +42,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.model.parser.api.YangContextParser;
+import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 
 public class GroupingTest {
     private Set<Module> modules;
@@ -155,6 +157,7 @@ public class GroupingTest {
         assertNotNull(data_g);
         assertFalse(data_g.isAddedByUses());
         assertFalse(data_u.equals(data_g));
+        assertEquals(data_g,  SchemaNodeUtils.getRootOriginalIfPossible(data_u));
 
         ChoiceNode how_u = (ChoiceNode) destination.getDataChildByName("how");
         assertNotNull(how_u);
@@ -166,6 +169,7 @@ public class GroupingTest {
         TestUtils.checkIsAddedByUses(how_g, false);
         assertEquals(2, how_g.getCases().size());
         assertFalse(how_u.equals(how_g));
+        assertEquals(how_g, SchemaNodeUtils.getRootOriginalIfPossible(how_u));
 
         LeafSchemaNode address_u = (LeafSchemaNode) destination.getDataChildByName("address");
         assertNotNull(address_u);
@@ -185,6 +189,7 @@ public class GroupingTest {
         assertTrue(address_g.isConfiguration());
         assertFalse(address_u.equals(address_g));
         assertTrue(address_g.getConstraints().isMandatory());
+        assertEquals(address_g, SchemaNodeUtils.getRootOriginalIfPossible(address_u));
 
         ContainerSchemaNode port_u = (ContainerSchemaNode) destination.getDataChildByName("port");
         assertNotNull(port_u);
@@ -194,6 +199,7 @@ public class GroupingTest {
         assertNotNull(port_g);
         TestUtils.checkIsAddedByUses(port_g, false);
         assertFalse(port_u.equals(port_g));
+        assertEquals(port_g, SchemaNodeUtils.getRootOriginalIfPossible(port_u));
 
         ListSchemaNode addresses_u = (ListSchemaNode) destination.getDataChildByName("addresses");
         assertNotNull(addresses_u);
@@ -203,6 +209,7 @@ public class GroupingTest {
         assertNotNull(addresses_g);
         TestUtils.checkIsAddedByUses(addresses_g, false);
         assertFalse(addresses_u.equals(addresses_g));
+        assertEquals(addresses_g, SchemaNodeUtils.getRootOriginalIfPossible(addresses_u));
 
         // grouping defined by 'uses'
         Set<GroupingDefinition> groupings_u = destination.getGroupings();
@@ -257,6 +264,7 @@ public class GroupingTest {
         assertNotNull(data_g);
         assertFalse(data_g.isAddedByUses());
         assertFalse(data_u.equals(data_g));
+        assertEquals(data_g, SchemaNodeUtils.getRootOriginalIfPossible(data_u));
 
         ChoiceNode how_u = (ChoiceNode) foo.getDataChildByName("how");
         assertNotNull(how_u);
@@ -275,6 +283,7 @@ public class GroupingTest {
         assertNotNull(how_g);
         TestUtils.checkIsAddedByUses(how_g, false);
         assertFalse(how_u.equals(how_g));
+        assertEquals(how_g, SchemaNodeUtils.getRootOriginalIfPossible(how_u));
 
         LeafSchemaNode address_u = (LeafSchemaNode) foo.getDataChildByName("address");
         assertNotNull(address_u);
@@ -292,6 +301,7 @@ public class GroupingTest {
         assertNull(address_g.getReference());
         assertTrue(address_g.isConfiguration());
         assertFalse(address_u.equals(address_g));
+        assertEquals(address_g, SchemaNodeUtils.getRootOriginalIfPossible(address_u));
 
         ContainerSchemaNode port_u = (ContainerSchemaNode) foo.getDataChildByName("port");
         assertNotNull(port_u);
@@ -301,6 +311,7 @@ public class GroupingTest {
         assertNotNull(port_g);
         TestUtils.checkIsAddedByUses(port_g, false);
         assertFalse(port_u.equals(port_g));
+        assertEquals(port_g, SchemaNodeUtils.getRootOriginalIfPossible(port_u));
 
         ListSchemaNode addresses_u = (ListSchemaNode) foo.getDataChildByName("addresses");
         assertNotNull(addresses_u);
@@ -310,6 +321,7 @@ public class GroupingTest {
         assertNotNull(addresses_g);
         TestUtils.checkIsAddedByUses(addresses_g, false);
         assertFalse(addresses_u.equals(addresses_g));
+        assertEquals(addresses_g, SchemaNodeUtils.getRootOriginalIfPossible(addresses_u));
 
         // grouping defined by 'uses'
         Set<GroupingDefinition> groupings_u = foo.getGroupings();
@@ -401,16 +413,17 @@ public class GroupingTest {
         // grouping-U
         Set<DataSchemaNode> childNodes = gu.getChildNodes();
         assertEquals(7, childNodes.size());
-        LeafSchemaNode leafGroupingU = null;
+
+        LeafSchemaNode leafGroupingU = (LeafSchemaNode) gu.getDataChildByName("leaf-grouping-U");
+        assertNotNull(leafGroupingU);
+        assertFalse(leafGroupingU.isAddedByUses());
+        assertFalse(SchemaNodeUtils.getOriginalIfPossible(leafGroupingU).isPresent());
+
         for (DataSchemaNode childNode : childNodes) {
-            if ("leaf-grouping-U".equals(childNode.getQName().getLocalName())) {
-                leafGroupingU = (LeafSchemaNode) childNode;
-            } else {
+            if (!(childNode.getQName().equals(leafGroupingU.getQName()))) {
                 TestUtils.checkIsAddedByUses(childNode, true);
             }
         }
-        assertNotNull(leafGroupingU);
-        assertFalse(leafGroupingU.isAddedByUses());
 
         // grouping-V
         childNodes = gv.getChildNodes();
@@ -509,6 +522,27 @@ public class GroupingTest {
         expectedPath = TestUtils.createPath(true, expectedNS, expectedRev, expectedPref, "grouping-ZZ",
                 "leaf-grouping-ZZ");
         assertEquals(expectedPath, leafZZinGZZ.getPath());
+
+        // TEST getOriginal from grouping-U
+        assertEquals(gv.getDataChildByName("leaf-grouping-V"), SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName("leaf-grouping-V")));
+        containerGroupingV = (ContainerSchemaNode) gu.getDataChildByName("container-grouping-V");
+        assertEquals(gv.getDataChildByName("container-grouping-V"), SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV));
+        assertEquals(gx.getDataChildByName("leaf-grouping-X"), SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV.getDataChildByName("leaf-grouping-X")
+                ));
+        assertEquals(gy.getDataChildByName("leaf-grouping-Y"), SchemaNodeUtils.getRootOriginalIfPossible(containerGroupingV.getDataChildByName("leaf-grouping-Y")
+                ));
+
+        assertEquals(gz.getDataChildByName("leaf-grouping-Z"), SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName("leaf-grouping-Z")));
+        assertEquals(gzz.getDataChildByName("leaf-grouping-ZZ"), SchemaNodeUtils.getRootOriginalIfPossible(gu.getDataChildByName("leaf-grouping-ZZ")
+                ));
+
+        // TEST getOriginal from grouping-V
+        assertEquals(gz.getDataChildByName("leaf-grouping-Z"), SchemaNodeUtils.getRootOriginalIfPossible(gv.getDataChildByName("leaf-grouping-Z")));
+        assertEquals(gzz.getDataChildByName("leaf-grouping-ZZ"), SchemaNodeUtils.getRootOriginalIfPossible(gv.getDataChildByName("leaf-grouping-ZZ")
+                ));
+
+        // TEST getOriginal from grouping-X
+        assertEquals(gy.getDataChildByName("leaf-grouping-Y"),SchemaNodeUtils.getRootOriginalIfPossible( gx.getDataChildByName("leaf-grouping-Y")));
     }
 
 }