Package com.codeforces.graygoose.rescanner

Source Code of com.codeforces.graygoose.rescanner.RescannerRunnable

package com.codeforces.graygoose.rescanner;

import com.codeforces.graygoose.ApplicationModule;
import com.codeforces.graygoose.dao.RuleCheckEventDao;
import com.codeforces.graygoose.misc.TimeConstants;
import com.codeforces.graygoose.model.RuleCheckEvent;
import com.codeforces.graygoose.util.SiteCheckingService;
import com.google.inject.Guice;
import org.apache.log4j.Logger;

import java.util.Iterator;
import java.util.List;

public class RescannerRunnable implements Runnable {
    private static final Logger logger = Logger.getLogger(RescannerRunnable.class);

    private static final int MAX_EVENTS_TO_REMOVE = 100;

    private RuleCheckEventDao ruleCheckEventDao;

    private RescannerContextListener rescannerContextListener;

    public RescannerRunnable(RescannerContextListener rescannerContextListener) {
        this.rescannerContextListener = rescannerContextListener;
        this.ruleCheckEventDao = Guice.createInjector(new ApplicationModule()).getInstance(RuleCheckEventDao.class);
    }

    private void removeOld() {
        logger.info("Retrieve old rule check events with \'SUCCESS\' status from the data storage.");

        List<RuleCheckEvent> oldEvents = ruleCheckEventDao.findAllByStatusForPeriod(
                RuleCheckEvent.Status.SUCCEEDED, 0, System.currentTimeMillis() - TimeConstants.MILLIS_PER_WEEK);

        removeEvents(oldEvents);
    }

    private void removeAll() {
        logger.info("Retrieve all rule check events from the data storage.");

        List<RuleCheckEvent> allEvents = ruleCheckEventDao.findAll();

        removeEvents(allEvents);
    }

    private void removeEvents(List<RuleCheckEvent> ruleCheckEvents) {
        int oldEventCount = ruleCheckEvents.size();
        logger.info(String.format("%d events to remove was found.", oldEventCount));

        if (oldEventCount == 0) {
            logger.info("Nothing to remove.");
            return;
        }

        if (oldEventCount > MAX_EVENTS_TO_REMOVE) {
            logger.info(String.format("Can't remove more than %d events per request.", MAX_EVENTS_TO_REMOVE));
        }

        Iterator<RuleCheckEvent> oldEventsIterator = ruleCheckEvents.iterator();
        int removedEventCount = 0;

        while (oldEventsIterator.hasNext() && removedEventCount < MAX_EVENTS_TO_REMOVE) {
            ruleCheckEventDao.delete(oldEventsIterator.next());
            ++removedEventCount;
        }

        logger.info(String.format("%d events were successfully removed.", removedEventCount));
    }

    @Override
    public void run() {
        SiteCheckingService siteCheckingService = SiteCheckingService.newSiteCheckingService();

        try {
            int iteration = 0;

            while (rescannerContextListener.isAlive()) {
                logger.info(String.format("Start sites checking."));
                siteCheckingService.checkSites();
                logger.info(String.format("Finish sites checking."));

                Thread.sleep(60 * 1000);
                iteration++;

                if (iteration == 15) {
                    iteration = 0;
                    removeOld();
                }
            }
        } catch (Exception e) {
            logger.error("Unexpected exception " + e, e);
        }
    }

}
TOP

Related Classes of com.codeforces.graygoose.rescanner.RescannerRunnable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.