/*
* 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 carries an argument vector entry for the argument vector.
* This calls is expected to be transient to the parsing process only.
*
* @author Jens-S. Vöckler
* @author Yong Zhao
* @version $Revision$
*/
public class ArgEntry extends Invocation implements HasText
{
/**
* argument vector position
*/
private int m_position;
/**
* argument vector value
*/
private StringBuffer m_value;
/**
* Default c'tor: Construct a hollow shell and allow further
* information to be added later.
*/
public ArgEntry()
{
m_position = -1;
m_value = null;
}
/**
* C'tor: Prepares a given key for accepting a value later on.
* @param position is the location to use.
*/
public ArgEntry( int position )
{
m_position = position;
m_value = null;
}
/**
* C'tor: Fully initializes the class
* @param position is the location to use.
* @param value is the value to remember
*/
public ArgEntry( int position, String value )
{
m_position = position;
m_value = new StringBuffer(value);
}
/**
* Appends a piece of text to the existing text.
* @param fragment is a piece of text to append to existing text.
* Appending <code>null</code> is a noop.
*/
public void appendValue( String fragment )
{
if ( fragment != null ) {
if ( this.m_value == null ) this.m_value = new StringBuffer(fragment);
else this.m_value.append(fragment);
}
}
/**
* Accessor
* @return the position of this entry in the argument vector.
* @see #setPosition(int)
*/
public int getPosition()
{ return this.m_position; }
/**
* Accessor.
*
* @param position
* @see #getPosition()
*/
public void setPosition( int position )
{ this.m_position = position; }
/**
* Accessor
*
* @see #setValue(String)
*/
public String getValue()
{
return ( m_value == null ? null : m_value.toString() );
}
/**
* Accessor.
*
* @param value is the new value to set.
* @see #getValue()
*/
public void setValue( String value )
{
this.m_value = ( value == null ? null : new StringBuffer(value) );
}
/**
* 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
{
stream.write( '[' );
stream.write( m_position );
stream.write( "]=" );
stream.write( getValue() );
}
/**
* Dumps the state of the current element as XML output. However, for
* the given instance, this class is ludicrious.
*
* @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 tag = ( namespace != null && namespace.length() > 0 ) ?
namespace + ":arg" : "arg";
// open tag
if ( indent != null && indent.length() > 0 ) stream.write( indent );
stream.write( '<' );
stream.write( tag );
writeAttribute( stream, " id=\"", Integer.toString(m_position) );
stream.write( '>' );
stream.write( quote(getValue(),false) );
stream.write( "</" );
stream.write( tag );
stream.write( '>' );
if ( indent != null )
stream.write( System.getProperty( "line.separator", "\r\n" ) );
}
}