From e5b7380c874745c989d1816b8f552504f038e1bc Mon Sep 17 00:00:00 2001 From: lresende Date: Thu, 26 Sep 2013 20:33:20 +0000 Subject: 2.0 branch for possible maintenance release git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1526672 13f79535-47bb-0310-9956-ffa450edef68 --- .../tuscany/sca/binding/local/LocalBinding.java | 33 +++++ .../sca/binding/local/LocalBindingInvoker.java | 102 ++++++++++++++++ .../binding/local/LocalBindingProviderFactory.java | 51 ++++++++ .../local/LocalReferenceBindingProvider.java | 135 +++++++++++++++++++++ .../binding/local/LocalServiceBindingProvider.java | 59 +++++++++ 5 files changed, 380 insertions(+) create mode 100644 sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java create mode 100644 sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java create mode 100644 sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java create mode 100644 sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java create mode 100644 sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java (limited to 'sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local') diff --git a/sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBinding.java b/sca-java-2.x/branches/2.0/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/branches/2.0/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/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingInvoker.java b/sca-java-2.x/branches/2.0/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/branches/2.0/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/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalBindingProviderFactory.java b/sca-java-2.x/branches/2.0/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/branches/2.0/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 { + + 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 getModelType() { + return LocalBinding.class; + } +} diff --git a/sca-java-2.x/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalReferenceBindingProvider.java b/sca-java-2.x/branches/2.0/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/branches/2.0/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/branches/2.0/modules/binding-local-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalServiceBindingProvider.java b/sca-java-2.x/branches/2.0/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/branches/2.0/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() { + } +} -- cgit v1.2.3