001/*
002 * #%L
003 * Netarchivesuite - harvester
004 * %%
005 * Copyright (C) 2005 - 2014 The Royal Danish Library, the Danish State and University Library,
006 *             the National Library of France and the Austrian National Library.
007 * %%
008 * This program is free software: you can redistribute it and/or modify
009 * it under the terms of the GNU Lesser General Public License as
010 * published by the Free Software Foundation, either version 2.1 of the
011 * License, or (at your option) any later version.
012 * 
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016 * GNU General Lesser Public License for more details.
017 * 
018 * You should have received a copy of the GNU General Lesser Public
019 * License along with this program.  If not, see
020 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
021 * #L%
022 */
023package dk.netarkivet.harvester.harvesting.frontier;
024
025import dk.netarkivet.harvester.harvesting.frontier.FullFrontierReport.ReportIterator;
026
027public class RetiredQueuesFilter extends MaxSizeFrontierReportExtract {
028
029    @Override
030    public InMemoryFrontierReport process(FrontierReport initialFrontier) {
031        InMemoryFrontierReport result = new InMemoryFrontierReport(initialFrontier.getJobName());
032
033        FullFrontierReport full = (FullFrontierReport) initialFrontier;
034        ReportIterator iter = full.iterateOnSpentBudget();
035        try {
036            int addedLines = 0;
037            int maxSize = getMaxSize();
038            while (addedLines <= maxSize && iter.hasNext()) {
039                FrontierReportLine l = iter.next();
040                if (isOverBudget(l)) {
041                    result.addLine(new FrontierReportLine(l));
042                    addedLines++;
043                }
044            }
045        } finally {
046            if (iter != null) {
047                iter.close();
048            }
049        }
050
051        return result;
052    }
053
054    /**
055     * Determines whether a given frontier queue is retired, e.g. over budget.
056     *
057     * @param l a {@link FrontierReportLine} representing a frontier queue
058     * @return true if the queue is retired, false otherwise.
059     * @see WorkQueue#isOverBudget()
060     */
061    private boolean isOverBudget(FrontierReportLine l) {
062        long totalBudget = l.getTotalBudget();
063        return totalBudget >= 0 && l.getTotalSpend() >= totalBudget;
064    }
065
066}