//******************************************************************************
//
// File: JobGenerator.java
// Package: edu.rit.pj.job
// Unit: Class edu.rit.pj.job.JobGenerator
//
// This Java source file is copyright (C) 2010 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ 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 General Public License for more details.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************
package edu.rit.pj.job;
import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* Class JobGenerator is the abstract base class for an object that generates a
* group of {@linkplain Job}s.
*
* Jobs are numbered from 0 to N−1, where N is the number of
* jobs in the group. A subclass must override the jobCount() method to
* return N. A subclass must override the createJob() method to
* create and return the job corresponding to a given job number. The job
* generator need not create all the jobs in the group, and it need not create
* them in any particular order.
*
* Class JobGenerator provides the omit() method to omit generating
* certain job numbers. This is used for checkpointing. For further information,
* see class {@linkplain Runner}.
*
* @author Alan Kaminsky
* @version 08-Oct-2010
*/
public abstract class JobGenerator
implements Iterable
{
// Hidden data members.
private Set myOmittedJobNumbers;
// Exported constructors.
/**
* Construct a new job generator.
*/
public JobGenerator()
{
myOmittedJobNumbers = new HashSet();
}
// Exported operations.
/**
* Omit the job numbers in the given set when generating jobs. To be
* effective, omit() must be called before calling
* iterator(). A snapshot of the given set is taken; changing the
* set's contents thereafter will not affect the job numbers to be omitted.
*
* @param theOmittedJobNumbers Set of job numbers to be omitted.
*
* @exception NullPointerException
* (unchecked exception) Thrown if theOmittedJobNumbers is
* null.
*/
public void omit
(Set theOmittedJobNumbers)
{
myOmittedJobNumbers.clear();
myOmittedJobNumbers.addAll (theOmittedJobNumbers);
}
/**
* Get an iterator for generating the jobs in the job group.
*
* @return Iterator.
*/
public Iterator iterator()
{
return new Iterator()
{
private int N = jobCount();
private int myJobNumber = -1;
private boolean generated = true;
public boolean hasNext()
{
advance();
return myJobNumber < N;
}
public Job next()
{
advance();
if (myJobNumber >= N)
{
throw new NoSuchElementException();
}
generated = true;
return createJob (myJobNumber);
}
public void remove()
{
throw new UnsupportedOperationException();
}
private void advance()
{
if (generated)
{
generated = false;
do
{
++ myJobNumber;
}
while (myJobNumber < N &&
myOmittedJobNumbers.contains (myJobNumber));
}
}
};
}
// Hidden operations.
/**
* Returns the number of jobs in the job group, N.
*
* @return Number of jobs.
*/
protected abstract int jobCount();
/**
* Create the job with the given job number. This method must create and
* return an instance of class {@linkplain Job} whose job number is
* theJobNumber.
*
* @param theJobNumber Job number (0 .. N−1).
*/
protected abstract Job createJob
(int theJobNumber);
}
Ads help maintain this website.