//******************************************************************************
//
// File: BackendFileWriter.java
// Package: edu.rit.pj.cluster
// Unit: Class edu.rit.pj.cluster.BackendFileWriter
//
// 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 edu.rit.io.LineBufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
/**
* Class BackendFileWriter provides an object that writes sequential files in
* the job backend process.
*
* Note: Class BackendFileWriter is not multiple thread safe; it assumes
* it is being called by a synchronized method in the job backend.
*
* @author Alan Kaminsky
* @version 05-Nov-2006
*/
public class BackendFileWriter
{
// Exported data members.
/**
* Print stream for printing on the job frontend's standard output.
*/
public final PrintStream out;
/**
* Print stream for printing on the job frontend's standard error.
*/
public final PrintStream err;
// Hidden data members.
private JobFrontendRef myJobFrontend;
private JobBackendRef myJobBackend;
// Mapping from backend file descriptor to backend file output stream.
private Map myOutputStreamForBFD =
new HashMap();
// Mapping from frontend file descriptor to backend file output stream.
private Map myOutputStreamForFFD =
new HashMap();
// Next backend file descriptor.
private int myNextBFD = 1;
// Exported constructors.
/**
* Construct a new backend file writer.
*
* @param theJobFrontend Job Frontend.
* @param theJobBackend Job Backend.
*/
public BackendFileWriter
(JobFrontendRef theJobFrontend,
JobBackendRef theJobBackend)
{
myJobFrontend = theJobFrontend;
myJobBackend = theJobBackend;
// Set up output streams for stdout and stderr.
BackendFileOutputStream outstream =
new BackendFileOutputStream
(myJobFrontend, myJobBackend, 1);
BackendFileOutputStream errstream =
new BackendFileOutputStream
(myJobFrontend, myJobBackend, 2);
myOutputStreamForFFD.put (1, outstream);
myOutputStreamForFFD.put (2, errstream);
// Set up print streams for stdout and stderr.
out =
new PrintStream
(new LineBufferedOutputStream (outstream),
true);
err =
new PrintStream
(new LineBufferedOutputStream (errstream),
true);
}
// Exported operations.
/**
* Open a backend file output stream on the given file.
*
* @param file File.
* @param append True to append, false to overwrite.
*
* @return Backend file output stream.
*
* @exception IOException
* Thrown if an I/O error occurred.
*/
public BackendFileOutputStream open
(File file,
boolean append)
throws IOException
{
BackendFileOutputStream stream = null;
int bfd = 0;
int ffd = 0;
synchronized (this)
{
stream = new BackendFileOutputStream (myJobFrontend, myJobBackend);
bfd = myNextBFD ++;
myOutputStreamForBFD.put (bfd, stream);
}
ffd = stream.open (bfd, file, append);
synchronized (this)
{
myOutputStreamForFFD.put (ffd, stream);
}
return stream;
}
/**
* Report the result of opening the given output 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 outputFileOpenResult
(JobFrontendRef theJobFrontend,
int bfd,
int ffd,
IOException exc)
{
BackendFileOutputStream stream = null;
synchronized (this)
{
stream = myOutputStreamForBFD.remove (bfd);
}
if (stream != null)
{
stream.putResult (ffd, exc);
}
}
/**
* Report the result of writing the given output 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 outputFileWriteResult
(JobFrontendRef theJobFrontend,
int ffd,
IOException exc)
{
BackendFileOutputStream stream = null;
synchronized (this)
{
stream = myOutputStreamForFFD.get (ffd);
}
if (stream != null)
{
stream.putResult (ffd, exc);
}
}
/**
* Report the result of flushing the given output 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 outputFileFlushResult
(JobFrontendRef theJobFrontend,
int ffd,
IOException exc)
{
BackendFileOutputStream stream = null;
synchronized (this)
{
stream = myOutputStreamForFFD.get (ffd);
}
if (stream != null)
{
stream.putResult (ffd, exc);
}
}
/**
* Report the result of closing the given output 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 outputFileCloseResult
(JobFrontendRef theJobFrontend,
int ffd,
IOException exc)
{
BackendFileOutputStream stream = null;
synchronized (this)
{
stream = myOutputStreamForFFD.remove (ffd);
}
if (stream != null)
{
stream.putResult (ffd, exc);
}
}
}
Ads help maintain this website.