*/
package org.opendaylight.yangtools.yang.model.api.type;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-
/**
- * Contains methods for getting data from the <code>instance-identifier</code>
- * YANG built-in type.
+ * Contains methods for getting data from the <code>instance-identifier</code> YANG built-in type.
*/
-public interface InstanceIdentifierTypeDefinition extends TypeDefinition<InstanceIdentifierTypeDefinition> {
- /**
- * Returns true|false which represents argument of <code>require-instance</code> statement. This statement is the
- * substatement of the <code>type</code> statement.
- *
- * @return boolean value which is true if the <code>require-instance</code> statement is true and vice versa
- */
- boolean requireInstance();
+public interface InstanceIdentifierTypeDefinition
+ extends RequireInstanceRestrictedTypeDefinition<InstanceIdentifierTypeDefinition> {
+
}
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<LeafrefTypeDefinition> {
+public interface LeafrefTypeDefinition extends RequireInstanceRestrictedTypeDefinition<LeafrefTypeDefinition> {
RevisionAwareXPath getPathStatement();
*
* @return boolean value which is true if the <code>require-instance</code> 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;
}
--- /dev/null
+/*
+ * 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 <T> Concrete {@link TypeDefinition} subinterface
+ */
+public interface RequireInstanceRestrictedTypeDefinition<T extends TypeDefinition<T>> extends TypeDefinition<T> {
+ /**
+ * Returns true or false which represents argument of <code>require-instance</code> statement. This statement is
+ * the substatement of the <code>type</code> statement.
+ *
+ * @return boolean value which is true if the <code>require-instance</code> statement is true and vice versa
+ */
+ boolean requireInstance();
+}
<leaf name="my-leafref-3">
<type name="leafref">
<path value="/target"></path>
- <require-instance value="false"></require-instance>
+ <require-instance value="true"></require-instance>
</type>
<config value="true"></config>
<mandatory value="false"></mandatory>
<mandatory value="false"></mandatory>
<status value="current"></status>
</leaf>
-</module>
\ No newline at end of file
+</module>
* 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<T extends TypeDefinition<T>>
extends AbstractRestrictedTypeBuilder<T> {
RequireInstanceRestrictedTypeBuilder(final T baseType, final SchemaPath path) {
super(baseType, path);
+ requireInstance = baseType instanceof RequireInstanceRestrictedTypeDefinition
+ ? ((RequireInstanceRestrictedTypeDefinition<?>)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();
}
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;
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 {
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<LeafrefTypeDefinition> falseBuilder =
+ RestrictedTypes.newLeafrefBuilder(falseLeafref, schemaPath);
+ assertFalse(falseBuilder.build().requireInstance());
+ final RequireInstanceRestrictedTypeBuilder<LeafrefTypeDefinition> trueBuilder =
+ RestrictedTypes.newLeafrefBuilder(trueLeafref, schemaPath);
+ assertTrue(trueBuilder.build().requireInstance());
}
}
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) {