Bug 6958 - add class NotificationAsContainer for transforming xml format notification... 52/47052/10
authorGeng Xingyuan <geng.xingyuan@zte.com.cn>
Tue, 18 Oct 2016 07:51:56 +0000 (15:51 +0800)
committerGeng Xingyuan <geng.xingyuan@zte.com.cn>
Sat, 22 Oct 2016 13:18:21 +0000 (13:18 +0000)
move utility class ConstraintDefinitions and EmptyConstraintDefinition to yang-data-util.
new utility class ContainerSchemaNodes for transforming yang rpc or notification to xml

Change-Id: Ib8f3ca23e8a3e67446ed5f4aa9e4c7b16ffb2d85
Signed-off-by: Geng Xingyuan <geng.xingyuan@zte.com.cn>
common/features/src/main/features/features.xml
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java [moved from yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitions.java with 84% similarity]
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java [new file with mode: 0644]
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java [moved from yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EmptyConstraintDefinition.java with 89% similarity]
yang/yang-parser-impl/pom.xml
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java
yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitionsTest.java

index 9dfc93ea242890f596a3eb8853f79f734c490c1b..ca84e67714b6af875137b4f2c0094d871e2eb7f5 100644 (file)
@@ -41,6 +41,8 @@
         <bundle>mvn:org.antlr/antlr4-runtime/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.yangtools/yang-model-api/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.yangtools/yang-model-util/{{VERSION}}</bundle>
+        <bundle>mvn:org.opendaylight.yangtools/yang-data-api/{{VERSION}}</bundle>
+        <bundle>mvn:org.opendaylight.yangtools/yang-data-util/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.yangtools/yang-parser-api/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.yangtools/yang-parser-impl/{{VERSION}}</bundle>
     </feature>
@@ -5,7 +5,7 @@
  * 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.parser.stmt.rfc6020.effective;
+package org.opendaylight.yangtools.yang.data.util;
 
 import com.google.common.base.MoreObjects;
 import java.util.Objects;
@@ -14,12 +14,12 @@ import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 /**
  * Utility methods for ConstraintDefinition implementations.
  */
-final class ConstraintDefinitions {
+public final class ConstraintDefinitions {
     private ConstraintDefinitions() {
         throw new UnsupportedOperationException();
     }
 
-    static int hashCode(final ConstraintDefinition def) {
+    public static int hashCode(final ConstraintDefinition def) {
         final int prime = 31;
         int result = 1;
         result = prime * result + Objects.hashCode(def.getWhenCondition());
@@ -30,14 +30,14 @@ final class ConstraintDefinitions {
         return result;
     }
 
-    static boolean equals(final ConstraintDefinition def, final Object obj) {
+    public static boolean equals(final ConstraintDefinition def, final Object obj) {
         if (def == obj) {
             return true;
         }
         if (!(obj instanceof ConstraintDefinition)) {
             return false;
         }
-        final ConstraintDefinition other = (EffectiveConstraintDefinitionImpl) obj;
+        final ConstraintDefinition other = (ConstraintDefinition) obj;
         if (def.isMandatory() != other.isMandatory()) {
             return false;
         }
@@ -56,7 +56,7 @@ final class ConstraintDefinitions {
         return true;
     }
 
-    static String toString(final ConstraintDefinition def) {
+    public static String toString(final ConstraintDefinition def) {
         return MoreObjects.toStringHelper(def).omitNullValues()
                 .add("whenCondition", def.getWhenCondition())
                 .add("mustConstraints", def.getMustConstraints())
diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java
new file mode 100644 (file)
index 0000000..0b62cf3
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2016 ZTE, 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.data.util;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+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.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.UsesNode;
+
+
+/**
+ * yang-data-util
+ * org.opendaylight.yangtools.yang.data.util
+ * Utility class for taking notification or rpc as ContainerSchemaNode.
+ * @author <a href="mailto:geng.xingyuan@zte.com.cn">Geng Xingyuan</a>
+ */
+public final class ContainerSchemaNodes {
+
+    private ContainerSchemaNodes() {
+    }
+
+    @Beta
+    public static ContainerSchemaNode forNotification(final NotificationDefinition notification) {
+        return new NotificationContainerSchemaNode(notification);
+    }
+
+    @Beta
+    public static ContainerSchemaNode forRPC(final RpcDefinition rpc) {
+        return new RpcContainerSchemaNode(rpc);
+    }
+
+    private abstract static class AbstractContainerSchemaNode implements ContainerSchemaNode {
+
+        private final SchemaNode schemaNode;
+
+        private AbstractContainerSchemaNode(final SchemaNode schemaNode) {
+            this.schemaNode = schemaNode;
+        }
+
+        @Override
+        public boolean isPresenceContainer() {
+            return false;
+        }
+
+        @Override
+        public Set<UsesNode> getUses() {
+            return ImmutableSet.of();
+        }
+
+        @Override
+        public boolean isAugmenting() {
+            return false;
+        }
+
+        @Override
+        public boolean isConfiguration() {
+            return false;
+        }
+
+        @Override
+        public ConstraintDefinition getConstraints() {
+            return EmptyConstraintDefinition.create(false);
+        }
+
+        @Nonnull
+        @Override
+        public QName getQName() {
+            return schemaNode.getQName();
+        }
+
+        @Nonnull
+        @Override
+        public SchemaPath getPath() {
+            return schemaNode.getPath();
+        }
+
+        @Nullable
+        @Override
+        public String getDescription() {
+            return schemaNode.getDescription();
+        }
+
+        @Nullable
+        @Override
+        public String getReference() {
+            return schemaNode.getReference();
+        }
+
+        @Nonnull
+        @Override
+        public Status getStatus() {
+            return schemaNode.getStatus();
+        }
+
+        @Override
+        public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+            return ImmutableList.of();
+        }
+    }
+
+    private static final class RpcContainerSchemaNode extends AbstractContainerSchemaNode {
+
+        private final RpcDefinition rpcDefinition;
+
+        private RpcContainerSchemaNode(final RpcDefinition rpcDefinition) {
+            super(rpcDefinition);
+            this.rpcDefinition = rpcDefinition;
+        }
+
+        @Override
+        public Set<GroupingDefinition> getGroupings() {
+            return rpcDefinition.getGroupings();
+        }
+
+        @Override
+        public Set<TypeDefinition<?>> getTypeDefinitions() {
+            return rpcDefinition.getTypeDefinitions();
+        }
+
+        @Override
+        public Set<AugmentationSchema> getAvailableAugmentations() {
+            return ImmutableSet.of();
+        }
+
+        @Override
+        public Collection<DataSchemaNode> getChildNodes() {
+            final ContainerSchemaNode input = rpcDefinition.getInput();
+            final ContainerSchemaNode output = rpcDefinition.getOutput();
+            if (input == null && output == null) {
+                return ImmutableList.of();
+            } else if (input != null && output != null) {
+                return ImmutableList.of(input,output);
+            } else if (input != null) {
+                return ImmutableList.of(input);
+            } else {
+                return ImmutableList.of(output);
+            }
+        }
+
+        @Override
+        public DataSchemaNode getDataChildByName(QName name) {
+            switch (name.getLocalName()) {
+                case "input":
+                    return rpcDefinition.getInput();
+                case "output":
+                    return rpcDefinition.getOutput();
+                default:
+                    return null;
+            }
+        }
+
+        @Override
+        public boolean isAddedByUses() {
+            return false;
+        }
+    }
+
+    private static final class NotificationContainerSchemaNode extends AbstractContainerSchemaNode {
+
+        private final NotificationDefinition notification;
+        private final Map<QName, DataSchemaNode> mapNodes;
+
+        private NotificationContainerSchemaNode(final NotificationDefinition notification) {
+            super(notification);
+            this.notification = notification;
+            mapNodes = Maps.uniqueIndex(notification.getChildNodes(), DataSchemaNode::getQName);
+        }
+
+        @Override
+        public Set<AugmentationSchema> getAvailableAugmentations() {
+            return notification.getAvailableAugmentations();
+        }
+
+        @Override
+        public Set<TypeDefinition<?>> getTypeDefinitions() {
+            return notification.getTypeDefinitions();
+        }
+
+        @Override
+        public Collection<DataSchemaNode> getChildNodes() {
+            return notification.getChildNodes();
+        }
+
+        @Override
+        public Set<GroupingDefinition> getGroupings() {
+            return notification.getGroupings();
+        }
+
+        @Override
+        public DataSchemaNode getDataChildByName(QName name) {
+            return mapNodes.get(name);
+        }
+
+        @Override
+        public boolean isAddedByUses() {
+            //FIXME: reference to https://bugs.opendaylight.org/show_bug.cgi?id=6897
+            return false;
+        }
+    }
+}
@@ -5,7 +5,7 @@
  * 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.parser.stmt.rfc6020.effective;
+package org.opendaylight.yangtools.yang.data.util;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
@@ -16,7 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 /**
  * Utility holder for constraint definitions which do not really constrain anything.
  */
-abstract class EmptyConstraintDefinition implements ConstraintDefinition {
+public abstract class EmptyConstraintDefinition implements ConstraintDefinition {
     private static final EmptyConstraintDefinition MANDATORY = new EmptyConstraintDefinition() {
         @Override
         public boolean isMandatory() {
@@ -34,7 +34,7 @@ abstract class EmptyConstraintDefinition implements ConstraintDefinition {
         // Hidden on purpose
     }
 
-    static EmptyConstraintDefinition create(final boolean mandatory) {
+    public static EmptyConstraintDefinition create(final boolean mandatory) {
         return mandatory ? MANDATORY : OPTIONAL;
     }
 
index a9d086ad8a0846e4eb4cce846d15c4e5849d79d8..cc2cc3129f35afa5f2ecbd89977799239f616361 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>yang-model-util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>yang-data-util</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr4-runtime</artifactId>
index dad039b9087df82a6d3e54a0e0c253295eca2009..161cb55a8ff5aaddc92c1b2822f8e2fdef33b483 100644 (file)
@@ -10,9 +10,11 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
+import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
+import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition;
 
 final class EffectiveConstraintDefinitionImpl implements ConstraintDefinition {
     private static final String UNBOUNDED_STR = "unbounded";
index 0093a3879731d13c7067accfe87913cec90dd170..caa4f38ab6344317e635a5f2350fc0728518b4fc 100644 (file)
@@ -24,6 +24,7 @@ import java.text.ParseException;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
+import org.opendaylight.yangtools.yang.data.util.ConstraintDefinitions;
 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;