From 2729709882692f467eb7efd67da251627e18cdc9 Mon Sep 17 00:00:00 2001 From: slaws Date: Mon, 9 Jan 2012 10:35:27 +0000 Subject: TUSCANY-3910, TUSCANY-3804 - Set ranking so that JAXWSInterfaceProcessor runs before WrapperJavaInterfaceProcess and apply 3804 style changes to ensure the output wrapper databinding is set separately from the output wrapper. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1229088 13f79535-47bb-0310-9956-ffa450edef68 --- .../processor/WrapperJavaInterfaceProcessor.java | 73 ++++++++++++++++++---- 1 file changed, 61 insertions(+), 12 deletions(-) (limited to 'sca-java-2.x/trunk/modules/core-databinding/src/main/java/org') diff --git a/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/WrapperJavaInterfaceProcessor.java b/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/WrapperJavaInterfaceProcessor.java index d152c0dc0a..7bae80d2c4 100644 --- a/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/WrapperJavaInterfaceProcessor.java +++ b/sca-java-2.x/trunk/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/processor/WrapperJavaInterfaceProcessor.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.databinding.DataBinding; import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; import org.apache.tuscany.sca.databinding.WrapperHandler; import org.apache.tuscany.sca.databinding.javabeans.JavaBeansDataBinding; @@ -60,24 +61,41 @@ public class WrapperJavaInterfaceProcessor implements JavaInterfaceVisitor { if (inputWrapperInfo == null || outputWrapperInfo == null) { continue; } - // JIRA: TUSCANY-842 + // TUSCANY-824 + // TUSCANY-3804 - modify the existing code to set up the input wrapper String db = inputWrapperInfo.getDataBinding(); if (db == null || JAXB_DATABINDING.equals(db)) { - db = assignOperationDataBinding(operation); + db = assignInputDataBinding(operation); } // Introspect the wrapper data type - org.apache.tuscany.sca.databinding.DataBinding dbObj = dataBindingRegistry.getDataBinding(db); + DataBinding dbObj = dataBindingRegistry.getDataBinding(db); WrapperHandler handler = dbObj == null ? null : dbObj.getWrapperHandler(); if (handler != null) { inputWrapperInfo.setWrapperType(handler.getWrapperType(operation, true)); - outputWrapperInfo.setWrapperType(handler.getWrapperType(operation, false)); } if (dbObj != null && handler == null) { // To avoid JAXB wrapper bean generation inputWrapperInfo.setWrapperType(null); - outputWrapperInfo.setWrapperType(null); } + + // TUSCANY-3804 - handle output wrapper separately + db = outputWrapperInfo.getDataBinding(); + if (db == null || JAXB_DATABINDING.equals(db)) { + db = assignOutputDataBinding(operation); + } + + // Introspect the wrapper data type + dbObj = dataBindingRegistry.getDataBinding(db); + handler = dbObj == null ? null : dbObj.getWrapperHandler(); + if (handler != null) { + outputWrapperInfo.setWrapperType(handler.getWrapperType(operation, false)); + } + + if (dbObj != null && handler == null) { + // To avoid JAXB wrapper bean generation + outputWrapperInfo.setWrapperType(null); + } } } @@ -88,15 +106,46 @@ public class WrapperJavaInterfaceProcessor implements JavaInterfaceVisitor { * * The method logic assumes the JavaBeans DataBinding is the default */ - private String assignOperationDataBinding(Operation operation) { + private String assignInputDataBinding(Operation operation) { Set dbs = new HashSet(); + List opDataTypes = new LinkedList(); - // Can't use DataType since operation.getInputType() returns: DataType> + opDataTypes.addAll(operation.getInputType().getLogical()); + + for (DataType d : opDataTypes) { + if (d != null) { + String dataBinding = d.getDataBinding(); + if ("java:array".equals(dataBinding)) { + dataBinding = ((DataType)d.getLogical()).getDataBinding(); + } + if (dataBinding != null) { + dbs.add(dataBinding); + } + } + } + + dbs.remove(JavaBeansDataBinding.NAME); + dbs.remove(SimpleJavaDataBinding.NAME); + + if (dbs.size() == 1) { + String db = dbs.iterator().next(); + operation.getInputWrapper().setDataBinding(db); + return db; + } else { + return operation.getInputWrapper().getDataBinding(); + } + } + + // TUSCANY-3804: handle output wrapper separately + // change here is different to that in 3804 + // to deal with logical data type + faults + private String assignOutputDataBinding(Operation operation) { + Set dbs = new HashSet(); List opDataTypes = new LinkedList(); - opDataTypes.addAll(operation.getInputType().getLogical()); opDataTypes.addAll(operation.getOutputType().getLogical()); + for (DataType ft : operation.getFaultTypes()) { opDataTypes.add(ft.getLogical()); } @@ -118,10 +167,10 @@ public class WrapperJavaInterfaceProcessor implements JavaInterfaceVisitor { if (dbs.size() == 1) { String db = dbs.iterator().next(); - operation.getInputWrapper().setDataBinding(db); + operation.getOutputWrapper().setDataBinding(db); return db; } else { - return operation.getInputWrapper().getDataBinding(); - } - } + return operation.getOutputWrapper().getDataBinding(); + } + } } -- cgit v1.2.3