| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // 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 com.cloud.utils.concurrency; |
| |
| import java.util.Calendar; |
| import java.util.Date; |
| import java.util.TimerTask; |
| |
| /** |
| * A test clock which is also a TimerTask. The task calls a Scheduler's poll method |
| * |
| */ |
| public class TestClock extends TimerTask { |
| private int _minute = 0; |
| private int _hour = 0; |
| private int _day = 0; |
| private int _week = 0; |
| private int _month = 0; |
| private int _year = 0; |
| private Calendar _cal = null; |
| private final int _minutesPerHour; |
| private final int _hoursPerDay; |
| private final int _daysPerWeek; |
| private final int _daysPerMonth; |
| private final int _weeksPerMonth; |
| private final int _monthsPerYear; |
| private final Scheduler _scheduler; |
| |
| public TestClock(Scheduler scheduler, int minutesPerHour, int hoursPerDay, int daysPerWeek, int daysPerMonth, int weeksPerMonth, int monthsPerYear) { |
| _minutesPerHour = minutesPerHour; |
| _hoursPerDay = hoursPerDay; |
| _daysPerWeek = daysPerWeek; |
| _daysPerMonth = daysPerMonth; |
| _weeksPerMonth = weeksPerMonth; |
| _monthsPerYear = monthsPerYear; |
| _cal = Calendar.getInstance(); |
| _year = _cal.get(Calendar.YEAR); |
| _month = _cal.get(Calendar.MONTH); |
| _day = _cal.get(Calendar.DAY_OF_MONTH); |
| _week = _cal.get(Calendar.WEEK_OF_MONTH); |
| _hour = _cal.get(Calendar.HOUR_OF_DAY); |
| _minute = _cal.get(Calendar.MINUTE); |
| _scheduler = scheduler; |
| } |
| |
| public int getMinute() { |
| return _minute; |
| } |
| public int getHour() { |
| return _hour; |
| } |
| public int getDay() { |
| return _day; |
| } |
| public int getWeek() { |
| return _week; |
| } |
| public int getMonth() { |
| return _month; |
| } |
| public int getYear() { |
| return _year; |
| } |
| |
| public int getMinutesPerHour() { |
| return _minutesPerHour; |
| } |
| public int getHoursPerDay() { |
| return _hoursPerDay; |
| } |
| public int getDaysPerMonth() { |
| return _daysPerMonth; |
| } |
| public int getDaysPerWeek() { |
| return _daysPerWeek; |
| } |
| public int getWeeksPerMonth() { |
| return _weeksPerMonth; |
| } |
| public int getMonthsPerYear() { |
| return _monthsPerYear; |
| } |
| |
| @Override |
| public void run() { |
| synchronized(this) { |
| _minute++; |
| if ((_minute > 0) && ((_minute % _minutesPerHour) == 0)) { |
| _minute = 0; |
| _hour++; |
| } |
| |
| if ((_hour > 0) && ((_hour % _hoursPerDay) == 0)) { |
| _hour = 0; |
| _day++; |
| } |
| |
| if ((_day > 0) && ((_day % _daysPerWeek) == 0)) { |
| _week++; |
| } |
| |
| if ((_day > 0) && ((_day % _daysPerMonth) == 0)) { |
| _day = 0; |
| _week = 0; |
| _month++; |
| } |
| |
| if ((_month > 0) && ((_month % _monthsPerYear) == 0)) { |
| _month = 0; |
| _year++; |
| } |
| if (_scheduler != null) { |
| // XXX: Creating new date is hugely inefficient for every minute. |
| // Later the time in the database will be changed to currentTimeInMillis. |
| // Then we can use System.getCurrentTimeInMillis() which is damn cheap. |
| _cal.set(_year, _month, _day, _hour, _minute); |
| Date currentTimestamp = _cal.getTime(); |
| _scheduler.poll(currentTimestamp); |
| } |
| } |
| } |
| } |