From d6b396379c2630b5aaff6b9f6b0596b922223c62 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 29 Mar 2018 23:59:34 +0200 Subject: [PATCH] Fix leafref require-instance implementation Both identityref and leafref types default to require-instace=true, hence we should be starting with that and also properly inherit the property from the parent type. Add RequireInstanceRestrictedTypeDefinition to capture the common method and adjust RequireInstanceRestrictedTypeBuilder to check for it and initialize the require-instance value appropriately. JIRA: YANGTOOLS-872 Change-Id: I125d5687950af21694c4510ce64adb00f92ae4e6 Signed-off-by: Robert Varga (cherry picked from commit 38ca7ba1b5222af644f0e782f2876db9e9a58f05) --- .../InstanceIdentifierTypeDefinition.java | 16 +++------- .../model/api/type/LeafrefTypeDefinition.java | 6 ++-- ...quireInstanceRestrictedTypeDefinition.java | 25 +++++++++++++++ .../RequireInstanceRestrictedTypeBuilder.java | 10 +++--- .../yang/model/util/LeafrefTest.java | 31 +++++++++---------- .../stmt/rfc7950/LeafrefStatementTest.java | 2 +- 6 files changed, 51 insertions(+), 39 deletions(-) create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RequireInstanceRestrictedTypeDefinition.java diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java index 0bca31119b..69504e8d35 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/InstanceIdentifierTypeDefinition.java @@ -7,18 +7,10 @@ */ package org.opendaylight.yangtools.yang.model.api.type; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; - /** - * Contains methods for getting data from the instance-identifier - * YANG built-in type. + * Contains methods for getting data from the instance-identifier YANG built-in type. */ -public interface InstanceIdentifierTypeDefinition extends TypeDefinition { - /** - * Returns true|false which represents argument of require-instance statement. This statement is the - * substatement of the type statement. - * - * @return boolean value which is true if the require-instance statement is true and vice versa - */ - boolean requireInstance(); +public interface InstanceIdentifierTypeDefinition + extends RequireInstanceRestrictedTypeDefinition { + } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java index 587ade58eb..b807468fdc 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/LeafrefTypeDefinition.java @@ -8,9 +8,8 @@ package org.opendaylight.yangtools.yang.model.api.type; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -public interface LeafrefTypeDefinition extends TypeDefinition { +public interface LeafrefTypeDefinition extends RequireInstanceRestrictedTypeDefinition { RevisionAwareXPath getPathStatement(); @@ -22,7 +21,8 @@ public interface LeafrefTypeDefinition extends TypeDefinitionrequire-instance statement is true and vice versa */ - // FIXME: version 2.0.0: make this method non-default + // FIXME: version 2.0.0: make this method non-default + @Override default boolean requireInstance() { return true; } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RequireInstanceRestrictedTypeDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RequireInstanceRestrictedTypeDefinition.java new file mode 100644 index 0000000000..b04fd8e9c6 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/type/RequireInstanceRestrictedTypeDefinition.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2013 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.api.type; + +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; + +/** + * Interface for {@link TypeDefinition}s which can be restricted through a require-instance statement. + * + * @param Concrete {@link TypeDefinition} subinterface + */ +public interface RequireInstanceRestrictedTypeDefinition> extends TypeDefinition { + /** + * Returns true or false which represents argument of require-instance statement. This statement is + * the substatement of the type statement. + * + * @return boolean value which is true if the require-instance statement is true and vice versa + */ + boolean requireInstance(); +} diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RequireInstanceRestrictedTypeBuilder.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RequireInstanceRestrictedTypeBuilder.java index 6d4b988b12..c3c238e3cf 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RequireInstanceRestrictedTypeBuilder.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RequireInstanceRestrictedTypeBuilder.java @@ -5,15 +5,15 @@ * 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.type; import com.google.common.annotations.Beta; -import com.google.common.base.Preconditions; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.RequireInstanceRestrictedTypeDefinition; @Beta +//FIXME: 3.0.0: this should require T to be a RequireInstanceRestrictedTypeDefinition public abstract class RequireInstanceRestrictedTypeBuilder> extends AbstractRestrictedTypeBuilder { @@ -21,13 +21,11 @@ public abstract class RequireInstanceRestrictedTypeBuilder)baseType).requireInstance() : true; } public final void setRequireInstance(final boolean requireInstance) { - if (this.requireInstance) { - Preconditions.checkArgument(requireInstance, "Cannot switch off require-instance in type %s", getPath()); - } - this.requireInstance = requireInstance; touch(); } diff --git a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/LeafrefTest.java b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/LeafrefTest.java index 2cd6969852..fd4b33d237 100644 --- a/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/LeafrefTest.java +++ b/yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/LeafrefTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; @@ -22,6 +21,8 @@ import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; import org.opendaylight.yangtools.yang.model.util.type.LeafrefTypeBuilder; +import org.opendaylight.yangtools.yang.model.util.type.RequireInstanceRestrictedTypeBuilder; +import org.opendaylight.yangtools.yang.model.util.type.RestrictedTypes; public class LeafrefTest { @@ -60,28 +61,24 @@ public class LeafrefTest { public void testRequireInstanceSubstatement() { final SchemaPath schemaPath = SchemaPath.create(true, QName.create("my-cont"), QName.create("my-leafref")); final RevisionAwareXPathImpl path = new RevisionAwareXPathImpl("../my-leaf", false); + final LeafrefTypeBuilder leafrefTypeBuilder = BaseTypes.leafrefTypeBuilder(schemaPath).setPathStatement(path); - LeafrefTypeBuilder leafrefTypeBuilder = BaseTypes.leafrefTypeBuilder(schemaPath).setPathStatement(path); + assertTrue(leafrefTypeBuilder.build().requireInstance()); leafrefTypeBuilder.setRequireInstance(false); - LeafrefTypeDefinition leafref = leafrefTypeBuilder.build(); - assertFalse(leafref.requireInstance()); + final LeafrefTypeDefinition falseLeafref = leafrefTypeBuilder.build(); + assertFalse(falseLeafref.requireInstance()); leafrefTypeBuilder.setRequireInstance(true); - leafref = leafrefTypeBuilder.build(); - assertTrue(leafref.requireInstance()); + final LeafrefTypeDefinition trueLeafref = leafrefTypeBuilder.build(); + assertTrue(trueLeafref.requireInstance()); - leafrefTypeBuilder.setRequireInstance(true); - leafref = leafrefTypeBuilder.build(); - assertTrue(leafref.requireInstance()); - - try { - leafrefTypeBuilder.setRequireInstance(false); - fail("An IllegalArgumentException should have been thrown."); - } catch (IllegalArgumentException ex) { - assertEquals("Cannot switch off require-instance in type AbsoluteSchemaPath{path=[my-cont, my-leafref]}", - ex.getMessage()); - } + final RequireInstanceRestrictedTypeBuilder falseBuilder = + RestrictedTypes.newLeafrefBuilder(falseLeafref, schemaPath); + assertFalse(falseBuilder.build().requireInstance()); + final RequireInstanceRestrictedTypeBuilder trueBuilder = + RestrictedTypes.newLeafrefBuilder(trueLeafref, schemaPath); + assertTrue(trueBuilder.build().requireInstance()); } } diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/LeafrefStatementTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/LeafrefStatementTest.java index 3857385a4e..57dcd56272 100644 --- a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/LeafrefStatementTest.java +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/parser/stmt/rfc7950/LeafrefStatementTest.java @@ -58,7 +58,7 @@ public class LeafrefStatementTest { final LeafSchemaNode leafrefC = (LeafSchemaNode) foo.getDataChildByName(QName.create(foo.getQNameModule(), "leafref-c")); assertNotNull(leafrefC); - assertRequireInstanceInLeafref(leafrefC, false); + assertRequireInstanceInLeafref(leafrefC, true); } private static void assertRequireInstanceInLeafref(final LeafSchemaNode leaf, final boolean requireInstance) { -- 2.36.6