--- /dev/null
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.mdsal.binding.dom.codec.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.mdsal552.norev.Mdsal552Data.OutputA;
+import org.opendaylight.yang.gen.v1.mdsal552.norev.RefTestOutput;
+import org.opendaylight.yang.gen.v1.mdsal552.norev.RefTestOutputBuilder;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+
+public class Mdsal552Test extends AbstractBindingCodecTest {
+ private static final SchemaPath OUTPUT_PATH = SchemaPath.create(true, QName.create(RefTestOutput.QNAME, "ref_test"),
+ RefTestOutput.QNAME);
+ private static final QName OUTPUTREF = QName.create(RefTestOutput.QNAME, "outputref");
+
+ @Test
+ public void testLeafrefEnumerationToNormalized() throws IOException {
+ assertEquals(Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(RefTestOutput.QNAME))
+ .withChild(ImmutableNodes.leafNode(OUTPUTREF, OutputA.DownTest.getName()))
+ .build(),
+ codecContext.toNormalizedNodeRpcData(new RefTestOutputBuilder().setOutputref(OutputA.DownTest).build()));
+ }
+
+ @Test
+ public void testLeafrefEnumerationFromNormalized() throws IOException {
+ assertEquals(new RefTestOutputBuilder().setOutputref(OutputA.DownTest).build(),
+ codecContext.fromNormalizedNodeRpcData(OUTPUT_PATH, Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(RefTestOutput.QNAME))
+ .withChild(ImmutableNodes.leafNode(OUTPUTREF, OutputA.DownTest.getName()))
+ .build()));
+ }
+}
import org.opendaylight.mdsal.binding.model.api.AccessModifier;
import org.opendaylight.mdsal.binding.model.api.Constant;
import org.opendaylight.mdsal.binding.model.api.DefaultType;
+import org.opendaylight.mdsal.binding.model.api.Enumeration;
import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
import org.opendaylight.mdsal.binding.model.api.GeneratedType;
import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
genCtx.put(module.getQNameModule(), context);
allTypeDefinitionsToGenTypes(context);
groupingsToGenTypes(context, module.getGroupings());
- rpcMethodsToGenType(context);
allIdentitiesToGenTypes(context);
- notificationsToGenType(context);
if (!module.getChildNodes().isEmpty()) {
final GeneratedTypeBuilder moduleType = moduleToDataType(context);
context.addModuleNode(moduleType);
resolveDataSchemaNodes(context, moduleType, moduleType, module.getChildNodes(), false);
}
+
+ // Resolve RPCs and notifications only after we have created instantiated tree
+ rpcMethodsToGenType(context);
+ notificationsToGenType(context);
return context;
}
* @param module Module in which type should be generated
* @return enumeration builder which contains data from <code>enumTypeDef</code>
*/
- private EnumBuilder resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName,
+ private Enumeration resolveInnerEnumFromTypeDefinition(final EnumTypeDefinition enumTypeDef, final QName enumName,
final GeneratedTypeBuilder typeBuilder, final ModuleContext context) {
- if (enumTypeDef != null && typeBuilder != null && enumTypeDef.getQName().getLocalName() != null) {
- final EnumBuilder enumBuilder = typeBuilder.addEnumeration(BindingMapping.getClassName(enumName));
- typeProvider.addEnumDescription(enumBuilder, enumTypeDef);
- enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
- context.addInnerTypedefType(enumTypeDef.getPath(), enumBuilder);
- return enumBuilder;
- }
- return null;
+ final EnumBuilder enumBuilder = typeBuilder.addEnumeration(BindingMapping.getClassName(enumName));
+ typeProvider.addEnumDescription(enumBuilder, enumTypeDef);
+ enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
+ final Enumeration ret = enumBuilder.toInstance(typeBuilder);
+ context.addTypeToSchema(ret, enumTypeDef);
+ context.addInnerTypedefType(enumTypeDef.getPath(), ret);
+ return ret;
}
/**
final TypeDefinition<?> typeDef = CompatUtils.compatType(leaf);
if (isInnerType(leaf, typeDef)) {
if (typeDef instanceof EnumTypeDefinition) {
- returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, inGrouping);
final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef;
- final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(),
- typeBuilder, context);
- if (enumBuilder != null) {
- returnType = enumBuilder.toInstance(typeBuilder);
- }
+ returnType = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(), typeBuilder, context);
typeProvider.putReferencedType(leaf.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
Type returnType = null;
if (typeDef.getBaseType() == null) {
if (typeDef instanceof EnumTypeDefinition) {
- returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, inGrouping);
final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef;
- final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName,
- typeBuilder, context);
- returnType = DefaultType.of(enumBuilder);
+ returnType = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName, typeBuilder, context);
typeProvider.putReferencedType(node.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
final UnionTypeDefinition unionDef = (UnionTypeDefinition)typeDef;
--- /dev/null
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.mdsal.binding.generator.impl;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.mdsal.binding.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
+import org.opendaylight.mdsal.binding.model.api.MethodSignature;
+import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
+
+public class Mdsal552Test {
+ private static final JavaTypeName BAR_INPUT =
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal552.norev", "BarInput");
+ private static final JavaTypeName BAZ =
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal552.norev", "Baz");
+ private static final JavaTypeName ENUMERATION =
+ JavaTypeName.create("org.opendaylight.yang.gen.v1.mdsal552.norev", "Mdsal552Data").createEnclosed("Foo");
+
+ @Test
+ public void enumLeafrefTest() {
+ final List<Type> types = DefaultBindingGenerator.generateFor(
+ YangParserTestUtils.parseYangResource("/mdsal552.yang"));
+ assertNotNull(types);
+ assertEquals(5, types.size());
+
+ final Type baz = types.stream()
+ .filter(type -> BAZ.equals(type.getIdentifier()))
+ .findFirst().orElseThrow();
+ assertThat(baz, instanceOf(GeneratedType.class));
+ final MethodSignature bazGetRef = ((GeneratedType) baz).getMethodDefinitions().stream()
+ .filter(method -> method.getName().equals("getRef"))
+ .findFirst().orElseThrow();
+ assertEquals(ENUMERATION, bazGetRef.getReturnType().getIdentifier());
+
+ final Type input = types.stream()
+ .filter(type -> BAR_INPUT.equals(type.getIdentifier()))
+ .findFirst().orElseThrow();
+ assertThat(input, instanceOf(GeneratedType.class));
+ final MethodSignature inputGetRef = ((GeneratedType) input).getMethodDefinitions().stream()
+ .filter(method -> method.getName().equals("getRef"))
+ .findFirst().orElseThrow();
+ assertEquals(ENUMERATION, inputGetRef.getReturnType().getIdentifier());
+ }
+}
--- /dev/null
+module mdsal552 {
+ prefix mdsal552;
+ namespace mdsal552;
+
+ leaf foo {
+ type enumeration {
+ enum one;
+ }
+ }
+
+ container baz {
+ leaf ref {
+ type leafref {
+ path /foo;
+ }
+ }
+ }
+
+ rpc bar {
+ input {
+ leaf ref {
+ type leafref {
+ path /foo;
+ }
+ }
+ }
+ }
+}
--- /dev/null
+module mdsal552 {
+ yang-version 1.1;
+ namespace "mdsal552";
+ prefix mdsal552;
+
+ leaf output_a {
+ type enumeration {
+ enum uptest {
+ value 0;
+ }
+ enum down_test {
+ value 1;
+ }
+ }
+ }
+
+ rpc ref_test {
+ description "RPC enum validation using leafref";
+ input {
+ leaf input_a {
+ type uint32;
+ }
+ }
+ output {
+ leaf outputref {
+ type leafref {
+ path "/output_a";
+ }
+ }
+ }
+ }
+}