summaryrefslogtreecommitdiffstats
path: root/sandbox/jboynes/sdoproxy/src/main/java/org/apache/tuscany/sdo/helper/DOMHelperImpl.java
blob: 748015120259173d21b6058665c9e9c88e32e688 (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
/**
 *
 * Copyright 2005 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.apache.tuscany.sdo.helper;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.xml.namespace.QName;

import org.osoa.sdo.DataObject;
import org.osoa.sdo.Property;
import org.osoa.sdo.Type;
import org.osoa.sdo.helper.DataFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * @version $Rev$ $Date$
 */
public class DOMHelperImpl {
    private final DataFactory dataFactory;

    public DOMHelperImpl(DataFactory dataFactory) {
        this.dataFactory = dataFactory;
    }

    public DataObject<?> load(Document doc) {
        Element rootElement = doc.getDocumentElement();
        QName name = new QName(rootElement.getNamespaceURI(), rootElement.getLocalName());
        DataObject<?> rootObject = dataFactory.create(name);
        for (Node node = rootElement.getFirstChild() ; node != null; node = node.getNextSibling()) {
            if (node.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }
            String propName = node.getLocalName();
            String value = node.getTextContent();
            Property<?> prop = rootObject.getType().getProperty(propName);
            rootObject.setString(prop.getIndex(), value);
        }
        return rootObject;
    }

    public void save(DataObject<?> dataObject, Document doc) {
        Type<?> t = dataObject.getType();
        Element element = doc.createElementNS(t.getName().getNamespaceURI(), t.getName().getLocalPart());
        int i = 0;
        for (Property<?> property : dataObject.getType().getProperties()) {
            String value = dataObject.getString(i++);
            if (value != null) {
                Element propElement = doc.createElementNS(null, property.getName());
                if (property.getType().isDataType()) {
                    propElement.appendChild(doc.createTextNode(value));
                }
                element.appendChild(propElement);
            }
        }
        doc.appendChild(element);
    }

    public void writeTo(OutputStream os, Document doc) throws IOException {
        PrintWriter writer = new PrintWriter(os);
        writeTo(writer, doc.getDocumentElement());
        writer.flush();
    }

    private static void writeTo(PrintWriter writer, Element e) throws IOException {
        writer.append('<');
        writer.append(e.getLocalName());
        if (e.hasChildNodes()) {
            writer.append('>');
            for (Node node = e.getFirstChild(); node != null; node = node.getNextSibling()) {
                switch (node.getNodeType()) {
                case Node.TEXT_NODE:
                    writer.append(node.getTextContent());
                    break;
                case Node.ELEMENT_NODE:
                    writeTo(writer, (Element) node);
                    break;
                }
            }
            writer.append('<');
            writer.append('/');
            writer.append(e.getLocalName());
            writer.append('>');
        } else {
            writer.append("/>");
        }
    }
}