summaryrefslogtreecommitdiff
path: root/orkbasej/java/net/sf/oreka/serializers/DomSerializer.java
blob: 53d7605f4b5597449acee638f35ca3a22eccbb15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * 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.TransformerException;
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 byte[] nodeToByteArray(Node node) throws TransformerException {
	
		TransformerFactory xformerFactory = TransformerFactory.newInstance();
		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);
		return byteArray.toByteArray();
	}
	
}