001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import java.util.List;
019    import java.util.ArrayList;
020    
021    /**
022     * HybsTimerTaskManager.java は、HybsTimerTask オブジェクトを管?て?クラスです?
023     *
024     * HybsTimerTask は、タスクとして?間隔で実行されます?オブジェクトが生?されてから?
025     * 実行中のタスクを?こ?クラスで管?ることにより、?別に削除、生成?全件終??制御?
026     * 可能になります?
027     *
028     * @version  4.0
029     * @author   Kazuhiko Hasegawa
030     * @since    JDK5.0,
031     */
032    public class HybsTimerTaskManager implements Cleanable {
033            private final List<HybsTimerTask> list = new ArrayList<HybsTimerTask>();
034    
035            /**
036             * HybsTimerTask クラスの 実オブジェクトを管??ため、登録します?
037             *
038             * @param task HybsTimerTaskオブジェク?
039             */
040            public synchronized void addTask( final HybsTimerTask task ) {
041                    list.add( task );
042            }
043    
044            /**
045             * こ?タイマ?タスクオブジェクトを削除します?
046             * こ?とき?すでにタイマ?タスク自信でキャンセルされて?オブジェクト?
047             * 削除も行います?
048             *
049             * @param key  HybsTimerTask のユニ?クキー
050             *
051             * @return 結果(削除成功 true/ 削除できなかっ?false )
052             */
053            public synchronized boolean cancelTask( final int key ) {
054                    boolean flag = false;
055    
056                    int size = list.size();
057                    for( int i=size-1; i>=0; i-- ) {
058                            HybsTimerTask task = list.get( i );
059                            if( task != null ) {
060                                    if( !task.isAlive() || ( task.getUniqKey() == key ) ) {
061                                            list.remove( i );
062                                            task.cancel();
063                                            flag = true;
064                                    }
065                            }
066                            else {
067                                    list.remove( i );
068                            }
069                    }
070    
071                    return flag;
072            }
073    
074            /**
075             * こ?タイマ?タスクオブジェクトを削除します?
076             *
077             * @param  name  HybsTimerTask の名前
078             *
079             * @return 結果(削除成功 true/ 削除できなかっ?false )
080             */
081            public synchronized boolean cancelTask( final String name ) {
082                    boolean flag = false;
083    
084                    if( name == null ) { return flag; }
085    
086                    int size = list.size();
087                    for( int i=size-1; i>=0; i-- ) {
088                            HybsTimerTask task = list.get( i );
089                            if( task != null ) {
090                                    if( !task.isAlive() || ( name.equals( task.getName() ) ) ) {
091                                            list.remove( i );
092                                            task.cancel();
093                                            flag = true;
094                                    }
095                            }
096                            else {
097                                    list.remove( i );
098                            }
099                    }
100    
101                    return flag;
102            }
103    
104            /**
105             * 現在実行中の全てのタイマ?タスクオブジェクトを削除します?
106             * (org.opengion.fukurou.util.Cleanable の実??
107             *
108             * @og.rev 4.0.0.0 (2005/01/31) 新規追?
109             */
110            public synchronized void clear() {
111                    HybsTimerTask[] tasks = list.toArray( new HybsTimerTask[list.size()] );
112    
113                    for( int i=0; i<tasks.length; i++ ) {
114                            if( tasks[i] != null ) {
115                                    tasks[i].cancel();
116                                    tasks[i] = null;
117                            }
118                    }
119                    list.clear();
120            }
121    
122            /**
123             * 現在実行中の、タイマ?タスクを?すべて返します?
124             *
125             * @return タイマ?タスクの配?
126             */
127            public synchronized HybsTimerTask[] toArray() {
128                    int size = list.size();
129                    for( int i=size-1; i>=0; i-- ) {
130                            HybsTimerTask task = list.get( i );
131                            if( task != null ) {
132                                    if( !task.isAlive() ) {
133                                            list.remove( i );
134                                    }
135                            }
136                            else {
137                                    list.remove( i );
138                            }
139                    }
140    
141                    HybsTimerTask[] tasks = list.toArray( new HybsTimerTask[list.size()] );
142    
143                    return tasks;
144            }
145    
146            /**
147             * 現在実行中の、タイマ?タスクの件数を返します?
148             *
149             * タスクがすでに 終?て?り?null 化されて?かをチェ?し?
150             * 不要なタスクは、削除します?
151             *
152             * @return タイマ?タスクの件数
153             */
154            public synchronized int size() {
155                    int size = list.size();
156                    for( int i=size-1; i>=0; i-- ) {
157                            HybsTimerTask task = list.get( i );
158                            if( task != null ) {
159                                    if( !task.isAlive() ) {
160                                            list.remove( i );
161                                    }
162                            }
163                            else {
164                                    list.remove( i );
165                            }
166                    }
167    
168                    return list.size();
169            }
170    
171            /**
172             * 現在実行中の、タイマ?タスクに、同?? Name 属?を持ったタスクが存在するかど??
173             *
174             * @param  nm タイマ?タスクの、Name 属?
175             *
176             * @return 存在する?true / 存在しな?false
177             */
178            public synchronized boolean contains( final String nm ) {
179                    if( nm == null ) { return false; }
180    
181                    HybsTimerTask[] tasks = toArray() ;
182    
183                    for( int i=0; i<tasks.length; i++ ) {
184                            if( tasks[i] != null && nm.equals( tasks[i].getName() ) ) { return true; }
185                    }
186                    return false;
187            }
188    }