fixed formatting and indentation.

This commit is contained in:
hns 2002-07-04 17:05:52 +00:00
parent 96cd8c406c
commit 47a3202ba8

View file

@ -26,235 +26,233 @@ import helma.objectmodel.db.Property;
public class XmlReader implements XmlConstants { public class XmlReader implements XmlConstants {
private HashMap convertedNodes; private HashMap convertedNodes;
private NodeManager nmgr = null; private NodeManager nmgr = null;
public XmlReader () { public XmlReader () {
}
public XmlReader (NodeManager nmgr) {
this.nmgr = nmgr;
}
/**
* main entry to read an xml-file.
*/
public INode read (File file, INode helmaNode) throws RuntimeException {
try {
return read (new FileInputStream(file), helmaNode);
} catch (FileNotFoundException notfound) {
System.err.println ("couldn't find xml-file: " + file.getAbsolutePath ());
return helmaNode;
} }
}
public XmlReader (NodeManager nmgr) {
this.nmgr = nmgr; /**
* read an InputStream with xml-content.
*/
public INode read (InputStream in, INode helmaNode) throws RuntimeException {
return read (new InputSource (in), helmaNode);
}
/**
* read an character reader with xml-content.
*/
public INode read (Reader in, INode helmaNode) throws RuntimeException {
return read (new InputSource (in), helmaNode);
}
/**
* read an InputSource with xml-content.
*/
public INode read (InputSource in, INode helmaNode) throws RuntimeException {
if (helmaNode==null && nmgr==null)
throw new RuntimeException ("can't create a new Node without a NodeManager");
Document document = XmlUtil.parse (in);
Element element = XmlUtil.getFirstElement(document);
if (element==null)
throw new RuntimeException ("corrupted xml-file");
if (helmaNode==null) {
return convert (element);
} else {
convertedNodes = new HashMap ();
INode convertedNode = convert (element, helmaNode);
convertedNodes = null;
return convertedNode;
}
}
/**
* convert children of an Element to a given helmaNode
*/
public INode convert (Element element, INode helmaNode) {
String idref = element.getAttribute("idref");
String key = idref + "-" + element.getAttribute("prototyperef");
if( idref!=null && !idref.equals("") ) {
if( convertedNodes.containsKey(key) ) {
return (INode)convertedNodes.get(key);
}
}
key = element.getAttribute("id") + "-" + element.getAttribute("prototype");
convertedNodes.put( key, helmaNode );
String prototype = element.getAttribute("prototype");
if( !prototype.equals("") && !prototype.equals("hopobject") ) {
helmaNode.setPrototype( prototype );
}
children(helmaNode, element);
return helmaNode;
}
// used by convert(Element,INode)
private INode children( INode helmaNode, Element element ) {
NodeList list = element.getChildNodes();
int len = list.getLength();
Element childElement;
for ( int i=0; i<len; i++ ) {
try {
childElement = (Element)list.item(i);
} catch( ClassCastException e ) {
// ignore CDATA, comments etc
continue;
}
INode workNode = null;
if ( childElement.getTagName().equals("hop:child") ) {
convert (childElement, helmaNode.createNode(null));
} else if ( !"".equals(childElement.getAttribute("id")) ||
!"".equals(childElement.getAttribute("idref")) ) {
String childTagName = childElement.getTagName();
INode newNode = convert (childElement, helmaNode.createNode (childTagName));
helmaNode.setNode (childTagName, newNode);
} else {
String type = childElement.getAttribute("type");
String key = childElement.getTagName();
String content = XmlUtil.getTextContent(childElement);
if ( type.equals("boolean") ) {
if ( content.equals("true") ) {
helmaNode.setBoolean(key,true);
} else {
helmaNode.setBoolean(key,false);
}
} else if ( type.equals("date") ) {
SimpleDateFormat format = new SimpleDateFormat ( DATEFORMAT );
try {
Date date = format.parse(content);
helmaNode.setDate(key, date);
} catch ( ParseException e ) {
helmaNode.setString(key,content);
}
} else if ( type.equals("float") ) {
helmaNode.setFloat(key, (new Double(content)).doubleValue() );
} else if ( type.equals("integer") ) {
helmaNode.setInteger(key, (new Long(content)).longValue() );
} else {
helmaNode.setString(key,content);
}
}
}
return helmaNode;
}
/**
* This is a basic de-serialization method for XML-2-Node conversion.
* It reads a Node from a database-like file and should return a Node
* that matches exactly the one dumped to that file before.
* It only supports persistent-capable Nodes (from objectmodel.db-package).
*/
public helma.objectmodel.db.Node convert (Element element) {
// FIXME: this method should use Element.getAttributeNS():
// FIXME: do we need the name value or is it retrieved through mappings anyway?
String name = element.getAttribute("name");
// String name = null;
String id = element.getAttribute("id");
String prototype = element.getAttribute("prototype");
if ( "".equals(prototype) )
prototype = "hopobject";
helma.objectmodel.db.Node helmaNode = null;
try {
long created = Long.parseLong (element.getAttribute ("created"));
long lastmodified = Long.parseLong (element.getAttribute ("lastModified"));
helmaNode = new helma.objectmodel.db.Node (name,id,prototype,nmgr.safe,created,lastmodified);
} catch ( NumberFormatException e ) {
helmaNode = new helma.objectmodel.db.Node (name,id,prototype,nmgr.safe);
} }
/** // now loop through all child elements and retrieve properties/subnodes for this node.
* main entry to read an xml-file. NodeList list = element.getChildNodes();
*/ int len = list.getLength();
public INode read (File file, INode helmaNode) throws RuntimeException { Hashtable propMap = new Hashtable();
try { List subnodes = new ExternalizableVector();
return read (new FileInputStream(file), helmaNode);
} catch (FileNotFoundException notfound) { for ( int i=0; i<len; i++ ) {
System.err.println ("couldn't find xml-file: " + file.getAbsolutePath ()); Element childElement;
return helmaNode; try {
} childElement = (Element)list.item(i);
} } catch( ClassCastException e ) {
// ignore CDATA, comments etc
/** continue;
* read an InputStream with xml-content. }
*/
public INode read (InputStream in, INode helmaNode) throws RuntimeException { if ( childElement.getTagName().equals("hop:child") ) {
return read (new InputSource (in), helmaNode); // add a new NodeHandle, presume all IDs in this objectcache are unique,
} // a prerequisite for a simple internal database.
subnodes.add (new NodeHandle (new DbKey(null,childElement.getAttribute("idref") ) ) );
/** continue;
* read an character reader with xml-content. }
*/
public INode read (Reader in, INode helmaNode) throws RuntimeException { if ( childElement.getTagName().equals("hop:parent") ) {
return read (new InputSource (in), helmaNode); // add a NodeHandle to parent object
} helmaNode.setParentHandle (new NodeHandle (new DbKey(null,childElement.getAttribute("idref") ) ) );
continue;
/** }
* read an InputSource with xml-content.
*/ // if we come until here, childelement is a property value
public INode read (InputSource in, INode helmaNode) throws RuntimeException { Property prop = new Property (childElement.getTagName(), helmaNode);
if (helmaNode==null && nmgr==null) if ( !"".equals(childElement.getAttribute("id")) ||
throw new RuntimeException ("can't create a new Node without a NodeManager"); !"".equals(childElement.getAttribute("idref")) ) {
Document document = XmlUtil.parse (in); // we've got an object!
Element element = XmlUtil.getFirstElement(document); String idref = childElement.getAttribute("idref");
if (element==null) prop.setNodeHandle (new NodeHandle(new DbKey(null,idref)));
throw new RuntimeException ("corrupted xml-file"); } else {
String type = childElement.getAttribute("type");
if (helmaNode==null) { String content = XmlUtil.getTextContent(childElement);
return convert (element); if ( type.equals("boolean") ) {
} else { if ( content.equals("true") ) {
convertedNodes = new HashMap (); prop.setBooleanValue(true);
INode convertedNode = convert (element, helmaNode); } else {
convertedNodes = null; prop.setBooleanValue(false);
return convertedNode; }
} } else if ( type.equals("date") ) {
} SimpleDateFormat format = new SimpleDateFormat ( DATEFORMAT );
try {
/** Date date = format.parse(content);
* convert children of an Element to a given helmaNode prop.setDateValue (date);
*/ } catch ( ParseException e ) {
public INode convert (Element element, INode helmaNode) { prop.setStringValue (content);
String idref = element.getAttribute("idref"); }
String key = idref + "-" + element.getAttribute("prototyperef"); } else if ( type.equals("float") ) {
if( idref!=null && !idref.equals("") ) { prop.setFloatValue ((new Double(content)).doubleValue());
if( convertedNodes.containsKey(key) ) { } else if ( type.equals("integer") ) {
return (INode)convertedNodes.get(key); prop.setIntegerValue ((new Long(content)).longValue());
} } else {
} prop.setStringValue (content);
key = element.getAttribute("id") + "-" + element.getAttribute("prototype"); }
convertedNodes.put( key, helmaNode ); }
String prototype = element.getAttribute("prototype"); propMap.put (childElement.getTagName().toLowerCase(), prop);
if( !prototype.equals("") && !prototype.equals("hopobject") ) {
helmaNode.setPrototype( prototype );
}
children(helmaNode, element);
return helmaNode;
}
// used by convert(Element,INode)
private INode children( INode helmaNode, Element element ) {
NodeList list = element.getChildNodes();
int len = list.getLength();
Element childElement;
for ( int i=0; i<len; i++ ) {
try {
childElement = (Element)list.item(i);
} catch( ClassCastException e ) {
continue; // ignore CDATA, comments etc
}
INode workNode = null;
if ( childElement.getTagName().equals("hop:child") ) {
convert (childElement, helmaNode.createNode(null));
} else if ( !"".equals(childElement.getAttribute("id")) || !"".equals(childElement.getAttribute("idref")) ) {
String childTagName = childElement.getTagName();
INode newNode = convert (childElement, helmaNode.createNode (childTagName));
helmaNode.setNode (childTagName, newNode);
} else {
String type = childElement.getAttribute("type");
String key = childElement.getTagName();
String content = XmlUtil.getTextContent(childElement);
if ( type.equals("boolean") ) {
if ( content.equals("true") ) {
helmaNode.setBoolean(key,true);
} else {
helmaNode.setBoolean(key,false);
}
} else if ( type.equals("date") ) {
SimpleDateFormat format = new SimpleDateFormat ( DATEFORMAT );
try {
Date date = format.parse(content);
helmaNode.setDate(key, date);
} catch ( ParseException e ) {
helmaNode.setString(key,content);
}
} else if ( type.equals("float") ) {
helmaNode.setFloat(key, (new Double(content)).doubleValue() );
} else if ( type.equals("integer") ) {
helmaNode.setInteger(key, (new Long(content)).longValue() );
} else {
helmaNode.setString(key,content);
}
}
}
return helmaNode;
}
/**
* This is a basic de-serialization method for XML-2-Node conversion.
* It reads a Node from a database-like file and should return a Node
* that matches exactly the one dumped to that file before.
* It only supports persistent-capable Nodes (from objectmodel.db-package).
*/
public helma.objectmodel.db.Node convert (Element element) {
// FIXME: this method should use Element.getAttributeNS():
// FIXME: do we need the name value or is it retrieved through mappings anyway?
String name = element.getAttribute("name");
// String name = null;
String id = element.getAttribute("id");
String prototype = element.getAttribute("prototype");
if ( "".equals(prototype) )
prototype = "hopobject";
helma.objectmodel.db.Node helmaNode = null;
try {
long created = Long.parseLong (element.getAttribute ("created"));
long lastmodified = Long.parseLong (element.getAttribute ("lastModified"));
helmaNode = new helma.objectmodel.db.Node (name,id,prototype,nmgr.safe,created,lastmodified);
} catch ( NumberFormatException e ) {
helmaNode = new helma.objectmodel.db.Node (name,id,prototype,nmgr.safe);
}
// now loop through all child elements and retrieve properties/subnodes for this node.
NodeList list = element.getChildNodes();
int len = list.getLength();
Hashtable propMap = new Hashtable();
List subnodes = new ExternalizableVector();
for ( int i=0; i<len; i++ ) {
Element childElement;
try {
childElement = (Element)list.item(i);
} catch( ClassCastException e ) {
continue; // ignore CDATA, comments etc
}
if ( childElement.getTagName().equals("hop:child") ) {
// add a new NodeHandle, presume all IDs in this objectcache are unique,
// a prerequisite for a simple internal database.
subnodes.add (new NodeHandle (new DbKey(null,childElement.getAttribute("idref") ) ) );
continue;
}
if ( childElement.getTagName().equals("hop:parent") ) {
// add a NodeHandle to parent object
helmaNode.setParentHandle (new NodeHandle (new DbKey(null,childElement.getAttribute("idref") ) ) );
continue;
}
// if we come until here, childelement is a property value
Property prop = new Property (childElement.getTagName(), helmaNode);
if ( !"".equals(childElement.getAttribute("id")) || !"".equals(childElement.getAttribute("idref")) ) {
// we've got an object!
String idref = childElement.getAttribute("idref");
prop.setNodeHandle (new NodeHandle(new DbKey(null,idref)));
} else {
String type = childElement.getAttribute("type");
String content = XmlUtil.getTextContent(childElement);
if ( type.equals("boolean") ) {
if ( content.equals("true") ) {
prop.setBooleanValue(true);
} else {
prop.setBooleanValue(false);
}
} else if ( type.equals("date") ) {
SimpleDateFormat format = new SimpleDateFormat ( DATEFORMAT );
try {
Date date = format.parse(content);
prop.setDateValue (date);
} catch ( ParseException e ) {
prop.setStringValue (content);
}
} else if ( type.equals("float") ) {
prop.setFloatValue ((new Double(content)).doubleValue());
} else if ( type.equals("integer") ) {
prop.setIntegerValue ((new Long(content)).longValue());
} else {
prop.setStringValue (content);
}
}
propMap.put (childElement.getTagName().toLowerCase(), prop);
}
if ( propMap.size()>0 )
helmaNode.setPropMap (propMap);
else
helmaNode.setPropMap (null);
if ( subnodes.size()>0 )
helmaNode.setSubnodes (subnodes);
else
helmaNode.setSubnodes (null);
return helmaNode;
} }
if ( propMap.size()>0 )
helmaNode.setPropMap (propMap);
else
helmaNode.setPropMap (null);
if ( subnodes.size()>0 )
helmaNode.setSubnodes (subnodes);
else
helmaNode.setSubnodes (null);
return helmaNode;
}
} }