]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
f849971edd07e5e42854d3ab6033358a8337b5f2
[tmp/jakarta-migration.git] /
1 package org.collectionspace.services.common.xmljson;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.io.PrintWriter;
7 import java.util.Iterator;
8 import java.util.Stack;
9
10 import javax.xml.namespace.QName;
11 import javax.xml.stream.XMLEventReader;
12 import javax.xml.stream.XMLInputFactory;
13 import javax.xml.stream.XMLStreamConstants;
14 import javax.xml.stream.XMLStreamException;
15 import javax.xml.stream.events.Attribute;
16 import javax.xml.stream.events.Namespace;
17 import javax.xml.stream.events.StartElement;
18 import javax.xml.stream.events.XMLEvent;
19
20 import org.apache.commons.lang3.StringUtils;
21 import org.collectionspace.services.common.xmljson.parsetree.Node;
22
23 import com.fasterxml.jackson.core.JsonGenerationException;
24 import com.fasterxml.jackson.databind.JsonMappingException;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26
27 public class XmlToJsonStreamConverter {
28     protected XMLEventReader eventReader;
29     protected PrintWriter writer;
30     protected Stack<Node> stack = new Stack<Node>();
31     protected Node parseResult = null;
32     
33     public static String nodeNameForQName(QName name) {
34         String prefix = name.getPrefix();
35         String localPart = name.getLocalPart();
36         
37         if (StringUtils.isNotEmpty(prefix)) {
38             return prefix + ":" + localPart;
39         }
40         
41         return localPart;
42     }
43     
44     public XmlToJsonStreamConverter(InputStream in, OutputStream out) throws XMLStreamException {
45         XMLInputFactory factory = XMLInputFactory.newInstance();
46         
47         eventReader = factory.createXMLEventReader(in);
48         writer = new PrintWriter(out);
49     }
50     
51     public void convert() throws XMLStreamException, JsonGenerationException, JsonMappingException, IOException {
52         while(eventReader.hasNext()){
53             XMLEvent event = eventReader.nextEvent();
54             
55             switch(event.getEventType()) {
56                 case XMLStreamConstants.CHARACTERS:
57                     onCharacters(event);
58                     break;
59                 case XMLStreamConstants.START_ELEMENT:
60                     onStartElement(event);
61                     break;
62                 case XMLStreamConstants.END_ELEMENT:
63                     onEndElement(event);
64                     break;
65                 case XMLStreamConstants.START_DOCUMENT:
66                     onStartDocument(event);
67                     break;
68                 case XMLStreamConstants.END_DOCUMENT:
69                     onEndDocument(event);
70                     break;
71             }
72         }
73         
74         ObjectMapper objectMapper = new ObjectMapper();
75         objectMapper.writeValue(writer, parseResult);
76         
77         writer.flush();
78     }
79     
80     protected void onStartDocument(XMLEvent event) {
81         stack.push(new Node());
82     }
83
84     protected void onEndDocument(XMLEvent event) {
85         parseResult = stack.pop();
86     }
87     
88     @SuppressWarnings("unchecked")
89     protected void onStartElement(XMLEvent event) {
90         StartElement element = event.asStartElement();
91         QName name = element.getName();
92
93         Node node = new Node(nodeNameForQName(name));
94
95         Iterator<Attribute> attrIter = element.getAttributes();
96         
97         while(attrIter.hasNext()) {
98             Attribute attr = attrIter.next();
99             
100             node.addAttribute(attr.getName().toString(), attr.getValue());
101         }
102         
103         Iterator<Namespace> nsIter = element.getNamespaces();
104         
105         while(nsIter.hasNext()) {
106             Namespace ns = nsIter.next();
107             
108             node.addNamespace(ns.getPrefix(), ns.getNamespaceURI());
109         }
110         
111         stack.push(node);
112     }
113     
114     protected void onCharacters(XMLEvent event) {
115         String text = event.asCharacters().getData();
116         Node parent = stack.peek();
117         
118         parent.addText(text);
119     }
120     
121     protected void onEndElement(XMLEvent event) {
122         Node node = stack.pop();
123         Node parent = stack.peek();
124         
125         parent.addChild(node);
126     }
127 }