/* * 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 encapsulates the exit code or reason of termination for * a given job. The class itself contains the raw exit code. It also * aggregates an instance of the JobStatus interface, which describes * more clearly failure, regular execution, signal and suspension. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ */ public class Status extends Invocation // implements Cloneable { /** * The raw exit code, unparsed and unprepared. There are several * interpretation of the value. Usually, it is interpreted as * unsigned 16 bit value. The high byte contains the exit code. * The low byte has the core dump flag as MSB, and the rest denote * the signal number. A value of -1 denotes a failure from the * grid launcher before starting the job. */ private int m_status; /** * This member variable contains the real status of the job. */ private JobStatus m_jobStatus; /** * Default c'tor: Construct a hollow shell and allow further * information to be added later. */ public Status() { m_status = 0; m_jobStatus = null; } /** * Constructs a layer with the raw exit code. * @param raw is the raw exit code to store. */ public Status( int raw ) { m_status = raw; m_jobStatus = null; } /** * Constructs the complete class with raw exit code * and a status child describing the exit code. * @param raw is the raw exit status * @param status is the description of the kind of exit. */ public Status( int raw, JobStatus status ) { m_status = raw; m_jobStatus = status; } /** * Accessor * * @see #setStatus(int) */ public int getStatus() { return this.m_status; } /** * Accessor. * * @param status * @see #getStatus() */ public void setStatus( int status ) { this.m_status = status; } /** * Accessor * * @see #setJobStatus( JobStatus ) */ public JobStatus getJobStatus() { return this.m_jobStatus; } /** * Accessor. * * @param jobStatus is an instance of the class describing * the real reason for program termination on the remote end. * @see #getJobStatus() */ public void setJobStatus( JobStatus jobStatus ) { this.m_jobStatus = jobStatus; } /** * 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 tag = ( namespace != null && namespace.length() > 0 ) ? namespace + ":status" : "status"; // open tag if ( indent != null && indent.length() > 0 ) stream.write( indent ); stream.write( '<' ); stream.write( tag ); writeAttribute( stream, " raw=\"", Integer.toString(m_status) ); stream.write( ">" ); // dump content String newindent = indent==null ? null : indent+" "; if ( m_jobStatus != null ) m_jobStatus.toXML( stream, newindent, namespace ); else throw new RuntimeException( "unknown state of job status" ); // close tag stream.write( "</" ); stream.write( tag ); stream.write( '>' ); if ( indent != null ) stream.write( System.getProperty( "line.separator", "\r\n" ) ); } }