[YANGTOOLS-127] yang-data-api: ClassCastException when serializing enums Created: 02/Apr/14  Updated: 10/Apr/22  Resolved: 08/Apr/14

Status: Resolved
Project: yangtools
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Tomas Olvecky Assignee: Ladislav Borak
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


Issue Links:
Duplicate
duplicates YANGTOOLS-101 YANG Enumeration type is not handled. Resolved
External issue ID: 646

 Description   

I am testing minimal toaster distro found here:
https://git.opendaylight.org/gerrit/#/c/5825/

Steps to reproduce:
run odl with toaster
do
curl http://localhost:8080/restconf/operational/toaster:toaster/ -v
An exception appears in logs: (some JSON is returned to the http client)

2014-04-02 08:56:44.325 CEST [qtp1112930044-117] ERROR o.o.c.sal.restconf.impl.RestCodec - ClassCastException was thrown when codec is invoked with parameter Up
java.lang.ClassCastException: org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster$ToasterStatus cannot be cast to java.lang.String
at org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec$EnumCodecStringImpl.serialize(TypeDefinitionAwareCodec.java:509) ~[bundlefile:na]
at org.opendaylight.controller.sal.restconf.impl.RestCodec$ObjectCodec.serialize(RestCodec.java:135) ~[bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.JsonMapper.writeValueOfNodeByType(JsonMapper.java:240) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.JsonMapper.writeLeaf(JsonMapper.java:193) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.JsonMapper.writeChildrenOfParent(JsonMapper.java:118) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.JsonMapper.writeContainer(JsonMapper.java:154) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.JsonMapper.write(JsonMapper.java:70) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.StructuredDataToJsonProvider.writeTo(StructuredDataToJsonProvider.java:61) [bundlefile:na]
at org.opendaylight.controller.sal.rest.impl.StructuredDataToJsonProvider.writeTo(StructuredDataToJsonProvider.java:33) [bundlefile:na]
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) [jersey-server-1.17.jar:1.17]
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479) [jersey-server-1.17.jar:1.17]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) [jersey-server-1.17.jar:1.17]
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) [jersey-server-1.17.jar:1.17]
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) [bundlefile:na]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) [bundlefile:na]
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) [bundlefile:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [bundlefile:3.1.0]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:711) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1112) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:479) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1046) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.Server.handle(Server.java:462) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:281) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.io.AbstractConnection$1.run(AbstractConnection.java:505) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) [bundlefile:9.1.3.v20140225]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) [bundlefile:9.1.3.v20140225]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]


This is probably related to the fact that org.opendaylight.yangtools.yang.data.api.codec.EnumCodec#serialize has String parameter and ToasterStatus is an enum? Deserialization also looks suspicious IMO



 Comments   
Comment by Ladislav Borak [ 07/Apr/14 ]

I tried to reproduce this bug using:

https://git.opendaylight.org/gerrit/#/c/5825/

and

curl http://localhost:8080/restconf/operational/toaster:toaster/ -v

and response was:

GET /restconf/operational/toaster:toaster/ HTTP/1.1
User-Agent: curl/7.18.0 (i586-pc-mingw32msvc) libcurl/7.18.0 zlib/1.2.3
Host: 192.168.9.1:8080
Accept: /

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Cache-Control: private
Expires: Thu, 01 Jan 1970 01:00:00 CET
Content-Type: application/yang.data+json
Transfer-Encoding: chunked
Date: Mon, 07 Apr 2014 07:25:40 GMT

{
"toaster":

{ "toasterManufacturer": "Opendaylight", "toasterModelNumber": "Model 1 - Binding Aware", "toasterStatus": "Up" }

}

It seems to be, it works correctly.

Comment by Ladislav Borak [ 07/Apr/14 ]

Propsed patch:

https://git.opendaylight.org/gerrit/#/c/5938/

Generated at Wed Feb 07 20:52:20 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.