/* * 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 maintains the application that was run, and the * arguments to the commandline that were actually passed on to * the application. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ * @see Job */ public class Environment extends Invocation { /** * Mappings of keys to values */ private Map m_environment; /** * Default c'tor: Construct a hollow shell and allow further * information to be added later. */ public Environment() { m_environment = new HashMap(); } /** * Adds an environment entry, effectively a key value pair, to the * current environment settings. * * @param entry is the environment entry to add * @return the old entry including <code>null</code>. * @see #addEntry( String, String ) */ public String addEntry( EnvEntry entry ) { String key = entry.getKey(); if ( key != null ) { String value = entry.getValue(); if ( value == null ) value = new String(); return (String) m_environment.put( entry.getKey(), entry.getValue() ); } else { return null; // evil! } } /** * Adds an environment entry, effectively a key value pair, to the * current environment settings. * * @param key is the identifier for the environment setting. * @param value is the value associated with the key. * @return the old entry including <code>null</code>. * @see #addEntry( EnvEntry ) */ public String addEntry( String key, String value ) { if ( key != null ) { if ( value == null ) value = new String(); return (String) m_environment.put( key, value ); } else { return null; } } /** * Retrieves the value for a given key * * @param key is the identifier in the map to retrieve the key for * @return the value for the given, which may include <code>null</code>. */ public String get( String key ) { return (String) m_environment.get(key); } /** * Creates a sorted iterator * * @return an iterator over sorted keys */ public Iterator iterator() { Set result = new TreeSet( m_environment.keySet() ); return result.iterator(); } /** * 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 newline = System.getProperty( "line.separator", "\r\n" ); String tag = ( namespace != null && namespace.length() > 0 ) ? namespace + ":environment" : "environment"; // open tag if ( indent != null && indent.length() > 0 ) stream.write( indent ); stream.write( '<' ); stream.write( tag ); if ( m_environment.size() == 0 ) { // no content stream.write( "/>" ); if ( indent != null ) stream.write( newline ); } else { // yes, content String newindent = ( indent == null ) ? null : indent + " "; String envtag = ( namespace != null && namespace.length() > 0 ) ? namespace + ":env" : "env"; stream.write( '>' ); if ( indent != null ) stream.write( newline ); for ( Iterator i=this.iterator(); i.hasNext(); ) { String key = (String) i.next(); String value = this.get(key); if ( newindent != null && newindent.length() > 0 ) stream.write( newindent ); stream.write( '<' ); stream.write( envtag ); writeAttribute( stream, " key=\"", key ); stream.write( '>' ); if ( value != null ) stream.write( quote(value,false) ); stream.write( "</" ); stream.write( envtag ); stream.write( '>' ); if ( indent != null ) stream.write( newline ); } stream.write( "</" ); stream.write( tag ); stream.write( '>' ); } if ( indent != null ) stream.write( newline ); } }