/* * 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.text.DecimalFormat; import java.io.Writer; import java.io.IOException; /** * This class is contains the record from each jobs that ran in every * invocation. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ */ public class Job extends Invocation // implements Cloneable { /** * This is the tag to produce the job for. Usually, it is one of * "mainjob", "prejob", "postjob", or "cleanup". */ private String m_tag; /** * Start time of this job. */ private Date m_start; /** * Duration of the job. */ private double m_duration; /** * Process id assigned to the job. */ private int m_pid; /** * Resource usage of this job. */ private Usage m_usage; /** * Exit condition of the job. */ private Status m_status; /** * Stat call of the executable. */ private StatCall m_executable; /** * Command-line arguments. */ private Arguments m_arguments; public Job( String tag ) { m_tag = tag; m_usage = null; m_status = null; m_executable = null; m_arguments = null; } /** * Accessor * * @see #setTag(String) */ public String getTag() { return this.m_tag; } /** * Accessor. * * @param tag * @see #getTag() */ public void setTag( String tag ) { this.m_tag = tag; } /** * Accessor * * @see #setStart(Date) */ public Date getStart() { return this.m_start; } /** * Accessor. * * @param start * @see #getStart() */ public void setStart( Date start ) { this.m_start = start; } /** * Accessor * * @see #setDuration(double) */ public double getDuration() { return this.m_duration; } /** * Accessor. * * @param duration * @see #getDuration() */ public void setDuration( double duration ) { this.m_duration = duration; } /** * Accessor * * @see #setPID(int) */ public int getPID() { return this.m_pid; } /** * Accessor. * * @param pid * @see #getPID() */ public void setPID( int pid ) { this.m_pid = pid; } /** * Accessor * * @see #setUsage(Usage) */ public Usage getUsage() { return this.m_usage; } /** * Accessor. * * @param usage * @see #getUsage() */ public void setUsage( Usage usage ) { this.m_usage = usage; } /** * Accessor * * @see #setStatus(Status) */ public Status getStatus() { return this.m_status; } /** * Accessor. * * @param status * @see #getStatus() */ public void setStatus( Status status ) { this.m_status = status; } /** * Accessor * * @see #setExecutable(StatCall) */ public StatCall getExecutable() { return this.m_executable; } /** * Accessor. * * @param executable * @see #getExecutable() */ public void setExecutable( StatCall executable ) { this.m_executable = executable; } /** * Accessor * * @see #setArguments(Arguments) */ public Arguments getArguments() { return this.m_arguments; } /** * Accessor. * * @param arguments * @see #getArguments() */ public void setArguments( Arguments arguments ) { this.m_arguments = arguments; } /** * 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" ); } /** * Dumps 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. * @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" ); DecimalFormat d = new DecimalFormat("#.###"); String tag = ( namespace != null && namespace.length() > 0 ) ? namespace + ":" + m_tag : m_tag; // open tag if ( indent != null && indent.length() > 0 ) stream.write( indent ); stream.write( '<' ); stream.write( tag ); writeAttribute( stream, " start=\"", Currently.iso8601(false,true,true,m_start) ); writeAttribute( stream, " duration=\"", d.format(m_duration) ); writeAttribute( stream, " pid=\"", Integer.toString(m_pid) ); stream.write( '>' ); if ( indent != null ) stream.write( newline ); // dump content String newindent = indent==null ? null : indent+" "; m_usage.toXML( stream, newindent, namespace ); m_status.toXML( stream, newindent, namespace ); m_executable.toXML( stream, newindent, namespace ); m_arguments.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 ); } }