1 64 65 package com.jtheory.jdring; 66 67 import java.util.Calendar ; 68 import java.util.Date ; 69 70 import java.util.ArrayList ; 71 import java.util.Collections ; 72 import java.util.Iterator ; 73 import java.util.LinkedList ; 74 import java.util.List ; 75 import java.util.SortedSet ; 76 import java.util.TreeSet ; 77 78 178 179 public class AlarmManager { 180 181 protected AlarmWaiter waiter; 182 protected SortedSet queue; 183 private boolean debug = false; 184 185 private void debug(String s) { 186 if (debug) 187 System.out.println("[" + Thread.currentThread().getName() + "] AlarmManager: " + s); 188 } 189 190 197 public AlarmManager(boolean isDaemon, String threadName) { 198 queue = new TreeSet (); 199 waiter = new AlarmWaiter(this, isDaemon, threadName); 200 } 201 202 207 public AlarmManager() { 208 this(false, "AlarmManager"); 209 } 210 211 220 public synchronized AlarmEntry addAlarm(String _name, Date _date, 221 AlarmListener _listener) throws PastDateException { 222 AlarmEntry entry = new AlarmEntry(_name, _date, _listener); 223 addAlarm(entry); 224 return entry; 225 } 226 227 public AlarmEntry addAlarm(Date _date, 228 AlarmListener _listener) throws PastDateException { 229 return addAlarm(null, _date, _listener); 230 } 231 232 243 public synchronized AlarmEntry addAlarm(String _name, int _delay, boolean _isRepeating, 244 AlarmListener _listener) throws PastDateException { 245 AlarmEntry entry = new AlarmEntry(_name, _delay, _isRepeating, _listener); 246 addAlarm(entry); 247 return entry; 248 } 249 250 public AlarmEntry addAlarm(int _delay, boolean _isRepeating, 251 AlarmListener _listener) throws PastDateException { 252 return addAlarm(null, _delay, _isRepeating, _listener); 253 } 254 255 276 public synchronized AlarmEntry addAlarm(String _name, int _minute, int _hour, 277 int _dayOfMonth, int _month, 278 int _dayOfWeek, 279 int _year, 280 AlarmListener _listener) 281 throws PastDateException { 282 283 AlarmEntry entry = new AlarmEntry(_name, _minute, _hour, 284 _dayOfMonth, _month, 285 _dayOfWeek, 286 _year, 287 _listener); 288 addAlarm(entry); 289 return entry; 290 } 291 292 public AlarmEntry addAlarm(int _minute, int _hour, 293 int _dayOfMonth, int _month, int _dayOfWeek, int _year, 294 AlarmListener _listener) 295 throws PastDateException { 296 return addAlarm(_minute, _hour, _dayOfMonth, _month, _dayOfWeek, _year,_listener); 297 } 298 299 321 public synchronized AlarmEntry addAlarm(String _name, int[] _minutes, int[] _hours, 322 int[] _daysOfMonth, int[] _months, 323 int[] _daysOfWeek, 324 int _year, 325 AlarmListener _listener) 326 throws PastDateException { 327 328 AlarmEntry entry = new AlarmEntry(_name, _minutes, _hours, 329 _daysOfMonth, _months, 330 _daysOfWeek, 331 _year, 332 _listener); 333 addAlarm(entry); 334 return entry; 335 } 336 337 public AlarmEntry addAlarm(int[] _minutes, int[] _hours, 338 int[] _daysOfMonth, int[] _months, int[] _daysOfWeek, int _year, 339 AlarmListener _listener) 340 throws PastDateException { 341 return addAlarm( null, _minutes, _hours, _daysOfMonth, _months, _daysOfWeek,_year,_listener); 342 } 343 344 351 public synchronized void addAlarm(AlarmEntry _entry) throws PastDateException { 352 debug("Add a new alarm entry : " + _entry); 353 354 queue.add(_entry); 355 if (queue.first().equals(_entry)) { 356 debug("This new alarm is the top one, update the waiter thread"); 357 waiter.update(_entry.alarmTime); 358 } 359 } 360 361 362 369 public synchronized boolean removeAlarm(AlarmEntry _entry) { 370 371 boolean found = false; 372 373 if( ! queue.isEmpty() ) { 374 AlarmEntry was_first = (AlarmEntry)queue.first(); 375 found = queue.remove(_entry); 376 377 if ( !queue.isEmpty() && _entry.equals(was_first) ) 379 { 380 waiter.update( ((AlarmEntry) queue.first()).alarmTime ); 381 } 382 } 383 384 return found; 385 } 387 391 public synchronized void removeAllAlarms() { 392 queue.clear(); 393 } 394 395 399 public synchronized void removeAllAlarmsAndStop() { 400 waiter.stop(); 401 waiter = null; 402 queue.clear(); 403 } 404 405 public boolean isStopped() { 406 return (waiter == null); 407 } 408 409 415 public synchronized boolean containsAlarm(AlarmEntry _alarmEntry) { 416 return queue.contains(_alarmEntry); 417 } 418 419 422 public synchronized List getAllAlarms() { 423 List result = new ArrayList (); 424 425 Iterator iterator = queue.iterator(); 426 while (iterator.hasNext()) { 427 result.add(iterator.next()); 428 } 429 430 return result; 431 } 432 433 438 protected synchronized void ringNextAlarm() { 439 debug("ringing next alarm"); 440 441 if (queue.isEmpty()) { 443 return; 444 } 445 446 AlarmEntry entry = (AlarmEntry) queue.first(); 448 queue.remove(entry); 449 450 if( entry.isRingInNewThread() ) { 453 new Thread ( new RunnableRinger(entry) ).start(); 454 } 455 else { 456 try { 458 entry.ringAlarm(); 459 } 460 catch(Exception e) { 461 e.printStackTrace(); 462 } 463 } 464 465 if (entry.isRepeating) { 467 entry.updateAlarmTime(); 468 queue.add(entry); 469 } 470 471 if (queue.isEmpty()) { 473 debug("no more alarms to handle; queue is empty"); 474 } 475 else { 476 long alarmTime = ((AlarmEntry)queue.first()).alarmTime; 477 if (alarmTime - System.currentTimeMillis() < 1000) { 478 debug("next alarm is within 1 sec or already past - ring it without waiting"); 479 ringNextAlarm(); 480 } 481 else { 482 debug("updating the waiter for next alarm: " + queue.first()); 483 waiter.restart(alarmTime); 484 } 485 } 486 } 488 491 public void finalize() { 492 if (waiter != null) 493 waiter.stop(); 494 } 495 496 500 private class RunnableRinger implements Runnable { 501 AlarmEntry entry = null; 502 503 RunnableRinger(AlarmEntry _entry) { 504 entry = _entry; 505 } 506 507 public void run() { 508 try { 509 entry.ringAlarm(); 510 } 511 catch(Exception e) { 512 e.printStackTrace(); 513 } 514 } 515 } 516 } 517 | Popular Tags |