[
https://issues.apache.org/jira/browse/TUSCANY-3696?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Simon Laws updated TUSCANY-3696:
--------------------------------
Fix Version/s: Java-SCA-2.x
> JSONP binding doesn't work with arrays
> --------------------------------------
>
> Key: TUSCANY-3696
> URL: https://issues.apache.org/jira/browse/TUSCANY-3696
> Project: Tuscany
> Issue Type: Bug
> Affects Versions: Java-SCA-1.4, Java-SCA-1.6, Java-SCA-2.0-M5
> Environment: All
> Reporter: Simon Laws
> Fix For: Java-SCA-2.x
>
>
> The JSONP binding doesn't apply the JSON conversion correctly when an
> operation parameter is of array type. This is because the data type model is
> set incorrectly in the array case.
> Both service and reference providers for the JSONP binding reset the binding
> interface contract databinding in order to enable JSON conversion using the
> JSON databinding using a line like....
> contract.getInterface().resetDataBinding("JSON2x");
> This works fine for ordinary parameters. What I didn't realize when I added
> this was that arrays are treated specially for some reason. There's code in
> InterfaceImpl which reads...
> private void setDataBinding(DataType dataType, String dataBinding) {
> if ("java:array".equals(dataType.getDataBinding())) {
> setDataBinding((DataType)dataType.getLogical(), dataBinding);
> } else {
> dataType.setDataBinding(dataBinding);
> }
> }
> When you then reset a databinding on an operation that has a parameter of an
> array type you get something like....
> Contract
> Interface
> Operation
> InputDataType
> Logical - databinding = java:array
> Logical - databinding = JSON2x
> This lead to the databinding code using the following transformations
> Input2InputTransformer
> Array2ArrayTransformer
> Object2JSONTransformer
> Where I would have expected
> Contract
> Interface
> Operation
> InputDataType
> Logical - databinding = JSON2x
> Logical - databinding = JSON2x
> Input2InputTransformer
> Object2JSONTransformer
> I don't know what the advantage of keeping the array databinding in place. I
> guess the point is that the databinding code may not be able to cope with
> array transfomation but it can in the JSON case. So I need to extend the
> databinding resetting code to read...
> contract.getInterface().resetDataBinding("JSON2x");
>
> // force array types to map to JSON also
> for (Operation operation : contract.getInterface().getOperations()){
> DataType<List<DataType>> inputTypes = operation.getInputType();
> for (DataType inputType : inputTypes.getLogical()){
> if ("java:array".equals(inputType.getDataBinding())){
> inputType.setDataBinding("JSON2x");
> }
> }
> DataType outputType = operation.getOutputType();
> if ("java:array".equals(outputType.getDataBinding())){
> outputType.setDataBinding("JSON2x");
> }
> }
> I may of course be missing something obvious to those who know about
> databinding.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira