[ 
https://issues.apache.org/jira/browse/OLINGO-615?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Frederic Souchu updated OLINGO-615:
-----------------------------------
    Description: 
The serializer code path is missing a fallback for enumerated values, similar 
to collection or complex types.
(exception trace below)

How to reproduce:
- declare an enumerated field in EDM
- add enum value in entity set:
{code:java}
EntitySet entitySet = new EntitySetImpl();
entitySet.getEntities().add(new EntityImpl()
                .addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE, 
4864))
                .addProperty(new PropertyImpl("company.com.MyEnum", 
"EnumField", ValueType.ENUM, 2)));
{code}
- call serializer from servlet, an exception is raised: Property type not yet 
supported!

What is happening (as far as I can tell):
- EdmTypeInfo.java primitiveType member is null (as expected)
- enumType is correctly set to my custom enum type
- ODataJsonSerializer.java correctly evaluates the type as 'not primitive', 
tries various fallback scenario to throw an exception.
>> The appriopriate writePropertyValue method (where enum serialization code 
>> is) is never called!!
{code:java}
  private void writePropertyValue(final EdmProperty edmProperty,
      final Property property, final Set<List<String>> selectedPaths,
      final JsonGenerator json) throws IOException, SerializerException {
    try {
      if (edmProperty.isPrimitive()) {
        /* primitive handling code not executed for an enum !! */
      } else if (edmProperty.isCollection()) {
        writeComplexCollection((EdmComplexType) edmProperty.getType(), 
property, selectedPaths, json);
      } else if (property.isLinkedComplex()) {
        writeComplexValue((EdmComplexType) edmProperty.getType(), 
property.asLinkedComplex().getValue(),
            selectedPaths, json);
      } else if (property.isComplex()) {
        writeComplexValue((EdmComplexType) edmProperty.getType(), 
property.asComplex(), selectedPaths, json);
      } else {
        throw new SerializerException("Property type not yet supported!",
            SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, 
edmProperty.getName());
      }
    } catch (final EdmPrimitiveTypeException e) {
      /* error msg mgt */
    }
  }
{code}

Note: setting the value using:
{code:java}
.addProperty(new PropertyImpl("company.com.MyEnum", "EnumField", 
ValueType.PRIMITIVE, 2))
{code}
or
{code:java}
.addProperty(new PropertyImpl(null, "EnumField", ValueType.PRIMITIVE, 2))
{code}

yields the same exception:
{code:text}
ODataJsonSerializer.writePropertyValue(EdmProperty, Property, 
Set<List<String>>, JsonGenerator) line: 327       
ODataJsonSerializer.writeProperty(EdmProperty, Property, Set<List<String>>, 
JsonGenerator) line: 299    
ODataJsonSerializer.writeProperties(EdmStructuredType, List<Property>, 
SelectOption, JsonGenerator) line: 238   
ODataJsonSerializer.writeEntity(EdmEntityType, Entity, ContextURL, 
ExpandOption, SelectOption, JsonGenerator) line: 222 
ODataJsonSerializer.writeEntitySet(EdmEntityType, EntitySet, ExpandOption, 
SelectOption, JsonGenerator) line: 197       
ODataJsonSerializer.entityCollection(EdmEntityType, EntitySet, 
EntityCollectionSerializerOptions) line: 153     
TransactionProcessor.readEntityCollection(ODataRequest, ODataResponse, UriInfo, 
ContentType) line: 132  
ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, boolean, 
boolean, boolean) line: 597  
ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, 
UriResourcePartTyped) line: 583       
ODataHandler.handleResourceDispatching(ODataRequest, ODataResponse) line: 251   
ODataHandler.processInternal(ODataRequest, ODataResponse) line: 192     
ODataHandler.process(ODataRequest) line: 111    
ODataHttpHandlerImpl.process(HttpServletRequest, HttpServletResponse) line: 66  
TransactionJournalRestService.customerJournal() line: 95 (out of synch) 
TransactionJournalRestService$Proxy$_$$_WeldClientProxy.customerJournal() line: 
not available   
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available 
[native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39      
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597      
MethodInjectorImpl.invoke(HttpRequest, HttpResponse, Object) line: 167  
ResourceMethod.invokeOnTarget(HttpRequest, HttpResponse, Object) line: 269      
ResourceMethod.invoke(HttpRequest, HttpResponse, Object) line: 227      
ResourceMethod.invoke(HttpRequest, HttpResponse) line: 216      
SynchronousDispatcher.getResponse(HttpRequest, HttpResponse, ResourceInvoker) 
line: 542 
SynchronousDispatcher.invoke(HttpRequest, HttpResponse, ResourceInvoker) line: 
524      
SynchronousDispatcher.invoke(HttpRequest, HttpResponse) line: 126       
ServletContainerDispatcher.service(String, HttpServletRequest, 
HttpServletResponse, boolean) line: 208  
HttpServlet30Dispatcher(HttpServletDispatcher).service(String, 
HttpServletRequest, HttpServletResponse) line: 55        
HttpServlet30Dispatcher(HttpServletDispatcher).service(HttpServletRequest, 
HttpServletResponse) line: 50        
HttpServlet30Dispatcher(HttpServlet).service(ServletRequest, ServletResponse) 
line: 847 
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 
295      
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 214      
StandardWrapperValve.invoke(Request, Response) line: 231        
StandardContextValve.invoke(Request, Response) line: 149        
WebNonTxEmCloserValve.invoke(Request, Response) line: 50        
WebNonTxEmCloserValve.invoke(Request, Response) line: 50        
SecurityContextAssociationValve.invoke(Request, Response) line: 169     
StandardHostValve.invoke(Request, Response) line: 145   
ErrorReportValve.invoke(Request, Response) line: 97     
StandardEngineValve.invoke(Request, Response) line: 102 
CoyoteAdapter.service(Request, Response) line: 344      
Http11Processor.process(Socket) line: 856       
Http11Protocol$Http11ConnectionHandler.process(Socket) line: 653        
JIoEndpoint$Worker.run() line: 926      
Thread.run() line: 662  
{code}



  was:
The serializer code path is missing a fallback for enumerated values, similar 
to collection or complex types.

How to reproduce:
- declare an enumerated field in EDM
- add enum value in entity set:
{code:java}
EntitySet entitySet = new EntitySetImpl();
entitySet.getEntities().add(new EntityImpl()
                .addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE, 
4864))
                .addProperty(new PropertyImpl(null, "company.com.MyEnum", 
ValueType.ENUM, 2)));
{code}
- call serializer from servlet, an exception is raised: Property type not yet 
supported!

What is happening:
- EdmTypeInfo.java primitiveType member is null (as expected)
- enumType is correctly set to my custom enum type
- ODataJsonSerializer.java correctly evaluates the type as 'not primitive' and 
does not call the appriopriate writePropertyValue method (where enum 
serialization code is!!)
{code:java}
  private void writePropertyValue(final EdmProperty edmProperty,
      final Property property, final Set<List<String>> selectedPaths,
      final JsonGenerator json) throws IOException, SerializerException {
    try {
      if (edmProperty.isPrimitive()) {
        /* primitive handling code not executed for an enum !! */
      } else if (edmProperty.isCollection()) {
        writeComplexCollection((EdmComplexType) edmProperty.getType(), 
property, selectedPaths, json);
      } else if (property.isLinkedComplex()) {
        writeComplexValue((EdmComplexType) edmProperty.getType(), 
property.asLinkedComplex().getValue(),
            selectedPaths, json);
      } else if (property.isComplex()) {
        writeComplexValue((EdmComplexType) edmProperty.getType(), 
property.asComplex(), selectedPaths, json);
      } else {
        throw new SerializerException("Property type not yet supported!",
            SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, 
edmProperty.getName());
      }
    } catch (final EdmPrimitiveTypeException e) {
      /* error msg mgt */
    }
  }

{code}



> Unable to serialize custom enum type
> ------------------------------------
>
>                 Key: OLINGO-615
>                 URL: https://issues.apache.org/jira/browse/OLINGO-615
>             Project: Olingo
>          Issue Type: Bug
>          Components: odata4-server
>    Affects Versions: (Java) V4 4.0.0-beta-02
>            Reporter: Frederic Souchu
>
> The serializer code path is missing a fallback for enumerated values, similar 
> to collection or complex types.
> (exception trace below)
> How to reproduce:
> - declare an enumerated field in EDM
> - add enum value in entity set:
> {code:java}
> EntitySet entitySet = new EntitySetImpl();
> entitySet.getEntities().add(new EntityImpl()
>               .addProperty(new PropertyImpl(null, "ID", ValueType.PRIMITIVE, 
> 4864))
>               .addProperty(new PropertyImpl("company.com.MyEnum", 
> "EnumField", ValueType.ENUM, 2)));
> {code}
> - call serializer from servlet, an exception is raised: Property type not yet 
> supported!
> What is happening (as far as I can tell):
> - EdmTypeInfo.java primitiveType member is null (as expected)
> - enumType is correctly set to my custom enum type
> - ODataJsonSerializer.java correctly evaluates the type as 'not primitive', 
> tries various fallback scenario to throw an exception.
> >> The appriopriate writePropertyValue method (where enum serialization code 
> >> is) is never called!!
> {code:java}
>   private void writePropertyValue(final EdmProperty edmProperty,
>       final Property property, final Set<List<String>> selectedPaths,
>       final JsonGenerator json) throws IOException, SerializerException {
>     try {
>       if (edmProperty.isPrimitive()) {
>         /* primitive handling code not executed for an enum !! */
>       } else if (edmProperty.isCollection()) {
>         writeComplexCollection((EdmComplexType) edmProperty.getType(), 
> property, selectedPaths, json);
>       } else if (property.isLinkedComplex()) {
>         writeComplexValue((EdmComplexType) edmProperty.getType(), 
> property.asLinkedComplex().getValue(),
>             selectedPaths, json);
>       } else if (property.isComplex()) {
>         writeComplexValue((EdmComplexType) edmProperty.getType(), 
> property.asComplex(), selectedPaths, json);
>       } else {
>         throw new SerializerException("Property type not yet supported!",
>             SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, 
> edmProperty.getName());
>       }
>     } catch (final EdmPrimitiveTypeException e) {
>       /* error msg mgt */
>     }
>   }
> {code}
> Note: setting the value using:
> {code:java}
> .addProperty(new PropertyImpl("company.com.MyEnum", "EnumField", 
> ValueType.PRIMITIVE, 2))
> {code}
> or
> {code:java}
> .addProperty(new PropertyImpl(null, "EnumField", ValueType.PRIMITIVE, 2))
> {code}
> yields the same exception:
> {code:text}
> ODataJsonSerializer.writePropertyValue(EdmProperty, Property, 
> Set<List<String>>, JsonGenerator) line: 327     
> ODataJsonSerializer.writeProperty(EdmProperty, Property, Set<List<String>>, 
> JsonGenerator) line: 299  
> ODataJsonSerializer.writeProperties(EdmStructuredType, List<Property>, 
> SelectOption, JsonGenerator) line: 238 
> ODataJsonSerializer.writeEntity(EdmEntityType, Entity, ContextURL, 
> ExpandOption, SelectOption, JsonGenerator) line: 222       
> ODataJsonSerializer.writeEntitySet(EdmEntityType, EntitySet, ExpandOption, 
> SelectOption, JsonGenerator) line: 197     
> ODataJsonSerializer.entityCollection(EdmEntityType, EntitySet, 
> EntityCollectionSerializerOptions) line: 153   
> TransactionProcessor.readEntityCollection(ODataRequest, ODataResponse, 
> UriInfo, ContentType) line: 132        
> ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, boolean, 
> boolean, boolean) line: 597        
> ODataHandler.handleEntityDispatching(ODataRequest, ODataResponse, 
> UriResourcePartTyped) line: 583     
> ODataHandler.handleResourceDispatching(ODataRequest, ODataResponse) line: 251 
> ODataHandler.processInternal(ODataRequest, ODataResponse) line: 192   
> ODataHandler.process(ODataRequest) line: 111  
> ODataHttpHandlerImpl.process(HttpServletRequest, HttpServletResponse) line: 
> 66        
> TransactionJournalRestService.customerJournal() line: 95 (out of synch)       
> TransactionJournalRestService$Proxy$_$$_WeldClientProxy.customerJournal() 
> line: not available 
> NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
> available [native method]        
> NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39    
> DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25        
> Method.invoke(Object, Object...) line: 597    
> MethodInjectorImpl.invoke(HttpRequest, HttpResponse, Object) line: 167        
> ResourceMethod.invokeOnTarget(HttpRequest, HttpResponse, Object) line: 269    
> ResourceMethod.invoke(HttpRequest, HttpResponse, Object) line: 227    
> ResourceMethod.invoke(HttpRequest, HttpResponse) line: 216    
> SynchronousDispatcher.getResponse(HttpRequest, HttpResponse, ResourceInvoker) 
> line: 542       
> SynchronousDispatcher.invoke(HttpRequest, HttpResponse, ResourceInvoker) 
> line: 524    
> SynchronousDispatcher.invoke(HttpRequest, HttpResponse) line: 126     
> ServletContainerDispatcher.service(String, HttpServletRequest, 
> HttpServletResponse, boolean) line: 208        
> HttpServlet30Dispatcher(HttpServletDispatcher).service(String, 
> HttpServletRequest, HttpServletResponse) line: 55      
> HttpServlet30Dispatcher(HttpServletDispatcher).service(HttpServletRequest, 
> HttpServletResponse) line: 50      
> HttpServlet30Dispatcher(HttpServlet).service(ServletRequest, ServletResponse) 
> line: 847       
> ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) 
> line: 295    
> ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 214    
> StandardWrapperValve.invoke(Request, Response) line: 231      
> StandardContextValve.invoke(Request, Response) line: 149      
> WebNonTxEmCloserValve.invoke(Request, Response) line: 50      
> WebNonTxEmCloserValve.invoke(Request, Response) line: 50      
> SecurityContextAssociationValve.invoke(Request, Response) line: 169   
> StandardHostValve.invoke(Request, Response) line: 145 
> ErrorReportValve.invoke(Request, Response) line: 97   
> StandardEngineValve.invoke(Request, Response) line: 102       
> CoyoteAdapter.service(Request, Response) line: 344    
> Http11Processor.process(Socket) line: 856     
> Http11Protocol$Http11ConnectionHandler.process(Socket) line: 653      
> JIoEndpoint$Worker.run() line: 926    
> Thread.run() line: 662        
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to