    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 */
    016package org.opengion.fukurou.util;
    017
    018import java.util.List;
    019import 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 */
    032public 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}