/* * Copyright 1999-2008 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package org.globus.workspace.scheduler; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import commonj.timers.StopTimerListener; import commonj.timers.Timer; import commonj.timers.TimerListener; import commonj.timers.TimerManager; /** * Copied from Java core. */ public class TimerManagerImpl implements TimerManager { private int poolSize = 1; private List taskList = new LinkedList(); private List timerPool = new ArrayList(); private int currentTimer = 0; public TimerManagerImpl() { for(int i = 0; i < this.poolSize; i++) { timerPool.add(new java.util.Timer(true)); } } public synchronized void resume() { Iterator taskIterator = this.taskList.iterator(); while(taskIterator.hasNext()) { ((TimerListenerWrapper) taskIterator.next()).resume(); } } public Timer schedule(TimerListener listener, Date firstTime, long period) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, period); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.schedule(task, firstTime, period); return newTimer; } public Timer schedule(TimerListener listener, Date time) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, 0); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.schedule(task, time); return newTimer; } public Timer schedule(TimerListener listener, long delay, long period) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, period); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.schedule(task, delay, period); return newTimer; } public Timer schedule(TimerListener listener, long delay) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, 0); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.schedule(task, delay); return newTimer; } public Timer scheduleAtFixedRate(TimerListener listener, Date firstTime, long period) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, period); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.scheduleAtFixedRate(task, firstTime, period); return newTimer; } public Timer scheduleAtFixedRate(TimerListener listener, long delay, long period) { java.util.Timer timer = (java.util.Timer) timerPool.get(this.currentTimer); this.currentTimer = (this.currentTimer + 1)%this.poolSize; Timer newTimer = new TimerImpl(listener, period); TimerListenerWrapper task = new TimerListenerWrapper(newTimer, this); this.taskList.add(task); timer.scheduleAtFixedRate(task, delay, period); return newTimer; } public synchronized void stop() { Iterator taskIterator = this.taskList.iterator(); TimerListenerWrapper task; TimerListener listener; while(taskIterator.hasNext()) { task = (TimerListenerWrapper) taskIterator.next(); task.stop(); listener = task.getListener(); if(listener instanceof StopTimerListener) { ((StopTimerListener) listener).timerStop(task.getTimer()); } } this.taskList.clear(); } public synchronized void suspend() { Iterator taskIterator = this.taskList.iterator(); while(taskIterator.hasNext()) { ((TimerListenerWrapper) taskIterator.next()).suspend(); } } protected synchronized void removeTask(Object task) { this.taskList.remove(task); } public int getPoolSize() { return this.poolSize; } public void setPoolSize(int poolSize) { // don't allow shrinking of the pool for(int i = this.poolSize; i < poolSize; i++) { timerPool.add(new java.util.Timer(true)); } this.poolSize = poolSize; } }