[ 
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

        

Reply via email to