Commit | Line | Data |
---|---|---|
be222f56 | 1 | /******************************************************************************* |
ed902a2b | 2 | * Copyright (c) 2010, 2014 Ericsson |
be222f56 PT |
3 | * |
4 | * All rights reserved. This program and the accompanying materials are | |
5 | * made available under the terms of the Eclipse Public License v1.0 which | |
6 | * accompanies this distribution, and is available at | |
7 | * http://www.eclipse.org/legal/epl-v10.html | |
8 | * | |
9 | * Contributors: | |
10 | * Yuriy Vashchuk (yvashchuk@gmail.com) - Initial API and implementation | |
11 | *******************************************************************************/ | |
12 | ||
2bdf0193 | 13 | package org.eclipse.tracecompass.tmf.core.filter.xml; |
be222f56 PT |
14 | |
15 | import java.io.File; | |
16 | ||
17 | import javax.xml.parsers.DocumentBuilder; | |
18 | import javax.xml.parsers.DocumentBuilderFactory; | |
19 | import javax.xml.parsers.ParserConfigurationException; | |
20 | import javax.xml.transform.Transformer; | |
21 | import javax.xml.transform.TransformerConfigurationException; | |
22 | import javax.xml.transform.TransformerException; | |
23 | import javax.xml.transform.TransformerFactory; | |
24 | import javax.xml.transform.dom.DOMSource; | |
25 | import javax.xml.transform.stream.StreamResult; | |
26 | ||
2bdf0193 AM |
27 | import org.eclipse.tracecompass.tmf.core.filter.model.ITmfFilterTreeNode; |
28 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAndNode; | |
29 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode; | |
30 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterContainsNode; | |
31 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEqualsNode; | |
32 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEventTypeNode; | |
d9b1b4ed | 33 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterMatchesFieldNode; |
2bdf0193 AM |
34 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterMatchesNode; |
35 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterNode; | |
36 | import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterOrNode; | |
be222f56 PT |
37 | import org.w3c.dom.Document; |
38 | import org.w3c.dom.Element; | |
39 | ||
40 | /** | |
41 | * The SAX based XML writer | |
42 | * | |
43 | * @version 1.0 | |
44 | * @author Yuriy Vashchuk | |
45 | * @author Patrick Tasse | |
46 | */ | |
47 | public class TmfFilterXMLWriter { | |
48 | ||
d5efe032 | 49 | private Document document = null; |
be222f56 | 50 | |
d5efe032 AF |
51 | /** |
52 | * The XMLParser constructor | |
53 | * | |
be222f56 | 54 | * @param root The tree root |
d5efe032 | 55 | * @throws ParserConfigurationException if a DocumentBuilder |
be222f56 | 56 | * cannot be created which satisfies the configuration requested. |
d5efe032 AF |
57 | */ |
58 | public TmfFilterXMLWriter(final ITmfFilterTreeNode root) throws ParserConfigurationException { | |
59 | DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); | |
60 | DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); | |
61 | document = documentBuilder.newDocument(); | |
62 | ||
63 | Element rootElement = document.createElement(root.getNodeName()); | |
64 | document.appendChild(rootElement); | |
65 | ||
66 | for (ITmfFilterTreeNode node : root.getChildren()) { | |
67 | buildXMLTree(document, node, rootElement); | |
68 | } | |
69 | } | |
70 | ||
71 | /** | |
72 | * The Tree to XML parser | |
73 | * | |
74 | * @param document The XML document | |
75 | * @param treenode The node to write | |
76 | * @param parentElement The XML element of the parent | |
77 | */ | |
78 | public static void buildXMLTree(final Document document, final ITmfFilterTreeNode treenode, Element parentElement) { | |
79 | Element element = document.createElement(treenode.getNodeName()); | |
80 | ||
81 | if (treenode instanceof TmfFilterNode) { | |
82 | ||
83 | TmfFilterNode node = (TmfFilterNode) treenode; | |
84 | element.setAttribute(TmfFilterNode.NAME_ATTR, node.getFilterName()); | |
85 | ||
86 | } else if (treenode instanceof TmfFilterEventTypeNode) { | |
87 | ||
88 | TmfFilterEventTypeNode node = (TmfFilterEventTypeNode) treenode; | |
89 | element.setAttribute(TmfFilterEventTypeNode.TYPE_ATTR, node.getEventType()); | |
90 | element.setAttribute(TmfFilterEventTypeNode.NAME_ATTR, node.getName()); | |
91 | ||
92 | } else if (treenode instanceof TmfFilterAndNode) { | |
93 | ||
94 | TmfFilterAndNode node = (TmfFilterAndNode) treenode; | |
95 | element.setAttribute(TmfFilterAndNode.NOT_ATTR, Boolean.toString(node.isNot())); | |
96 | ||
97 | } else if (treenode instanceof TmfFilterOrNode) { | |
98 | ||
99 | TmfFilterOrNode node = (TmfFilterOrNode) treenode; | |
100 | element.setAttribute(TmfFilterOrNode.NOT_ATTR, Boolean.toString(node.isNot())); | |
101 | ||
102 | } else if (treenode instanceof TmfFilterContainsNode) { | |
103 | ||
104 | TmfFilterContainsNode node = (TmfFilterContainsNode) treenode; | |
105 | element.setAttribute(TmfFilterContainsNode.NOT_ATTR, Boolean.toString(node.isNot())); | |
106 | element.setAttribute(TmfFilterContainsNode.FIELD_ATTR, node.getField()); | |
107 | element.setAttribute(TmfFilterContainsNode.VALUE_ATTR, node.getValue()); | |
108 | element.setAttribute(TmfFilterContainsNode.IGNORECASE_ATTR, Boolean.toString(node.isIgnoreCase())); | |
109 | ||
110 | } else if (treenode instanceof TmfFilterEqualsNode) { | |
111 | ||
112 | TmfFilterEqualsNode node = (TmfFilterEqualsNode) treenode; | |
113 | element.setAttribute(TmfFilterEqualsNode.NOT_ATTR, Boolean.toString(node.isNot())); | |
114 | element.setAttribute(TmfFilterEqualsNode.FIELD_ATTR, node.getField()); | |
115 | element.setAttribute(TmfFilterEqualsNode.VALUE_ATTR, node.getValue()); | |
116 | element.setAttribute(TmfFilterEqualsNode.IGNORECASE_ATTR, Boolean.toString(node.isIgnoreCase())); | |
117 | ||
d9b1b4ed | 118 | } else if (treenode instanceof TmfFilterMatchesFieldNode) { |
d5efe032 | 119 | |
d9b1b4ed | 120 | TmfFilterMatchesFieldNode node = (TmfFilterMatchesFieldNode) treenode; |
d5efe032 | 121 | element.setAttribute(TmfFilterMatchesNode.NOT_ATTR, Boolean.toString(node.isNot())); |
d9b1b4ed | 122 | element.setAttribute(TmfFilterMatchesFieldNode.FIELD_ATTR, node.getField()); |
d5efe032 AF |
123 | element.setAttribute(TmfFilterMatchesNode.REGEX_ATTR, node.getRegex()); |
124 | ||
125 | } else if (treenode instanceof TmfFilterCompareNode) { | |
126 | ||
127 | TmfFilterCompareNode node = (TmfFilterCompareNode) treenode; | |
128 | element.setAttribute(TmfFilterCompareNode.NOT_ATTR, Boolean.toString(node.isNot())); | |
129 | element.setAttribute(TmfFilterCompareNode.FIELD_ATTR, node.getField()); | |
130 | element.setAttribute(TmfFilterCompareNode.RESULT_ATTR, Integer.toString(node.getResult())); | |
131 | element.setAttribute(TmfFilterCompareNode.TYPE_ATTR, node.getType().toString()); | |
132 | element.setAttribute(TmfFilterCompareNode.VALUE_ATTR, node.getValue()); | |
133 | ||
134 | } | |
135 | ||
136 | parentElement.appendChild(element); | |
137 | ||
138 | for (int i = 0; i < treenode.getChildrenCount(); i++) { | |
139 | buildXMLTree(document, treenode.getChild(i), element); | |
140 | } | |
141 | } | |
142 | ||
143 | /** | |
144 | * Save the tree | |
145 | * | |
146 | * @param uri The new Filter XML path | |
147 | */ | |
148 | public void saveTree(final String uri) { | |
149 | TransformerFactory transformerFactory = TransformerFactory.newInstance(); | |
150 | ||
151 | try { | |
152 | Transformer transformer = transformerFactory.newTransformer(); | |
153 | DOMSource source = new DOMSource(document); | |
154 | StreamResult result = new StreamResult(new File(uri)); | |
155 | transformer.transform(source, result); | |
156 | } catch (TransformerConfigurationException e) { | |
157 | e.printStackTrace(); | |
158 | } catch (TransformerException e) { | |
159 | e.printStackTrace(); | |
160 | } | |
161 | } | |
be222f56 PT |
162 | |
163 | } |