/* * Copyright 2004 Carnegie Mellon University. * Portions Copyright 2004 Sun Microsystems, Inc. * Portions Copyright 2004 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.util; import java.io.IOException; import java.util.List; /** A simple implementation of the batch manager suitable for single threaded batch processing */ public class SimpleBatchManager implements BatchManager { private final String batchFile; private final int skip; private int whichBatch; private final int totalBatches; private int curItem; private List<String> items; /** * Constructs a SimpleBatchManager object. * * @param filename the name of the batch file * @param skip number of records to skip between items * @param whichBatch which chunk of the batch should we process * @param totalBatches the total number of chuncks that the batch is divided into. */ public SimpleBatchManager(String filename, int skip, int whichBatch, int totalBatches) { this.batchFile = filename; this.skip = skip; this.whichBatch = whichBatch; this.totalBatches = totalBatches; } /** Starts processing the batch */ public void start() throws IOException { curItem = 0; items = getBatchItems(batchFile); } /** * Gets the next available batch item or null if no more are available * * @return the next available batch item * @throws IOException if an I/O error occurs while getting the next item from the batch file. */ public BatchItem getNextItem() throws IOException { if (curItem >= items.size()) { return null; } else { String line = items.get(curItem++); return new BatchItem(BatchFile.getFilename(line), BatchFile.getReference(line)); } } /** Stops processing the batch */ public void stop() throws IOException { } /** * Returns the name of the file * * @return the filename */ public String getFilename() { return batchFile; } /** * Gets the set of lines from the file * * @param file the name of the file */ private List<String> getBatchItems(String file) throws IOException { List<String> list = BatchFile.getLines(file, skip); if (totalBatches > 1) { int linesPerBatch = list.size() / totalBatches; if (linesPerBatch < 1) { linesPerBatch = 1; } if (whichBatch >= totalBatches) { whichBatch = totalBatches - 1; } int startLine = whichBatch * linesPerBatch; // last batch needs to get all remaining lines if (whichBatch == (totalBatches - 1)) { list = list.subList(startLine, list.size()); } else { list = list.subList(startLine, startLine + linesPerBatch); } } return list; } }