diff options
author | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-07-11 10:54:38 +0000 |
---|---|---|
committer | slaws <slaws@13f79535-47bb-0310-9956-ffa450edef68> | 2011-07-11 10:54:38 +0000 |
commit | dbf4d8905d3dcee44dc2d54270a5979560ce7f37 (patch) | |
tree | a84449b62a3cc19b988bc688b29ae3eae19ede43 /sca-java-2.x/trunk/modules | |
parent | f7e7402c450c81c4ca5a58adb7b3603db94a44f5 (diff) |
TUSCANY-3884 - Convert the default binding to delegate for local calls as well as remote calls. Means that the binding is more consistent in it's layout and the delegation selection logic is more cleanly separated from the code that handles passing messages.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1145118 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules')
18 files changed, 786 insertions, 465 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABinding.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABinding.java new file mode 100644 index 0000000000..d6f951896f --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABinding.java @@ -0,0 +1,13 @@ +package org.apache.tuscany.sca.binding.local;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.assembly.Base;
+import org.apache.tuscany.sca.assembly.Binding;
+
+/**
+ * Represents a Local SCA Binding
+ */
+public interface LocalSCABinding extends Binding {
+ QName TYPE = new QName(Base.SCA11_TUSCANY_NS, "binding.local");
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactory.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactory.java new file mode 100644 index 0000000000..ffc00cf0aa --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactory.java @@ -0,0 +1,14 @@ +package org.apache.tuscany.sca.binding.local;
+
+/**
+ * Factory for the Local SCA Service binding model.
+ */
+public interface LocalSCABindingFactory {
+ /**
+ * Create a new Local binding.
+ *
+ * @return a new Local binding
+ */
+ LocalSCABinding createLocalBinding();
+
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactoryImpl.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactoryImpl.java new file mode 100644 index 0000000000..35d953dcc4 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingFactoryImpl.java @@ -0,0 +1,16 @@ +package org.apache.tuscany.sca.binding.local;
+
+/**
+ * A factory for the Local SCA binding model.
+ */
+public class LocalSCABindingFactoryImpl implements LocalSCABindingFactory {
+ public LocalSCABindingFactoryImpl() {
+
+ }
+
+ @Override
+ public LocalSCABinding createLocalBinding() {
+ return new LocalSCABindingImpl();
+ }
+
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingImpl.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingImpl.java new file mode 100644 index 0000000000..3f589297d6 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingImpl.java @@ -0,0 +1,97 @@ +package org.apache.tuscany.sca.binding.local;
+
+import javax.xml.namespace.QName;
+
+import org.apache.tuscany.sca.assembly.OperationSelector;
+import org.apache.tuscany.sca.assembly.WireFormat;
+
+/**
+ * Represents a Local SCA Binding
+ */
+public class LocalSCABindingImpl implements LocalSCABinding {
+ private String name;
+ private String uri;
+ private WireFormat wireFormat;
+
+ /**
+ * Constructs a new Local binding.
+ */
+ public LocalSCABindingImpl() {
+ }
+
+ @Override
+ public QName getType() {
+ return TYPE;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Getters for the binding URI. The computed URI for the
+ * service that the reference is targeting or which the service represents
+ * depending on whether the biding is associated with a reference or
+ * service
+ *
+ * @return the binding URI
+ */
+ @Override
+ public String getURI() {
+ return uri;
+ }
+
+ @Override
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ @Override
+ public boolean isUnresolved() {
+ return false;
+ }
+
+ @Override
+ public void setUnresolved(boolean unresolved) {
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+
+ @Override
+ public WireFormat getRequestWireFormat() {
+ return wireFormat;
+ }
+
+ @Override
+ public void setRequestWireFormat(WireFormat wireFormat) {
+ this.wireFormat = wireFormat;
+ }
+
+ @Override
+ public WireFormat getResponseWireFormat() {
+ return wireFormat;
+ }
+
+ @Override
+ public void setResponseWireFormat(WireFormat wireFormat) {
+ this.wireFormat = wireFormat;
+ }
+
+ @Override
+ public OperationSelector getOperationSelector() {
+ return null;
+ }
+
+ @Override
+ public void setOperationSelector(OperationSelector operationSelector) {
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/SCABindingLocalInvocationInterceptor.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingInvocationInterceptor.java index 45933bde63..36ac93a5be 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/SCABindingLocalInvocationInterceptor.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingInvocationInterceptor.java @@ -1,109 +1,108 @@ -/* - * 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.sca.provider; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker; -import org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl; -import org.apache.tuscany.sca.invocation.Invoker; -import org.apache.tuscany.sca.invocation.InvokerAsyncResponse; -import org.apache.tuscany.sca.invocation.Message; -import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; - -/** - * Interceptor used by the SCA Binding on the service side chain to provide a mechanism for optimising - * invocations when the reference and the service involved are both in the same JVM, and thus the need - * to use a transport of any kind is unnecessary. - * - */ -public class SCABindingLocalInvocationInterceptor extends InterceptorAsyncImpl { - private static final Logger logger = Logger.getLogger(SCABindingLocalInvocationInterceptor.class.getName()); - - private Invoker next; - - private boolean skipPrevious; - - public SCABindingLocalInvocationInterceptor() { - super(); - } // end constructor - - public Message invoke(Message msg) { - return next.invoke(msg); - } // end method invoke - - public Invoker getNext() { - return next; - } // end method getNext - - public void setNext(Invoker next) { - this.next = next; - } // end method setNext - - /** - * Process request method is simply a passthrough - */ - public Message processRequest(Message msg) { - return msg ; - } // end method processRequest - - - /** - * Handle an async response - * - deals with the local SCA binding case only (at present) - * - in this case, extract the async response invoker from the message header and call the EPR - * that is present in the invoker, which is in fact the local EPR from which the original forward - * request came - */ - public void invokeAsyncResponse(Message msg) { - @SuppressWarnings("unchecked") - AsyncResponseInvoker<?> respInvoker = - (AsyncResponseInvoker<?>)msg.getHeaders().get("ASYNC_RESPONSE_INVOKER"); - if( respInvoker != null && "SCA_LOCAL".equals(respInvoker.getBindingType()) ) { - // Handle the locally optimised case - RuntimeEndpointReference responseEPR = (RuntimeEndpointReference)respInvoker.getResponseTargetAddress(); - msg.setFrom(responseEPR); - // Handle async response Relates_To message ID value - String msgID = respInvoker.getRelatesToMsgID(); - msg.getHeaders().put("RELATES_TO", msgID); - - // Call the processing on the reference chain directly - responseEPR.invokeAsyncResponse(msg); - - // Prevent the response being processed by the rest of the service chain - return; - } else { - // Carry on processing the response by the rest of the service chain - InvokerAsyncResponse thePrevious = (InvokerAsyncResponse)getPrevious(); - if (thePrevious != null ) thePrevious.invokeAsyncResponse(msg); - return; - } // end if - - } // end method invokeAsyncResponse - - /** - * processResponse is not called during async response handling (all handled by invokeAsyncResponse) - * - this version is a dummy which does nothing. - */ - public Message processResponse(Message msg) { - return msg; - } // end method processResponse - -} // end class +/*
+ * 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 java.util.logging.Logger;
+
+import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker;
+import org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.InvokerAsyncResponse;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+
+/**
+ * Interceptor used by the SCA Binding on the service side chain to provide a mechanism for optimising
+ * invocations when the reference and the service involved are both in the same JVM, and thus the need
+ * to use a transport of any kind is unnecessary.
+ *
+ */
+public class LocalSCABindingInvocationInterceptor extends InterceptorAsyncImpl {
+ private static final Logger logger = Logger.getLogger(LocalSCABindingInvocationInterceptor.class.getName());
+
+ private Invoker next;
+
+ private boolean skipPrevious;
+
+ public LocalSCABindingInvocationInterceptor() {
+ super();
+ } // end constructor
+
+ public Message invoke(Message msg) {
+ return next.invoke(msg);
+ } // end method invoke
+
+ public Invoker getNext() {
+ return next;
+ } // end method getNext
+
+ public void setNext(Invoker next) {
+ this.next = next;
+ } // end method setNext
+
+ /**
+ * Process request method is simply a passthrough
+ */
+ public Message processRequest(Message msg) {
+ return msg ;
+ } // end method processRequest
+
+
+ /**
+ * Handle an async response
+ * - deals with the local SCA binding case only (at present)
+ * - in this case, extract the async response invoker from the message header and call the EPR
+ * that is present in the invoker, which is in fact the local EPR from which the original forward
+ * request came
+ */
+ public void invokeAsyncResponse(Message msg) {
+ @SuppressWarnings("unchecked")
+ AsyncResponseInvoker<?> respInvoker =
+ (AsyncResponseInvoker<?>)msg.getHeaders().get("ASYNC_RESPONSE_INVOKER");
+ if( respInvoker != null && "SCA_LOCAL".equals(respInvoker.getBindingType()) ) {
+ // Handle the locally optimised case
+ RuntimeEndpointReference responseEPR = (RuntimeEndpointReference)respInvoker.getResponseTargetAddress();
+ msg.setFrom(responseEPR);
+ // Handle async response Relates_To message ID value
+ String msgID = respInvoker.getRelatesToMsgID();
+ msg.getHeaders().put("RELATES_TO", msgID);
+
+ // Call the processing on the reference chain directly
+ responseEPR.invokeAsyncResponse(msg);
+
+ // Prevent the response being processed by the rest of the service chain
+ return;
+ } else {
+ // Carry on processing the response by the rest of the service chain
+ InvokerAsyncResponse thePrevious = (InvokerAsyncResponse)getPrevious();
+ if (thePrevious != null ) thePrevious.invokeAsyncResponse(msg);
+ return;
+ } // end if
+
+ } // end method invokeAsyncResponse
+
+ /**
+ * processResponse is not called during async response handling (all handled by invokeAsyncResponse)
+ * - this version is a dummy which does nothing.
+ */
+ public Message processResponse(Message msg) {
+ return msg;
+ } // end method processResponse
+
+} // end class
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/SCABindingInvoker.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingInvoker.java index de0b1cfe0e..a2eb53d5bb 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/SCABindingInvoker.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingInvoker.java @@ -1,167 +1,167 @@ -/* - * 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.sca.provider; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; -import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker; -import org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl; -import org.apache.tuscany.sca.databinding.Mediator; -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.invocation.InvokerAsyncRequest; -import org.apache.tuscany.sca.invocation.InvokerAsyncResponse; -import org.apache.tuscany.sca.invocation.Message; -import org.apache.tuscany.sca.invocation.MessageFactory; -import org.apache.tuscany.sca.invocation.Phase; -import org.apache.tuscany.sca.runtime.RuntimeEndpoint; -import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; - - -/** - * @version $Rev$ $Date$ - */ -public class SCABindingInvoker extends InterceptorAsyncImpl { - private InvocationChain chain; - private Mediator mediator; - private Operation sourceOperation; - private Operation targetOperation; - private boolean passByValue; - private RuntimeEndpointReference epr; - private RuntimeEndpoint ep; - private ExtensionPointRegistry registry; - - /** - * Construct a SCABindingInvoker that delegates to the service invocation chain - */ - public SCABindingInvoker(InvocationChain chain, Operation sourceOperation, Mediator mediator, - boolean passByValue, RuntimeEndpointReference epr, ExtensionPointRegistry registry) { - super(); - this.chain = chain; - this.mediator = mediator; - this.sourceOperation = sourceOperation; - this.targetOperation = chain.getTargetOperation(); - this.passByValue = passByValue; - this.epr = epr; - this.ep = (RuntimeEndpoint)epr.getTargetEndpoint(); - this.registry = registry; - } - - /** - * @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 - } - - public Message processRequest(Message msg){ - if (passByValue) { - msg.setBody(mediator.copyInput(msg.getBody(), sourceOperation, targetOperation)); - } // end if - - 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 ); - } // end if - - if( ep.isAsyncInvocation() ) { - // Get the message ID - String msgID = (String)msg.getHeaders().get("MESSAGE_ID"); - - String operationName = msg.getOperation().getName(); - - // Create a response invoker and add it to the message headers - AsyncResponseInvoker<RuntimeEndpointReference> respInvoker = - new AsyncResponseInvoker<RuntimeEndpointReference>(ep, null, epr, msgID, operationName, getMessageFactory()); - respInvoker.setBindingType("SCA_LOCAL"); - msg.getHeaders().put("ASYNC_RESPONSE_INVOKER", respInvoker); - } // end if - - return msg; - } // end method processRequest - - /** - * Regular (sync) processing of response message - */ - public Message processResponse(Message msg){ - if (passByValue) { - // Note source and target operation swapped so result is in source class loader - if (msg.isFault()) { - msg.setFaultBody(mediator.copyFault(msg.getBody(), sourceOperation, targetOperation)); - } else { - if (sourceOperation.getOutputType() != null) { - msg.setBody(mediator.copyOutput(msg.getBody(), sourceOperation, targetOperation)); - } // end if - } // end if - } // end if - - return msg; - } // end method processResponse - - public void invokeAsyncRequest(Message msg) throws Throwable { - try{ - msg = processRequest(msg); - InvokerAsyncRequest theNext = (InvokerAsyncRequest)getNext(); - if( theNext != null ) theNext.invokeAsyncRequest(msg); - postProcessRequest(msg); - } catch (Throwable e) { - postProcessRequest(msg, e); - } // end try - } // end method invokeAsyncRequest - - public void invokeAsyncResponse(Message msg) { - msg = processResponse(msg); - - // Handle async response Relates_To message ID value - @SuppressWarnings("unchecked") - AsyncResponseInvoker<RuntimeEndpointReference> respInvoker = - (AsyncResponseInvoker<RuntimeEndpointReference>)msg.getHeaders().get("ASYNC_RESPONSE_INVOKER"); - // TODO - this deals with the Local case only - not distributed - if( respInvoker != null && "SCA_LOCAL".equals(respInvoker.getBindingType()) ) { - RuntimeEndpointReference responseEPR = respInvoker.getResponseTargetAddress(); - msg.setFrom(responseEPR); - String msgID = respInvoker.getRelatesToMsgID(); - msg.getHeaders().put("RELATES_TO", msgID); - } // end if - - InvokerAsyncResponse thePrevious = (InvokerAsyncResponse)getPrevious(); - if (thePrevious != null ) thePrevious.invokeAsyncResponse(msg); - } // end method invokeAsyncResponse - - public boolean isLocalSCABIndingInvoker() { - return true; - } - - private MessageFactory getMessageFactory() { - FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class); - return modelFactories.getFactory(MessageFactory.class); - } // end method getMessageFactory - -} +/*
+ * 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.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker;
+import org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl;
+import org.apache.tuscany.sca.databinding.Mediator;
+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.invocation.InvokerAsyncRequest;
+import org.apache.tuscany.sca.invocation.InvokerAsyncResponse;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.invocation.MessageFactory;
+import org.apache.tuscany.sca.invocation.Phase;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+
+
+/**
+ * @version $Rev: 1057653 $ $Date: 2011-01-11 09:18:49 -0500 (Tue, 11 Jan 2011) $
+ */
+public class LocalSCABindingInvoker extends InterceptorAsyncImpl {
+ private InvocationChain chain;
+ private Mediator mediator;
+ private Operation sourceOperation;
+ private Operation targetOperation;
+ private boolean passByValue;
+ private RuntimeEndpointReference epr;
+ private RuntimeEndpoint ep;
+ private ExtensionPointRegistry registry;
+
+ /**
+ * Construct a SCABindingInvoker that delegates to the service invocation chain
+ */
+ public LocalSCABindingInvoker(InvocationChain chain, Operation sourceOperation, Mediator mediator,
+ boolean passByValue, RuntimeEndpointReference epr, ExtensionPointRegistry registry) {
+ super();
+ this.chain = chain;
+ this.mediator = mediator;
+ this.sourceOperation = sourceOperation;
+ this.targetOperation = chain.getTargetOperation();
+ this.passByValue = passByValue;
+ this.epr = epr;
+ this.ep = (RuntimeEndpoint)epr.getTargetEndpoint();
+ this.registry = registry;
+ }
+
+ /**
+ * @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
+ }
+
+ public Message processRequest(Message msg){
+ if (passByValue) {
+ msg.setBody(mediator.copyInput(msg.getBody(), sourceOperation, targetOperation));
+ } // end if
+
+ 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 );
+ } // end if
+
+ if( ep.isAsyncInvocation() ) {
+ // Get the message ID
+ String msgID = (String)msg.getHeaders().get("MESSAGE_ID");
+
+ String operationName = msg.getOperation().getName();
+
+ // Create a response invoker and add it to the message headers
+ AsyncResponseInvoker<RuntimeEndpointReference> respInvoker =
+ new AsyncResponseInvoker<RuntimeEndpointReference>(ep, null, epr, msgID, operationName, getMessageFactory());
+ respInvoker.setBindingType("SCA_LOCAL");
+ msg.getHeaders().put("ASYNC_RESPONSE_INVOKER", respInvoker);
+ } // end if
+
+ return msg;
+ } // end method processRequest
+
+ /**
+ * Regular (sync) processing of response message
+ */
+ public Message processResponse(Message msg){
+ if (passByValue) {
+ // Note source and target operation swapped so result is in source class loader
+ if (msg.isFault()) {
+ msg.setFaultBody(mediator.copyFault(msg.getBody(), sourceOperation, targetOperation));
+ } else {
+ if (sourceOperation.getOutputType() != null) {
+ msg.setBody(mediator.copyOutput(msg.getBody(), sourceOperation, targetOperation));
+ } // end if
+ } // end if
+ } // end if
+
+ return msg;
+ } // end method processResponse
+
+ public void invokeAsyncRequest(Message msg) throws Throwable {
+ try{
+ msg = processRequest(msg);
+ InvokerAsyncRequest theNext = (InvokerAsyncRequest)getNext();
+ if( theNext != null ) theNext.invokeAsyncRequest(msg);
+ postProcessRequest(msg);
+ } catch (Throwable e) {
+ postProcessRequest(msg, e);
+ } // end try
+ } // end method invokeAsyncRequest
+
+ public void invokeAsyncResponse(Message msg) {
+ msg = processResponse(msg);
+
+ // Handle async response Relates_To message ID value
+ @SuppressWarnings("unchecked")
+ AsyncResponseInvoker<RuntimeEndpointReference> respInvoker =
+ (AsyncResponseInvoker<RuntimeEndpointReference>)msg.getHeaders().get("ASYNC_RESPONSE_INVOKER");
+ // TODO - this deals with the Local case only - not distributed
+ if( respInvoker != null && "SCA_LOCAL".equals(respInvoker.getBindingType()) ) {
+ RuntimeEndpointReference responseEPR = respInvoker.getResponseTargetAddress();
+ msg.setFrom(responseEPR);
+ String msgID = respInvoker.getRelatesToMsgID();
+ msg.getHeaders().put("RELATES_TO", msgID);
+ } // end if
+
+ InvokerAsyncResponse thePrevious = (InvokerAsyncResponse)getPrevious();
+ if (thePrevious != null ) thePrevious.invokeAsyncResponse(msg);
+ } // end method invokeAsyncResponse
+
+ public boolean isLocalSCABIndingInvoker() {
+ return true;
+ }
+
+ private MessageFactory getMessageFactory() {
+ FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+ return modelFactories.getFactory(MessageFactory.class);
+ } // end method getMessageFactory
+
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingProviderFactory.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingProviderFactory.java new file mode 100644 index 0000000000..486a465d03 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCABindingProviderFactory.java @@ -0,0 +1,37 @@ +package org.apache.tuscany.sca.binding.local;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.UtilityExtensionPoint;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.SCABindingMapper;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
+
+public class LocalSCABindingProviderFactory implements BindingProviderFactory<LocalSCABinding> {
+ private ExtensionPointRegistry extensionPoints;
+ private SCABindingMapper scaBindingMapper;
+
+ public LocalSCABindingProviderFactory(ExtensionPointRegistry extensionPoints) {
+ this.extensionPoints = extensionPoints;
+ UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ this.scaBindingMapper = utilities.getUtility(SCABindingMapper.class);
+ }
+
+ @Override
+ public ReferenceBindingProvider createReferenceBindingProvider(RuntimeEndpointReference endpointReference) {
+ return new LocalSCAReferenceBindingProvider(extensionPoints, endpointReference, scaBindingMapper);
+ }
+
+ @Override
+ public ServiceBindingProvider createServiceBindingProvider(RuntimeEndpoint endpoint) {
+ return new LocalSCAServiceBindingProvider(endpoint, scaBindingMapper);
+ }
+
+ @Override
+ public Class<LocalSCABinding> getModelType() {
+ return LocalSCABinding.class;
+ }
+
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAReferenceBindingProvider.java new file mode 100644 index 0000000000..f04b6aeb4c --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAReferenceBindingProvider.java @@ -0,0 +1,127 @@ +package org.apache.tuscany.sca.binding.local;
+
+import org.apache.tuscany.sca.assembly.Endpoint;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.binding.local.LocalSCABindingInvoker;
+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.EndpointReferenceAsyncProvider;
+import org.apache.tuscany.sca.provider.SCABindingMapper;
+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;
+
+public class LocalSCAReferenceBindingProvider implements EndpointReferenceAsyncProvider {
+ private RuntimeEndpointReference endpointReference;
+
+ private InterfaceContractMapper interfaceContractMapper;
+ private ExtensionPointRegistry extensionPoints;
+ private Mediator mediator;
+
+ public LocalSCAReferenceBindingProvider(ExtensionPointRegistry extensionPoints, RuntimeEndpointReference endpointReference, SCABindingMapper mapper) {
+ this.extensionPoints = extensionPoints;
+ UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
+ this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class);
+ this.mediator = utilities.getUtility(Mediator.class);
+
+ this.endpointReference = endpointReference;
+ }
+
+ @Override
+ public InterfaceContract getBindingInterfaceContract() {
+ RuntimeEndpoint endpoint = (RuntimeEndpoint) endpointReference.getTargetEndpoint();
+ if (endpoint != null) {
+ return endpoint.getComponentTypeServiceInterfaceContract();
+ } else {
+ return endpointReference.getComponentTypeReferenceInterfaceContract();
+ }
+ }
+
+ @Override
+ public Invoker createInvoker(Operation operation) {
+ Invoker result = null;
+
+ Endpoint target = endpointReference.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 {
+ Reference ref = endpointReference.getReference().getReference();
+ // The spec says both ref and service needs to
+ // allowsPassByReference
+ boolean allowsPBR = (endpointReference.getReference().isAllowsPassByReference() || (ref != null && ref.isAllowsPassByReference())) && chain.allowsPassByReference();
+
+ if (allowsPBR && interfaceContractMapper.isCompatibleByReference(operation, targetOp, Compatibility.SUBSET)) {
+ passByValue = false;
+ } else if (interfaceContractMapper.isCompatibleWithoutUnwrapByValue(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
+ result = chain == null ? null : new LocalSCABindingInvoker(chain, operation, mediator, passByValue, endpointReference, extensionPoints);
+ }
+ }
+
+ if (result == null) {
+ throw new ServiceUnavailableException("Unable to create SCA binding invoker for local target " + endpointReference.getComponent().getName() + " reference "
+ + endpointReference.getReference().getName() + " (bindingURI=" + endpointReference.getBinding().getURI() + " operation=" + operation.getName() + ")");
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean supportsOneWayInvocation() {
+ // Default for Local invocation
+ return false;
+ }
+
+ @Override
+ public boolean supportsNativeAsync() {
+ return true;
+ }
+
+ @Override
+ public void configure() {
+ // Nothing required for Local invocation
+ }
+
+ @Override
+ public void start() {
+ // Nothing required for Local invocation
+ }
+
+ @Override
+ public void stop() {
+ // Nothing required for Local invocation
+ }
+
+ /**
+ * Allows us to replace the delegate EPR with the real EPR so that the local binding
+ * optimization operates against the correct invocation chains.
+ */
+ public void setEndpointReference(RuntimeEndpointReference endpointReference){
+ this.endpointReference = endpointReference;
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAServiceBindingProvider.java new file mode 100644 index 0000000000..760b92cfa4 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/local/LocalSCAServiceBindingProvider.java @@ -0,0 +1,52 @@ +package org.apache.tuscany.sca.binding.local;
+
+import org.apache.tuscany.sca.binding.sca.provider.SCABindingAsyncResponseInvoker;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.invocation.InvokerAsyncResponse;
+import org.apache.tuscany.sca.provider.EndpointAsyncProvider;
+import org.apache.tuscany.sca.provider.SCABindingMapper;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+
+public class LocalSCAServiceBindingProvider implements EndpointAsyncProvider {
+ private RuntimeEndpoint endpoint;
+
+ public LocalSCAServiceBindingProvider(RuntimeEndpoint endpoint, SCABindingMapper scaBindingMapper) {
+ this.endpoint = endpoint;
+ }
+
+ @Override
+ public InterfaceContract getBindingInterfaceContract() {
+ return endpoint.getComponentTypeServiceInterfaceContract();
+ }
+
+ @Override
+ public InvokerAsyncResponse createAsyncResponseInvoker() {
+ return new SCABindingAsyncResponseInvoker(null, null);
+ }
+
+ @Override
+ public boolean supportsOneWayInvocation() {
+ // Default for Local invocation
+ return false;
+ }
+
+ @Override
+ public boolean supportsNativeAsync() {
+ return true;
+ }
+
+ @Override
+ public void stop() {
+ // Nothing required for local invocation
+ }
+
+ @Override
+ public void start() {
+ // Nothing required for local invocation
+ }
+
+ @Override
+ public void configure() {
+ // Nothing required for local invocation
+ }
+}
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DefaultSCABindingMapper.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DefaultSCABindingMapper.java index 284411054a..c87779d58d 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DefaultSCABindingMapper.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DefaultSCABindingMapper.java @@ -47,6 +47,8 @@ import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint; import org.apache.tuscany.sca.provider.SCABindingMapper; import org.apache.tuscany.sca.runtime.DomainRegistryFactory; import org.apache.tuscany.sca.runtime.DomainRegistryFactoryExtensionPoint; +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.ServiceRuntimeException; @@ -60,6 +62,7 @@ public class DefaultSCABindingMapper implements SCABindingMapper { protected ProviderFactoryExtensionPoint providerFactories; protected StAXArtifactProcessorExtensionPoint processors; protected QName defaultMappedBinding; + protected QName defaultLocalBinding; protected boolean supportsDistributedSCA; public DefaultSCABindingMapper(ExtensionPointRegistry registry, Map<String, String> attributes) { @@ -67,6 +70,7 @@ public class DefaultSCABindingMapper implements SCABindingMapper { providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class); processors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class); defaultMappedBinding = getDefaultMappedBinding(attributes); + defaultLocalBinding = new QName(Base.SCA11_TUSCANY_NS, "binding.local"); supportsDistributedSCA = isDistributed(); } @@ -151,7 +155,6 @@ public class DefaultSCABindingMapper implements SCABindingMapper { } public RuntimeEndpoint map(RuntimeEndpoint endpoint) { - QName bindingType = chooseBinding(endpoint); if (!isBindingSupported(bindingType)) { logger.warning("Mapped binding for binding.sca is not supported: " + bindingType); @@ -242,6 +245,7 @@ public class DefaultSCABindingMapper implements SCABindingMapper { return binding; } + /* public boolean isRemotable(RuntimeEndpoint endpoint) { return supportsDistributedSCA && isBindingSupported(chooseBinding(endpoint)); } @@ -249,6 +253,7 @@ public class DefaultSCABindingMapper implements SCABindingMapper { public boolean isRemotable(RuntimeEndpointReference endpointReference) { return supportsDistributedSCA && isBindingSupported(chooseBinding(endpointReference)); } + */ /** * Choose the physical binding for service-side remotable binding.sca @@ -256,7 +261,14 @@ public class DefaultSCABindingMapper implements SCABindingMapper { * @return */ protected QName chooseBinding(RuntimeEndpoint endpoint) { - return defaultMappedBinding; + if(endpoint.getService().getInterfaceContract() != null + && ((RuntimeComponentService)endpoint.getService()).getInterfaceContract().getInterface().isRemotable() + && supportsDistributedSCA + && isBindingSupported(defaultMappedBinding)) { + return defaultMappedBinding; + } + + return defaultLocalBinding; } /** @@ -265,7 +277,21 @@ public class DefaultSCABindingMapper implements SCABindingMapper { * @return */ protected QName chooseBinding(RuntimeEndpointReference endpointReference) { - return defaultMappedBinding; + if(endpointReference.getTargetEndpoint().isRemote()) { + RuntimeComponentReference ref = (RuntimeComponentReference)endpointReference.getReference(); + if(ref.getInterfaceContract() != null && !ref.getInterfaceContract().getInterface().isRemotable()) { + throw new ServiceRuntimeException("Reference interface not remotable for component: " + + endpointReference.getComponent().getName() + + " and reference: " + + ref.getName()); + } + + if(supportsDistributedSCA && isBindingSupported(defaultMappedBinding)) { + return defaultMappedBinding; + } + } + + return defaultLocalBinding; } } diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAReferenceBindingProvider.java index e168851d81..2cc71f1744 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAReferenceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAReferenceBindingProvider.java @@ -19,9 +19,12 @@ package org.apache.tuscany.sca.binding.sca.provider; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.binding.local.LocalSCAReferenceBindingProvider; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.provider.EndpointReferenceAsyncProvider; import org.apache.tuscany.sca.provider.EndpointReferenceProvider; import org.apache.tuscany.sca.provider.ReferenceBindingProvider; import org.apache.tuscany.sca.provider.SCABindingMapper; @@ -30,15 +33,23 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; /** * The reference binding provider for the remote sca binding implementation. */ -public class DelegatingSCAReferenceBindingProvider implements EndpointReferenceProvider { +public class DelegatingSCAReferenceBindingProvider implements EndpointReferenceAsyncProvider { private ReferenceBindingProvider provider; + private RuntimeEndpointReference delegateEndpointReference; public DelegatingSCAReferenceBindingProvider(RuntimeEndpointReference endpointReference, SCABindingMapper mapper) { - RuntimeEndpointReference epr = mapper.map(endpointReference); - if (epr != null) { - provider = epr.getBindingProvider(); + delegateEndpointReference = mapper.map(endpointReference); + if (delegateEndpointReference != null) { + endpointReference.setDelegateEndpointReference(delegateEndpointReference); + provider = delegateEndpointReference.getBindingProvider(); + + // reset the EPR to binding.sca EPR because the local optimization assumes + // this to be the case. + if (provider instanceof LocalSCAReferenceBindingProvider){ + ((LocalSCAReferenceBindingProvider)provider).setEndpointReference(endpointReference); + } } } @@ -67,4 +78,17 @@ public class DelegatingSCAReferenceBindingProvider implements EndpointReferenceP ((EndpointReferenceProvider)provider).configure(); } } + + @Override + public boolean supportsNativeAsync() { + if (provider instanceof EndpointReferenceAsyncProvider) { + return ((EndpointReferenceAsyncProvider)provider).supportsNativeAsync(); + } + + return false; + } + + public RuntimeEndpointReference getDelegateEndpointReference(){ + return delegateEndpointReference; + } } diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAServiceBindingProvider.java index f24082fd5c..bc57c47ba6 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAServiceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/DelegatingSCAServiceBindingProvider.java @@ -26,6 +26,7 @@ import org.apache.tuscany.sca.provider.EndpointProvider; import org.apache.tuscany.sca.provider.SCABindingMapper; import org.apache.tuscany.sca.provider.ServiceBindingProvider; import org.apache.tuscany.sca.runtime.RuntimeEndpoint; +import org.apache.tuscany.sca.runtime.RuntimeEndpointReference; /** * The service binding provider for the remote sca binding implementation. Relies on the @@ -39,14 +40,15 @@ public class DelegatingSCAServiceBindingProvider implements EndpointAsyncProvide private ServiceBindingProvider provider; private RuntimeEndpoint endpoint; - private RuntimeEndpoint mappedEndpoint; + private RuntimeEndpoint delegateEndpoint; private boolean started = false; public DelegatingSCAServiceBindingProvider(RuntimeEndpoint endpoint, SCABindingMapper mapper) { this.endpoint = endpoint; - this.mappedEndpoint = mapper.map(endpoint); - if (mappedEndpoint != null) { - provider = mappedEndpoint.getBindingProvider(); + this.delegateEndpoint = mapper.map(endpoint); + if (delegateEndpoint != null) { + endpoint.setDelegateEndpoint(delegateEndpoint); + provider = delegateEndpoint.getBindingProvider(); } } @@ -92,8 +94,8 @@ public class DelegatingSCAServiceBindingProvider implements EndpointAsyncProvide } else { provider.start(); // Set the resolved binding URI back to the binding.sca - endpoint.getBinding().setURI(mappedEndpoint.getBinding().getURI()); - endpoint.setDeployedURI(mappedEndpoint.getDeployedURI()); + endpoint.getBinding().setURI(delegateEndpoint.getBinding().getURI()); + endpoint.setDeployedURI(delegateEndpoint.getDeployedURI()); started = true; } } @@ -112,5 +114,9 @@ public class DelegatingSCAServiceBindingProvider implements EndpointAsyncProvide public ServiceBindingProvider getProviderDelegate() { return provider; } + + public RuntimeEndpoint getDelegateEndpoint(){ + return delegateEndpoint; + } } diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAReferenceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAReferenceBindingProvider.java index 122959d935..cfbb6f484b 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAReferenceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAReferenceBindingProvider.java @@ -19,29 +19,16 @@ package org.apache.tuscany.sca.binding.sca.provider; -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.assembly.Reference; -import org.apache.tuscany.sca.assembly.SCABinding; 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.EndpointReferenceAsyncProvider; import org.apache.tuscany.sca.provider.EndpointReferenceProvider; import org.apache.tuscany.sca.provider.ReferenceBindingProvider; import org.apache.tuscany.sca.provider.SCABindingMapper; -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.ServiceRuntimeException; -import org.oasisopen.sca.ServiceUnavailableException; /** * The sca reference binding provider mediates between the twin requirements of @@ -55,148 +42,45 @@ import org.oasisopen.sca.ServiceUnavailableException; public class RuntimeSCAReferenceBindingProvider implements EndpointReferenceAsyncProvider { private RuntimeEndpointReference endpointReference; - private RuntimeComponent component; - private RuntimeComponentReference reference; - private SCABinding binding; - private boolean remotable; private boolean started = false; - private ReferenceBindingProvider distributedProvider; - private Mediator mediator; - private InterfaceContractMapper interfaceContractMapper; + private ReferenceBindingProvider delegatingBindingProvider; private SCABindingMapper scaBindingMapper; - private ExtensionPointRegistry registry; public RuntimeSCAReferenceBindingProvider(ExtensionPointRegistry extensionPoints, RuntimeEndpointReference endpointReference) { - this.registry = extensionPoints; this.endpointReference = endpointReference; - this.component = (RuntimeComponent)endpointReference.getComponent(); - this.reference = (RuntimeComponentReference)endpointReference.getReference(); - this.binding = (SCABinding)endpointReference.getBinding(); UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class); - this.mediator = utilities.getUtility(Mediator.class); - this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class); this.scaBindingMapper = utilities.getUtility(SCABindingMapper.class); - remotable = isTargetRemote(); - getDistributedProvider(); + getDelegatingProvider(); } - private boolean isTargetRemote() { - return endpointReference.getTargetEndpoint().isRemote(); - } - - private ReferenceBindingProvider getDistributedProvider() { - - if (remotable) { - // initialize the remote provider if it hasn't been done already - if (distributedProvider == null) { - if (reference.getInterfaceContract() != null && !reference.getInterfaceContract().getInterface() - .isRemotable()) { - throw new ServiceRuntimeException("Reference interface not remotable for component: " + component - .getName() - + " and reference: " - + reference.getName()); - } - - if (scaBindingMapper.isRemotable(endpointReference)) { - distributedProvider = - new DelegatingSCAReferenceBindingProvider(endpointReference, scaBindingMapper); - } - } + private ReferenceBindingProvider getDelegatingProvider() { + if (delegatingBindingProvider == null) { + delegatingBindingProvider = new DelegatingSCAReferenceBindingProvider(endpointReference, scaBindingMapper); } - return distributedProvider; + return delegatingBindingProvider; } public InterfaceContract getBindingInterfaceContract() { - if (remotable && distributedProvider != null) { - return distributedProvider.getBindingInterfaceContract(); - } else { - // Check if there is a target - RuntimeEndpoint endpoint = (RuntimeEndpoint)endpointReference.getTargetEndpoint(); - if (endpoint != null) { - return endpoint.getComponentTypeServiceInterfaceContract(); - } else { - return endpointReference.getComponentTypeReferenceInterfaceContract(); - } - } + return delegatingBindingProvider.getBindingInterfaceContract(); } public boolean supportsOneWayInvocation() { - if (remotable && distributedProvider != null) { - return distributedProvider.supportsOneWayInvocation(); - } else { - 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 { - Reference ref = epr.getReference().getReference(); - // The spec says both ref and service needs to allowsPassByReference - boolean allowsPBR = - (epr.getReference().isAllowsPassByReference() || (ref != null && ref.isAllowsPassByReference())) && chain - .allowsPassByReference(); - - if (allowsPBR && interfaceContractMapper.isCompatibleByReference(operation, - targetOp, - Compatibility.SUBSET)) { - passByValue = false; - } else if (interfaceContractMapper.isCompatibleWithoutUnwrapByValue(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 SCABindingInvoker(chain, operation, mediator, passByValue, epr, registry); - } - } - return null; + return delegatingBindingProvider.supportsOneWayInvocation(); } public Invoker createInvoker(Operation operation) { - if (remotable && distributedProvider != null) { - return distributedProvider.createInvoker(operation); - } else { - 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; - } + return delegatingBindingProvider.createInvoker(operation); } public void start() { if (started) { return; } - if (distributedProvider != null) { - distributedProvider.start(); - } + getDelegatingProvider().start(); started = true; } @@ -206,22 +90,24 @@ public class RuntimeSCAReferenceBindingProvider implements EndpointReferenceAsyn } try { - if (distributedProvider != null) { - distributedProvider.stop(); - } + getDelegatingProvider().stop(); } finally { started = false; } } public void configure() { - if (distributedProvider instanceof EndpointReferenceProvider) { - ((EndpointReferenceProvider)distributedProvider).configure(); + if (getDelegatingProvider() instanceof EndpointReferenceProvider) { + ((EndpointReferenceProvider)getDelegatingProvider()).configure(); } } public boolean supportsNativeAsync() { - return true; + return ((EndpointReferenceAsyncProvider)delegatingBindingProvider).supportsNativeAsync(); + } + + public RuntimeEndpointReference getDelegateEndpointReference(){ + return ((DelegatingSCAReferenceBindingProvider)delegatingBindingProvider).getDelegateEndpointReference(); } } diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAServiceBindingProvider.java index e1ffa548de..2dc019226a 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAServiceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/java/org/apache/tuscany/sca/binding/sca/provider/RuntimeSCAServiceBindingProvider.java @@ -19,15 +19,16 @@ package org.apache.tuscany.sca.binding.sca.provider; +import org.apache.tuscany.sca.binding.local.LocalSCABindingInvocationInterceptor; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.invocation.InvocationChain; import org.apache.tuscany.sca.invocation.InvokerAsyncResponse; import org.apache.tuscany.sca.invocation.Phase; import org.apache.tuscany.sca.provider.EndpointAsyncProvider; +import org.apache.tuscany.sca.provider.EndpointProvider; import org.apache.tuscany.sca.provider.OptimisingBindingProvider; import org.apache.tuscany.sca.provider.SCABindingMapper; import org.apache.tuscany.sca.provider.ServiceBindingProvider; -import org.apache.tuscany.sca.runtime.RuntimeComponentService; import org.apache.tuscany.sca.runtime.RuntimeEndpoint; /** @@ -40,22 +41,23 @@ import org.apache.tuscany.sca.runtime.RuntimeEndpoint; */ public class RuntimeSCAServiceBindingProvider implements EndpointAsyncProvider, OptimisingBindingProvider { private RuntimeEndpoint endpoint; - private RuntimeComponentService service; + private SCABindingMapper mapper; - private ServiceBindingProvider distributedProvider; + private ServiceBindingProvider delegatingBindingProvider; public RuntimeSCAServiceBindingProvider(SCABindingMapper scaBindingMapper, 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()) { + this.mapper = scaBindingMapper; + getDelegatingProvider(); + } - if (scaBindingMapper.isRemotable(endpoint)) { - distributedProvider = new DelegatingSCAServiceBindingProvider(endpoint, scaBindingMapper); - } - } + // if there is potentially a wire to this service that crosses the node boundary + // then we need to create a remote endpoint + private ServiceBindingProvider getDelegatingProvider() { + if(delegatingBindingProvider == null) { + delegatingBindingProvider = new DelegatingSCAServiceBindingProvider(endpoint, mapper); + } + return delegatingBindingProvider; } /* @@ -73,35 +75,26 @@ public class RuntimeSCAServiceBindingProvider implements EndpointAsyncProvider, */ public InterfaceContract getBindingInterfaceContract() { - if (distributedProvider != null) { - return distributedProvider.getBindingInterfaceContract(); - } else { - return endpoint.getComponentTypeServiceInterfaceContract(); - } + return getDelegatingProvider().getBindingInterfaceContract(); } public boolean supportsOneWayInvocation() { - if (distributedProvider != null) { - return distributedProvider.supportsOneWayInvocation(); - } - return false; + return getDelegatingProvider().supportsOneWayInvocation(); } public void start() { - if (distributedProvider != null) { - distributedProvider.start(); - } + getDelegatingProvider().start(); } public void stop() { endpoint.getBinding().setURI(null); - if (distributedProvider != null) { - distributedProvider.stop(); - } + getDelegatingProvider().stop(); } public void configure() { - // TODO Auto-generated method stub + if (getDelegatingProvider() instanceof EndpointProvider) { + ((EndpointProvider)getDelegatingProvider()).configure(); + } } public boolean supportsNativeAsync() { @@ -109,15 +102,11 @@ public class RuntimeSCAServiceBindingProvider implements EndpointAsyncProvider, } public InvokerAsyncResponse createAsyncResponseInvoker() { - if (distributedProvider != null) { - return ((EndpointAsyncProvider)distributedProvider).createAsyncResponseInvoker(); - } else { - return new SCABindingAsyncResponseInvoker(null, null); - } + return ((EndpointAsyncProvider)getDelegatingProvider()).createAsyncResponseInvoker(); } /** - * Handles the optimisation for the service side chain, which provides a mechanism for direct local + * Handles the optimization for the service side chain, which provides a mechanism for direct local * invocation of the service in cases where the component reference is in the same JVM as the * component service. Effectively, this means skipping any Remote Binding listener and its associated * binding chain and data binding processors. @@ -129,9 +118,13 @@ public class RuntimeSCAServiceBindingProvider implements EndpointAsyncProvider, // To optimise, place an SCA binding Local Invocation interceptor at the start of the POLICY phase // of the service chain... for (InvocationChain chain : ep.getInvocationChains()) { - chain.addHeadInterceptor( Phase.SERVICE_POLICY, new SCABindingLocalInvocationInterceptor() ); + chain.addHeadInterceptor( Phase.SERVICE_POLICY, new LocalSCABindingInvocationInterceptor() ); } // end for } // end method optimiseBinding + + public RuntimeEndpoint getDelegateEndpoint(){ + return ((DelegatingSCAServiceBindingProvider)delegatingBindingProvider).getDelegateEndpoint(); + } } // end class RuntimeSCAServiceBinding diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.local.LocalSCABindingFactory b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.local.LocalSCABindingFactory new file mode 100644 index 0000000000..9ad3a4c536 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.binding.local.LocalSCABindingFactory @@ -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.
+
+org.apache.tuscany.sca.binding.local.LocalSCABindingFactoryImpl
+
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor new file mode 100644 index 0000000000..419e040564 --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-sca-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.LocalSCABinding,factory=org.apache.tuscany.sca.binding.local.LocalSCABindingFactory
diff --git a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory index 86e3d1e829..3a089bc284 100644 --- a/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory +++ b/sca-java-2.x/trunk/modules/binding-sca-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory @@ -17,4 +17,4 @@ # Implementation class for the binding extension
org.apache.tuscany.sca.binding.sca.provider.RuntimeSCABindingProviderFactory;model=org.apache.tuscany.sca.assembly.SCABinding
-
+org.apache.tuscany.sca.binding.local.LocalSCABindingProviderFactory;model=org.apache.tuscany.sca.binding.local.LocalSCABinding
diff --git a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/SCABindingMapper.java b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/SCABindingMapper.java index 68096a8f9a..706bf7d319 100644 --- a/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/SCABindingMapper.java +++ b/sca-java-2.x/trunk/modules/core-spi/src/main/java/org/apache/tuscany/sca/provider/SCABindingMapper.java @@ -39,13 +39,6 @@ public interface SCABindingMapper { * @param endpointReference
* @return The endpoint reference for the mapped binding
*/
- public RuntimeEndpointReference map(RuntimeEndpointReference endpointReference);
-
- /**
- * Check if the remote SCA binding is supported
- * @return
- */
- boolean isRemotable(RuntimeEndpoint endpoint);
- boolean isRemotable(RuntimeEndpointReference endpointReference);
+ public RuntimeEndpointReference map(RuntimeEndpointReference endpointReference);
}
|