From c07a51e55c19cbe5da1be3da4968ab266d93a59f Mon Sep 17 00:00:00 2001 From: Geng Xingyuan Date: Tue, 18 Oct 2016 15:51:56 +0800 Subject: [PATCH] Bug 6958 - add class NotificationAsContainer for transforming xml format notification to java Notification interface. 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 --- .../features/src/main/features/features.xml | 2 + .../data/util}/ConstraintDefinitions.java | 12 +- .../yang/data/util/ContainerSchemaNodes.java | 226 ++++++++++++++++++ .../data/util}/EmptyConstraintDefinition.java | 6 +- yang/yang-parser-impl/pom.xml | 4 + .../EffectiveConstraintDefinitionImpl.java | 2 + .../effective/ConstraintDefinitionsTest.java | 1 + 7 files changed, 244 insertions(+), 9 deletions(-) rename yang/{yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective => yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util}/ConstraintDefinitions.java (84%) create mode 100644 yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java rename yang/{yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective => yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util}/EmptyConstraintDefinition.java (89%) diff --git a/common/features/src/main/features/features.xml b/common/features/src/main/features/features.xml index 9dfc93ea24..ca84e67714 100644 --- a/common/features/src/main/features/features.xml +++ b/common/features/src/main/features/features.xml @@ -41,6 +41,8 @@ mvn:org.antlr/antlr4-runtime/{{VERSION}} mvn:org.opendaylight.yangtools/yang-model-api/{{VERSION}} mvn:org.opendaylight.yangtools/yang-model-util/{{VERSION}} + mvn:org.opendaylight.yangtools/yang-data-api/{{VERSION}} + mvn:org.opendaylight.yangtools/yang-data-util/{{VERSION}} mvn:org.opendaylight.yangtools/yang-parser-api/{{VERSION}} mvn:org.opendaylight.yangtools/yang-parser-impl/{{VERSION}} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitions.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java similarity index 84% rename from yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitions.java rename to yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java index 2641d2c4dd..4ee52b343c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitions.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ConstraintDefinitions.java @@ -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 index 0000000000..0b62cf3160 --- /dev/null +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ContainerSchemaNodes.java @@ -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 Geng Xingyuan + */ +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 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 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 getGroupings() { + return rpcDefinition.getGroupings(); + } + + @Override + public Set> getTypeDefinitions() { + return rpcDefinition.getTypeDefinitions(); + } + + @Override + public Set getAvailableAugmentations() { + return ImmutableSet.of(); + } + + @Override + public Collection 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 mapNodes; + + private NotificationContainerSchemaNode(final NotificationDefinition notification) { + super(notification); + this.notification = notification; + mapNodes = Maps.uniqueIndex(notification.getChildNodes(), DataSchemaNode::getQName); + } + + @Override + public Set getAvailableAugmentations() { + return notification.getAvailableAugmentations(); + } + + @Override + public Set> getTypeDefinitions() { + return notification.getTypeDefinitions(); + } + + @Override + public Collection getChildNodes() { + return notification.getChildNodes(); + } + + @Override + public Set 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; + } + } +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EmptyConstraintDefinition.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java similarity index 89% rename from yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EmptyConstraintDefinition.java rename to yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java index 194d150b24..8050a1fcb2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EmptyConstraintDefinition.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/EmptyConstraintDefinition.java @@ -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; } diff --git a/yang/yang-parser-impl/pom.xml b/yang/yang-parser-impl/pom.xml index a9d086ad8a..cc2cc3129f 100644 --- a/yang/yang-parser-impl/pom.xml +++ b/yang/yang-parser-impl/pom.xml @@ -53,6 +53,10 @@ ${project.groupId} yang-model-util + + ${project.groupId} + yang-data-util + org.antlr antlr4-runtime diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java index dad039b908..161cb55a8f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/EffectiveConstraintDefinitionImpl.java @@ -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"; diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitionsTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitionsTest.java index 0093a38797..caa4f38ab6 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitionsTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConstraintDefinitionsTest.java @@ -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; -- 2.36.6