/*
* 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 edu.isi.pegasus.common.util.Currently;
import java.util.*;
/**
* This class is the container for a Workflow record. The record itself
* contains information about the job or jobs that ran.
*
* @author Jens-S. Vöckler
* @author Mike Wilde
* @version $Revision$
*/
public class WorkEntry implements Workflow, Cloneable
{
/**
* primary key: unique workflow identifier.
*/
private long m_id = -1;
/**
* secondary key, part 1: base directory
*/
private String m_basedir;
/**
* secondary key, part 2: VO group
*/
private String m_vogroup;
/**
* secondary key, part 3: workflow label
*/
private String m_label;
/**
* secondary key, part 4: run directory
*/
private String m_run;
/**
* workflow creator as an account name.
*/
private String m_creator;
/**
* workflow creation time as time stamp.
*/
private Date m_ctime;
/**
* workflow state as integer to represent future, current or past
* workflows.
*/
private int m_state;
/**
* last modification time of workflow state as time stamp.
*/
private Date m_mtime;
/**
* list of jobs associated with the workflow.
*/
private Map m_jobMap;
/**
* Creates and returns a copy of this object.
* @return a new instance with a deep copy of everything.
*/
public Object clone()
{
WorkEntry result = new WorkEntry( getID(),
getBaseDirectory(), getVOGroup(), getWorkflowLabel(), getRunDirectory() );
result.setCreator( getCreator() );
result.setCreationTime( getCreationTime() );
result.setState( getState() );
result.setModificationTime( getModificationTime() );
// now the tricky portion -- deep clone jobs
for ( Iterator i=iterateJob(); i.hasNext(); ) {
result.addJob( (JobStateEntry) ((JobStateEntry) i.next()).clone() );
}
return result;
}
/**
* Default constructor, should not be used.
*/
private WorkEntry()
{
m_jobMap = new TreeMap();
}
/**
* Constructs another empty class.
*
* @param id is the workflow primary key
*/
public WorkEntry( long id )
{
m_jobMap = new TreeMap();
m_id = id;
}
/**
* Constructs another empty class.
*
* @param id is the workflow primary key
* @param basedir is the base directory
* @param vogroup is the VO group identifier
* @param label is the workflow label
* @param run is the workflow run directory
*/
public WorkEntry( long id,
String basedir, String vogroup,
String label, String run )
{
m_jobMap = new TreeMap();
m_id = id;
m_basedir = basedir;
m_vogroup = vogroup;
m_label = label;
m_run = run;
}
/**
* Accessor
*
* @see #setID(long)
*/
public long getID()
{ return this.m_id; }
/**
* Accessor.
*
* @param id
* @see #getID()
*/
public void setID( long id )
{ this.m_id = id; }
/**
* Accessor
*
* @see #setBaseDirectory(String)
*/
public String getBaseDirectory()
{ return this.m_basedir; }
/**
* Accessor.
*
* @param basedir
* @see #getBaseDirectory()
*/
public void setBaseDirectory( String basedir )
{ this.m_basedir = basedir; }
/**
* Accessor
*
* @see #setVOGroup(String)
*/
public String getVOGroup()
{ return this.m_vogroup; }
/**
* Accessor.
*
* @param vogroup
* @see #getVOGroup()
*/
public void setVOGroup( String vogroup )
{ this.m_vogroup = vogroup; }
/**
* Accessor
*
* @see #setWorkflowLabel(String)
*/
public String getWorkflowLabel()
{ return this.m_label; }
/**
* Accessor.
*
* @param label
* @see #getWorkflowLabel()
*/
public void setWorkflowLabel( String label )
{ this.m_label = label; }
/**
* Accessor
*
* @see #setRunDirectory(String)
*/
public String getRunDirectory()
{ return this.m_run; }
/**
* Accessor.
*
* @param run
* @see #getRunDirectory()
*/
public void setRunDirectory( String run )
{ this.m_run = run; }
/**
* Accessor
*
* @see #setCreator(String)
*/
public String getCreator()
{ return this.m_creator; }
/**
* Accessor.
*
* @param creator
* @see #getCreator()
*/
public void setCreator( String creator )
{ this.m_creator = creator; }
/**
* 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 #setState(int)
*/
public int getState()
{ return this.m_state; }
/**
* Accessor.
*
* @param state
* @see #getState()
*/
public void setState( int state )
{ this.m_state = state; }
/**
* 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: Adds a job to the bag of jobs.
*
* @param job is the job to add.
* @see JobStateEntry
*/
public void addJob( JobStateEntry job )
{
this.m_jobMap.put( job.getID(), job );
}
/**
* Accessor: Obtains an job by the job id.
*
* @param id is the job identifier in the workflow.
* @return a reference to the job of this name.
* @see JobStateEntry
*/
public JobStateEntry getJob( String id )
{
return (JobStateEntry) this.m_jobMap.get(id);
}
/**
* Accessor: Counts the number of jobs in this workflow.
*
* @return the number of jobs in the internal bag.
*/
public int getJobCount()
{
return this.m_jobMap.size();
}
/**
* Accessor: A list of all jobs known to this workflow. This list is
* read-only.
*
* @return an array with <code>JobStateEntry</code> elements.
* @see JobStateEntry
*/
public java.util.List getJobList()
{
return Collections.unmodifiableList( new ArrayList(this.m_jobMap.values()));
}
/**
* Accessor: Obtains all jobs references by their id. The map is a
* read-only map to avoid modifications outside the API.
*
* @return a map with all jobs known to this workflow
* @see JobStateEntry
*/
public java.util.Map getJobMap()
{
return Collections.unmodifiableMap( this.m_jobMap );
}
/**
* Accessor: Provides an iterator over the jobs of this workflow.
* @return an iterator to walk the <code>JobStateEntry</code> list with.
* @see JobStateEntry
*/
public Iterator iterateJob()
{
return this.m_jobMap.values().iterator();
}
/**
* Accessor: Removes all jobs. Effectively empties the bag.
*/
public void removeAllJob()
{
this.m_jobMap.clear();
}
/**
* Accessor: Removes a specific job.
*
* @param name is the job identifier.
* @return the object that was removed, or null, if not found.
* @see JobStateEntry
*/
public JobStateEntry removeJob( String name )
{
return (JobStateEntry) this.m_jobMap.remove(name);
}
/**
* Accessor: Adds a new or overwrites an existing actual argument.
*
* @param job is a new complete job to enter.
* @see JobStateEntry
*/
public void setJob( JobStateEntry job )
{
this.m_jobMap.put( job.getID(), job );
}
/**
* Accessor: Replaces all jobs with the new collection of jobs. Note
* that a collection can be anything in a list or set.
*
* @param jobs is a collection of jobs.
* @see JobStateEntry
*/
public void setJob( Collection jobs )
{
this.m_jobMap.clear();
for ( Iterator i=jobs.iterator(); i.hasNext(); ) {
JobStateEntry j = (JobStateEntry) i.next();
this.m_jobMap.put(j.getID(),j);
}
}
/**
* Accessor: Replaces all job mappings with new job mappings.
*
* @param jobs is a map with job id to job mappings.
* @see JobStateEntry
*/
public void setJob( Map jobs )
{
this.m_jobMap.clear();
this.m_jobMap.putAll(jobs);
}
/**
* Constructs a sensible line of all internal data points
* @return a line containing all internal data.
*/
public String toString()
{
String newline = System.getProperty("line.separator","\r\n");
StringBuffer result = new StringBuffer( 80 * (1+m_jobMap.size()) );
// the workflow stuff
result.append( getID() ).append('|');
result.append( getBaseDirectory() ).append('|');
result.append( getVOGroup() ).append('|');
result.append( getWorkflowLabel() ).append('|');
result.append( getRunDirectory() ).append('|');
result.append( getCreator() ).append('|');;
result.append( Currently.iso8601(false,false,false,getCreationTime()) );
result.append('|');
result.append( Integer.toString(getState()) ).append('|');;
result.append( Currently.iso8601(false,false,false,getModificationTime()) );
result.append(newline);
// add all jobs with space ahead
for ( Iterator i=iterateJob(); i.hasNext(); ) {
JobStateEntry j = (JobStateEntry) i.next();
result.append(" ").append(j).append(newline);
}
return result.toString();
}
}