com.turn.sorcerer.pipeline.impl.CronPipeline.java Source code

Java tutorial

Introduction

Here is the source code for com.turn.sorcerer.pipeline.impl.CronPipeline.java

Source

/*
 * Copyright (c) 2015, Turn Inc. All Rights Reserved.
 * Use of this source code is governed by a BSD-style license that can be found
 * in the LICENSE file.
 */

package com.turn.sorcerer.pipeline.impl;

import com.turn.sorcerer.pipeline.Pipeline;
import com.turn.sorcerer.util.CronExpression;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

/**
 * Cron implementation of Pipeline
 *
 * @author tshiou
 */
public class CronPipeline implements Pipeline {

    private static final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyMMdd");

    private final CronExpression cronExp;
    private DateTime next;
    private int currIterNo;

    public CronPipeline(String cronString) {
        this.cronExp = new CronExpression(cronString);

        next = cronExp.getNextTimeAfter(DateTime.now());

        currIterNo = -1;
    }

    @Override
    public Integer getCurrentIterationNumber() {
        DateTime now = DateTime.now();

        if (now.isAfter(next)) {
            currIterNo = generateIterationNumber(now);

            next = cronExp.getNextTimeAfter(now);
        }

        return currIterNo;
    }

    @Override
    public Integer getPreviousIterationNumber(int curr, int prev) {
        DateTime currDate = getDateTime(curr);
        int currIterNo = getDayIterNo(curr);

        int iterationsLeft = prev;

        while (iterationsLeft >= 0) {

            if (currIterNo - iterationsLeft > 0) {
                return getIterationNumber(currDate, currIterNo - iterationsLeft);
            }

            iterationsLeft -= currIterNo;
            currDate = new DateTime(currDate).minusDays(1);
            currIterNo = getLastIterNoForDate(currDate);
        }

        return null;

    }

    private int generateIterationNumber(DateTime dt) {
        return getIterationNumber(dt, getDayIterNoForDateTime(dt));
    }

    private int getIterationNumber(DateTime dt, int dayIterNo) {
        int year = dt.getYear();
        int month = dt.getMonthOfYear();
        int day = dt.getDayOfMonth();

        return (((year % 100) * 10000) + (month * 100) + day) * 10000 + dayIterNo;
    }

    private DateTime getDateTime(int iterNo) {
        return dtf.parseDateTime(String.valueOf(iterNo / 10000));
    }

    private int getDayIterNo(int iterNo) {
        return iterNo % 10000;
    }

    private int getLastIterNoForDate(DateTime dt) {
        int iterNo = 0;
        DateTime _next = new DateTime().withYear(dt.getYear()).withDayOfYear(dt.getDayOfYear()).withHourOfDay(0)
                .withMinuteOfHour(0).withSecondOfMinute(0);

        while (_next.getDayOfMonth() == dt.getDayOfMonth()) {
            _next = cronExp.getNextTimeAfter(_next);
            iterNo++;
        }

        return iterNo;
    }

    private int getDayIterNoForDateTime(DateTime dt) {
        int iterNo = 0;
        DateTime _next = new DateTime().withYear(dt.getYear()).withDayOfYear(dt.getDayOfYear()).withHourOfDay(0)
                .withMinuteOfHour(0).withSecondOfMinute(0);

        while (_next.isBefore(dt)) {
            _next = cronExp.getNextTimeAfter(_next);
            iterNo++;
        }

        return iterNo;
    }
}