diff --git a/src/helma/objectmodel/dom/XmlReader.java b/src/helma/objectmodel/dom/XmlReader.java index 74915f2d..5bb08802 100644 --- a/src/helma/objectmodel/dom/XmlReader.java +++ b/src/helma/objectmodel/dom/XmlReader.java @@ -17,6 +17,7 @@ package helma.objectmodel.dom; import helma.objectmodel.INode; +import helma.objectmodel.db.WrappedNodeManager; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -45,11 +46,13 @@ public final class XmlReader extends DefaultHandler implements XmlConstants { private String elementName = null; private StringBuffer charBuffer = null; boolean parsingHopObject; + WrappedNodeManager nmgr; /** * Creates a new XmlReader object. */ - public XmlReader() { + public XmlReader(WrappedNodeManager nmgr) { + this.nmgr = nmgr; } /** @@ -190,6 +193,12 @@ public final class XmlReader extends DefaultHandler implements XmlConstants { String key = idref + "-" + prototyperef; INode n = (INode) convertedNodes.get(key); + // if not a reference to a node we already read, try to + // resolve against the NodeManager. + if (n == null) { + n = nmgr.getNode(idref, nmgr.getDbMapping(prototyperef)); + } + if (n != null) { if ("hop:child".equals(qName)) { // add an already parsed node as child to current node diff --git a/src/helma/objectmodel/dom/XmlWriter.java b/src/helma/objectmodel/dom/XmlWriter.java index 82156e5b..11a7249b 100644 --- a/src/helma/objectmodel/dom/XmlWriter.java +++ b/src/helma/objectmodel/dom/XmlWriter.java @@ -20,6 +20,7 @@ package helma.objectmodel.dom; import helma.objectmodel.INode; import helma.objectmodel.IProperty; import helma.objectmodel.TransientNode; +import helma.objectmodel.INodeState; import helma.objectmodel.db.DbMapping; import helma.objectmodel.db.Node; import helma.util.HtmlEncoder; @@ -43,7 +44,10 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants { private SimpleDateFormat format = new SimpleDateFormat(DATEFORMAT); private boolean dbmode = true; - // Only add encoding to XML declaration if it was explicitly set, not when we're using + // the helma.objectmodel.INodeState of the node we're writing + public int rootState; + + // Only add encoding to XML declaration if it was explicitly set, not when we're using // the platform's standard encoding. private String explicitEncoding; @@ -182,6 +186,7 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants { * the cache of already converted nodes. */ public boolean write(INode node) throws IOException { + rootState = node.getState(); convertedNodes = new Vector(); if (explicitEncoding == null) { @@ -228,6 +233,13 @@ public class XmlWriter extends OutputStreamWriter implements XmlConstants { if (convertedNodes.contains(node)) { writeReferenceTag(node, elementName, propName); + } else if (rootState == INodeState.TRANSIENT && + node.getState() > INodeState.TRANSIENT) { + // if we are writing a transient node, and that node + // holds a reference to a persistent one, just write a + // reference tag to that persistent node. + writeReferenceTag(node, elementName, propName); + } else { convertedNodes.addElement(node); writeTagOpen(node, elementName, propName); diff --git a/src/helma/scripting/rhino/extensions/XmlObject.java b/src/helma/scripting/rhino/extensions/XmlObject.java index 80e2c78e..04434ab5 100644 --- a/src/helma/scripting/rhino/extensions/XmlObject.java +++ b/src/helma/scripting/rhino/extensions/XmlObject.java @@ -141,7 +141,7 @@ public class XmlObject { } try { - XmlReader reader = new XmlReader(); + XmlReader reader = new XmlReader(core.app.getWrappedNodeManager()); INode result = reader.read(new File(file), node); return core.getNodeWrapper(result); @@ -188,7 +188,7 @@ public class XmlObject { } try { - XmlReader reader = new XmlReader(); + XmlReader reader = new XmlReader(core.app.getWrappedNodeManager()); INode result = reader.read(new StringReader(str), node); return core.getNodeWrapper(result);