/*
* 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.dax;
import org.griphyn.vdl.dax.*;
import java.util.*;
import java.io.Writer;
import java.io.IOException;
/**
* This class extends the base class <code>Leaf</code> by adding an
* attribute to store the content of a the textual data of mixed
* content. The <code>PseudoText</code> is not an element!
*
* @author Jens-S. Vöckler
* @author Yong Zhao
* @version $Revision$
*
* @see Leaf
*/
public class PseudoText extends Leaf implements Cloneable
{
/**
* Stores the content of the textual element.
*/
private String m_content;
/**
* Creates and returns a copy of this object.
* @return a new instance.
*/
public Object clone()
{
// java.lang.String implements inherently copy-on-write.
return new PseudoText(this.m_content);
}
/**
* Default ctor.
*/
public PseudoText()
{
super();
}
/**
* Ctor to initialize the content while constructing the class.
* This is a convenience ctor.
*/
public PseudoText( String content )
{
super();
this.m_content = content;
}
/**
* Gets the content state of this object. The text may contain
* other elements which are not quoted or changed in any way,
* because the text element is designed to be a leaf node.
*
* @return The current state of content. The text may be null.
* @see #setContent(String)
*/
public String getContent()
{
return this.m_content;
}
/**
* Overwrites the internal state with new content. The supplied content
* will become effectively the active state of the object. Usually, this
* method will be called during SAX assembly of the instance structure.
*
* @param content is the new state to register.
* @see #getContent()
**/
public void setContent( String content )
{
this.m_content = content;
}
/**
* Converts the active state into something meant for human consumption.
* The method will be called when recursively traversing the instance
* tree. This method overwrites the default method, since it appears
* to be faster to do directly.
*
* @return The current content enclosed in quotes.
*/
public String toString()
{
StringBuffer result = new StringBuffer( this.m_content.length() + 2 );
result.append('"');
if ( this.m_content != null ) result.append(escape(this.m_content));
result.append('"');
return result.toString();
}
/**
* 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( '"' );
if ( this.m_content != null )
stream.write( escape(this.m_content) );
stream.write( '"' );
}
// static private final String empty_element = "</text>";
/**
* Converts the active state into something meant for computer consumption.
* The method will be called when recursively traversing the instance
* tree. This method overwrites the inherited methods since it appears
* to be faster to do it this way.<p>
*
* FIXME: Contents will not be properly XML quoted.
*
* @param indent is an arbitrary string to prefix a line with for
* pretty printing. Usually, an initial amount of zero spaces are
* used. Unused in this case.
* @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.
* @return a string which contains the current string. Since the string
* is part of mixed content, no element tags are supplied, nor any
* additional whitespaces.
*/
public String toXML( String indent, String namespace )
{
// if ( m_content != null && m_content.length() > 0 ) {
// StringBuffer result = new StringBuffer( m_content.length() + 16 );
// result.append( "<text>"). append( quote(this.m_content,false) ).append("</text>");
// return result.toString();
// } else {
// return empty_element;
// }
if ( this.m_content != null ) {
return new String( quote(this.m_content,false) );
} else {
return new String();
}
}
/**
* 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.<p>
*
* FIXME: Contents will not be properly XML quoted.
*
* @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
{
// if ( m_content != null && m_content.length() > 0 ) {
// stream.write( "<text>");
// stream.write( quote(this.m_content,false) );
// stream.write("</text>");
// } else {
// stream.write(empty_element);
// }
if ( this.m_content != null ) {
stream.write( quote(this.m_content,false) );
}
}
}