com.cubeia.games.poker.tournament.configuration.TournamentSchedule.java Source code

Java tutorial

Introduction

Here is the source code for com.cubeia.games.poker.tournament.configuration.TournamentSchedule.java

Source

/**
 * Copyright (C) 2010 Cubeia Ltd <info@cubeia.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.cubeia.games.poker.tournament.configuration;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.quartz.Trigger;

@SuppressWarnings("serial")
@Entity
public class TournamentSchedule implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;

    private static final Logger log = Logger.getLogger(TournamentSchedule.class);

    private Date startDate;

    private Date endDate;

    private String cronSchedule;

    private int minutesInAnnounced;

    private int minutesInRegistering;

    private int minutesVisibleAfterFinished;

    public TournamentSchedule() {

    }

    public TournamentSchedule(Date startDate, Date endDate, String cronSchedule, int minutesInAnnounced,
            int minutesInRegistering, int minutesVisibleAfterFinished) {
        log.trace("Created tournament schedule. Start date: " + startDate + " End date: " + endDate);
        this.startDate = new Date(startDate.getTime());
        this.endDate = new Date(endDate.getTime());
        this.cronSchedule = cronSchedule;
        this.minutesInAnnounced = minutesInAnnounced;
        this.minutesInRegistering = minutesInRegistering;
        this.minutesVisibleAfterFinished = minutesVisibleAfterFinished;
    }

    public int getMinutesInAnnounced() {
        return minutesInAnnounced;
    }

    public int getMinutesInRegistering() {
        return minutesInRegistering;
    }

    public int getMinutesVisibleAfterFinished() {
        return minutesVisibleAfterFinished;
    }

    public DateTime getNextAnnounceTime(DateTime now) {
        log.trace("Getting next announce time after " + now + ". Start date = " + getSchedule().getStartTime());
        DateTime nextStartTime = getNextStartTime(now);
        log.trace("Next startTime: " + nextStartTime);
        if (nextStartTime == null) {
            return null;
        } else {
            DateTime nextAnnounceTime = new DateTime(nextStartTime).minusMinutes(minutesInRegistering)
                    .minusMinutes(minutesInAnnounced);
            log.trace("Next announce time: " + nextAnnounceTime);
            return nextAnnounceTime;
        }
    }

    /**
     * Calculate the next start time by the given time.
     * @param now time start use as base
     * @return next start time after the given time, null if there is none
     */
    public DateTime getNextStartTime(DateTime now) {
        Date nextStartTime = getSchedule().getFireTimeAfter(now.toDate());
        if (nextStartTime == null) {
            return null;
        } else {
            return new DateTime(nextStartTime);
        }
    }

    public DateTime getNextRegisteringTime(DateTime now) {
        DateTime nextStartTime = getNextStartTime(now);
        if (nextStartTime == null) {
            return null;
        } else {
            DateTime nextRegisteringTime = new DateTime(nextStartTime).minusMinutes(minutesInRegistering);
            return nextRegisteringTime;
        }
    }

    /**
     * Calculate a list, limited by max, of tournament start times after the given date.
     * 
     * @param startTime date to start calculation from
     * @param max max number of start dates to calculate
     * @return list of start dates, never null
     */
    public List<DateTime> calculateStartTimes(DateTime startTime, int max) {
        Trigger trigger = getSchedule();
        List<DateTime> startTimes = new ArrayList<>();
        Date time = new Date(startTime.getMillis());

        while (time != null && startTimes.size() < max) {
            time = trigger.getFireTimeAfter(time);
            if (time != null) {
                startTimes.add(new DateTime(time));
            }
        }

        return startTimes;
    }

    public Trigger getSchedule() {
        return newTrigger().withSchedule(cronSchedule(cronSchedule)).startAt(startDate).endAt(endDate).build();
    }

    public void setMinutesInAnnounced(int minutesInAnnounced) {
        this.minutesInAnnounced = minutesInAnnounced;
    }

    public void setMinutesInRegistering(int minutesInRegistering) {
        this.minutesInRegistering = minutesInRegistering;
    }

    public void setMinutesVisibleAfterFinished(int minutesVisibleAfterFinished) {
        this.minutesVisibleAfterFinished = minutesVisibleAfterFinished;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getStartDate() {
        return new Date(startDate.getTime());
    }

    public void setStartDate(Date startDate) {
        this.startDate = new Date(startDate.getTime());
    }

    public Date getEndDate() {
        return new Date(endDate.getTime());
    }

    public void setEndDate(Date endDate) {
        this.endDate = new Date(endDate.getTime());
    }

    public String getCronSchedule() {
        return cronSchedule;
    }

    public void setCronSchedule(String cronSchedule) {
        this.cronSchedule = cronSchedule;
    }

}