summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/tags/2.0.1-RC1/modules/core-spi/src/main/java/org/apache/tuscany/sca/invocation/InvocationChain.java
blob: b7e26d68eba73745f6127cbc649405dfb93a96c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * 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.invocation;

import org.apache.tuscany.sca.interfacedef.Operation;

/**
 * A wire consists of 1..n invocation chains associated with the operations of its source service contract.
 * <p/>
 * Invocation chains may contain <code>Interceptors</code> that process invocations.
 * <p/>
 * A <code>Message</code> is used to pass data associated with an invocation through the chain.
 *
 * @version $Rev$ $Date$
 * @tuscany.spi.extension.asclient
 */
public interface InvocationChain {
    /**
     * Returns the target operation for this invocation chain.
     *
     * @return The target operation for this invocation chain
     */
    Operation getTargetOperation();

    /**
     * Updates the target operation for this invocation chain.
     *
     * @param operation The new target operation for this invocation chain
     */
    void setTargetOperation(Operation operation);
    
    /**
     * Returns the source operation for this invocation chain.
     *
     * @return The source operation for this invocation chain
     */    
    Operation getSourceOperation();

    /**
     * Updates the source operation for this invocation chain.
     *
     * @param operation The new source operation for this invocation chain
     */
    void setSourceOperation(Operation operation);

    /**
     * Adds an interceptor to the end of the chain. For reference side, it will be added to
     * Phase.REFERENCE. For service side, it will be added to Phase.SERVICE 
     *
     * @param interceptor The interceptor to add
     */
    void addInterceptor(Interceptor interceptor);
    
    /**
     * Add an interceptor to the end of the given phase
     * @param phase - the phase
     * @param interceptor - the interceptor
     */
    void addInterceptor(String phase, Interceptor interceptor);
    
    /**
     * Adds an interceptor to the head of the chain
     * @param interceptor - the interceptor
     */
    void addHeadInterceptor(Interceptor interceptor);
    
    /**
     * Adds an interceptor to the head of the given phase
     * @param phase - the phase
     * @param interceptor - the interceptor
     */
    void addHeadInterceptor(String phase, Interceptor interceptor);

    /**
     * Adds an invoker to the end of the chain
     *
     * @param invoker The invoker to add
     */
    void addInvoker(Invoker invoker);

    /**
     * Returns the first invoker in the chain.
     *
     * @return The first invoker in the chain
     */
    Invoker getHeadInvoker();
    
    /**
     * Returns the last invoker in the chain.
     *
     * @return The last invoker in the chain
     */
    Invoker getTailInvoker();    
    
    /**
     * Get the first invoker that is on the same or later phase 
     * @param phase
     * @return The first invoker that is on the same or later phase
     */
    Invoker getHeadInvoker(String phase);

    /**
     * Indicate if the data can be passed in by reference as they won't be mutated.
     * @return true if pass-by-reference is allowed
     */
    boolean allowsPassByReference();
    /**
     * Force the invocation to allow pass-by-reference
     * @param allowsPBR
     */
    void setAllowsPassByReference(boolean allowsPBR);
    
    /** 
     * Returns true if this chain must be able to support async 
     * invocation. This will be as a consequence of the EPR/EP 
     * detecting the asyncInvocation intent. The flag is set on
     * construction and used as an internal guard against non
     * async interceptors being added to a chain that expect to 
     * be able to handle async calls
     * 
     * @return true is the chain supports async invocation.
     */
    boolean isAsyncInvocation();
}