[MDSAL-647] org.opendaylight.mdsal.binding.model.ietf.rfc8776 generated classes from typedef -> typedef -> enumeration Created: 30/Nov/20 Updated: 02/May/23 Resolved: 02/May/23 |
|
| Status: | Resolved |
| Project: | mdsal |
| Component/s: | Binding codegen |
| Affects Version/s: | None |
| Fix Version/s: | 8.0.0 |
| Type: | Bug | Priority: | Medium |
| Reporter: | Emmanuelle Delfour | Assignee: | Robert Varga |
| Resolution: | Done | Votes: | 0 |
| Labels: | pt | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Attachments: |
|
| Description |
|
In ietf-te-types yang model there is a type definition “te-common-status” which type is enumeration. This type definition is used to declare 2 another type definitions:
typedef te-oper-status {
type te-common-status;
description
"Defines a type representing the operational status of
a TE resource.";
}
typedef te-admin-status {
type te-common-status;
description
"Defines a type representing the administrative status of
a TE resource.";
}
The generated classes from te-oper-status (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev200610. TeOperStatus) and te-admin-status (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev200610. TeAdminStatus) are empty Class. Shouldn’t they be Enum instead ? I ask this question because when I try to serialize object using them I got the following exception
Exception in thread "main" java.lang.IllegalArgumentException
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:128)
at org.opendaylight.mdsal.binding.dom.codec.impl.EnumerationCodec.loader(EnumerationCodec.java:38)
at org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.getCodecLoader(ValueTypeCodec.java:87)
at org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.getCodecFor(ValueTypeCodec.java:65)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getCodecForBindingClass(BindingCodecContext.java:448)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getCodec(BindingCodecContext.java:421)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getLeafNodesUsingReflection(BindingCodecContext.java:371)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getLeafNodes(BindingCodecContext.java:356)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.<init>(DataObjectCodecContext.java:112)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.<init>(DataObjectCodecContext.java:104)
at org.opendaylight.mdsal.binding.dom.codec.impl.ContainerNodeCodecContext.<init>(ContainerNodeCodecContext.java:20)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.createInstance(DataContainerCodecPrototype.java:261)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.loadInstance(DataContainerCodecPrototype.java:245)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.get(DataContainerCodecPrototype.java:238)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.streamChild(DataObjectCodecContext.java:266)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingToNormalizedStreamWriter.enter(BindingToNormalizedStreamWriter.java:80)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingToNormalizedStreamWriter.startContainerNode(BindingToNormalizedStreamWriter.java:179)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev200806.networks.network.link.Te$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamContainer(DataObjectStreamer.java:90)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev200806.Link1$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.emitAugmentation(DataObjectStreamer.java:176)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamAugmentations(DataObjectStreamer.java:63)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.commonStreamList(DataObjectStreamer.java:153)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamMap(DataObjectStreamer.java:133)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.emitAugmentation(DataObjectStreamer.java:176)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamAugmentations(DataObjectStreamer.java:63)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.commonStreamList(DataObjectStreamer.java:153)
at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamMap(DataObjectStreamer.java:133)
at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks$$$streamer.serialize(Unknown Source)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.toNormalizedNode(BindingCodecContext.java:506)
at org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices.toNormalizedNode(ForwardingBindingDOMCodecServices.java:67)
at org.test.Serialization.serialize(Serialization.java:136)
at org.test.Serialization.main(Serialization.java:147)
I have attached to this mail a code sample to reproduce the problem. |
| Comments |
| Comment by Robert Varga [ 02/May/23 ] |
|
So this is nominally a duplicate of MDSAL-503, I think. This particular failure was addressed https://git.opendaylight.org/gerrit/c/mdsal/+/94297 by us not generating the classes anymore. This may seem counter-intuitive, but now TeCommonStatus serves both cases and its use in leaf types should result in run-time checks whether the enum satisties any restrictions on the used value. Since the enumeration maps to a java.lang.Enum, which is implicitly final, the only way we could address the non-presence of TeOperState is to push the enumeration into an inner type and have TeCommonType become a TypeObject (instead of EnumTypeObject) holding a single value. If that is a desired outcome, we can consider it in one of the major releases – please file a separate issue if that is the case. |