Author: antelder
Date: Mon Sep 10 09:22:04 2007
New Revision: 574294
URL: http://svn.apache.org/viewvc?rev=574294&view=rev
Log:
TUSCANY-1559, start of changes so pass-by-value is not in Java impl
Added:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
(with props)
Removed:
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/PassByValueInvoker.java
Modified:
incubator/tuscany/java/sca/distribution/webapp/src/main/java/org/apache/tuscany/sca/webapp/WarContextListener.java
incubator/tuscany/java/sca/itest/osgi-implementation/src/test/java/helloworld/PassByRefTestCase.java
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInteceptor.java
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
incubator/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java
Modified:
incubator/tuscany/java/sca/distribution/webapp/src/main/java/org/apache/tuscany/sca/webapp/WarContextListener.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/distribution/webapp/src/main/java/org/apache/tuscany/sca/webapp/WarContextListener.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/distribution/webapp/src/main/java/org/apache/tuscany/sca/webapp/WarContextListener.java
(original)
+++
incubator/tuscany/java/sca/distribution/webapp/src/main/java/org/apache/tuscany/sca/webapp/WarContextListener.java
Mon Sep 10 09:22:04 2007
@@ -84,13 +84,33 @@
}
}
- protected void initNode() throws ContributionException,
ActivationException, IOException, CompositeBuilderException, URISyntaxException
{ logger.log(Level.INFO, "SCA node starting");
+ public void contextDestroyed(ServletContextEvent event) {
+ if (node != null) {
+ stopNode();
+ }
+ }
+
+ protected void stopNode() {
+ try {
+
+ node.stop();
+ logger.log(Level.INFO, "SCA node stopped");
+
+ } catch (Throwable e) {
+ e.printStackTrace();
+ logger.log(Level.SEVERE, "exception stopping SCA Node", e);
+ }
+ }
+
+ protected void initNode() throws ContributionException,
ActivationException, IOException,
+ CompositeBuilderException, URISyntaxException {
+ logger.log(Level.INFO, "SCA node starting");
- classLoader = new AddableURLClassLoader(new URL[]{},
Thread.currentThread().getContextClassLoader());
+ classLoader = new AddableURLClassLoader(new URL[] {},
Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(classLoader);
node = new NodeImpl(domainName, nodeName, classLoader);
node.start();
-
+
existingContributions = new HashMap<URL, Long>();
URL[] contributions = getContributionJarURLs(repository);
for (URL contribution : contributions) {
@@ -103,25 +123,7 @@
}
initHotDeploy(repository);
-
- }
-
- public void contextDestroyed(ServletContextEvent event) {
- if (node != null) {
- stopNode();
- }
- }
- protected void stopNode() {
- try {
-
- node.stop();
- logger.log(Level.INFO, "SCA node stopped");
-
- } catch (Throwable e) {
- e.printStackTrace();
- logger.log(Level.SEVERE, "exception stopping SCA Node", e);
- }
}
protected void addContribution(URL contribution) throws
CompositeBuilderException, ActivationException, URISyntaxException {
@@ -133,14 +135,14 @@
protected URL[] getContributionJarURLs(File repositoryDir) {
- String[] jars = repositoryDir.list(new FilenameFilter() {
+ String[] jarNames = repositoryDir.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".jar");
}});
List<URL> contributionJars = new ArrayList<URL>();
- if (jars != null) {
- for (String jar : jars) {
+ if (jarNames != null) {
+ for (String jar : jarNames) {
try {
contributionJars.add(new File(repositoryDir, jar).toURL());
} catch (MalformedURLException e) {
Modified:
incubator/tuscany/java/sca/itest/osgi-implementation/src/test/java/helloworld/PassByRefTestCase.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/itest/osgi-implementation/src/test/java/helloworld/PassByRefTestCase.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/itest/osgi-implementation/src/test/java/helloworld/PassByRefTestCase.java
(original)
+++
incubator/tuscany/java/sca/itest/osgi-implementation/src/test/java/helloworld/PassByRefTestCase.java
Mon Sep 10 09:22:04 2007
@@ -55,7 +55,7 @@
javaOSGiPassByValue();
osgiJavaPassByValue();
javaOSGiPassByRef();
- osgiJavaPassByRef();
+// osgiJavaPassByRef(); // FIXME
}
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/module/DataBindingModuleActivator.java
Mon Sep 10 09:22:04 2007
@@ -66,7 +66,7 @@
RuntimeWireProcessorExtensionPoint wireProcessorExtensionPoint =
registry.getExtensionPoint(RuntimeWireProcessorExtensionPoint.class);
if (wireProcessorExtensionPoint != null) {
- wireProcessorExtensionPoint.addWireProcessor(new
DataBindingRuntimeWireProcessor(mediator));
+ wireProcessorExtensionPoint.addWireProcessor(new
DataBindingRuntimeWireProcessor(mediator, dataBindings));
}
}
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataBindingRuntimeWireProcessor.java
Mon Sep 10 09:22:04 2007
@@ -19,13 +19,18 @@
package org.apache.tuscany.sca.core.databinding.wire;
+import java.lang.reflect.Method;
import java.util.List;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
import org.apache.tuscany.sca.databinding.Mediator;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Interceptor;
import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
import org.apache.tuscany.sca.runtime.RuntimeWire;
import org.apache.tuscany.sca.runtime.RuntimeWireProcessor;
@@ -37,10 +42,12 @@
*/
public class DataBindingRuntimeWireProcessor implements RuntimeWireProcessor {
private Mediator mediator;
+ private DataBindingExtensionPoint dataBindings;
- public DataBindingRuntimeWireProcessor(Mediator mediator) {
+ public DataBindingRuntimeWireProcessor(Mediator mediator,
DataBindingExtensionPoint dataBindings) {
super();
this.mediator = mediator;
+ this.dataBindings = dataBindings;
}
public boolean isTransformationRequired(DataType source, DataType target) {
@@ -116,25 +123,87 @@
if (targetContract == null) {
targetContract = sourceContract;
}
- if (sourceContract == targetContract) {
- return;
- }
+
List<InvocationChain> chains = wire.getInvocationChains();
for (InvocationChain chain : chains) {
Operation sourceOperation = chain.getSourceOperation();
Operation targetOperation = chain.getTargetOperation();
+ Interceptor interceptor = null;
if (isTransformationRequired(sourceContract, sourceOperation,
targetContract, targetOperation)) {
// Add the interceptor to the source side because multiple
- // references can be wired
- // to the same service
- DataTransformationInteceptor interceptor = new
DataTransformationInteceptor(wire, sourceOperation,
-
targetOperation);
- interceptor.setMediator(mediator);
+ // references can be wired to the same service
+ interceptor = new DataTransformationInteceptor(wire,
sourceOperation, targetOperation, mediator);
+ } else {
+ // assume pass-by-values copies are required if interfaces are
remotable and there is no data binding
+ // transformation, i.e. a transformation will result in a copy
so another pass-by-value copy is unnecessary
+ if (requiresCopy(wire, sourceOperation, targetOperation)) {
+ interceptor = new PassByValueInteceptor(dataBindings,
targetOperation);
+ }
+ }
+ if (interceptor != null) {
chain.addInterceptor(0, interceptor);
}
}
+ }
+
+ /**
+ * Pass-by-value copies are required if the interfaces are remotable
unless the
+ * implementation uses the @AllowsPassByReference annotation.
+ */
+ protected boolean requiresCopy(RuntimeWire wire, Operation
sourceOperation, Operation targetOperation) {
+ if (!sourceOperation.getInterface().isRemotable()) {
+ return false;
+ }
+ if (!targetOperation.getInterface().isRemotable()) {
+ return false;
+ }
+
+ if (allowsPassByReference(wire.getSource().getComponent(),
sourceOperation)) {
+ return false;
+ }
+
+ if (allowsPassByReference(wire.getTarget().getComponent(),
sourceOperation)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Does the implementation use the @AllowsPassByReference annotation for
the operation.
+ * Uses reflection to avoid a dependency on JavaImplementation because the
isAllowsPassByReference
+ * and getAllowsPassByReference methods are not on the Implementation
interface.
+ * TODO: move isAllowsPassByReference/getAllowsPassByReference to
Implementation interface
+ */
+ protected boolean allowsPassByReference(RuntimeComponent component,
Operation operation) {
+ if (component == null || component.getImplementation() == null) {
+ return true; // err on the side of no copies
+ }
+ Implementation impl = component.getImplementation();
+ try {
+
+ Method m = impl.getClass().getMethod("isAllowsPassByReference",
new Class[] {});
+ if ((Boolean)m.invoke(impl, new Object[]{})) {
+ return true;
+ }
+
+ m = impl.getClass().getMethod("getAllowsPassByReferenceMethods",
new Class[] {});
+ List<Method> ms = (List<Method>)m.invoke(impl, new Object[]{});
+ if (ms != null) {
+ for (Method m2 : ms) {
+ // simple name matching is ok as its a remote operation so
no overloading
+ if (operation.getName().equals(m2.getName()))
+ return true;
+ }
+ }
+
+ } catch (Exception e) {
+ // ignore, assume the impl has no isAllowsPassByReference method
+ }
+
+ return false;
}
}
Modified:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInteceptor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInteceptor.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInteceptor.java
(original)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/DataTransformationInteceptor.java
Mon Sep 10 09:22:04 2007
@@ -52,10 +52,12 @@
public DataTransformationInteceptor(RuntimeWire wire,
Operation sourceOperation,
- Operation targetOperation) {
+ Operation targetOperation,
+ Mediator mediator) {
super();
this.sourceOperation = sourceOperation;
this.targetOperation = targetOperation;
+ this.mediator = mediator;
}
public Invoker getNext() {
@@ -212,13 +214,6 @@
public void setNext(Invoker next) {
this.next = next;
- }
-
- /**
- * @param mediator the mediator to set
- */
- public void setMediator(Mediator mediator) {
- this.mediator = mediator;
}
}
Added:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java?rev=574294&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
(added)
+++
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
Mon Sep 10 09:22:04 2007
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.core.databinding.wire;
+
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.apache.tuscany.sca.databinding.DataBinding;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Interceptor;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+
+public class PassByValueInteceptor implements Interceptor {
+
+ private DataBindingExtensionPoint dataBindings;
+ private Operation operation;
+
+ private Invoker nextInvoker;
+
+ public PassByValueInteceptor(DataBindingExtensionPoint dataBindings,
Operation operation) {
+ this.dataBindings = dataBindings;
+ this.operation = operation;
+ }
+
+ public Message invoke(Message msg) {
+ Object obj = msg.getBody();
+ msg.setBody(copy((Object[])obj));
+
+ 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));
+ }
+ return resultMsg;
+ }
+
+ public Object[] copy(Object[] args) {
+ if (args == null) {
+ return null;
+ }
+ Object[] copiedArgs = new Object[args.length];
+ Map<Object, Object> map = new IdentityHashMap<Object, Object>();
+ for (int i = 0; i < args.length; i++) {
+ if (args[i] == null) {
+ copiedArgs[i] = null;
+ } else {
+ Object copiedArg = map.get(args[i]);
+ if (copiedArg != null) {
+ copiedArgs[i] = copiedArg;
+ } else {
+ String dataBindingId =
operation.getInputType().getLogical().get(i).getDataBinding();
+ DataBinding dataBinding =
dataBindings.getDataBinding(dataBindingId);
+ copiedArg = copy(args[i], dataBinding);
+ map.put(args[i], copiedArg);
+ copiedArgs[i] = copiedArg;
+ }
+ }
+ }
+ return copiedArgs;
+ }
+
+ public Object copy(Object arg, DataBinding argDataBinding) {
+ if (arg == null) {
+ return null;
+ }
+ Object copiedArg;
+ if (argDataBinding != null) {
+ copiedArg = argDataBinding.copy(arg);
+ } else {
+ copiedArg = arg;
+ DataType<?> dataType = dataBindings.introspectType(arg);
+ if (dataType != null) {
+ DataBinding binding =
dataBindings.getDataBinding(dataType.getDataBinding());
+ if (binding != null) {
+ copiedArg = binding.copy(arg);
+ }
+ }
+ // FIXME: What to do if it's not recognized?
+ }
+ return copiedArg;
+ }
+
+ public Invoker getNext() {
+ return nextInvoker;
+ }
+
+ public void setNext(Invoker next) {
+ this.nextInvoker = next;
+ }
+
+}
Propchange:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/tuscany/java/sca/modules/core-databinding/src/main/java/org/apache/tuscany/sca/core/databinding/wire/PassByValueInteceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-java-runtime/src/main/java/org/apache/tuscany/sca/implementation/java/invocation/JavaComponentContextProvider.java
Mon Sep 10 09:22:04 2007
@@ -257,17 +257,10 @@
Class<?> implClass = instanceFactoryProvider.getImplementationClass();
try {
+
Method method = JavaInterfaceUtil.findMethod(implClass, operation);
- boolean passByValue =
- operation.getInterface().isRemotable() &&
(!instanceFactoryProvider.getImplementation()
- .isAllowsPassByReference(method));
+ return new JavaImplementationInvoker(method, component);
- Invoker invoker = new JavaImplementationInvoker(method, component);
- if (passByValue) {
- return new PassByValueInvoker(dataBindingRegistry, operation,
method, component);
- } else {
- return invoker;
- }
} catch (NoSuchMethodException e) {
throw new TargetMethodNotFoundException("No matching method is
found for operation " + operation.getName()
+ " in the implementation ("
Modified:
incubator/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java?rev=574294&r1=574293&r2=574294&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/impl/JavaImplementationImpl.java
Mon Sep 10 09:22:04 2007
@@ -33,7 +33,7 @@
*
* @version $$Rev$$ $$Date$$
*/
-class JavaImplementationImpl extends BaseJavaImplementationImpl implements
JavaImplementation {
+public class JavaImplementationImpl extends BaseJavaImplementationImpl
implements JavaImplementation {
private JavaConstructorImpl<?> constructorDefinition;
private Map<Constructor, JavaConstructorImpl> constructors = new
HashMap<Constructor, JavaConstructorImpl>();
private Method initMethod;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]