You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2008/01/08 22:26:33 UTC
svn commit: r610165 -
/incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
Author: rfeng
Date: Tue Jan 8 13:26:29 2008
New Revision: 610165
URL: http://svn.apache.org/viewvc?rev=610165&view=rev
Log:
Merge the changes from trunk under r610075
Modified:
incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
Modified: incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java?rev=610165&r1=610164&r2=610165&view=diff
==============================================================================
--- incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java (original)
+++ incubator/tuscany/branches/sca-java-1.1/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInterceptor.java Tue Jan 8 13:26:29 2008
@@ -20,7 +20,9 @@
package org.apache.tuscany.sca.core.databinding.wire;
import java.io.Serializable;
+import java.lang.reflect.Array;
import java.util.IdentityHashMap;
+import java.util.List;
import java.util.Map;
import org.apache.tuscany.sca.databinding.DataBinding;
@@ -33,82 +35,142 @@
import org.apache.tuscany.sca.invocation.Invoker;
import org.apache.tuscany.sca.invocation.Message;
+/**
+ * Implementation of an interceptor that enforces pass-by-value semantics
+ * on operation invocations by copying the operation input and output data.
+ *
+ * @version $Rev$ $Date$
+ */
public class PassByValueInterceptor implements Interceptor {
private DataBindingExtensionPoint dataBindings;
+ private DataBinding[] inputDataBindings;
+ private DataBinding outputDataBinding;
+ private DataBinding javaBeanDataBinding;
+ private DataBinding jaxbDataBinding;
private Operation operation;
-
private Invoker nextInvoker;
+ /**
+ * Constructs a new PassByValueInterceptor.
+ * @param dataBindings databinding extension point
+ * @param operation the intercepted operation
+ */
public PassByValueInterceptor(DataBindingExtensionPoint dataBindings, Operation operation) {
- this.dataBindings = dataBindings;
this.operation = operation;
+
+ // Cache data bindings to use
+ this.dataBindings = dataBindings;
+ jaxbDataBinding = dataBindings.getDataBinding(JAXBDataBinding.NAME);
+ javaBeanDataBinding = dataBindings.getDataBinding(JavaBeansDataBinding.NAME);
+
+ // Determine the input databindings
+ if (operation.getInputType() != null) {
+ List<DataType> inputTypes = operation.getInputType().getLogical();
+ inputDataBindings = new DataBinding[inputTypes.size()];
+ int i = 0;
+ for (DataType inputType: inputTypes) {
+ String id = inputType.getDataBinding();
+ inputDataBindings[i++] = dataBindings.getDataBinding(id);
+ }
+ }
+
+ // Determine the output databinding
+ if (operation.getOutputType() != null) {
+ String id = operation.getOutputType().getDataBinding();
+ outputDataBinding = dataBindings.getDataBinding(id);
+ }
}
public Message invoke(Message msg) {
- Object obj = msg.getBody();
- msg.setBody(copy((Object[])obj));
+ msg.setBody(copy((Object[])msg.getBody(), inputDataBindings));
Message resultMsg = nextInvoker.invoke(msg);
if (!msg.isFault() && operation.getOutputType() != null) {
- String dataBindingId = operation.getOutputType().getDataBinding();
- DataBinding dataBinding = dataBindings.getDataBinding(dataBindingId);
- resultMsg.setBody(copy(resultMsg.getBody(), dataBinding));
+ resultMsg.setBody(copy(resultMsg.getBody(), outputDataBinding));
}
return resultMsg;
}
- public Object[] copy(Object[] args) {
- if (args == null) {
+ /**
+ * Copy an array of data objects passed to an operation
+ * @param data array of objects to copy
+ * @return the copy
+ */
+ private Object[] copy(Object[] data, DataBinding[] dataBindings) {
+ if (data == null) {
return null;
}
- Object[] copiedArgs = new Object[args.length];
+ Object[] copy = new Object[data.length];
Map<Object, Object> map = new IdentityHashMap<Object, Object>();
- for (int i = 0; i < args.length; i++) {
- if (args[i] == null) {
- copiedArgs[i] = null;
+ for (int i = 0; i < data.length; i++) {
+ Object arg = data[i];
+ if (arg == null) {
+ copy[i] = null;
} else {
- Object copiedArg = map.get(args[i]);
+ Object copiedArg = map.get(arg);
if (copiedArg != null) {
- copiedArgs[i] = copiedArg;
+ copy[i] = copiedArg;
} else {
- String dataBindingId = operation.getInputType().getLogical().get(i).getDataBinding();
- DataBinding dataBinding = dataBindings.getDataBinding(dataBindingId);
- // HACK: Use JAXB to copy non-Serializable beans
- if (dataBinding != null &&
- JavaBeansDataBinding.NAME.equals(dataBinding.getName()) &&
- !(args[i] instanceof Serializable)) {
- dataBinding = dataBindings.getDataBinding(JAXBDataBinding.NAME);
- }
- copiedArg = copy(args[i], dataBinding);
- map.put(args[i], copiedArg);
- copiedArgs[i] = copiedArg;
+ copiedArg = copy(arg, dataBindings[i]);
+ map.put(arg, copiedArg);
+ copy[i] = copiedArg;
}
}
}
- return copiedArgs;
+ return copy;
}
- public Object copy(Object arg, DataBinding argDataBinding) {
- if (arg == null) {
+ /**
+ * Copy data using the specified databinding.
+ * @param data input data
+ * @param dataBinding databinding to use
+ * @return a copy of the data
+ */
+ private Object copy(Object data, DataBinding dataBinding) {
+ if (data == null) {
return null;
}
- Object copiedArg;
- if (argDataBinding != null) {
- copiedArg = argDataBinding.copy(arg);
- } else {
- copiedArg = arg;
- DataType<?> dataType = dataBindings.introspectType(arg);
+
+ // If no databinding was specified, introspect the given arg to
+ // determine its databinding
+ if (dataBinding == null) {
+ DataType<?> dataType = dataBindings.introspectType(data);
if (dataType != null) {
- DataBinding binding = dataBindings.getDataBinding(dataType.getDataBinding());
- if (binding != null) {
- copiedArg = binding.copy(arg);
+ dataBinding = dataBindings.getDataBinding(dataType.getDataBinding());
+ }
+ if (dataBinding == null) {
+
+ // Default to the JavaBean databinding
+ dataBinding = javaBeanDataBinding;
+ }
+ }
+
+ // Use the JAXB databinding to copy non-Serializable data
+ if (dataBinding == javaBeanDataBinding) {
+
+ // If the input data is an array containing non serializable elements
+ // use JAXB
+ Class<?> clazz = data.getClass();
+ if (clazz.isArray()) {
+ if (Array.getLength(data) != 0) {
+ Object element = Array.get(data, 0);
+ if (element != null && !(element instanceof Serializable)) {
+ dataBinding = jaxbDataBinding;
+ }
+ }
+ } else {
+
+ // If the input data is not serializable use JAXB
+ if (!(data instanceof Serializable)) {
+ dataBinding = jaxbDataBinding;
}
}
- // FIXME: What to do if it's not recognized?
}
- return copiedArg;
+
+ Object copy = dataBinding.copy(data);
+ return copy;
}
public Invoker getNext() {
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org