[ https://issues.apache.org/jira/browse/SLING-10485?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Bertrand Delacretaz updated SLING-10485: ---------------------------------------- Description: Working on the [sample-graphql-api|https://github.com/apache/sling-whiteboard/tree/master/remote-content-api/sample-graphql-api] exposed the need for converting the Objects provided by the graphql-java parser to our own types, if we want to continue hiding the graphql-java APIs (which I think is good). In that sample module (at commit c4f0a930), this query, which uses an {{ObjectScalar}} for its {{input argument}}: {code:java} mutation { command(lang: "echo", input: {structuredJSONdata: { isSupported: true, for: "things like this", as: {json: "data"} }, moreData: { isOk :true, comment : "as well" } } ) { success output help } } {code} Outputs {code:java} { "data": { "command": { "success": true, "output": "ObjectValue{objectFields=[ObjectField{name='structuredJSONdata', value=ObjectValue{objectFields=[ObjectField{name='isSupported', value=BooleanValue{value=true}}, ObjectField{name='for', value=StringValue{value='things like this'}}, ObjectField{name='as', value=ObjectValue{objectFields=[ObjectField{name='json', value=StringValue{value='data'}}]}}]}}, ObjectField{name='moreData', value=ObjectValue{objectFields=[ObjectField{name='isOk', value=BooleanValue{value=true}}, ObjectField{name='comment', value=StringValue{value='as well'}}]}}]}", "help": "Echoes its input" } } } {code} With the ObjectValue (from the [graphql-java language package|https://github.com/graphql-java/graphql-java/tree/master/src/main/java/graphql/language]) converted to String instead of JSON. To fix this, the {{output}} field in that schema needs to use the {{Object}} which the {{ObjectScalar}} from that module handles, but doing that causes a JSON conversion error, as the Johnzon library that we use to convert the query result to JSON doesn't know that {{ObjectValue}} type. To avoid that issue I think we need to provide a helper that the {{ObjectScalar}} can use to convert the input object to an API that Johnzon understands and that's independent from the graphql-java APIs. To test this, the {{input}} field should work for all types such as String, Int, Float, Boolean, Arrays of those and JSON. It even looks like arrays of heterogenous types are supported, this Mutation works: {code:java} mutation { command(lang: "echo", input: [12, 34.5, "testing", {some: "json"}]) { success output help } } {code} was: Working on the [sample-graphql-api|https://github.com/apache/sling-whiteboard/tree/master/remote-content-api/sample-graphql-api] exposed the need for converting the Objects provided by the graphql-java parser to our own types, if we want to continue hiding the graphql-java APIs (which I think is good). In that sample module (at commit dbb38a24), this query, which uses an {{ObjectScalar}} for its {{input argument}}: {code:java} mutation { command(lang: "echo", input: {structuredJSONdata: { isSupported: true, for: "things like this", as: {json: "data"} }, moreData: { isOk :true, comment : "as well" } } ) { success output help } } {code} Outputs {code:java} { "data": { "command": { "success": true, "output": "ObjectValue{objectFields=[ObjectField{name='structuredJSONdata', value=ObjectValue{objectFields=[ObjectField{name='isSupported', value=BooleanValue{value=true}}, ObjectField{name='for', value=StringValue{value='things like this'}}, ObjectField{name='as', value=ObjectValue{objectFields=[ObjectField{name='json', value=StringValue{value='data'}}]}}]}}, ObjectField{name='moreData', value=ObjectValue{objectFields=[ObjectField{name='isOk', value=BooleanValue{value=true}}, ObjectField{name='comment', value=StringValue{value='as well'}}]}}]}", "help": "Echoes its input" } } } {code} With the ObjectValue (from the [graphql-java language package|https://github.com/graphql-java/graphql-java/tree/master/src/main/java/graphql/language]) converted to String instead of JSON. To fix this, the {{output}} field in that schema needs to use the {{Object}} which the {{ObjectScalar}} from that module handles, but doing that causes a JSON conversion error, as the Johnzon library that we use to convert the query result to JSON doesn't know that {{ObjectValue}} type. To avoid that issue I think we need to provide a helper that the {{ObjectScalar}} can use to convert the input object to an API that Johnzon understands and that's independent from the graphql-java APIs. To test this, the {{input}} field should work for all types such as String, Int, Float, Boolean, Arrays of those and JSON. It even looks like arrays of heterogenous types are supported, this Mutation works: {code:java} mutation { command(lang: "echo", input: [12, 34.5, "testing", {some: "json"}]) { success output help } } {code} > Helpers to convert GraphQL types in Object scalars > -------------------------------------------------- > > Key: SLING-10485 > URL: https://issues.apache.org/jira/browse/SLING-10485 > Project: Sling > Issue Type: Improvement > Components: GraphQL > Affects Versions: GraphQL Core 0.0.10 > Reporter: Bertrand Delacretaz > Priority: Minor > > Working on the > [sample-graphql-api|https://github.com/apache/sling-whiteboard/tree/master/remote-content-api/sample-graphql-api] > exposed the need for converting the Objects provided by the graphql-java > parser to our own types, if we want to continue hiding the graphql-java APIs > (which I think is good). > In that sample module (at commit c4f0a930), this query, which uses an > {{ObjectScalar}} for its {{input argument}}: > {code:java} > mutation { > command(lang: "echo", input: > {structuredJSONdata: > { > isSupported: true, > for: "things like this", > as: {json: "data"} > }, > moreData: { > isOk :true, > comment : "as well" > } > } > ) { > success > output > help > } > } > {code} > Outputs > {code:java} > { > "data": { > "command": { > "success": true, > "output": > "ObjectValue{objectFields=[ObjectField{name='structuredJSONdata', > value=ObjectValue{objectFields=[ObjectField{name='isSupported', > value=BooleanValue{value=true}}, ObjectField{name='for', > value=StringValue{value='things like this'}}, ObjectField{name='as', > value=ObjectValue{objectFields=[ObjectField{name='json', > value=StringValue{value='data'}}]}}]}}, ObjectField{name='moreData', > value=ObjectValue{objectFields=[ObjectField{name='isOk', > value=BooleanValue{value=true}}, ObjectField{name='comment', > value=StringValue{value='as well'}}]}}]}", > "help": "Echoes its input" > } > } > } > {code} > With the ObjectValue (from the [graphql-java language > package|https://github.com/graphql-java/graphql-java/tree/master/src/main/java/graphql/language]) > converted to String instead of JSON. > To fix this, the {{output}} field in that schema needs to use the {{Object}} > which the {{ObjectScalar}} from that module handles, but doing that causes a > JSON conversion error, as the Johnzon library that we use to convert the > query result to JSON doesn't know that {{ObjectValue}} type. > To avoid that issue I think we need to provide a helper that the > {{ObjectScalar}} can use to convert the input object to an API that Johnzon > understands and that's independent from the graphql-java APIs. > To test this, the {{input}} field should work for all types such as String, > Int, Float, Boolean, Arrays of those and JSON. > It even looks like arrays of heterogenous types are supported, this Mutation > works: > > {code:java} > mutation { > command(lang: "echo", input: [12, 34.5, "testing", {some: "json"}]) { > success > output > help > } > } > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)