Skip to content
This repository was archived by the owner on Feb 12, 2022. It is now read-only.
This repository was archived by the owner on Feb 12, 2022. It is now read-only.

Interger as name of Type produces a ClassCastException during parsing #679

Open
@pierCo

Description

@pierCo

When I attempt to parse a RAML definition that contains a type where its name is an Integer it failed. A ClassCastException is thrown.

I try to fix that by patch the source code of TypeDeclaration.java. It works but after a few search in the source code this error could be produced at many places.

So my question is more: is it allowed to use Integer as key of a type (or another resource)?
And if not, how to handle this error more cleanly? For example, to indicate that the RAML definition is invalid.

Attempt to fix the issue

I try to fix that by patch the source code of TypeDeclaration.java as below:

    public String name()
    {
        if (node instanceof PropertyNode)
        {
            return ((PropertyNode) node).getName();
        }
        // Code that produces the ClassCastException
        // String keyValue = ((StringNode) node.getKey()).getValue();
        String keyValue = getValueAsString(node)
        Node parentTypeNode = node.getValue();
        if (node.getParent() instanceof TypeDeclarationNode && parentTypeNode instanceof TypeExpressionNode)
        {
            // getting name of parent type
            if (parentTypeNode instanceof ExternalSchemaTypeExpressionNode)
            {
                return null;
            }
            return ((TypeExpressionNode) parentTypeNode).getTypeExpressionText();
        }
        return keyValue;
    }

    // COPY PASTE OF the class PropertyUtils.java
    private static String getValueAsString(KeyValueNode node)
    {
        final String keyValue;
        if (node.getKey() instanceof IntegerNode)
        {
            keyValue = String.valueOf(((IntegerNode) node.getKey()).getValue());
        }
        else
        {
            StringNode key = (StringNode) node.getKey();
            keyValue = key.getValue();
        }
        return keyValue;
    }

Error information

RAML Content

#%RAML 1.0
title: "Tasks API"
version: "1.1.0"
types:
  125:
    type: "object"
    description: "An object"
    properties:
      id:
        type: "string"
/tasks:
  get:
    body:
      application/json:
        type: "125"

Error stack trace

Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.raml.yagi.framework.model.ModelProxyBuilder$SimpleProxy.fromMethod(ModelProxyBuilder.java:98)
	at org.raml.yagi.framework.model.ModelProxyBuilder$SimpleProxy.invoke(ModelProxyBuilder.java:74)
	... 38 more
Caused by: java.lang.ClassCastException: class org.raml.yagi.framework.nodes.snakeyaml.SYIntegerNode cannot be cast to class org.raml.yagi.framework.nodes.StringNode (org.raml.yagi.framework.nodes.snakeyaml.SYIntegerNode and org.raml.yagi.framework.nodes.StringNode are in unnamed module of loader 'app')
	at org.raml.v2.internal.impl.commons.model.type.TypeDeclaration.name(TypeDeclaration.java:99)
	... 44 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions