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-2.0-M5, Java-SCA-1.6, Java-SCA-1.4
Environment: All
Reporter: Simon Laws
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.
-
You can reply to this email to add a comment to the issue online.