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 }