diff options
Diffstat (limited to 'orkbasej/java/net/sf/oreka/serializers/DomSerializer.java')
-rw-r--r-- | orkbasej/java/net/sf/oreka/serializers/DomSerializer.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/orkbasej/java/net/sf/oreka/serializers/DomSerializer.java b/orkbasej/java/net/sf/oreka/serializers/DomSerializer.java new file mode 100644 index 0000000..ac64a13 --- /dev/null +++ b/orkbasej/java/net/sf/oreka/serializers/DomSerializer.java @@ -0,0 +1,186 @@ +/* + * Oreka -- A media capture and retrieval platform + * + * Copyright (C) 2005, orecx LLC + * + * http://www.orecx.com + * + * This program is free software, distributed under the terms of + * the GNU General Public License. + * Please refer to http://www.gnu.org/copyleft/gpl.html + * + */ + + + +package net.sf.oreka.serializers; + + +import java.io.ByteArrayOutputStream; + +import javax.xml.transform.Result; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import net.sf.oreka.OrkException; +import net.sf.oreka.OrkObject; +import net.sf.oreka.OrkObjectFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.Text; + +public class DomSerializer extends OrkSerializer { + + Node node = null; + Document document = null; + + public OrkObject deSerialize(Node node) throws OrkException + { + if (node == null) + { + throw (new OrkException("DomSerializer: null node was passed in")); + } + this.node = node; + deserialize = true; // Set DeSerialize mode + OrkObject obj = OrkObjectFactory.instance().newOrkObject(node.getNodeName()); + obj.define(this); + obj.validate(); + return obj; + } + + public void serialize(Document document, Node node, OrkObject object) throws OrkException { + + if (node == null) { + throw ( new OrkException("DomSerializer: passed DOM node is null")); + } + if (document == null) { + throw ( new OrkException("DomSerializer: passed DOM document is null")); + } + this.document = document; + this.node = node; + + deserialize = false; // Set Serialize mode + object.define(this); + } + + @Override + public void addClassName(String value) { + // TODO Auto-generated method stub + + } + + @Override + void addString(String key, String value) { + + Element newElem = document.createElement(key); + node.appendChild(newElem); + + Text newText = document.createTextNode(value); + newElem.appendChild(newText); + } + + @Override + String getString(String key, String oldValue, boolean required) throws OrkException { + + String value = null; + + // Find the right node + Node stringNode = findElementByName(node, key); + + if(stringNode != null) + { + // Now, the string associated to element should be the first child (text element) + Node textNode = stringNode.getFirstChild(); + if (textNode != null && textNode.getNodeType() == Node.TEXT_NODE) { + value = textNode.getNodeValue().trim(); + } + } + if (value == null) { + if (required) { + throw(new OrkException("DomSerializer::GetString: required parameter missing:" + key)); + } + value = oldValue; + } + return value; + } + + @Override + public OrkObject objectValue(String key, OrkObject value, boolean required) throws OrkException { + + if (deserialize) { + return getObject(key, value, required); + } + else { + addObject(key, value); + return value; + } + } + + void addObject(String key, OrkObject value) throws OrkException { + + Element newElem = document.createElement(key); + node.appendChild(newElem); + DomSerializer ser = new DomSerializer(); + ser.serialize(document, newElem, value); + } + + OrkObject getObject(String key, OrkObject oldValue, boolean required) throws OrkException { + + OrkObject value = null; + + // Find the node corresponding to the object wanting to be populated + Node objectNode = findElementByName(node, key); + + // Create a new serializer and affect it to this object + if (objectNode != null) + { + DomSerializer serializer = new DomSerializer(); + value = serializer.deSerialize(objectNode); + } + if (value == null) { + if (required) { + throw(new OrkException("DomSerializer.getObject: required node missing:" + key)); + } + value = oldValue; + } + return value; + } + + public Node findElementByName(Node node, String name) + { + Node child = node.getFirstChild(); + while(child != null) + { + if (child.getNodeName().equalsIgnoreCase(name) && child.getNodeType() == Node.ELEMENT_NODE) + { + return child; + } + child = child.getNextSibling(); + } + return null; + } + + public static String NodeToString(Node node) { + + String result = null; + TransformerFactory xformerFactory = TransformerFactory.newInstance(); + try { + Transformer xformer = xformerFactory.newTransformer(); + xformer.setOutputProperty("indent", "yes"); + ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); + Result output = new StreamResult(byteArray); + DOMSource source = new DOMSource(node); + xformer.transform(source,output); + result = byteArray.toString(); + } + catch (Exception e) { + ; + } + return result; + } + +} |