diff options
19 files changed, 804 insertions, 473 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);
}
diff --git a/sca-java-2.x/trunk/testing/itest/scabindingmapper/src/main/java/itest/scabindingmapper/MyMapper.java b/sca-java-2.x/trunk/testing/itest/scabindingmapper/src/main/java/itest/scabindingmapper/MyMapper.java index 016f744598..77c7cc0cbe 100644 --- a/sca-java-2.x/trunk/testing/itest/scabindingmapper/src/main/java/itest/scabindingmapper/MyMapper.java +++ b/sca-java-2.x/trunk/testing/itest/scabindingmapper/src/main/java/itest/scabindingmapper/MyMapper.java @@ -42,20 +42,30 @@ public class MyMapper extends DefaultSCABindingMapper { @Override protected QName chooseBinding(RuntimeEndpoint endpoint) { - if (endpoint.getComponent().getName().endsWith("2")) { - return JSONPBinding.TYPE; - } else { - return super.defaultMappedBinding; + QName bindingType = super.chooseBinding(endpoint); + + if (!bindingType.equals(super.defaultLocalBinding)) { + if (endpoint.getComponent().getName().endsWith("2")) { + bindingType = JSONPBinding.TYPE; + } else { + bindingType = super.defaultMappedBinding; + } } + return bindingType; } @Override protected QName chooseBinding(RuntimeEndpointReference endpointReference) { - if (endpointReference.getBinding().getURI().contains("Service2")) { - return JSONPBinding.TYPE; - } else { - return super.defaultMappedBinding; + QName bindingType = super.chooseBinding(endpointReference); + + if (!bindingType.equals(super.defaultLocalBinding)) { + if (endpointReference.getBinding().getURI().contains("Service2")) { + bindingType = JSONPBinding.TYPE; + } else { + bindingType = super.defaultMappedBinding; + } } + return bindingType; } /* |