/*
* 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 org.griphyn.vdl.workflow;
import java.util.*;
import edu.isi.pegasus.common.util.Currently;
/**
* This class is the container for a job state record.<p>
*
* When constructing a job from piece-meal, please note that setting the
* job's state will automatically set the job's last modification time
* to the current time. If this is not desired, you must set the
* modification time after setting the state. However, none of the
* constructors will set the modification to the current time (yet).
*
* @author Jens-S. Vöckler
* @author Mike Wilde
* @version $Revision$
*/
public class JobStateEntry implements Workflow, Cloneable
{
/**
* primary key: which workflow do we belong to. If -1 then unknown.
*/
private long m_wfid = -1;
/**
* primary key: unique job identifier within the workflow
*/
private String m_id;
/**
* the Condor state of the job.
*/
private String m_state;
/**
* the last modification time of the job state.
*/
private Date m_mtime;
/**
* the resource where the job ran, may be unspecified.
*/
private String m_site = null;
/**
* Creates and returns a copy of this object.
* @return a new instance.
*/
public Object clone()
{
JobStateEntry result = new JobStateEntry( getWorkflowID(), getID() );
result.setState( getState() );
result.setModificationTime( getModificationTime() );
result.setSite( getSite() );
return result;
}
/**
* Default contructor.
*/
public JobStateEntry()
{
// empty
}
/**
* Constructs an other empty class.
*
* @param wfid is the workflow primary key
*/
public JobStateEntry( long wfid )
{
m_wfid = wfid;
}
/**
* Constructs an other empty class.
*
* @param wfid is the workflow primary key
* @param jobid is the job identifier within the workflow
*/
public JobStateEntry( long wfid, String jobid )
{
m_wfid = wfid;
m_id = jobid;
}
/**
* Constructs an other empty class. It will set the workflow identifier
* to -1 to indicate no connection.
*
* @param jobid is the job identifier within the workflow
*/
public JobStateEntry( String jobid )
{
m_wfid = -1;
m_id = jobid;
}
/**
* Accessor
*
* @see #setWorkflowID(long)
* @return this job's workflow identifier.
*/
public long getWorkflowID()
{ return this.m_wfid; }
/**
* Accessor.
*
* @param wfid is the new workflow id as positive number.
* @see #getWorkflowID()
*/
public void setWorkflowID( long wfid )
{
if ( wfid < 0 ) throw new RuntimeException("negative workflow id");
this.m_wfid = wfid;
}
/**
* Accessor
*
* @see #setID(String)
* @return the job identifier
*/
public String getID()
{ return this.m_id; }
/**
* Accessor.
*
* @param id is the new job id, must not be <code>null</code>.
* @see #getID()
*/
public void setID( String id )
{
if ( id == null ) throw new NullPointerException();
this.m_id = id;
}
/**
* Accessor
*
* @see #setState(String)
* @return the Condor job state string with some extensions.
*/
public String getState()
{ return this.m_state; }
/**
* Accessor. As a side effect, setting the job state will
* set the current modification time to the current time.
*
* @param state is the new Condor job state, must not be
* <code>null</code>.
* @see #getState()
*/
public void setState( String state )
{
if ( state == null ) throw new NullPointerException();
this.m_state = state;
this.m_mtime = new Date();
}
/**
* Accessor
*
* @see #setModificationTime(Date)
* @return the last modification time of any of this job's state.
*/
public Date getModificationTime()
{ return this.m_mtime; }
/**
* Accessor.
*
* @param mtime is the new last modification time of this job, must
* not be <code>null</code>.
* @see #getModificationTime()
*/
public void setModificationTime( Date mtime )
{
if ( mtime == null ) throw new NullPointerException();
this.m_mtime = mtime;
}
/**
* Accessor
*
* @see #setSite(String)
*/
public String getSite()
{ return this.m_site; }
/**
* Accessor.
*
* @param site is the new remote site, may be <code>null</code>.
* @see #getSite()
*/
public void setSite( String site )
{ this.m_site = site; }
/**
* Constructs a simple line of all internal data points. Adjust
* to your requirements - this is an example, only.
*
* @return a line containing all internal data.
*/
public String toString()
{
StringBuffer result = new StringBuffer(80);
result.append( Long.toString(m_wfid) ).append('|');
result.append( m_id ).append('|');
result.append( m_state ).append('|');
result.append( Currently.iso8601(false,true,false,m_mtime) ).append('|');
result.append( m_site == null ? "NULL" : m_site );
return result.toString();
}
}