summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk/modules/binding-local-runtime/src/main
diff options
context:
space:
mode:
authorantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2010-11-24 12:09:26 +0000
committerantelder <antelder@13f79535-47bb-0310-9956-ffa450edef68>2010-11-24 12:09:26 +0000
commit1b68f70a4084371fd68e54429dce10b96ae61888 (patch)
treeac1cfb811a2352ea0320a10c76c00d6dbee1419e /sca-java-2.x/trunk/modules/binding-local-runtime/src/main
parent97a0a82b386becd737258b9d45e4c83ecfacdf78 (diff)
Add a binding.local which is the parts of the current sca binding for doing local only invocations. This is part of a peice of work to restructure the sca binding into separately configurable and pluggable pieces in order to give more flexibility in sca binding invocations
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1038579 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/binding-local-runtime/src/main')
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java33
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java102
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java51
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java135
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java59
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor19
-rw-r--r--sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory19
7 files changed, 418 insertions, 0 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java
new file mode 100644
index 0000000000..c69d61ec53
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java
@@ -0,0 +1,33 @@
+/*
+ * 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.binding.local;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.assembly.impl.BindingImpl;
+
+public class LocalBinding extends BindingImpl {
+
+ public static final QName TYPE = new QName(SCA11_TUSCANY_NS, "binding.local");
+
+ public LocalBinding() {
+ super(TYPE);
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java
new file mode 100644
index 0000000000..c03abcb528
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java
@@ -0,0 +1,102 @@
+/*
+ * 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.binding.local;
+
+import org.apache.tuscany.sca.databinding.Mediator;
+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.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.invocation.Phase;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+
+/**
+ * The Local binding invoker
+ */
+public class LocalBindingInvoker implements Interceptor {
+ private InvocationChain chain;
+ private Mediator mediator;
+ private Operation sourceOperation;
+ private Operation targetOperation;
+ private boolean passByValue;
+ private RuntimeEndpoint ep;
+
+ /**
+ * Construct a SCABindingInvoker that delegates to the service invocaiton chain
+ */
+ public LocalBindingInvoker(InvocationChain chain, Operation sourceOperation, Mediator mediator, boolean passByValue, RuntimeEndpointReference epr) {
+ super();
+ this.chain = chain;
+ this.mediator = mediator;
+ this.sourceOperation = sourceOperation;
+ this.targetOperation = chain.getTargetOperation();
+ this.passByValue = passByValue;
+ this.ep = (RuntimeEndpoint)epr.getTargetEndpoint();
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.invocation.Interceptor#getNext()
+ */
+ public Invoker getNext() {
+ return chain.getHeadInvoker(Phase.SERVICE_POLICY);
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.invocation.Interceptor#setNext(org.apache.tuscany.sca.invocation.Invoker)
+ */
+ public void setNext(Invoker next) {
+ // NOOP
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.invocation.Invoker#invoke(org.apache.tuscany.sca.invocation.Message)
+ */
+ public Message invoke(Message msg) {
+
+ if (passByValue) {
+ msg.setBody(mediator.copyInput(msg.getBody(), sourceOperation, targetOperation));
+ }
+
+ ep.getInvocationChains();
+ if ( !ep.getCallbackEndpointReferences().isEmpty() ) {
+ RuntimeEndpointReference asyncEPR = (RuntimeEndpointReference) ep.getCallbackEndpointReferences().get(0);
+ // Place a link to the callback EPR into the message headers...
+ msg.getHeaders().put("ASYNC_CALLBACK", asyncEPR );
+ }
+
+ Message resultMsg = getNext().invoke(msg);
+
+ if (passByValue) {
+ // Note source and target operation swapped so result is in source class loader
+ if (resultMsg.isFault()) {
+ resultMsg.setFaultBody(mediator.copyFault(resultMsg.getBody(), sourceOperation, targetOperation));
+ } else {
+ if (sourceOperation.getOutputType() != null) {
+ resultMsg.setBody(mediator.copyOutput(resultMsg.getBody(), sourceOperation, targetOperation));
+ }
+ }
+ }
+
+ return resultMsg;
+ }
+
+}
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java
new file mode 100644
index 0000000000..f93a2dd11b
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java
@@ -0,0 +1,51 @@
+/*
+ * 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.binding.local;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+
+/**
+ * The factory for creating Local Binding providers
+ */
+public class LocalBindingProviderFactory implements BindingProviderFactory<LocalBinding> {
+
+ private ExtensionPointRegistry extensionPoints;
+
+ public LocalBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
+ this.extensionPoints = extensionPoints;
+ }
+
+ public ReferenceBindingProvider createReferenceBindingProvider(RuntimeEndpointReference endpointReference) {
+ return new LocalReferenceBindingProvider(extensionPoints, endpointReference);
+ }
+
+ public ServiceBindingProvider createServiceBindingProvider(RuntimeEndpoint endpoint) {
+ return new LocalServiceBindingProvider(extensionPoints, endpoint);
+ }
+
+ public Class<LocalBinding> getModelType() {
+ return LocalBinding.class;
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java
new file mode 100644
index 0000000000..0573a68f22
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java
@@ -0,0 +1,135 @@
+/*
+ * 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.binding.local;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.Compatibility;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.EndpointReferenceProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+import org.oasisopen.sca.ServiceUnavailableException;
+
+/**
+ * The Local binding reference binding provider
+ */
+public class LocalReferenceBindingProvider implements EndpointReferenceProvider {
+
+ private RuntimeEndpointReference endpointReference;
+ private RuntimeComponent component;
+ private RuntimeComponentReference reference;
+ private LocalBinding binding;
+
+ private Mediator mediator;
+ private InterfaceContractMapper interfaceContractMapper;
+
+ public LocalReferenceBindingProvider(ExtensionPointRegistry extensionPoints, RuntimeEndpointReference endpointReference) {
+ this.endpointReference = endpointReference;
+ this.component = (RuntimeComponent)endpointReference.getComponent();
+ this.reference = (RuntimeComponentReference)endpointReference.getReference();
+ this.binding = (LocalBinding)endpointReference.getBinding();
+
+ UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ this.mediator = utilities.getUtility(Mediator.class);
+ this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class);
+ }
+
+ public InterfaceContract getBindingInterfaceContract() {
+ // Check if there is a target
+ RuntimeEndpoint endpoint = (RuntimeEndpoint)endpointReference.getTargetEndpoint();
+ if (endpoint != null) {
+ return endpoint.getComponentTypeServiceInterfaceContract();
+ } else {
+ return endpointReference.getComponentTypeReferenceInterfaceContract();
+ }
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+ private Invoker getInvoker(RuntimeEndpointReference epr, Operation operation) {
+ Endpoint target = epr.getTargetEndpoint();
+ if (target != null) {
+ RuntimeComponentService service = (RuntimeComponentService)target.getService();
+ if (service != null) { // not a callback wire
+ InvocationChain chain = ((RuntimeEndpoint)target).getInvocationChain(operation);
+
+ boolean passByValue = false;
+ Operation targetOp = chain.getTargetOperation();
+ if (!operation.getInterface().isRemotable()) {
+ if (interfaceContractMapper.isCompatibleByReference(operation, targetOp, Compatibility.SUBSET)) {
+ passByValue = false;
+ }
+ } else {
+ boolean allowsPBR = false;
+ if (allowsPBR && interfaceContractMapper.isCompatibleByReference(operation,
+ targetOp,
+ Compatibility.SUBSET)) {
+ passByValue = false;
+ } else if (interfaceContractMapper.isCompatibleByValue(operation, targetOp, Compatibility.SUBSET)) {
+ passByValue = true;
+ }
+ }
+ // it turns out that the chain source and target operations are the same, and are the operation
+ // from the target, not sure if thats by design or a bug. The SCA binding invoker needs to know
+ // the source and target class loaders so pass in the real source operation in the constructor
+ return chain == null ? null : new LocalBindingInvoker(chain, operation, mediator, passByValue, epr);
+ }
+ }
+ return null;
+ }
+
+ public Invoker createInvoker(Operation operation) {
+ Invoker invoker = getInvoker(endpointReference, operation);
+ if (invoker == null) {
+ throw new ServiceUnavailableException(
+ "Unable to create SCA binding invoker for local target " + component
+ .getName()
+ + " reference "
+ + reference.getName()
+ + " (bindingURI="
+ + binding.getURI()
+ + " operation="
+ + operation.getName()
+ + ")");
+ }
+ return invoker;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ }
+
+ public void configure() {
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java
new file mode 100644
index 0000000000..5f8d9cd9fd
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java
@@ -0,0 +1,59 @@
+/*
+ * 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.binding.local;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+
+/**
+ * The Local binding service binding provider
+ */
+public class LocalServiceBindingProvider implements ServiceBindingProvider {
+ private RuntimeEndpoint endpoint;
+ private RuntimeComponentService service;
+
+ public LocalServiceBindingProvider(ExtensionPointRegistry extensionPoints, RuntimeEndpoint endpoint) {
+ this.endpoint = endpoint;
+ this.service = (RuntimeComponentService)endpoint.getService();
+
+ // if there is potentially a wire to this service that crosses the node boundary
+ // then we need to create a remote endpoint
+ if (service.getInterfaceContract().getInterface().isRemotable()) {
+ // TODO: should this throw some exception now for the local binding case?
+ }
+ }
+
+ public InterfaceContract getBindingInterfaceContract() {
+ return endpoint.getComponentTypeServiceInterfaceContract();
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
new file mode 100644
index 0000000000..584842b354
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the artifact processor extension
+org.apache.tuscany.sca.assembly.xml.DefaultBeanModelProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.1#binding.local,model=org.apache.tuscany.sca.binding.local.LocalBinding
diff --git a/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory
new file mode 100644
index 0000000000..ab36ae28b0
--- /dev/null
+++ b/sca-java-2.x/trunk/modules/binding-local-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the binding extension
+org.apache.tuscany.sca.binding.local.LocalBindingProviderFactory;model=org.apache.tuscany.sca.binding.local.LocalBinding