/*******************************************************************************
* Copyright (c) 2010, 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Yuriy Vashchuk (yvashchuk@gmail.com) - Initial API and implementation
* Patrick Tasse - Update filter nodes
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.filter.xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfEventFieldAspect;
import org.eclipse.tracecompass.tmf.core.filter.model.ITmfFilterTreeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAndNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAspectNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterContainsNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEqualsNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterMatchesNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterOrNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterTraceTypeNode;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* The SAX based XML writer
*
* @version 1.0
* @author Yuriy Vashchuk
* @author Patrick Tasse
*/
public class TmfFilterXMLWriter {
private Document document = null;
/**
* The XMLParser constructor
*
* @param root The tree root
* @throws ParserConfigurationException if a DocumentBuilder
* cannot be created which satisfies the configuration requested.
*/
public TmfFilterXMLWriter(final ITmfFilterTreeNode root) throws ParserConfigurationException {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.newDocument();
Element rootElement = document.createElement(root.getNodeName());
document.appendChild(rootElement);
for (ITmfFilterTreeNode node : root.getChildren()) {
buildXMLTree(document, node, rootElement);
}
}
/**
* The Tree to XML parser
*
* @param document The XML document
* @param treenode The node to write
* @param parentElement The XML element of the parent
*/
public static void buildXMLTree(final Document document, final ITmfFilterTreeNode treenode, Element parentElement) {
Element element = document.createElement(treenode.getNodeName());
if (treenode instanceof TmfFilterNode) {
TmfFilterNode node = (TmfFilterNode) treenode;
element.setAttribute(TmfFilterNode.NAME_ATTR, node.getFilterName());
} else if (treenode instanceof TmfFilterTraceTypeNode) {
TmfFilterTraceTypeNode node = (TmfFilterTraceTypeNode) treenode;
element.setAttribute(TmfFilterTraceTypeNode.TYPE_ATTR, node.getTraceTypeId());
element.setAttribute(TmfFilterTraceTypeNode.NAME_ATTR, node.getName());
} else if (treenode instanceof TmfFilterAndNode) {
TmfFilterAndNode node = (TmfFilterAndNode) treenode;
element.setAttribute(TmfFilterAndNode.NOT_ATTR, Boolean.toString(node.isNot()));
} else if (treenode instanceof TmfFilterOrNode) {
TmfFilterOrNode node = (TmfFilterOrNode) treenode;
element.setAttribute(TmfFilterOrNode.NOT_ATTR, Boolean.toString(node.isNot()));
} else if (treenode instanceof TmfFilterContainsNode) {
TmfFilterContainsNode node = (TmfFilterContainsNode) treenode;
element.setAttribute(TmfFilterContainsNode.NOT_ATTR, Boolean.toString(node.isNot()));
setAspectAttributes(element, node);
element.setAttribute(TmfFilterContainsNode.VALUE_ATTR, node.getValue());
element.setAttribute(TmfFilterContainsNode.IGNORECASE_ATTR, Boolean.toString(node.isIgnoreCase()));
} else if (treenode instanceof TmfFilterEqualsNode) {
TmfFilterEqualsNode node = (TmfFilterEqualsNode) treenode;
element.setAttribute(TmfFilterEqualsNode.NOT_ATTR, Boolean.toString(node.isNot()));
setAspectAttributes(element, node);
element.setAttribute(TmfFilterEqualsNode.VALUE_ATTR, node.getValue());
element.setAttribute(TmfFilterEqualsNode.IGNORECASE_ATTR, Boolean.toString(node.isIgnoreCase()));
} else if (treenode instanceof TmfFilterMatchesNode) {
TmfFilterMatchesNode node = (TmfFilterMatchesNode) treenode;
element.setAttribute(TmfFilterMatchesNode.NOT_ATTR, Boolean.toString(node.isNot()));
setAspectAttributes(element, node);
element.setAttribute(TmfFilterMatchesNode.REGEX_ATTR, node.getRegex());
} else if (treenode instanceof TmfFilterCompareNode) {
TmfFilterCompareNode node = (TmfFilterCompareNode) treenode;
element.setAttribute(TmfFilterCompareNode.NOT_ATTR, Boolean.toString(node.isNot()));
setAspectAttributes(element, node);
element.setAttribute(TmfFilterCompareNode.RESULT_ATTR, Integer.toString(node.getResult()));
element.setAttribute(TmfFilterCompareNode.TYPE_ATTR, node.getType().toString());
element.setAttribute(TmfFilterCompareNode.VALUE_ATTR, node.getValue());
}
parentElement.appendChild(element);
for (int i = 0; i < treenode.getChildrenCount(); i++) {
buildXMLTree(document, treenode.getChild(i), element);
}
}
private static void setAspectAttributes(Element element, TmfFilterAspectNode node) {
if (node.getEventAspect() != null) {
element.setAttribute(TmfFilterAspectNode.EVENT_ASPECT_ATTR, node.getEventAspect().getName());
element.setAttribute(TmfFilterAspectNode.TRACE_TYPE_ID_ATTR, node.getTraceTypeId());
if (node.getEventAspect() instanceof TmfEventFieldAspect) {
TmfEventFieldAspect aspect = (TmfEventFieldAspect) node.getEventAspect();
if (aspect.getFieldPath() != null) {
element.setAttribute(TmfFilterAspectNode.FIELD_ATTR, aspect.getFieldPath());
}
}
}
}
/**
* Save the tree
*
* @param uri The new Filter XML path
*/
public void saveTree(final String uri) {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(uri));
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}