WALA/com.ibm.wala.cast/source/java/com/ibm/wala/cast/util/CAstToDOM.java

75 lines
2.4 KiB
Java

/******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* 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:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package com.ibm.wala.cast.util;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import com.ibm.wala.cast.tree.CAstNode;
public class CAstToDOM extends CAstPrinter {
private static final String VALUE_TAG = "value";
private static final String TYPE_TAG = "type";
public static Document toDOM(CAstNode astRoot) {
try {
DocumentBuilderFactory documentBuilderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder =
documentBuilderFactory.newDocumentBuilder();
DOMImplementation domImplementation =
documentBuilder.getDOMImplementation();
Document document =
domImplementation.createDocument("CAst", "CAst", null);
Element rootNode =
document.getDocumentElement();
nodeToDOM(document, rootNode, astRoot);
return document;
} catch (ParserConfigurationException e) {
e.printStackTrace();
throw new RuntimeException("DOM builder error.");
}
}
private static void nodeToDOM(Document doc, Element root, CAstNode astNode) {
Element nodeElt = doc.createElement(kindAsString(astNode.getKind()));
if (astNode.getValue() == null) {
for(int i = 0; i < astNode.getChildCount(); i++) {
nodeToDOM(doc, nodeElt, astNode.getChild(i));
}
} else {
Element typeTag = doc.createElement(TYPE_TAG);
Text type = doc.createTextNode(astNode.getValue().getClass().toString());
typeTag.appendChild( type );
nodeElt.appendChild(typeTag);
Element valueTag = doc.createElement(VALUE_TAG);
Text value = doc.createTextNode( astNode.getValue().toString() );
valueTag.appendChild( value );
nodeElt.appendChild(valueTag);
}
root.appendChild(nodeElt);
}
}