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.spi;
018    
019    import org.apache.camel.Exchange;
020    import org.apache.camel.Message;
021    
022    /**
023     * An object representing the unit of work processing an {@link Exchange}
024     * which allows the use of {@link Synchronization} hooks. This object might map one-to-one with
025     * a transaction in JPA or Spring; or might not.
026     *
027     * @version $Revision: 899628 $
028     */
029    public interface UnitOfWork {
030    
031        /**
032         * Adds a synchronization hook
033         *
034         * @param synchronization  the hook
035         */
036        void addSynchronization(Synchronization synchronization);
037    
038        /**
039         * Removes a synchronization hook
040         *
041         * @param synchronization  the hook
042         */
043        void removeSynchronization(Synchronization synchronization);
044    
045        /**
046         * Handover all the registered synchronizations to the target {@link org.apache.camel.Exchange}.
047         * <p/>
048         * This is used when a route turns into asynchronous and the {@link org.apache.camel.Exchange} that
049         * is continued and routed in the async thread should do the on completion callbacks instead of the
050         * original synchronous thread.
051         * 
052         * @param target  the target exchange
053         */
054        void handoverSynchronization(Exchange target);
055    
056        /**
057         * Invoked when this unit of work has been completed, whether it has failed or completed
058         *
059         * @param exchange the current exchange
060         */
061        void done(Exchange exchange);
062    
063        /**
064         * Returns the unique ID of this unit of work, lazily creating one if it does not yet have one
065         * 
066         * @return the unique ID
067         */
068        String getId();
069    
070        /**
071         * Gets the original IN {@link Message} this Unit of Work was started with.
072         *
073         * @return the original IN {@link Message}
074         */
075        Message getOriginalInMessage();
076    
077        /**
078         * Gets tracing information
079         *
080         * @return trace information
081         */
082        TracedRouteNodes getTracedRouteNodes();
083    
084        /**
085         * Are we already transacted by the given transaction definition
086         * <p/>
087         * The definition will most likely be a Spring TransactionTemplate when using Spring Transaction
088         *
089         * @param transactionDefinition the transaction definition
090         * @return <tt>true</tt> if already, <tt>false</tt> otherwise
091         */
092        boolean isTransactedBy(Object transactionDefinition);
093    
094        /**
095         * Mark this UnitOfWork as being transacted by the given transaction definition.
096         * <p/>
097         * The definition will most likely be a Spring TransactionTemplate when using Spring Transaction
098         * <p/>
099         * When the transaction is completed then invoke the {@link #endTransactedBy(Object)} method.
100         *
101         * @param transactionDefinition the transaction definition
102         */
103        void beginTransactedBy(Object transactionDefinition);
104    
105        /**
106         * Mark this UnitOfWork as not transacted anymore by the given transaction definition.
107         * <p/>
108         * The definition will most likely be a Spring TransactionTemplate when using Spring Transaction
109         *
110         * @param transactionDefinition the transaction definition
111         */
112        void endTransactedBy(Object transactionDefinition);
113    
114        /**
115         * Gets the {@link RouteContext} that this {@link UnitOfWork} currently is being routed through.
116         * <p/>
117         * Notice that an {@link Exchange} can be routed through multiple routes and thus the
118         * {@link org.apache.camel.spi.RouteContext} can change over time.
119         *
120         * @return the route context
121         * @see #pushRouteContext(RouteContext)
122         * @see #popRouteContext()
123         */
124        RouteContext getRouteContext();
125    
126        /**
127         * Pushes the {@link RouteContext} that this {@link UnitOfWork} currently is being routed through.
128         * <p/>
129         * Notice that an {@link Exchange} can be routed through multiple routes and thus the
130         * {@link org.apache.camel.spi.RouteContext} can change over time.
131         *
132         * @param routeContext the route context
133         */
134        void pushRouteContext(RouteContext routeContext);
135    
136        /**
137         * When finished being routed under the current {@link org.apache.camel.spi.RouteContext}
138         * it should be removed.
139         *
140         * @return the route context or <tt>null</tt> if none existed
141         */
142        RouteContext popRouteContext();
143    }