001: /*
002: * This file or a portion of this file is licensed under the terms of
003: * the Globus Toolkit Public License, found in file GTPL, or at
004: * http://www.globus.org/toolkit/download/license.html. This notice must
005: * appear in redistributions of this file, with or without modification.
006: *
007: * Redistributions of this Software, with or without modification, must
008: * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
009: * some other similar material which is provided with the Software (if
010: * any).
011: *
012: * Copyright 1999-2004 University of Chicago and The University of
013: * Southern California. All rights reserved.
014: */
015: package org.griphyn.vdl.invocation;
016:
017: import java.util.*;
018: import java.io.Writer;
019: import java.io.IOException;
020:
021: /**
022: * This class is transient for XML parsing. The data value will be
023: * incorporated into the job status classes.
024: *
025: * @author Jens-S. Vöckler
026: * @author Yong Zhao
027: * @version $Revision: 50 $
028: * @see StatCall
029: */
030: public class JobStatusSuspend extends JobStatus implements HasText {
031: /**
032: * This is the data contained between the tags. A <code>null</code>
033: * value is not valid.
034: */
035: private String m_value;
036:
037: /**
038: * This is the signal number that led to the suspension.
039: */
040: private short m_signo;
041:
042: /**
043: * Default c'tor: Construct a hollow shell and allow further
044: * information to be added later.
045: */
046: public JobStatusSuspend() {
047: m_signo = 0;
048: m_value = null;
049: }
050:
051: /**
052: * Constructs an error number without reason text.
053: * @param signo is the signal number for the suspension.
054: */
055: public JobStatusSuspend(short signo) {
056: m_signo = signo;
057: m_value = null;
058: }
059:
060: /**
061: * Constructs a piece of data.
062: * @param signo is the signal number for the suspension.
063: * @param value is the textual error reason.
064: */
065: public JobStatusSuspend(short signo, String value) {
066: m_signo = signo;
067: m_value = value;
068: }
069:
070: /**
071: * Appends a piece of text to the existing text.
072: * @param fragment is a piece of text to append to existing text.
073: * Appending <code>null</code> is a noop.
074: */
075: public void appendValue(String fragment) {
076: if (fragment != null) {
077: if (this .m_value == null)
078: this .m_value = new String(fragment);
079: else
080: this .m_value += fragment;
081: }
082: }
083:
084: /**
085: * Accessor
086: *
087: * @see #setSignalNumber(short)
088: */
089: public short getSignalNumber() {
090: return this .m_signo;
091: }
092:
093: /**
094: * Accessor.
095: *
096: * @param signo
097: * @see #getSignalNumber()
098: */
099: public void setSignalNumber(short signo) {
100: this .m_signo = signo;
101: }
102:
103: /**
104: * Accessor
105: *
106: * @see #setValue(String)
107: */
108: public String getValue() {
109: return this .m_value;
110: }
111:
112: /**
113: * Accessor.
114: *
115: * @param value is the new value to set.
116: * @see #getValue()
117: */
118: public void setValue(String value) {
119: this .m_value = value;
120: }
121:
122: /**
123: * Converts the active state into something meant for human consumption.
124: * The method will be called when recursively traversing the instance
125: * tree.
126: *
127: * @param stream is a stream opened and ready for writing. This can also
128: * be a string stream for efficient output.
129: */
130: public void toString(Writer stream) throws IOException {
131: throw new IOException(
132: "method not implemented, please contact vds-support@griphyn.org");
133: }
134:
135: /**
136: * Dumps the state of the current element as XML output. This function
137: * can return the necessary data more efficiently, thus overwriting
138: * the inherited method.
139: *
140: * @param indent is a <code>String</code> of spaces used for pretty
141: * printing. The initial amount of spaces should be an empty string.
142: * The parameter is used internally for the recursive traversal.
143: *
144: * @return a String which contains the state of the current class and
145: * its siblings using XML. Note that these strings might become large.
146: */
147: public String toXML(String indent) {
148: StringBuffer result = new StringBuffer(36); // good for no content
149:
150: result.append("<suspended signal=\"");
151: result.append(Short.toString(m_signo));
152:
153: if (m_value == null) {
154: // no content
155: result.append("\"/>");
156: } else {
157: // yes, content
158: result.append("\">");
159: result.append(quote(m_value, false));
160: result.append("</suspended>");
161: }
162:
163: return result.toString();
164: }
165:
166: /**
167: * Dump the state of the current element as XML output. This function
168: * traverses all sibling classes as necessary, and converts the data
169: * into pretty-printed XML output. The stream interface should be able
170: * to handle large output efficiently.
171: *
172: * @param stream is a stream opened and ready for writing. This can also
173: * be a string stream for efficient output.
174: * @param indent is a <code>String</code> of spaces used for pretty
175: * printing. The initial amount of spaces should be an empty string.
176: * The parameter is used internally for the recursive traversal.
177: * If a <code>null</code> value is specified, no indentation nor
178: * linefeeds will be generated.
179: * @param namespace is the XML schema namespace prefix. If neither
180: * empty nor null, each element will be prefixed with this prefix,
181: * and the root element will map the XML namespace.
182: * @exception IOException if something fishy happens to the stream.
183: */
184: public void toXML(Writer stream, String indent, String namespace)
185: throws IOException {
186: String tag = (namespace != null && namespace.length() > 0) ? namespace
187: + ":suspended"
188: : "suspended";
189:
190: // open tag
191: stream.write('<');
192: stream.write(tag);
193: writeAttribute(stream, " signal=\"", Short.toString(m_signo));
194:
195: if (m_value == null) {
196: // no content
197: stream.write("/>");
198: } else {
199: // yes, content
200: stream.write('>');
201: stream.write(quote(m_value, false));
202:
203: // close tag
204: stream.write("</");
205: stream.write(tag);
206: stream.write('>');
207: }
208: }
209: }
|