/*
* The Relaxer artifact
* Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.relaxer.vocabulary.forrest_0_5.howto_v12;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import org.w3c.dom.*;
/**
* <b>RString</b> is a text container class which is used for mixed.
*
* @version howto_v12.rng 1.0 (Wed Mar 03 11:15:34 JST 2004)
* @author Relaxer 1.1b (http://www.relaxer.org)
*/
public class RString implements java.io.Serializable, Cloneable, IFhTitleMixed, IFhLinkContentMixMixed, IFhContentMixMixed, IFhSubtitleMixed, IFhFlowMixed {
private Object value_;
private boolean cdata_;
/**
* Creates a <code>RString</code>.
*
*/
public RString() {
}
/**
* Creates a <code>RString</code> by the String <code>text</code>.
*
* @param text
*/
public RString(String text) {
value_ = text;
}
/**
* Creates a <code>RString</code> by the DOM node <code>node</code>.
*
* @param node
*/
public RString(org.w3c.dom.Node node) {
value_ = node;
}
/**
* Creates a <code>RString</code> by the Object <code>object</code>.
*
* @param object
*/
public RString(Object object) {
value_ = object;
}
/**
* Creates a <code>RString</code> by the Rstring <code>source</code>.
*
* @param source
*/
public RString(RString source) {
this(source.getContent());
}
/**
* Creates a <code>RString</code> by the Stack <code>stack</code>.
* This constructor is supposed to be used internallyby the Relaxer system.
*
* @param stack
*/
public RString(RStack stack) {
setup(stack);
}
/**
* Initializes the <code>RString</code> by the Stack <code>stack</code>
* that contains Elements.
* This constructor is supposed to be used internallyby the Relaxer system.
*
* @param stack
*/
public void setup(RStack stack) {
value_ = stack.pop().toString();
}
/**
* Creates a DOM representation of the object.
* Result is appended to the Node <code>parent</code>.
*
* @param node
*/
public void makeElement(Node node) {
Document doc = node.getOwnerDocument();
if (value_ instanceof org.w3c.dom.Node) {
node.appendChild(doc.importNode((Node)value_, true));
} else if (value_ != null) {
if (cdata_) {
node.appendChild(doc.createCDATASection(value_.toString()));
} else {
node.appendChild(doc.createTextNode(value_.toString()));
}
}
}
/**
* Gets the text.
*
* @return String
*/
public String getText() {
if (value_ instanceof String) {
return ((String)value_);
} else {
return (null);
}
}
/**
* Sets the text.
*
* @param text
*/
public void setText(String text) {
value_ = text;
}
/**
* Gets the DOM node.
*
* @return org.w3c.dom.Node
*/
public org.w3c.dom.Node getNode() {
if (value_ instanceof org.w3c.dom.Node) {
return ((org.w3c.dom.Node)value_);
} else {
return (null);
}
}
/**
* Sets the DOM node.
*
* @param node
*/
public void setNode(org.w3c.dom.Node node) {
value_ = node;
}
/**
* Gets the object.
*
* @return Object
*/
public Object getObject() {
if (value_ instanceof String || value_ instanceof org.w3c.dom.Node) {
return (null);
} else {
return (value_);
}
}
/**
* Sets the DOM node.
*
* @param object
*/
public void setObject(Object object) {
value_ = object;
}
/**
* Gets the content.
*
* @return Object
*/
public Object getContent() {
return (value_);
}
/**
* Sets the content.
*
* @param value
*/
public void setContent(Object value) {
value_ = value;
}
/**
* Checks whether cdata or not.
*
* @return boolean
*/
public boolean isCdata() {
return (cdata_);
}
/**
* Sets wheter cdata or not.
*
* @param cdata
*/
public void setCdata(boolean cdata) {
cdata_ = cdata;
}
/**
* Gets the text content as String.
*
* @return String
*/
public String getContentAsString() {
if (value_ == null) {;
return (null);
} else if (value_ instanceof org.w3c.dom.Node) {
return (URelaxer.node2String4Data((Node)value_));
} else {
return (value_.toString());
}
}
/**
* Gets the String.
*
* @return String
*/
public String toString() {
return (getContentAsString());
}
/**
* Clones the String.
*
* @return Object
*/
public Object clone() {
return (new RString(this));
}
/**
* Makes an XML text representation.
*
* @param buffer
*/
public void makeTextElement(StringBuffer buffer) {
if (value_ instanceof org.w3c.dom.Node) {
buffer.append(URelaxer.node2String4Data((Node)value_));
} else {
if (cdata_) {
buffer.append("<![CDATA[");
buffer.append(value_.toString());
buffer.append("]]>");
} else {
buffer.append(URelaxer.escapeCharData(value_.toString()));
}
}
}
/**
* Makes an XML text representation.
*
* @param buffer
* @exception IOException
*/
public void makeTextElement(Writer buffer) throws IOException {
if (value_ instanceof org.w3c.dom.Node) {
buffer.write(URelaxer.node2String4Data((Node)value_));
} else {
if (cdata_) {
buffer.write("<![CDATA[");
buffer.write(value_.toString());
buffer.write("]]>");
} else {
buffer.write(URelaxer.escapeCharData(value_.toString()));
}
}
}
/**
* Makes an XML text representation.
*
* @param buffer
*/
public void makeTextElement(PrintWriter buffer) {
if (value_ instanceof org.w3c.dom.Node) {
buffer.print(URelaxer.node2String4Data((Node)value_));
} else {
if (cdata_) {
buffer.print("<![CDATA[");
buffer.print(value_.toString());
buffer.print("]]>");
} else {
buffer.print(URelaxer.escapeCharData(value_.toString()));
}
}
}
/**
* Makes an XML text representation.
*
* @param buffer
*/
public void makeTextAttribute(StringBuffer buffer) {
}
/**
* Makes an XML text representation.
*
* @param buffer
* @exception IOException
*/
public void makeTextAttribute(Writer buffer) throws IOException {
}
/**
* Makes an XML text representation.
*
* @param buffer
*/
public void makeTextAttribute(PrintWriter buffer) {
}
/**
* Tests if elements contained in a Stack <code>stack</code>
* is valid for the <code>RString</code>.
* This mehtod is supposed to be used internally
* by the Relaxer system.
*
* @param stack
* @return boolean
*/
public static boolean isMatch(RStack stack) {
return (stack.peek() instanceof String);
}
}