001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel;
018    
019    import java.util.Map;
020    
021    import org.apache.camel.spi.Synchronization;
022    import org.apache.camel.spi.UnitOfWork;
023    
024    /**
025     * The base message exchange interface providing access to the request, response
026     * and fault {@link Message} instances. Different providers such as JMS, JBI,
027     * CXF and HTTP can provide their own derived API to expose the underlying
028     * transport semantics to avoid the leaky abstractions of generic APIs.
029     *
030     * @version $Revision: 946167 $
031     */
032    public interface Exchange {
033    
034        String AUTHENTICATION             = "CamelAuthentication";       
035        String ACCEPT_CONTENT_TYPE        = "CamelAcceptContentType";
036        @Deprecated
037        String AGGREGATED_INDEX           = "CamelAggregatedIndex";
038        String AGGREGATED_SIZE            = "CamelAggregatedSize";
039        String AGGREGATED_COMPLETED_BY    = "CamelAggregatedCompletedBy";
040        String AGGREGATED_CORRELATION_KEY = "CamelAggregatedCorrelationKey";
041        String ASYNC_WAIT                 = "CamelAsyncWait";
042    
043        String BATCH_INDEX    = "CamelBatchIndex";
044        String BATCH_SIZE     = "CamelBatchSize";
045        String BATCH_COMPLETE = "CamelBatchComplete";
046    
047        String BEAN_METHOD_NAME           = "CamelBeanMethodName";
048        String BEAN_MULTI_PARAMETER_ARRAY = "CamelBeanMultiParameterArray";
049    
050        String BINDING = "CamelBinding";
051    
052        String CHARSET_NAME     = "CamelCharsetName";
053        String CONTENT_ENCODING = "Content-Encoding";
054        String CONTENT_TYPE     = "Content-Type";
055        String CORRELATION_ID   = "CamelCorrelationId";
056    
057        String DATASET_INDEX = "CamelDataSetIndex";
058        String DEFAULT_CHARSET_PROPERTY = "org.apache.camel.default.charset";
059        
060        String DISABLE_HTTP_STREAM_CACHE = "CamelDisableHttpStreamCache";
061    
062        String EXCEPTION_CAUGHT     = "CamelExceptionCaught";
063        String ERRORHANDLER_HANDLED = "CamelErrorHandlerHandled";
064        String FAILURE_HANDLED      = "CamelFailureHandled";
065        String FAILURE_ENDPOINT     = "CamelFailureEndpoint";
066        
067        String FILTER_NON_XML_CHARS = "CamelFilterNonXmlChars";
068    
069        String FILE_LOCAL_WORK_PATH = "CamelFileLocalWorkPath";
070        String FILE_NAME            = "CamelFileName";
071        String FILE_NAME_ONLY       = "CamelFileNameOnly";
072        String FILE_NAME_PRODUCED   = "CamelFileNameProduced";
073        String FILE_PATH            = "CamelFilePath";
074        String FILE_PARENT          = "CamelFileParent";
075        String FILE_LAST_MODIFIED   = "CamelFileLastModified";
076    
077        String GROUPED_EXCHANGE = "CamelGroupedExchange";
078        
079        String HTTP_BASE_URI           = "CamelHttpBaseUri";
080        String HTTP_CHARACTER_ENCODING = "CamelHttpCharacterEncoding";
081        String HTTP_METHOD             = "CamelHttpMethod";
082        String HTTP_PATH               = "CamelHttpPath";
083        String HTTP_QUERY              = "CamelHttpQuery";
084        String HTTP_RESPONSE_CODE      = "CamelHttpResponseCode";
085        String HTTP_URI                = "CamelHttpUri";
086        String HTTP_URL                = "CamelHttpUrl";
087        String HTTP_CHUNKED            = "CamelHttpChunked";
088        String HTTP_SERVLET_REQUEST   = "CamelHttpServletRequest";
089        String HTTP_SERVLET_RESPONSE  = "CamelHttpServletResponse";
090    
091        String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint";
092        String TO_ENDPOINT          = "CamelToEndpoint";
093    
094        String LOG_DEBUG_BODY_MAX_CHARS = "CamelLogDebugBodyMaxChars";
095        String LOG_DEBUG_BODY_STREAMS   = "CamelLogDebugStreams";
096        String LOOP_INDEX               = "CamelLoopIndex";
097        String LOOP_SIZE                = "CamelLoopSize";
098    
099        String MAXIMUM_CACHE_POOL_SIZE = "CamelMaximumCachePoolSize";
100        String MULTICAST_INDEX         = "CamelMulticastIndex";
101    
102        String ON_COMPLETION = "CamelOnCompletion";
103    
104        String ROUTE_STOP           = "CamelRouteStop";
105        String REDELIVERED          = "CamelRedelivered";
106        String REDELIVERY_COUNTER   = "CamelRedeliveryCounter";
107        String REDELIVERY_EXHAUSTED = "CamelRedeliveryExhausted";
108        String ROLLBACK_ONLY        = "CamelRollbackOnly";
109        String ROLLBACK_ONLY_LAST   = "CamelRollbackOnlyLast";
110        
111        String SKIP_GZIP_ENCODING = "CamelSkipGzipEncoding";
112       
113        String SOAP_ACTION = "CamelSoapAction";
114        String SPLIT_INDEX = "CamelSplitIndex";
115        String SPLIT_SIZE  = "CamelSplitSize";
116    
117        String TRANSACTED            = "CamelTransacted";
118        String TRANSFER_ENCODING     = "Transfer-Encoding";
119        String TRACE_EVENT           = "CamelTraceEvent";
120        String TRACE_EVENT_NODE_ID   = "CamelTraceEventNodeId";
121        String TRACE_EVENT_TIMESTAMP = "CamelTraceEventTimestamp";
122        String TRACE_EVENT_EXCHANGE  = "CamelTraceEventExchange";
123    
124        String TIMER_FIRED_TIME = "CamelTimerFiredTime";
125        String TIMER_NAME       = "CamelTimerName";
126        String TIMER_PERIOD     = "CamelTimerPeriod";
127        String TIMER_TIME       = "CamelTimerTime";
128    
129        String XSLT_FILE_NAME = "CamelXsltFileName";
130    
131        /**
132         * Returns the {@link ExchangePattern} (MEP) of this exchange.
133         *
134         * @return the message exchange pattern of this exchange
135         */
136        ExchangePattern getPattern();
137    
138        /**
139         * Allows the {@link ExchangePattern} (MEP) of this exchange to be customized.
140         *
141         * This typically won't be required as an exchange can be created with a specific MEP
142         * by calling {@link Endpoint#createExchange(ExchangePattern)} but it is here just in case
143         * it is needed.
144         *
145         * @param pattern  the pattern 
146         */
147        void setPattern(ExchangePattern pattern);
148    
149        /**
150         * Returns a property associated with this exchange by name
151         *
152         * @param name the name of the property
153         * @return the value of the given property or <tt>null</tt> if there is no property for
154         *         the given name
155         */
156        Object getProperty(String name);
157    
158        /**
159         * Returns a property associated with this exchange by name
160         *
161         * @param name the name of the property
162         * @param defaultValue the default value to return if property was absent
163         * @return the value of the given property or <tt>defaultValue</tt> if there is no
164         *         property for the given name
165         */
166        Object getProperty(String name, Object defaultValue);
167    
168        /**
169         * Returns a property associated with this exchange by name and specifying
170         * the type required
171         *
172         * @param name the name of the property
173         * @param type the type of the property
174         * @return the value of the given property or <tt>null</tt> if there is no property for
175         *         the given name or <tt>null</tt> if it cannot be converted to the given type
176         */
177        <T> T getProperty(String name, Class<T> type);
178    
179        /**
180         * Returns a property associated with this exchange by name and specifying
181         * the type required
182         *
183         * @param name the name of the property
184         * @param defaultValue the default value to return if property was absent
185         * @param type the type of the property
186         * @return the value of the given property or <tt>defaultValue</tt> if there is no property for
187         *         the given name or <tt>null</tt> if it cannot be converted to the given type
188         */
189        <T> T getProperty(String name, Object defaultValue, Class<T> type);
190    
191        /**
192         * Sets a property on the exchange
193         *
194         * @param name  of the property
195         * @param value to associate with the name
196         */
197        void setProperty(String name, Object value);
198    
199        /**
200         * Removes the given property on the exchange
201         *
202         * @param name of the property
203         * @return the old value of the property
204         */
205        Object removeProperty(String name);
206    
207        /**
208         * Returns all of the properties associated with the exchange
209         *
210         * @return all the headers in a Map
211         */
212        Map<String, Object> getProperties();
213    
214        /**
215         * Returns whether any properties has been set
216         *
217         * @return <tt>true</tt> if any properties has been set
218         */
219        boolean hasProperties();
220    
221        /**
222         * Returns the inbound request message
223         *
224         * @return the message
225         */
226        Message getIn();
227    
228        /**
229         * Returns the inbound request message as the given type
230         *
231         * @param type the given type
232         * @return the message as the given type or <tt>null</tt> if not possible to covert to given type
233         */
234        <T> T getIn(Class<T> type);
235    
236        /**
237         * Sets the inbound message instance
238         *
239         * @param in the inbound message
240         */
241        void setIn(Message in);
242    
243        /**
244         * Returns the outbound message, lazily creating one if one has not already
245         * been associated with this exchange.
246         * <p/>
247         * If you want to test whether an OUT message have been set or not, use the {@link #hasOut()} method.
248         *
249         * @return the response
250         */
251        Message getOut();
252    
253        /**
254         * Returns the outbound request message as the given type
255         *
256         * @param type the given type
257         * @return the message as the given type or <tt>null</tt> if not possible to covert to given type
258         */
259        <T> T getOut(Class<T> type);
260    
261        /**
262         * Returns whether an OUT message has been set or not.
263         *
264         * @return <tt>true</tt> if an OUT message exists, <tt>false</tt> otherwise.
265         */
266        boolean hasOut();
267    
268        /**
269         * Sets the outbound message
270         *
271         * @param out the outbound message
272         */
273        void setOut(Message out);
274    
275        /**
276         * Returns the exception associated with this exchange
277         *
278         * @return the exception (or null if no faults)
279         */
280        Exception getException();
281    
282        /**
283         * Returns the exception associated with this exchange.
284         * <p/>
285         * Is used to get the caused exception that typically have been wrapped in some sort
286         * of Camel wrapper exception
287         * <p/>
288         * The strategy is to look in the exception hierarchy to find the first given cause that matches the type.
289         * Will start from the bottom (the real cause) and walk upwards.
290         *
291         * @param type the exception type
292         * @return the exception (or <tt>null</tt> if no caused exception matched)
293         */
294        <T> T getException(Class<T> type);
295    
296        /**
297         * Sets the exception associated with this exchange
298         *
299         * @param e  the caused exception
300         */
301        void setException(Exception e);
302    
303        /**
304         * Returns true if this exchange failed due to either an exception or fault
305         *
306         * @return true if this exchange failed due to either an exception or fault
307         * @see Exchange#getException()
308         * @see Message#setFault(boolean)
309         * @see Message#isFault()
310         */
311        boolean isFailed();
312    
313        /**
314         * Returns true if this exchange is transacted
315         */
316        boolean isTransacted();
317    
318        /**
319         * Returns true if this exchange is marked for rollback
320         */
321        boolean isRollbackOnly();
322    
323        /**
324         * Returns the container so that a processor can resolve endpoints from URIs
325         *
326         * @return the container which owns this exchange
327         */
328        CamelContext getContext();
329    
330        /**
331         * Creates a copy of the current message exchange so that it can be
332         * forwarded to another destination
333         */
334        Exchange copy();
335    
336        /**
337         * Returns the endpoint which originated this message exchange if a consumer on an endpoint created the message exchange
338         * otherwise this property will be null
339         */
340        Endpoint getFromEndpoint();
341    
342        /**
343         * Sets the endpoint which originated this message exchange. This method
344         * should typically only be called by {@link org.apache.camel.Endpoint} implementations
345         *
346         * @param fromEndpoint the endpoint which is originating this message exchange
347         */
348        void setFromEndpoint(Endpoint fromEndpoint);
349        
350        /**
351         * Returns the unit of work that this exchange belongs to; which may map to
352         * zero, one or more physical transactions
353         */
354        UnitOfWork getUnitOfWork();
355    
356        /**
357         * Sets the unit of work that this exchange belongs to; which may map to
358         * zero, one or more physical transactions
359         */
360        void setUnitOfWork(UnitOfWork unitOfWork);
361    
362        /**
363         * Returns the exchange id (unique)
364         */
365        String getExchangeId();
366    
367        /**
368         * Set the exchange id
369         */
370        void setExchangeId(String id);
371    
372        /**
373         * Adds a {@link org.apache.camel.spi.Synchronization} to be invoked as callback when
374         * this exchange is completed.
375         *
376         * @param onCompletion  the callback to invoke on completion of this exchange
377         */
378        void addOnCompletion(Synchronization onCompletion);
379    
380        /**
381         * Handover all the on completions from this exchange to the target exchange.
382         *
383         * @param target the target exchange
384         */
385        void handoverCompletions(Exchange target);
386    
387    }