package context.arch.comm.language;
import java.lang.StringBuffer;
import context.arch.comm.DataObject;
import context.arch.comm.DataObjects;
public class XMLEncoder implements EncoderInterface {
/**
* Language used to encode
*/
public static final String LANGUAGE = "XML";
/**
* Tag to mark end of line
*/
private static final String END_OF_LINE = "\r\n";
/**
* XML version number is 1.0
*/
private static final String XML_VERSION = "1.0";
/**
* Header to use for XML message
*/
private static final String XML_HEADER = "<?xml version=\"" + XML_VERSION + "\"?>" + END_OF_LINE;
private StringBuffer xmlText = new StringBuffer();
/**
* Constructor for XMLEncoder
*/
public XMLEncoder() {
xmlText.append(XML_HEADER);
}
/**
* Method used to encode data
*
* @param data Data to be encoded
* @see #addElement(context.arch.comm.DataObject)
* @see #getXML()
* @exception context.arch.comm.language.EncodeException if the data can't be encoded
*/
public String encodeData(DataObject data) throws EncodeException {
addElement(data);
return getXML();
}
/**
* Method to start XML element - creates opening tag
*
* @param tag XML element being started
*/
public String beginTag (String tag) {
return ("<" + tag + ">"/* + END_OF_LINE*/);
}
/**
* Method to start XML element - creates opening tag and sets attributes
*
* @param tag XML element being started
* @param attributes attributes for XML element
*/
public String beginTag (String tag, String attributes) {
if (attributes.length() > 0) {
return ("<" + tag + " " + attributes + ">"/* + END_OF_LINE*/);
}
else {
return beginTag (tag);
}
}
/**
* Method to add single XML tag
*
* @param tag single XML element
*/
public String singleTag (String tag) {
return ("<" + tag + "/>" + END_OF_LINE);
}
/**
* Method to end XML element - creates closing tag
*
* @param tag XML element being closed
*/
public String endTag (String tag) {
return ("</" + tag + ">" + END_OF_LINE);
}
/**
* Method to add XML element
*
* @param elt DataObject element being added
* @exception context.arch.comm.language.EncodeException if the element can't be added
*/
public void addElement(DataObject elt) throws EncodeException {
xmlText.append(addXMLElement(elt));
}
/**
* Private method to add XML element
*
* @param elt DataObject element being added
* @return String that contains encoding for element
* @exception context.arch.comm.language.EncodeException if the element can't be added
*/
private String addXMLElement(DataObject elt) throws EncodeException {
String name = elt.getName ();
// Map<String, String> atts = elt.getAttributes();
// Vector val = elt.getValue();
String val = elt.getValue();
DataObjects children = elt.getChildren();
String xmlElement = new String ();
String xmlAttributes = new String ();
// throw exception if no name
if (name == null) {
//System.out.println("elt = " + elt);
// may be null if one part of the DataObject is empty, i.e.: new DataObject()
// so should return null instead, if returning nothing
throw new EncodeException("tag is null");
} // null tag
// no value or children
if (val == null && children.isEmpty()) {
xmlElement = singleTag(name);
}
else {
xmlElement = beginTag(name, xmlAttributes); // start tag
// handle value; assume only 1
if (val != null) {
xmlElement += val;
}
// handle children
for (DataObject child : children) {
xmlElement += addXMLElement(child);
}
xmlElement += endTag (name); // end tag
}
return xmlElement;
}
/**
* Returns XML encoding as a string
*
* @return XML encoding
*/
public String getXML() {
return xmlText.toString();
}
/**
* Returns language used to encode XML
*
* @return language used to encode XML
* @see #LANGUAGE
*/
public String getLanguage() {
return LANGUAGE;
}
/**
* Returns name of class used to encode XML
*
* @return name of class used to encode XML
*/
public String getClassName() {
return this.getClass().getName();
}
}