Added: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationConfiguration.java?rev=399988&view=auto ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationConfiguration.java (added) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvocationConfiguration.java Thu May 4 23:29:38 2006 @@ -0,0 +1,191 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.spi.wire; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * Contains a source- or target-side invocation pipeline for a service operation. The runtime framework + * creates invocation chains on a per-operation, per-service basis. Further, invocation chains are further + * distinguished by being part of the source or target sides of a wire. Chains are "bridged" together by the + * runtime by a set of [EMAIL PROTECTED] org.apache.tuscany.spi.builder.WireBuilder}s with the source-side holding + * references to the target. + * <p/> + * <code>InvocationChain</code>s are managed by [EMAIL PROTECTED] WireConfiguration}s, which are used by [EMAIL PROTECTED] + * org.apache.tuscany.core.wire.WireFactory}s to buildSource wires and proxies. + * <p/> + * Invocation configurations must contain at least one interceptor and may have 0 to N handlers. Handlers + * process a wire request or response in a one-way fashion. A typical wire sequence where interceptors and + * handlers are configured for both the source and target-side will proceed as follows: + * <pre> + * <ol> + * <li>The first source interceptor will be called with a message, which will in + * turn invoke the next interceptor in the chain <li>The last source interceptor, which must be of type + * [EMAIL PROTECTED] + * org.apache.tuscany.core.wire.impl.RequestResponseInterceptor} if there are handlers present, will be + * invoked. The RR + * interceptor will in turn pass the message to a [EMAIL PROTECTED] MessageChannel} which + * will invoke all source-side request handlers. + * <li>The RR interceptor will then invoke the target-side request <code>MessageChannel</code>. + * <li>The last source-side handler, an instance of [EMAIL PROTECTED] MessageDispatcher}, + * will invoke the + * first source-side interceptor, which in turn will pass the message down the target-side interceptor + * chain. + * <li>If the target is a component instance the last target-side interceptor, an instance of + * [EMAIL PROTECTED] InvokerInterceptor} will retrieve the [EMAIL PROTECTED] TargetInvoker} from the + * message and + * call it to invoke the operation on a target instance. <tt>TargetInvoker</tt>s are help by + * the source proxy to enable optimizations such as caching of target instances. <li> The response is + * returned up the wire + * stack + * until it reaches the source-side <tt>RequestResponseInterceptor</tt>, which invokes the target and + * source-side response + * channels respectively. + * <li>The response is then passed back up the rest of the wire stack. </ol> + * </pre> + * <p/> + * The source-to-target bridge may be constructed in any of the following ways: + * <pre> + * <ul> + * <li>Source handler-to-target handler + * <li>Source handler-to-target interceptor + * <li>Source interceptor-to-target handler + * <li>Source interceptor-to-target interceptor + * </ul> + * </pre> + * <p/> + * In some scenarios, a service proxy may only contain target-side invocaton chains, for example, when a + * service is resolved through a locate operation by a non-component client. In this case, there will be no + * source-side wire chains and the target invoker will be held by the target-side and passed down the + * pipeline. + * + * @version $Rev: 396284 $ $Date: 2006-04-23 08:27:42 -0700 (Sun, 23 Apr 2006) $ + * @see org.apache.tuscany.spi.builder.WireBuilder + * @see WireFactory + * @see TargetInvoker + * @see MessageDispatcher + */ +public abstract class InvocationConfiguration { + + // the operation on the target that will utlimately be invoked + protected Method operation; + + // responsible for invoking a target instance + protected TargetInvoker targetInvoker; + + protected Interceptor interceptorChainHead; + + protected Interceptor interceptorChainTail; + + protected List<MessageHandler> requestHandlers; + + protected List<MessageHandler> responseHandlers; + + public InvocationConfiguration(Method operation) { + assert (operation != null) : "No operation type specified"; + this.operation = operation; + } + + /** + * Returns the target operation for this invocation chain + */ + public Method getMethod() { + return operation; + } + + /** + * Adds an request handler to the invocation chain + */ + public void addRequestHandler(MessageHandler handler) { + if (requestHandlers == null) { + requestHandlers = new ArrayList<MessageHandler>(); + } + requestHandlers.add(handler); + } + + /** + * Adds an response handler to the invocation chain + */ + public void addResponseHandler(MessageHandler handler) { + if (responseHandlers == null) { + responseHandlers = new ArrayList<MessageHandler>(); + } + responseHandlers.add(handler); + } + + /** + * Returns the request handler chain + */ + public List<MessageHandler> getRequestHandlers() { + return requestHandlers; + } + + /** + * Returns the response handler chain + */ + public List<MessageHandler> getResponseHandlers() { + return responseHandlers; + } + + /** + * Sets the target invoker to pass down the chain + */ + public void setTargetInvoker(TargetInvoker invoker) { + this.targetInvoker = invoker; + } + + /** + * Returns the target invoker that is passed down the chain + */ + public TargetInvoker getTargetInvoker() { + return targetInvoker; + } + + /** + * Adds an interceptor to the chain + */ + public void addInterceptor(Interceptor interceptor) { + if (interceptorChainHead == null) { + interceptorChainHead = interceptor; + } else { + interceptorChainTail.setNext(interceptor); + } + interceptorChainTail = interceptor; + } + + /** + * Returns the last interceptor in the chain + */ + public Interceptor getTailInterceptor() { + return interceptorChainTail; + } + + /** + * Returns the first interceptor in the chain + */ + public Interceptor getHeadInterceptor() { + return interceptorChainHead; + } + + /** + * Signals to the chain that its configuration is complete. Implementations may use this callback to + * prepare there invocation chains. + */ + public abstract void build(); +}
Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvokerInterceptor.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvokerInterceptor.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvokerInterceptor.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/InvokerInterceptor.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/InvokerInterceptor.java Thu May 4 23:29:38 2006 @@ -11,20 +11,15 @@ * 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.core.wire.impl; - -import org.apache.tuscany.spi.wire.Interceptor; -import org.apache.tuscany.spi.wire.InvocationRuntimeException; -import org.apache.tuscany.spi.wire.TargetInvoker; -import org.apache.tuscany.spi.wire.Message; +package org.apache.tuscany.spi.wire; /** * Serves as a tail interceptor on a target wire chain. This implementation dispatches to the target invoker * passed inside the wire message. Target invokers are passed from the source in order to allow for caching of * target instances. - * - * @see org.apache.tuscany.spi.wire.TargetInvoker + * * @version $Rev$ $Date$ + * @see TargetInvoker */ public class InvokerInterceptor implements Interceptor { Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageChannelImpl.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java Thu May 4 23:29:38 2006 @@ -14,28 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tuscany.core.wire.impl; - -import org.apache.tuscany.spi.wire.MessageChannel; -import org.apache.tuscany.spi.wire.MessageHandler; -import org.apache.tuscany.spi.wire.Message; +package org.apache.tuscany.spi.wire; import java.util.List; /** * A channel comprising an ordered collection of message handlers. * - [EMAIL PROTECTED] org.apache.tuscany.spi.wire.Message * @version $Rev$ $Date$ + * @see org.apache.tuscany.spi.wire.Message */ public class MessageChannelImpl implements MessageChannel { private final List<MessageHandler> pipeline; - //---------------------------------- - // Constructors - //---------------------------------- - /** * Construct a new channel comprising the supplied list of handlers. * @@ -45,19 +37,14 @@ this.pipeline = pipeline; } - //---------------------------------- - // Methods - //---------------------------------- - /** - * Send a message down the channel. The message will be processed by all handlers - * in order until one returns false to indicate processing is complete or all - * handlers have been called. + * Send a message down the channel. The message will be processed by all handlers in order until one + * returns false to indicate processing is complete or all handlers have been called. * * @param msg a Message to send down the channel */ public void send(Message msg) { - if (pipeline!=null) { + if (pipeline != null) { for (MessageHandler handler : pipeline) { if (!handler.processMessage(msg)) { break; Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageChannelImpl.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/MessageDispatcher.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java Thu May 4 23:29:38 2006 @@ -14,16 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tuscany.core.wire.impl; - -import org.apache.tuscany.spi.wire.Interceptor; -import org.apache.tuscany.spi.wire.MessageHandler; -import org.apache.tuscany.spi.wire.Message; +package org.apache.tuscany.spi.wire; /** - * A message handler that dispatches the message through an interceptor stack and the uses the response channel to - * return the wire result. - * + * A message handler that dispatches the message through an interceptor stack and the uses the response + * channel to return the wire result. + * * @version $Rev$ $Date$ */ public class MessageDispatcher implements MessageHandler { @@ -31,7 +27,7 @@ /** * Construct a handler that dispatches messages to an Interceptor stack. - * + * * @param head the interceptor at the head of the stack */ public MessageDispatcher(Interceptor head) { Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageDispatcher.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/message/impl/MessageImpl.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java Thu May 4 23:29:38 2006 @@ -14,11 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tuscany.core.message.impl; - -import org.apache.tuscany.spi.wire.Message; -import org.apache.tuscany.spi.wire.MessageChannel; -import org.apache.tuscany.spi.wire.TargetInvoker; +package org.apache.tuscany.spi.wire; /** * The default implementation of a message flowed through a wire during an invocation @@ -31,55 +27,33 @@ private Message relatedCallbackMessage; private TargetInvoker invoker; - protected MessageImpl() { - super(); + public MessageImpl() { } - /** - * @see org.apache.tuscany.spi.wire.Message#getBody() - */ public Object getBody() { return body; } - /** - * @see org.apache.tuscany.spi.wire.Message#setBody(java.lang.Object) - */ public void setBody(Object body) { this.body = body; } - /** - * @see org.apache.tuscany.spi.wire.Message#getCallbackChannel() - */ public MessageChannel getCallbackChannel() { return this; } - /** - * @see org.apache.tuscany.spi.wire.MessageChannel#send(org.apache.tuscany.spi.wire.Message) - */ public void send(Message message) { relatedCallbackMessage = message; } - /** - * @see org.apache.tuscany.spi.wire.Message#getRelatedCallbackMessage() - */ public Message getRelatedCallbackMessage() { return relatedCallbackMessage; } - /** - * @see org.apache.tuscany.spi.wire.Message#setTargetInvoker(org.apache.tuscany.spi.wire.TargetInvoker) - */ public void setTargetInvoker(TargetInvoker invoker) { this.invoker = invoker; } - /** - * @see org.apache.tuscany.spi.wire.Message#getTargetInvoker() - */ public TargetInvoker getTargetInvoker() { return invoker; } Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/MessageImpl.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/OneWayInterceptor.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java Thu May 4 23:29:38 2006 @@ -14,15 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tuscany.core.wire.impl; - -import org.apache.tuscany.spi.wire.Interceptor; -import org.apache.tuscany.spi.wire.MessageChannel; -import org.apache.tuscany.spi.wire.Message; +package org.apache.tuscany.spi.wire; /** * An interceptor that sends the wire Message down its request channel and does not expect a response. - * + * * @version $Rev$ $Date$ */ public class OneWayInterceptor implements Interceptor { @@ -30,7 +26,7 @@ /** * Construct an interceptor that sends messages down the supplied channel. - * + * * @param requestChannel the channel to send messages down */ public OneWayInterceptor(MessageChannel requestChannel) { Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/OneWayInterceptor.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java (from r399941, incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java) URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java?p2=incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java&p1=incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java&r1=399941&r2=399988&rev=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/core/src/main/java/org/apache/tuscany/core/wire/impl/RequestResponseInterceptor.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java Thu May 4 23:29:38 2006 @@ -14,16 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.tuscany.core.wire.impl; - -import org.apache.tuscany.spi.wire.Interceptor; -import org.apache.tuscany.spi.wire.MessageChannel; -import org.apache.tuscany.spi.wire.Message; +package org.apache.tuscany.spi.wire; /** * An interceptor that first sends a message down its request channel then extracts the response from the * message and sends it down the response channel before returning it up the interceptor stack. - * + * * @version $Rev$ $Date$ */ public class RequestResponseInterceptor implements Interceptor { @@ -38,8 +34,8 @@ /** * Construct an interceptor that sends messages down the supplied channels. - * - * @param targetRequestChannel the channel to send request messages down + * + * @param targetRequestChannel the channel to send request messages down * @param targetResponseChannel the channel to sent response messages down */ public RequestResponseInterceptor(MessageChannel sourceRequestChannel, MessageChannel targetRequestChannel, Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/RequestResponseInterceptor.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/SourceInvocationConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/SourceInvocationConfiguration.java?rev=399988&view=auto ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/SourceInvocationConfiguration.java (added) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/SourceInvocationConfiguration.java Thu May 4 23:29:38 2006 @@ -0,0 +1,127 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.spi.wire; + +import java.lang.reflect.Method; + +/** + * Contains a source-side invocation pipeline for a service operation. + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class SourceInvocationConfiguration extends InvocationConfiguration { + + // the pointer to the bridged target head interceptor or null if the target has no interceptors + private Interceptor targetInterceptorChainHead; + + // the pointer to bridged target request channel, or null if the target has an interceptor + private MessageChannel targetRequestChannel; + + // the pointer to bridged target response channel, or null if the target has an interceptor + private MessageChannel targetResponseChannel; + + /** + * Creates an new wire configuration for the given service reference operation + * + * @param operation the method on the interface representing specified by the reference, where the method corresponds to the + * service operation + */ + public SourceInvocationConfiguration(Method operation) { + super(operation); + } + + /** + * Sets the head interceptor of the target-side configuration for the wire. Used when the runtime bridges source and target + * chains. + * + * @param interceptor + */ + public void setTargetInterceptor(Interceptor interceptor) { + targetInterceptorChainHead = interceptor; + } + + /** + * Returns the head target-side interceptor. This will be the head interceptor of the "bridged" target configuration. + */ + public Interceptor getTargetInterceptor() { + return targetInterceptorChainHead; + } + + /** + * Sets the target-side request channel. Used when the runtime bridges source and target chains. + */ + public void setTargetRequestChannel(MessageChannel channel) { + targetRequestChannel = channel; + } + + /** + * Sets the target-side response channel. Used when the runtime bridges source and target chains. + */ + public void setTargetResponseChannel(MessageChannel channel) { + targetResponseChannel = channel; + } + + /** + * Prepares the configuration by linking interceptors and handlers + */ + @Override + public void build() { + + if (requestHandlers != null && targetInterceptorChainHead != null) { + // on target-side, connect existing handlers and interceptors + MessageHandler messageDispatcher = new MessageDispatcher(targetInterceptorChainHead); + requestHandlers.add(messageDispatcher); + } + + if (requestHandlers != null) { + MessageChannel requestChannel = new MessageChannelImpl(requestHandlers); + MessageChannel responseChannel = new MessageChannelImpl(responseHandlers); + Interceptor channelInterceptor = new RequestResponseInterceptor(requestChannel, targetRequestChannel, + responseChannel, targetResponseChannel); + + if (interceptorChainHead != null) { + interceptorChainTail.setNext(channelInterceptor); + } else { + interceptorChainHead = channelInterceptor; + } + + } else { + // no request handlers + if (interceptorChainHead != null) { + if (targetInterceptorChainHead != null) { + // Connect source interceptor chain directly to target interceptor chain + interceptorChainTail.setNext(targetInterceptorChainHead); + // interceptorChainTail = targetInterceptorChainHead; + } else { + // Connect source interceptor chain to the target request channel + Interceptor channelInterceptor = new RequestResponseInterceptor(null, targetRequestChannel, null, + targetResponseChannel); + interceptorChainTail.setNext(channelInterceptor); + } + } else { + // no source interceptor chain or source handlers, conntect to target interceptor chain or channel + if (targetInterceptorChainHead != null) { + interceptorChainHead = targetInterceptorChainHead; + interceptorChainTail = targetInterceptorChainHead; + } else { + Interceptor channelInterceptor = new RequestResponseInterceptor(null, targetRequestChannel, null, + targetResponseChannel); + interceptorChainHead = channelInterceptor; + interceptorChainTail = channelInterceptor; + } + } + } + } + +} Added: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/TargetInvocationConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/TargetInvocationConfiguration.java?rev=399988&view=auto ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/TargetInvocationConfiguration.java (added) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/TargetInvocationConfiguration.java Thu May 4 23:29:38 2006 @@ -0,0 +1,47 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.spi.wire; + +import java.lang.reflect.Method; + +/** + * Contains a target-side invocation pipeline for a service operation. + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ + */ +public class TargetInvocationConfiguration extends InvocationConfiguration { + + /** + * Creates an new target-side pipeline for the given operation + * + * @param operation the method on the interface representing target service, where the method corresponds + * to the service operation + */ + public TargetInvocationConfiguration(Method operation) { + super(operation); + } + + /** + * Prepares the configuration by linking interceptors and handlers + */ + @Override + public void build() { + if (requestHandlers != null && interceptorChainHead != null) { + // on target-side, connect existing handlers and interceptors + MessageHandler messageDispatcher = new MessageDispatcher(interceptorChainHead); + requestHandlers.add(messageDispatcher); + } + } + +} Added: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireConfiguration.java?rev=399988&view=auto ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireConfiguration.java (added) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireConfiguration.java Thu May 4 23:29:38 2006 @@ -0,0 +1,82 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * Licensed 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.spi.wire; + +import java.lang.reflect.Method; +import java.util.Map; + +import org.apache.tuscany.spi.QualifiedName; + +/** + * Contains configuration for a wire, including its invocation chains. Invocation chains are accessed from the + * collection of [EMAIL PROTECTED] InvocationConfiguration}s keyed by operation on the service specified by the source + * reference or target service. <code>WireConfiguration</code> subtypes distinguish between source and target + * sides of a wire and hence return corresponding <code>InvocationChain</code> subtypes. Operations are + * represented using JDK reflection, i.e. as a <code>Method</code> corresponding to the Java interface + * representing the service. + * <p/> + * Wire configurations are created from an assembly model by the runtime during the buildSource phase. + * + * @version $Rev: 396284 $ $Date: 2006-04-23 08:27:42 -0700 (Sun, 23 Apr 2006) $ + */ +public abstract class WireConfiguration<T extends InvocationConfiguration> { + + protected Map<Method, T> configurations; + + protected ClassLoader proxyClassLoader; + + protected QualifiedName targetName; + + /** + * Creates the configuration + * + * @param targetName the qualified name of the target service specified by the wire + * @param proxyClassLoader the classloader to use when creating a proxy + */ + public WireConfiguration(QualifiedName targetName, ClassLoader proxyClassLoader) { + this.targetName = targetName; + if (proxyClassLoader == null) { + this.proxyClassLoader = Thread.currentThread().getContextClassLoader(); + } else { + this.proxyClassLoader = proxyClassLoader; + } + } + + /** + * Returns the qualified name of the target service specified by the wire + */ + public QualifiedName getTargetName() { + return targetName; + } + + /** + * Returns the classloader used for creating proxies + */ + public ClassLoader getProxyClassLoader() { + return proxyClassLoader; + } + + /** + * Returns the invocation configuration for each operation on a service specified by a reference or a + * target service. + */ + public Map<Method, T> getInvocationConfigurations() { + return configurations; + } + + +} Modified: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireFactory.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireFactory.java?rev=399988&r1=399987&r2=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireFactory.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireFactory.java Thu May 4 23:29:38 2006 @@ -20,7 +20,7 @@ * Implementations are responsible for managing source or target sides of a wire, including creation of service proxies. * Source-side wires are injected on references and may contain policy interceptors and/or handlers specified by them. Target-side * wires may contain policy interceptors and/or handlers specified by the service the wire is targeted to or one of its - * operations. Source- and target-side <code>WireFactory</code>s are held in the [EMAIL PROTECTED] org.apache.tuscany.core.builder.ContextFactory} + * operations. Source- and target-side <code>WireFactory</code>s are held in the [EMAIL PROTECTED] org.apache.tuscany.spi.context.AtomicContext} * associated with the source reference or target service. * <p/> * When an assembly is built by the runtime, source-side and target-side wires are "bridged" on the source side (i.e. a reference @@ -61,7 +61,7 @@ /** * Returns the primary interface type implemented by generated proxies */ - public Class getBusinessInterface(); + public T getBusinessInterface(); /** * Adds an interface type generated proxies implement Modified: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireSourceConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireSourceConfiguration.java?rev=399988&r1=399987&r2=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireSourceConfiguration.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireSourceConfiguration.java Thu May 4 23:29:38 2006 @@ -1,23 +1,65 @@ /** * - * Copyright 2006 The Apache Software Foundation or its licensors as applicable + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. * - * Licensed 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 + * Licensed 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 + * 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. + * 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.spi.wire; +import org.apache.tuscany.spi.QualifiedName; + +import java.lang.reflect.Method; +import java.util.Map; + /** - * @version $Rev$ $Date$ + * Contains configuration for the source side of a wire + * + * @version $Rev: 394379 $ $Date: 2006-04-15 15:01:36 -0700 (Sat, 15 Apr 2006) $ */ -public class WireSourceConfiguration { +public class WireSourceConfiguration extends WireConfiguration<SourceInvocationConfiguration> { + + private String referenceName; + + /** + * Creates the source side of a wire + * + * @param referenceName the name of the reference the wire is associated with + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + */ + public WireSourceConfiguration(String referenceName, QualifiedName targetName, + Map<Method, SourceInvocationConfiguration> invocationConfigs, ClassLoader proxyClassLoader) { + super(targetName, proxyClassLoader); + this.referenceName = referenceName; + this.configurations = invocationConfigs; + } + + /** + * Creates the source side of a wire where the reference is "anonymous", i.e. on an entry point + * + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + */ + public WireSourceConfiguration(QualifiedName targetName, + Map<Method, SourceInvocationConfiguration> invocationConfigs, ClassLoader proxyClassLoader) { + this(null, targetName, invocationConfigs, proxyClassLoader); + } + + + /** + * Returns the name of the source reference + */ + public String getReferenceName() { + return referenceName; + } + } Modified: incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireTargetConfiguration.java URL: http://svn.apache.org/viewcvs/incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireTargetConfiguration.java?rev=399988&r1=399987&r2=399988&view=diff ============================================================================== --- incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireTargetConfiguration.java (original) +++ incubator/tuscany/sandbox/jboynes/sca/spi/src/main/java/org/apache/tuscany/spi/wire/WireTargetConfiguration.java Thu May 4 23:29:38 2006 @@ -1,23 +1,30 @@ -/** - * - * Copyright 2006 The Apache Software Foundation or its licensors as applicable - * - * Licensed 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.spi.wire; +import java.lang.reflect.Method; +import java.util.Map; + +import org.apache.tuscany.spi.QualifiedName; + /** - * @version $Rev$ $Date$ + * Contains configuration for the target side of a wire + * + * @version $$Rev$$ $$Date$$ */ -public class WireTargetConfiguration { +public class WireTargetConfiguration extends WireConfiguration<TargetInvocationConfiguration> { + + /** + * Creates the source side of a wire + * + * @param targetName the qualified name of the target service specified by the wire + * @param invocationConfigs a collection of target service operation-to-invocation chain mappings + * @param proxyClassLoader the classloader to use when creating a proxy + */ + public WireTargetConfiguration(QualifiedName targetName, Map<Method, TargetInvocationConfiguration> invocationConfigs, + ClassLoader proxyClassLoader) { + super(targetName, proxyClassLoader); + assert (invocationConfigs != null) : "No wire configuration map specified"; + configurations = invocationConfigs; + + } + }
