import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
@SuppressWarnings({ "unchecked", "rawtypes" })
final Codec<Object, Object> casted = (Codec) instanceIdentifierCodec;
return casted;
- } else if (Boolean.class.equals(valueType)) {
- if (instantiatedType instanceof EmptyTypeDefinition) {
- return ValueTypeCodec.EMPTY_CODEC;
- }
} else if (BindingReflections.isBindingClass(valueType)) {
return getCodecForBindingClass(valueType, instantiatedType);
}
import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
/**
* Derived YANG types are just immutable value holders for simple value
static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, final TypeDefinition<?> typeDef) {
return () -> {
final Method m;
- if (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition) {
+ if (typeDef instanceof BooleanTypeDefinition) {
m = typeClz.getMethod("isValue");
} else {
m = typeClz.getMethod("getValue");
import java.util.concurrent.ExecutionException;
import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
/**
/**
* No-op Codec, Java YANG Binding uses same types as NormalizedNode model for base YANG types, representing numbers,
- * binary and strings.
+ * binary, strings and empty.
*/
public static final SchemaUnawareCodec NOOP_CODEC = new SchemaUnawareCodec() {
}
};
- public static final SchemaUnawareCodec EMPTY_CODEC = new SchemaUnawareCodec() {
-
- @Override
- public Object serialize(final Object input) {
- // Empty type has Empty value in NormalizedNode and Composite Node representation
- return Empty.getInstance();
- }
-
- @Override
- public Object deserialize(final Object input) {
- /* Empty type has boolean.TRUE representation in Binding-aware world otherwise it is null / false.
- * So when codec is triggered, empty leaf is present, that means we are safe to return true.
- */
- return Boolean.TRUE;
- }
- };
-
- private static final Callable<? extends SchemaUnawareCodec> EMPTY_LOADER = () -> EMPTY_CODEC;
-
-
public static SchemaUnawareCodec getCodecFor(final Class<?> typeClz, final TypeDefinition<?> def) {
if (BindingReflections.isBindingClass(typeClz)) {
return getCachedSchemaUnawareCodec(typeClz, getCodecLoader(typeClz, def));
}
- return def instanceof EmptyTypeDefinition ? EMPTY_CODEC : NOOP_CODEC;
+ return NOOP_CODEC;
}
private static SchemaUnawareCodec getCachedSchemaUnawareCodec(final Class<?> typeClz,
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
public final class BindingSchemaMapping {
private BindingSchemaMapping() {
}
public static String getGetterMethodName(final TypedDataSchemaNode node) {
- // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
+ // Bug 8903: If it is a derived type of boolean, not an inner type, then the return type
// of method would be the generated type of typedef not build-in types, so here it should be 'get'.
final TypeDefinition<?> type = node.getType();
return BindingMapping.getGetterMethodName(node.getQName(),
- (type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition)
+ type instanceof BooleanTypeDefinition
&& (type.getPath().equals(node.getPath()) || type.getBaseType() == null));
}
}
final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
final Method methodFoo2 = TestDataObject2.class.getMethod("foo");
TEST_UVOC_1 = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, methodFoo1,
- ValueTypeCodec.EMPTY_CODEC);
+ ValueTypeCodec.NOOP_CODEC);
TEST_UVOC_2 = new UnionValueOptionContext(TestUnion.class, TestDataObject2.class, methodFoo2,
- ValueTypeCodec.EMPTY_CODEC);
+ ValueTypeCodec.NOOP_CODEC);
}
@Test
public void hashCodeTest() throws Exception {
final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
- methodFoo1, ValueTypeCodec.EMPTY_CODEC);
+ methodFoo1, ValueTypeCodec.NOOP_CODEC);
assertEquals("HashCode", test_uvoc.hashCode(), TEST_UVOC_1.hashCode());
assertNotEquals("HashCode", TEST_UVOC_1.hashCode(), TEST_UVOC_2.hashCode());
public void equalsTest() throws Exception {
final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
- methodFoo1, ValueTypeCodec.EMPTY_CODEC);
+ methodFoo1, ValueTypeCodec.NOOP_CODEC);
assertTrue("Equals", TEST_UVOC_1.equals(test_uvoc));
assertFalse("Not equals", TEST_UVOC_1.equals(TEST_UVOC_2));
*/
package org.opendaylight.mdsal.binding.dom.codec.test;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.ChoiceInList;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
public void testCaseWithEmptyLeafType() {
final TopLevelList withEmptyCase = new TopLevelListBuilder()
.withKey(TOP_FOO_KEY)
- .setChoiceInList(new EmptyLeafBuilder().setEmptyType(true).build())
+ .setChoiceInList(new EmptyLeafBuilder().setEmptyType(Empty.getInstance()).build())
.build();
final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = registry.toNormalizedNode(BA_TOP_LEVEL_LIST,
withEmptyCase);
dom.getValue());
final ChoiceInList list = ((TopLevelList) readed.getValue()).getChoiceInList();
assertTrue(list instanceof EmptyLeaf);
- assertTrue(((EmptyLeaf) list).isEmptyType());
+ assertNotNull(((EmptyLeaf) list).getEmptyType());
}
private static RpcComplexUsesAugment createComplexData() {
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.typedef.empty.rev170829.TypedefEmpty;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@Test
public void testTypedefEmptyType() {
TestCont binding = new TestContBuilder()
- .setEmptyLeaf(true)
- .setEmptyLeaf2(new TypedefEmpty(true))
- .setEmptyLeaf3(true)
+ .setEmptyLeaf(Empty.getInstance())
+ .setEmptyLeaf2(new TypedefEmpty(Empty.getInstance()))
+ .setEmptyLeaf3(Empty.getInstance())
.build();
final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
registry.toNormalizedNode(BA_TEST_CONT, binding);
import org.opendaylight.mdsal.binding.model.util.Types;
import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
/**
* <code>Type</code> representation of <code>empty</code> YANG type.
*/
- public static final Type EMPTY_TYPE = BOOLEAN_TYPE;
+ public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class);
public static final Type ENUM_TYPE = Types.typeForClass(Enum.class);
import org.opendaylight.mdsal.binding.generator.spi.TypeProvider;
import org.opendaylight.mdsal.binding.model.api.Type;
import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil;
+import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty);
assertNotNull(javaType);
- assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName());
+ assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName());
javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool);
assertNotNull(javaType);
javaType = typeProvider.javaTypeForSchemaDefinitionType(empty, empty,
BindingGeneratorUtil.getRestrictions(empty));
assertNotNull(javaType);
- assertEquals(Boolean.class.getCanonicalName(), javaType.getFullyQualifiedName());
+ assertEquals(Empty.class.getCanonicalName(), javaType.getFullyQualifiedName());
javaType = typeProvider.javaTypeForSchemaDefinitionType(bool, bool,
BindingGeneratorUtil.getRestrictions(bool));
import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
import static extension org.apache.commons.text.StringEscapeUtils.escapeJava
+import com.google.common.base.Preconditions
import com.google.common.collect.ImmutableList
import com.google.common.collect.Lists
import java.beans.ConstructorProperties
import org.opendaylight.mdsal.binding.model.api.Type
import org.opendaylight.mdsal.binding.model.util.TypeConstants
import org.opendaylight.yangtools.yang.binding.CodeHelpers
+import org.opendaylight.yangtools.yang.common.Empty
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
/**
return new «genTO.name»(«Base64.importedName».getDecoder().decode(defaultValue));
«ELSEIF STRING.equals(prop.returnType)»
return new «genTO.name»(defaultValue);
+ «ELSEIF Constants.EMPTY.equals(prop.returnType)»
+ «Preconditions.importedName».checkArgument(defaultValue.isEmpty(), "Invalid value %s", defaultValue);
+ return new «genTO.name»(«Empty.importedName».getInstance());
«ELSEIF allProperties.size > 1»
«bitsArgs»
«ELSEIF BOOLEAN.equals(prop.returnType)»
*/
package org.opendaylight.mdsal.binding.java.api.generator;
+import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.util.Types;
+import org.opendaylight.yangtools.yang.common.Empty;
+
/**
* Various constants when generating JAVA source code.
*/
*/
public static final String MEMBER_REGEX_LIST = "regexes";
+ // This should live in a common artifact
+ static final Type EMPTY = Types.typeForClass(Empty.class);
+
private Constants() {
}
import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
import org.opendaylight.mdsal.binding.model.api.Enumeration
import org.opendaylight.mdsal.binding.model.api.Type
+import org.opendaylight.mdsal.binding.model.util.Types
+import org.opendaylight.yangtools.yang.common.Empty
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
/**
* Template for generating JAVA class.
*/
class UnionTemplate extends ClassTemplate {
-
/**
* Creates instance of this class with concrete <code>genType</code>.
*
«ELSEIF BYTE_ARRAY.equals(propRet.typedefReturnType)»
««« generated byte[] typedef
return «Base64.importedName».getEncoder().encodeToString(«field».getValue());
+ «ELSEIF Constants.EMPTY.equals(propRet) || Constants.EMPTY.equals(propRet.typedefReturnType)»
+ ««« generated empty typedef
+ return "";
«ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
&& (propRet as GeneratedTransferObject).typedef // Is it a typedef
&& (propRet as GeneratedTransferObject).baseType instanceof BitsTypeDefinition»
import org.junit.Test;
import org.opendaylight.yangtools.yang.binding.ChildOf;
import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext;
+import org.opendaylight.yangtools.yang.common.Empty;
/**
* Test correct code generation.
CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdBits", "getIdBits", loader);
CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdBoolean");
CompilationTestUtils.assertContainsMethod(nodesClass, BigDecimal.class, "getIdDecimal64");
- CompilationTestUtils.assertContainsMethod(nodesClass, Boolean.class, "isIdEmpty");
+ CompilationTestUtils.assertContainsMethod(nodesClass, Empty.class, "getIdEmpty");
CompilationTestUtils.assertContainsMethod(nodesClass, pkg + ".Nodes$IdEnumeration", "getIdEnumeration", loader);
testReturnTypeIdentityref(nodesClass, "getIdIdentityref", pkg + ".Alg");
testReturnTypeInstanceIdentitifer(loader, nodesClass, "getIdInstanceIdentifier");
import java.util.List;
import java.util.regex.Pattern;
import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.Empty;
/**
* Test correct code generation.
assertFalse(unionExt4Class.isInterface());
CompilationTestUtils.assertContainsField(unionExt4Class, "_unionExt3", unionExt3Class);
CompilationTestUtils.assertContainsField(unionExt4Class, "_int32Ext2", int32Ext2Class);
- CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Boolean.class);
+ CompilationTestUtils.assertContainsField(unionExt4Class, "_empty", Empty.class);
CompilationTestUtils.assertContainsField(unionExt4Class, "_myDecimalType", myDecimalTypeClass);
CompilationTestUtils.assertContainsFieldWithValue(unionExt4Class, "serialVersionUID", Long.TYPE,
8089656970520476667L, new Class<?>[] { Boolean.class }, false);
assertEquals(5, unionExt4Class.getDeclaredFields().length);
CompilationTestUtils.assertContainsMethod(unionExt4Class, unionExt3Class, "getUnionExt3");
CompilationTestUtils.assertContainsMethod(unionExt4Class, int32Ext2Class, "getInt32Ext2");
- CompilationTestUtils.assertContainsMethod(unionExt4Class, Boolean.class, "isEmpty");
+ CompilationTestUtils.assertContainsMethod(unionExt4Class, Empty.class, "getEmpty");
CompilationTestUtils.assertContainsMethod(unionExt4Class, myDecimalTypeClass, "getMyDecimalType");
CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt3Class);
CompilationTestUtils.assertContainsConstructor(unionExt4Class, int32Ext2Class);
- CompilationTestUtils.assertContainsConstructor(unionExt4Class, Boolean.class);
+ CompilationTestUtils.assertContainsConstructor(unionExt4Class, Empty.class);
CompilationTestUtils.assertContainsConstructor(unionExt4Class, myDecimalTypeClass);
CompilationTestUtils.assertContainsConstructor(unionExt4Class, unionExt4Class);
assertEquals(5, unionExt4Class.getDeclaredConstructors().length);