import org.opendaylight.yangtools.concepts.Identifier;
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.util.ClassLoaderUtils;
+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.YangInstanceIdentifier.NodeIdentifierWithPredicates;
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;
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;
final String suffix = JavaIdentifierNormalizer.normalizeSpecificIdentifier(node.getQName().getLocalName(),
JavaIdentifier.CLASS);
- if ((typeDef.getPath().equals(node.getPath()) || typeDef.getBaseType() == null)
- && (typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition)) {
+ if (typeDef instanceof BooleanTypeDefinition
+ && (typeDef.getPath().equals(node.getPath()) || typeDef.getBaseType() == null)) {
return "is" + suffix;
}
@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 (Empty.class.equals(valueType)) {
+ return ValueTypeCodec.EMPTY_CODEC;
} else if (BindingReflections.isBindingClass(valueType)) {
return getCodecForBindingClass(valueType, instantiatedType);
}
this.valueType = Preconditions.checkNotNull(valueType);
}
- static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, TypeDefinition<?> typeDef) {
+ static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, final TypeDefinition<?> typeDef) {
return () -> {
final Method m;
if (typeDef instanceof BooleanTypeDefinition) {
import java.util.concurrent.ExecutionException;
import org.opendaylight.mdsal.binding.javav2.runtime.reflection.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;
public Object serialize(final Object arg0) {
// Empty type has null value in NormalizedNode and Composite Node
// representation
- return null;
+ return Empty.getInstance();
}
@Override
public Object deserialize(final Object arg0) {
- /* 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.
+ /* Empty type has Empty representation in Binding-aware world
+ * otherwise it is null.
+ * So when codec is triggered, empty leaf is present and its
+ * value is Empty.getInstance(), that means we are safe to
+ * return it directly.
*/
- return Boolean.TRUE;
+ return arg0;
}
};
return EnumerationCodec.loader(typeClz, (EnumTypeDefinition) rootType);
} else if (rootType instanceof BitsTypeDefinition) {
return BitsCodec.loader(typeClz, (BitsTypeDefinition) rootType);
- } else if (rootType instanceof EmptyTypeDefinition) {
- return EMPTY_LOADER;
}
+
return EncapsulatedValueCodec.loader(typeClz, def);
}
@SuppressWarnings("rawtypes")
- public static ValueTypeCodec encapsulatedValueCodecFor(final Class<?> typeClz, final TypeDefinition<?> typeDef,
+ public static ValueTypeCodec encapsulatedValueCodecFor(final Class<?> typeClz, final TypeDefinition<?> typeDef,
final Codec delegate) {
final SchemaUnawareCodec extractor = getCachedSchemaUnawareCodec(typeClz,
EncapsulatedValueCodec.loader(typeClz, typeDef));
package org.opendaylight.mdsal.binding.javav2.dom.codec.impl;
import static org.junit.Assert.assertEquals;
+import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
import java.util.Map.Entry;
import javassist.ClassPool;
import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.data.DefaultPolicy;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.data.TestCont;
import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.dto.DefaultPolicyBuilder;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.dto.TestContBuilder;
import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.type.PolicyLoggingFlag;
+import org.opendaylight.mdsal.gen.javav2.urn.test.simple.test.typedef.rev170829.type.TypedefEmpty;
+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.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
public class TypedefTest extends AbstractBindingRuntimeTest {
private static final InstanceIdentifier<DefaultPolicy> BA_DEFAULT_POLICY =
InstanceIdentifier.builder(DefaultPolicy.class).build();
+ private static final InstanceIdentifier<TestCont> BA_TEST_CONT =
+ InstanceIdentifier.builder(TestCont.class).build();
+
+ private static final QName EMPTY_LEAF = QName.create(TestCont.QNAME, "empty-leaf");
+ private static final QName EMPTY_LEAF2 = QName.create(TestCont.QNAME, "empty-leaf2");
+ private static final QName EMPTY_LEAF3 = QName.create(TestCont.QNAME, "empty-leaf3");
+ private static final YangInstanceIdentifier BI_TESTCONT_PATH = YangInstanceIdentifier.of(TestCont.QNAME);
+
private BindingNormalizedNodeCodecRegistry registry;
@Override
assertEquals(binding,readed.getValue());
}
+
+ private static TestCont getTypedefEmptyTypeBindingData() {
+ return new TestContBuilder()
+ .setEmptyLeaf(Empty.getInstance())
+ .setEmptyLeaf2(TypedefEmpty.getDefaultInstance())
+ .setEmptyLeaf3(Empty.getInstance())
+ .build();
+ }
+
+ private static ContainerNode getTypedefEmptyTypeNormalizedData() {
+ return ImmutableContainerNodeBuilder.create()
+ .withNodeIdentifier(new NodeIdentifier(TestCont.QNAME))
+ .withChild(leafNode(EMPTY_LEAF, Empty.getInstance()))
+ .withChild(leafNode(EMPTY_LEAF2, Empty.getInstance()))
+ .withChild(leafNode(EMPTY_LEAF3, Empty.getInstance()))
+ .build();
+ }
+
+ @Test
+ public void testTypedefEmptyTypeToNormalizedData() {
+ final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
+ registry.toNormalizedNode(BA_TEST_CONT, getTypedefEmptyTypeBindingData());
+
+ assertEquals(getTypedefEmptyTypeNormalizedData(), dom.getValue());
+ }
+
+ @Test
+ public void testTypedefEmptyTypeFromNormalizedData() {
+ final Entry<InstanceIdentifier<?>, TreeNode> readed =
+ registry.fromNormalizedNode(BI_TESTCONT_PATH, getTypedefEmptyTypeNormalizedData());
+
+ assertEquals(getTypedefEmptyTypeBindingData(), readed.getValue());
+ }
}
import org.opendaylight.mdsal.binding.javav2.model.api.Type;
import org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier;
import org.opendaylight.mdsal.binding.javav2.util.BindingMapping;
+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 = Types.typeForClass(Boolean.class);
+ public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class);
/**
* <code>Type</code> representation of <code>enumeration</code> YANG type
@defaultInstance() = {
@if(genTo.isTypedef && !allProperties.isEmpty && !genTo.isUnionType) {
+ @if("org.opendaylight.yangtools.yang.common.Empty".equals(allProperties.get(0).getReturnType.getFullyQualifiedName)) {
+ public static @{genTo.getName} getDefaultInstance() {
+ return new @{genTo.getName}(Empty.getInstance());
+ }
+ } else {
@if(!"org.opendaylight.mdsal.binding.javav2.spec.base.InstanceIdentifier".equals(allProperties.get(0).getReturnType.getFullyQualifiedName)) {
public static @{genTo.getName} getDefaultInstance(String defaultValue) {
@if(allProperties.size > 1) {
}
}
}
+ }
}
}
\ No newline at end of file
type boolean;
}
+ typedef typedef-empty {
+ type empty;
+ }
+
container default-policy{
leaf action {
type boolean;
default "true";
}
}
+
+ container test-cont{
+ leaf empty-leaf {
+ type empty;
+ }
+
+ leaf empty-leaf2 {
+ type typedef-empty;
+ }
+
+ leaf empty-leaf3{
+ type empty;
+ default "";
+ }
+ }
}