/* * This file or a portion of this file is licensed under the terms of * the Globus Toolkit Public License, found in file ../GTPL, or at * http://www.globus.org/toolkit/download/license.html. This notice must * appear in redistributions of this file, with or without modification. * * Redistributions of this Software, with or without modification, must * reproduce the GTPL in: (1) the Software, or (2) the Documentation or * some other similar material which is provided with the Software (if * any). * * Copyright 1999-2004 University of Chicago and The University of * Southern California. All rights reserved. */ package edu.isi.pegasus.planner.invocation; import java.util.*; import java.io.Writer; import java.io.IOException; /** * This class is the container for a complete call to stat() or fstat(). * It contains information about the file or descriptor. Optionally, it * may also contain some data from the file or descriptor. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ */ public class StatCall extends Invocation // implements Cloneable { /** * optional handle for stat calls of the invocation record */ private String m_handle; /** * optional logical filename associated with this stat call */ private String m_lfn; /** * value of errno after calling any stat function, or -1 for failure. */ private int m_errno; /** * the object (fn,fd) that the stat call was taken on. */ private File m_file; /** * the stat information itself, only present for unfailed calls. */ private StatInfo m_statinfo; /** * Optional data gleaned from stdout or stderr. */ private Data m_data; /** * Default c'tor: Construct a hollow shell and allow further * information to be added later. */ public StatCall() { m_handle = m_lfn = null; m_file = null; m_statinfo = null; m_data = null; } /** * Construct a specific but empty stat call object. * @param handle is the identifier to give this specific stat call. */ public StatCall( String handle ) { m_handle = handle; m_lfn = null; m_file = null; m_statinfo = null; m_data = null; } /** * Accessor * * @see #setHandle(String) */ public String getHandle() { return this.m_handle; } /** * Accessor. * * @param handle * @see #getHandle() */ public void setHandle( String handle ) { this.m_handle = handle; } /** * Accessor * * @see #setLFN(String) */ public String getLFN() { return this.m_lfn; } /** * Accessor. * * @param lfn * @see #getLFN() */ public void setLFN( String lfn ) { this.m_lfn = lfn; } /** * Accessor * * @see #setError(int) */ public int getError() { return this.m_errno; } /** * Accessor. * * @param errno * @see #getError() */ public void setError( int errno ) { this.m_errno = errno; } /** * Accessor * * @see #setFile(File) */ public File getFile() { return this.m_file; } /** * Accessor. * * @param file * @see #getFile() */ public void setFile( File file ) { this.m_file = file; } /** * Accessor * * @see #setStatInfo(StatInfo) */ public StatInfo getStatInfo() { return this.m_statinfo; } /** * Accessor. * * @param statinfo * @see #getStatInfo() */ public void setStatInfo( StatInfo statinfo ) { this.m_statinfo = statinfo; } /** * Accessor * * @see #setData(String) */ public Data getData() { return this.m_data; } /** * Accessor. * * @param data * @see #getData() */ public void setData( String data ) { this.m_data = new Data(data); } /** * Conversion accessor. * * @param data * @see #getData() * @see #setData( String ) */ public void setData( Data data ) { this.m_data = data; } /** * Converts the active state into something meant for human consumption. * The method will be called when recursively traversing the instance * tree. * * @param stream is a stream opened and ready for writing. This can also * be a string stream for efficient output. */ public void toString( Writer stream ) throws IOException { throw new IOException( "method not implemented, please contact vds-support@griphyn.org" ); } /** * Dump the state of the current element as XML output. This function * traverses all sibling classes as necessary, and converts the data * into pretty-printed XML output. The stream interface should be able * to handle large output efficiently. * * @param stream is a stream opened and ready for writing. This can also * be a string stream for efficient output. * @param indent is a <code>String</code> of spaces used for pretty * printing. The initial amount of spaces should be an empty string. * The parameter is used internally for the recursive traversal. * If a <code>null</code> value is specified, no indentation nor * linefeeds will be generated. * @param namespace is the XML schema namespace prefix. If neither * empty nor null, each element will be prefixed with this prefix, * and the root element will map the XML namespace. * @exception IOException if something fishy happens to the stream. */ public void toXML( Writer stream, String indent, String namespace ) throws IOException { String newline = System.getProperty( "line.separator", "\r\n" ); String tag = ( namespace != null && namespace.length() > 0 ) ? namespace + ":statcall" : "statcall"; // open tag if ( indent != null && indent.length() > 0 ) stream.write( indent ); stream.write( '<' ); stream.write( tag ); writeAttribute( stream, " error=\"", Integer.toString(m_errno) ); if ( m_handle != null ) writeAttribute( stream, " id=\"", m_handle ); if ( m_lfn != null ) writeAttribute( stream, " lfn=\"", m_lfn ); stream.write( '>' ); if ( indent != null ) stream.write( newline ); // dump content String newindent = indent==null ? null : indent+" "; m_file.toXML( stream, newindent, namespace ); if ( m_statinfo != null ) m_statinfo.toXML( stream, newindent, namespace ); if ( m_data != null ) m_data.toXML( stream, newindent, namespace ); // close tag if ( indent != null && indent.length() > 0 ) stream.write( indent ); stream.write( "</" ); stream.write( tag ); stream.write( '>' ); if ( indent != null ) stream.write( newline ); } }