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
Description
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
Labels
No labels