/*
* 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 edu.isi.pegasus.common.util.Currently;
import java.util.*;
import java.io.Writer;
import java.io.IOException;
/**
* This class is the container for the results of a call to either
* stat() or fstat(). Not all stat information is kept.
*
* @author Jens-S. Vöckler
* @author Yong Zhao
* @version $Revision$
*/
public class StatInfo extends Invocation // implements Cloneable
{
/**
* Is the number for the file mode. This is originally an octal string.
*/
private int m_mode;
/**
* Denotes the size of the file. Files can grow rather large.
*/
private long m_size;
/**
* We store the inode number, which let's us reference a file uniquely
* per filesystem.
*/
private long m_inode;
/**
* Stores the number of hard links to the file.
*/
private long m_nlink;
/**
* Stores the blocksize of the file.
*/
private long m_blksize;
/**
* Stores the number of blocks of the file.
*/
private long m_blocks;
/**
* Contains the last access time timestamp.
*/
private Date m_atime;
/**
* Contains the creation time timestamp.
*/
private Date m_ctime;
/**
* Contains the last modification time timestamp;
*/
private Date m_mtime;
/**
* user id of the owner of the file.
*/
private int m_uid;
/**
* symbolical user name of the effective user.
*/
private String m_user;
/**
* group id of the owner of the file.
*/
private int m_gid;
/**
* symbolical group name of the effective user.
*/
private String m_group;
/**
* Default c'tor: Construct a hollow shell and allow further
* information to be added later.
*/
public StatInfo()
{
m_uid = m_gid = -1;
m_atime = m_ctime = m_mtime = new Date();
}
/**
* Accessor
*
* @see #setMode(int)
*/
public int getMode()
{ return this.m_mode; }
/**
* Accessor.
*
* @param mode
* @see #getMode()
*/
public void setMode( int mode )
{ this.m_mode = mode; }
/**
* Accessor
*
* @see #setSize(long)
*/
public long getSize()
{ return this.m_size; }
/**
* Accessor.
*
* @param size
* @see #getSize()
*/
public void setSize( long size )
{ this.m_size = size; }
/**
* Accessor
*
* @see #setINode(long)
*/
public long getINode()
{ return this.m_inode; }
/**
* Accessor.
*
* @param inode
* @see #getINode()
*/
public void setINode( long inode )
{ this.m_inode = inode; }
/**
* Accessor
*
* @see #setLinkCount(long)
*/
public long getLinkCount()
{ return this.m_nlink; }
/**
* Accessor.
*
* @param nlink
* @see #getLinkCount()
*/
public void setLinkCount( long nlink )
{ this.m_nlink = nlink; }
/**
* Accessor
*
* @see #setBlockSize(long)
*/
public long getBlockSize()
{ return this.m_blksize; }
/**
* Accessor.
*
* @param blksize
* @see #getBlockSize()
*/
public void setBlockSize( long blksize )
{ this.m_blksize = blksize; }
/**
* Accessor
*
* @see #setBlocks(long)
*/
public long getBlocks()
{ return this.m_blocks; }
/**
* Accessor.
*
* @param blocks
* @see #getBlocks()
*/
public void setBlocks( long blocks )
{ this.m_blocks = blocks; }
/**
* Accessor
*
* @see #setAccessTime(Date)
*/
public Date getAccessTime()
{ return this.m_atime; }
/**
* Accessor.
*
* @param atime
* @see #getAccessTime()
*/
public void setAccessTime( Date atime )
{ this.m_atime = atime; }
/**
* Accessor
*
* @see #setCreationTime(Date)
*/
public Date getCreationTime()
{ return this.m_ctime; }
/**
* Accessor.
*
* @param ctime
* @see #getCreationTime()
*/
public void setCreationTime( Date ctime )
{ this.m_ctime = ctime; }
/**
* Accessor
*
* @see #setModificationTime(Date)
*/
public Date getModificationTime()
{ return this.m_mtime; }
/**
* Accessor.
*
* @param mtime
* @see #getModificationTime()
*/
public void setModificationTime( Date mtime )
{ this.m_mtime = mtime; }
/**
* Accessor
*
* @see #setUID(int)
*/
public int getUID()
{ return this.m_uid; }
/**
* Accessor.
*
* @param uid
* @see #getUID()
*/
public void setUID( int uid )
{ this.m_uid = uid; }
/**
* Accessor
*
* @see #setUser(String)
*/
public String getUser()
{ return this.m_user; }
/**
* Accessor.
*
* @param user
* @see #getUser()
*/
public void setUser( String user )
{ this.m_user = user; }
/**
* Accessor
*
* @see #setGID(int)
*/
public int getGID()
{ return this.m_gid; }
/**
* Accessor.
*
* @param gid
* @see #getGID()
*/
public void setGID( int gid )
{ this.m_gid = gid; }
/**
* Accessor
*
* @see #setGroup(String)
*/
public String getGroup()
{ return this.m_group; }
/**
* Accessor.
*
* @param group
* @see #getGroup()
*/
public void setGroup( String group )
{ this.m_group = group; }
/**
* 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
{
if ( indent != null && indent.length() > 0 ) stream.write( indent );
stream.write( '<' );
if ( namespace != null && namespace.length() > 0 ) {
stream.write( namespace );
stream.write( ':' );
}
stream.write( "statinfo" );
writeAttribute( stream, " mode=\"0", Integer.toOctalString(m_mode) );
writeAttribute( stream, " size=\"", Long.toString(m_size) );
writeAttribute( stream, " inode=\"", Long.toString(m_inode) );
writeAttribute( stream, " nlink=\"", Long.toString(m_nlink) );
writeAttribute( stream, " blksize=\"", Long.toString(m_blksize) );
writeAttribute( stream, " blocks=\"", Long.toString(m_blocks) );
writeAttribute( stream, " mtime=\"", Currently.iso8601(false,true,false,m_mtime) );
writeAttribute( stream, " atime=\"", Currently.iso8601(false,true,false,m_atime) );
writeAttribute( stream, " ctime=\"", Currently.iso8601(false,true,false,m_ctime) );
writeAttribute( stream, " uid=\"", Integer.toString(m_uid) );
if ( this.m_user != null && this.m_user.length() > 0 )
writeAttribute( stream, " user=\"", this.m_user );
writeAttribute( stream, " gid=\"", Integer.toString(m_gid) );
if ( this.m_group != null && this.m_group.length() > 0 )
writeAttribute( stream, " group=\"", this.m_group );
// done
stream.write( "/>" );
if ( indent != null )
stream.write( System.getProperty( "line.separator", "\r\n" ) );
}
}