//******************************************************************************
//
// File: BackendFileReader.java
// Package: edu.rit.pj.cluster
// Unit: Class edu.rit.pj.cluster.BackendFileReader
//
// This Java source file is copyright (C) 2006 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.cluster;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Class BackendFileReader provides an object that reads sequential files in
* the job backend process.
*
* Note: Class BackendFileReader is not multiple thread safe; it assumes
* it is being called by a synchronized method in the job backend.
*
* @author Alan Kaminsky
* @version 20-Nov-2006
*/
public class BackendFileReader
{
// Exported data members.
/**
* Input stream for reading from the job frontend's standard input.
*/
public final BackendFileInputStream in;
// Hidden data members.
private JobFrontendRef myJobFrontend;
private JobBackendRef myJobBackend;
// Mapping from backend file descriptor to backend file input stream.
private Map myInputStreamForBFD =
new HashMap();
// Mapping from frontend file descriptor to backend file input stream.
private Map myInputStreamForFFD =
new HashMap();
// Next backend file descriptor.
private int myNextBFD = 1;
// Exported constructors.
/**
* Construct a new backend file reader.
*
* @param theJobFrontend Job Frontend.
* @param theJobBackend Job Backend.
*/
public BackendFileReader
(JobFrontendRef theJobFrontend,
JobBackendRef theJobBackend)
{
myJobFrontend = theJobFrontend;
myJobBackend = theJobBackend;
// Set up input stream for stdin.
in = new BackendFileInputStream (myJobFrontend, myJobBackend, 1);
myInputStreamForFFD.put (1, in);
}
// Exported operations.
/**
* Open a backend file input stream on the given file.
*
* @param file File.
*
* @return Backend file input stream.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
public BackendFileInputStream open
(File file)
throws IOException
{
BackendFileInputStream stream = null;
int bfd = 0;
int ffd = 0;
synchronized (this)
{
stream = new BackendFileInputStream (myJobFrontend, myJobBackend);
bfd = myNextBFD ++;
myInputStreamForBFD.put (bfd, stream);
}
ffd = stream.open (bfd, file);
synchronized (this)
{
myInputStreamForFFD.put (ffd, stream);
}
return stream;
}
/**
* Report the result of opening the given input file.
*
* @param theJobFrontend Job Frontend that is calling this method.
* @param bfd Backend file descriptor.
* @param ffd Frontend file descriptor if success.
* @param exc Null if success, exception if failure.
*/
public void inputFileOpenResult
(JobFrontendRef theJobFrontend,
int bfd,
int ffd,
IOException exc)
{
BackendFileInputStream stream = null;
synchronized (this)
{
stream = myInputStreamForBFD.remove (bfd);
}
if (stream != null)
{
stream.putResult (ffd, 0, 0L, exc);
}
}
/**
* Report the result of reading the given input file.
*
* @param theJobFrontend Job Frontend that is calling this method.
* @param ffd Frontend file descriptor.
* @param len Number of bytes read, or -1 if EOF.
* @param exc Null if success, exception if failure.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
public void inputFileReadResult
(JobFrontendRef theJobFrontend,
int ffd,
int len,
IOException exc)
{
BackendFileInputStream stream = null;
synchronized (this)
{
stream = myInputStreamForFFD.get (ffd);
}
if (stream != null)
{
stream.putResult (ffd, len, 0L, exc);
}
}
/**
* Report the result of skipping the given input file.
*
* @param theJobFrontend Job Frontend that is calling this method.
* @param ffd Frontend file descriptor.
* @param len Number of bytes skipped.
* @param exc Null if success, exception if failure.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
public void inputFileSkipResult
(JobFrontendRef theJobFrontend,
int ffd,
long len,
IOException exc)
{
BackendFileInputStream stream = null;
synchronized (this)
{
stream = myInputStreamForFFD.get (ffd);
}
if (stream != null)
{
stream.putResult (ffd, 0, len, exc);
}
}
/**
* Report the result of closing the given input file.
*
* @param theJobFrontend Job Frontend that is calling this method.
* @param ffd Frontend file descriptor.
* @param exc Null if success, exception if failure.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
public void inputFileCloseResult
(JobFrontendRef theJobFrontend,
int ffd,
IOException exc)
{
BackendFileInputStream stream = null;
synchronized (this)
{
stream = myInputStreamForFFD.remove (ffd);
}
if (stream != null)
{
stream.putResult (ffd, 0, 0L, exc);
}
}
}
Ads help maintain this website.