Rewrote XML encoding of properties not to stumble over null values (hopefully).

Also did some minor code cleanup.
Support for stopTypes has been added but is commented out.
This commit is contained in:
hns 2002-10-14 17:05:06 +00:00
parent 00ae368a85
commit 30dd6b206e

View file

@ -12,6 +12,7 @@ import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.Vector;
// import java.util.Set;
import helma.objectmodel.*; import helma.objectmodel.*;
import helma.objectmodel.INode; import helma.objectmodel.INode;
@ -40,6 +41,9 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
// the platform's standard encoding. // the platform's standard encoding.
private String explicitEncoding; private String explicitEncoding;
// Set of prototypes at which to stop writing.
// private Set stopTypes = null;
/** /**
* create ids that can be used for temporary files. * create ids that can be used for temporary files.
*/ */
@ -93,6 +97,13 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
this.dbmode = dbmode; this.dbmode = dbmode;
} }
/**
* Set a group of prototypes at which to stop XML serialization.
*/
/* public void setStopTypes (Set set) {
this.stopTypes = set;
} */
/** /**
* set the number of space chars * set the number of space chars
*/ */
@ -115,8 +126,8 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
writeln ("<?xml version=\"1.0\"?>"); writeln ("<?xml version=\"1.0\"?>");
else else
writeln ("<?xml version=\"1.0\" encoding=\""+explicitEncoding+"\"?>"); writeln ("<?xml version=\"1.0\" encoding=\""+explicitEncoding+"\"?>");
writeln ("<!-- printed by helma object publisher -->"); // writeln ("<!-- printed by helma object publisher -->");
writeln ("<!-- created " + (new Date()).toString() + " -->" ); // writeln ("<!-- created " + (new Date()).toString() + " -->" );
write ("<xmlroot xmlns:hop=\""); write ("<xmlroot xmlns:hop=\"");
write (NAMESPACE); write (NAMESPACE);
writeln ("\">"); writeln ("\">");
@ -134,10 +145,13 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
public void write (INode node, String name, int level) throws IOException { public void write (INode node, String name, int level) throws IOException {
if (node==null) if (node==null)
return; return;
// if (stopTypes != null && stopTypes.contains (node.getPrototype()))
// return;
int previousLength = prefix.length();
prefix.append(indent); prefix.append(indent);
if ( ++level>maxLevels ) { if ( ++level>maxLevels ) {
writeReferenceTag (node, name); writeReferenceTag (node, name);
prefix = prefix.delete( prefix.length()-indent.length(), Integer.MAX_VALUE ); prefix.setLength( previousLength );
return; return;
} }
if ( convertedNodes.contains(node) ) { if ( convertedNodes.contains(node) ) {
@ -152,7 +166,7 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
writeChildren (node,level); writeChildren (node,level);
writeTagClose (node,name); writeTagClose (node,name);
} }
prefix = prefix.delete( prefix.length()-indent.length(), Integer.MAX_VALUE ); prefix.setLength( previousLength );
} }
@ -201,31 +215,40 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants {
* apply xml-encoding. * apply xml-encoding.
*/ */
public void writeProperty (IProperty property) throws IOException { public void writeProperty (IProperty property) throws IOException {
int propType = property.getType();
// we can't encode java objects in XML
if (propType == IProperty.JAVAOBJECT)
return;
String propName = property.getName();
write (prefix.toString()); write (prefix.toString());
write (indent); write (indent);
write ("<"); write ("<");
write (property.getName()); write (propName);
switch (property.getType()) { switch (propType) {
case IProperty.BOOLEAN: case IProperty.BOOLEAN:
write (" type=\"boolean\""); write (" type=\"boolean\">");
write (property.getStringValue());
break; break;
case IProperty.FLOAT: case IProperty.FLOAT:
write (" type=\"float\""); write (" type=\"float\">");
write (property.getStringValue());
break; break;
case IProperty.INTEGER: case IProperty.INTEGER:
write (" type=\"integer\""); write (" type=\"integer\">");
write (property.getStringValue());
break; break;
} case IProperty.DATE:
if ( property.getType()==IProperty.DATE ) { write (" type=\"date\">");
write (" type=\"date\"");
write (">");
write ( format.format (property.getDateValue()) ); write ( format.format (property.getDateValue()) );
} else { break;
case IProperty.STRING:
write (">"); write (">");
write ( HtmlEncoder.encodeXml (property.getStringValue()) ); String str = HtmlEncoder.encodeXml (property.getStringValue());
if (str != null)
write ( str );
} }
write ("</"); write ("</");
write (property.getName()); write (propName);
write (">"); write (">");
write (LINESEPARATOR); write (LINESEPARATOR);
} }