TUSCANY-3288 - Special handling of arrays to properly create the JAXB Context and minor enhancement on the Atom Binding to avoid data copy
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@824229 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
38ea64f0a5
commit
b289688fc6
4 changed files with 26 additions and 11 deletions
|
@ -40,6 +40,7 @@ import org.apache.commons.httpclient.methods.StringRequestEntity;
|
|||
import org.apache.tuscany.sca.binding.atom.collection.NotFoundException;
|
||||
import org.apache.tuscany.sca.data.collection.Entry;
|
||||
import org.apache.tuscany.sca.interfacedef.Operation;
|
||||
import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
|
||||
import org.apache.tuscany.sca.invocation.Invoker;
|
||||
import org.apache.tuscany.sca.invocation.Message;
|
||||
import org.osoa.sca.ServiceRuntimeException;
|
||||
|
@ -49,7 +50,7 @@ import org.osoa.sca.ServiceRuntimeException;
|
|||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
class AtomBindingInvoker implements Invoker {
|
||||
class AtomBindingInvoker implements Invoker, DataExchangeSemantics {
|
||||
|
||||
private static final Factory abderaFactory = Abdera.getNewFactory();
|
||||
private static final Parser abderaParser = Abdera.getNewParser();
|
||||
|
@ -74,6 +75,11 @@ class AtomBindingInvoker implements Invoker {
|
|||
// by specific invoker subclasses
|
||||
throw new UnsupportedOperationException(operation.getName());
|
||||
}
|
||||
|
||||
public boolean allowsPassByReference() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get operation invoker
|
||||
|
|
|
@ -284,7 +284,7 @@ public class JAXBContextHelper {
|
|||
}
|
||||
} else if (type instanceof GenericArrayType) {
|
||||
GenericArrayType gType = (GenericArrayType)type;
|
||||
findClasses(gType, classSet, visited);
|
||||
findClasses(gType.getGenericComponentType(), classSet, visited);
|
||||
} else if (type instanceof WildcardType) {
|
||||
WildcardType wType = (WildcardType)type;
|
||||
for (Type t : wType.getLowerBounds()) {
|
||||
|
|
|
@ -20,6 +20,8 @@ package org.apache.tuscany.sca.databinding;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.GenericArrayType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -223,12 +225,17 @@ public class DefaultDataBindingExtensionPoint implements DataBindingExtensionPoi
|
|||
}
|
||||
|
||||
private boolean introspectArray(DataType dataType, Operation operation) {
|
||||
Class physical = dataType.getPhysical();
|
||||
Class<?> physical = dataType.getPhysical();
|
||||
if (!physical.isArray() || physical == byte[].class) {
|
||||
return false;
|
||||
}
|
||||
Class componentType = physical.getComponentType();
|
||||
DataType logical = new DataTypeImpl(componentType, dataType.getLogical());
|
||||
Class<?> componentType = physical.getComponentType();
|
||||
Type genericComponentType = componentType;
|
||||
|
||||
if(dataType.getGenericType() instanceof GenericArrayType) {
|
||||
genericComponentType = ((GenericArrayType) dataType.getGenericType()).getGenericComponentType();
|
||||
}
|
||||
DataType logical = new DataTypeImpl(dataType.getDataBinding(), componentType, genericComponentType, dataType.getLogical());
|
||||
introspectType(logical, operation);
|
||||
dataType.setDataBinding("java:array");
|
||||
dataType.setLogical(logical);
|
||||
|
|
|
@ -475,12 +475,14 @@ public class MediatorImpl implements Mediator {
|
|||
// If no databinding was specified, introspect the given arg to
|
||||
// determine its databinding
|
||||
if (dataBinding == null) {
|
||||
dataType = dataBindings.introspectType(data, operation);
|
||||
if (dataType != null) {
|
||||
String db = dataType.getDataBinding();
|
||||
dataBinding = dataBindings.getDataBinding(db);
|
||||
if (dataBinding == null && db != null) {
|
||||
return data;
|
||||
if(! "java:array".equals(dataType.getDataBinding())) {
|
||||
dataType = dataBindings.introspectType(data, operation);
|
||||
if (dataType != null) {
|
||||
String db = dataType.getDataBinding();
|
||||
dataBinding = dataBindings.getDataBinding(db);
|
||||
if (dataBinding == null && db != null) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dataBinding == null) {
|
||||
|
|
Loading…
Reference in a new issue