/* Soot - a J*va Optimization Framework * Copyright (C) 2003 Jennifer Lhotak * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package ca.mcgill.sable.soot.attributes; import java.util.*; //import javax.xml.parsers.*; import org.w3c.dom.*; public class AttributeDomProcessor { Document domDoc; ArrayList attributes; private ArrayList keys; private SootAttribute current; /** * Method AttributeDomProcessor. * @param domDoc */ public AttributeDomProcessor(Document domDoc) { setDomDoc(domDoc); } /** * Method processAttributesDom. */ public void processAttributesDom() { processNode(getDomDoc()); } private void processNode(Node node) { if (node.getNodeType() == Node.DOCUMENT_NODE) { NodeList children = node.getChildNodes(); if (children != null) { setAttributes(new ArrayList()); for (int i = 0; i < children.getLength(); i++) { processNode(children.item(i)); } } } else if (node.getNodeType() == Node.ELEMENT_NODE) { if ( node.getNodeName().equals("attribute")) { current = new SootAttribute(); NodeList children = node.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { processAttributeNode(current, children.item(i)); } getAttributes().add(current); } else if (node.getNodeName().equals("key")){ if (keys == null){ keys = new ArrayList(); } NamedNodeMap map = node.getAttributes(); AnalysisKey key = new AnalysisKey(); key.setRed((new Integer(map.getNamedItem("red").getNodeValue())).intValue()); key.setGreen((new Integer(map.getNamedItem("green").getNodeValue())).intValue()); key.setBlue((new Integer(map.getNamedItem("blue").getNodeValue())).intValue()); key.setKey(map.getNamedItem("key").getNodeValue()); key.setType(map.getNamedItem("aType").getNodeValue()); keys.add(key); } else { NodeList children = node.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { processNode(children.item(i)); } } } } private void processAttributeNode(SootAttribute current, Node node) { if (node.getNodeType() == Node.ELEMENT_NODE) { if (node.getNodeName().equals("link")){ NamedNodeMap map = node.getAttributes(); LinkAttribute la = new LinkAttribute(); la.setLabel(map.getNamedItem("label").getNodeValue()); la.setJavaLink((new Integer(map.getNamedItem("srcLink").getNodeValue()).intValue())); la.setJimpleLink((new Integer(map.getNamedItem("jmpLink").getNodeValue()).intValue())); la.setClassName(map.getNamedItem("clssNm").getNodeValue()); la.setType(map.getNamedItem("aType").getNodeValue()); current.addLinkAttr(la); } else if (node.getNodeName().equals("color")){ NamedNodeMap map = node.getAttributes(); int r = (new Integer(map.getNamedItem("r").getNodeValue())).intValue(); int g = (new Integer(map.getNamedItem("g").getNodeValue())).intValue(); int b = (new Integer(map.getNamedItem("b").getNodeValue())).intValue(); int fgInt = (new Integer(map.getNamedItem("fg").getNodeValue())).intValue(); boolean fg = false; if (fgInt == 1){ fg = true; } ColorAttribute ca = new ColorAttribute(r, g, b, fg); ca.type(map.getNamedItem("aType").getNodeValue()); current.addColorAttr(ca);//.setColor(ca); } else if (node.getNodeName().equals("srcPos")){ NamedNodeMap map = node.getAttributes(); int sline = (new Integer(map.getNamedItem("sline").getNodeValue())).intValue(); int eline = (new Integer(map.getNamedItem("eline").getNodeValue())).intValue(); int spos = (new Integer(map.getNamedItem("spos").getNodeValue())).intValue(); int epos = (new Integer(map.getNamedItem("epos").getNodeValue())).intValue(); current.setJavaStartLn(sline); current.setJavaEndLn(eline); current.setJavaStartPos(spos); current.setJavaEndPos(epos); } else if (node.getNodeName().equals("jmpPos")){ NamedNodeMap map = node.getAttributes(); int sline = (new Integer(map.getNamedItem("sline").getNodeValue())).intValue(); int eline = (new Integer(map.getNamedItem("eline").getNodeValue())).intValue(); int spos = (new Integer(map.getNamedItem("spos").getNodeValue())).intValue(); int epos = (new Integer(map.getNamedItem("epos").getNodeValue())).intValue(); current.setJimpleStartLn(sline); current.setJimpleEndLn(eline); current.setJimpleStartPos(spos); current.setJimpleEndPos(epos); } else if (node.getNodeName().equals("text")){ NamedNodeMap map = node.getAttributes(); TextAttribute ta = new TextAttribute(); ta.setInfo(map.getNamedItem("info").getNodeValue()); ta.setType(map.getNamedItem("aType").getNodeValue()); current.addTextAttr(ta); } else { NodeList children = node.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { processAttributeNode(current, children.item(i)); } } } else if (node.getNodeType() == Node.TEXT_NODE){ String type = node.getParentNode().getNodeName(); } } /** * Returns the domDoc. * @return Document */ public Document getDomDoc() { return domDoc; } /** * Sets the domDoc. * @param domDoc The domDoc to set */ public void setDomDoc(Document domDoc) { this.domDoc = domDoc; } /** * Returns the attributes. * @return Vector */ public ArrayList getAttributes() { return attributes; } /** * Returns the current. * @return SootAttribute */ public SootAttribute getCurrent() { return current; } /** * Sets the attributes. * @param attributes The attributes to set */ public void setAttributes(ArrayList attributes) { this.attributes = attributes; } /** * Sets the current. * @param current The current to set */ public void setCurrent(SootAttribute current) { this.current = current; } /** * @return */ public ArrayList getKeys() { return keys; } /** * @param list */ public void setKeys(ArrayList list) { keys = list; } }