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.processor.resequencer;
018    
019    import java.util.LinkedList;
020    import java.util.List;
021    import java.util.Timer;
022    import java.util.TimerTask;
023    
024    /**
025     * A timer task that notifies handlers about scheduled timeouts.
026     * 
027     * @see Timer
028     * @see TimerTask
029     * 
030     * @author Martin Krasser
031     * 
032     * @version $Revision
033     */
034    public class Timeout extends TimerTask {
035        
036        private List<TimeoutHandler> timeoutHandlers;
037        
038        private Timer timer;
039        
040        private long timeout;
041        
042        /**
043         * Creates a new timeout task using the given {@link Timer} instance a timeout value. The
044         * task is not scheduled immediately. It will be scheduled by calling this
045         * task's {@link #schedule()} method.
046         * 
047         * @param timer
048         * @param timeout
049         */
050        public Timeout(Timer timer, long timeout) {
051            this.timeoutHandlers = new LinkedList<TimeoutHandler>();
052            this.timeout = timeout;
053            this.timer = timer;
054        }
055    
056        /**
057         * Returns the list of timeout handlers that have been registered for
058         * notification.
059         * 
060         * @return the list of timeout handlers
061         */
062        public List<TimeoutHandler> getTimeoutHandlers() {
063            return timeoutHandlers;
064        }
065        
066        /**
067         * Appends a new timeout handler at the end of the timeout handler list.
068         * 
069         * @param handler a timeout handler.
070         */
071        public void addTimeoutHandler(TimeoutHandler handler) {
072            timeoutHandlers.add(handler);
073        }
074        
075        /**
076         * inserts a new timeout handler at the beginning of the timeout handler
077         * list.
078         * 
079         * @param handler a timeout handler.
080         */
081        public void addTimeoutHandlerFirst(TimeoutHandler handler) {
082            timeoutHandlers.add(0, handler);
083        }
084        
085        /**
086         * Removes all timeout handlers from the timeout handler list. 
087         */
088        public void clearTimeoutHandlers() {
089            this.timeoutHandlers.clear();
090        }
091        
092        /**
093         * Schedules this timeout task.
094         */
095        public void schedule() {
096            timer.schedule(this, timeout);
097        }
098    
099        /**
100         * Notifies all timeout handlers about the scheduled timeout.
101         */
102        @Override
103        public void run() {
104            for (TimeoutHandler observer : timeoutHandlers) {
105                observer.timeout(this);
106            }
107        }
108    
109    }