All Downloads are FREE. Search and download functionalities are using the official Maven repository.

soot.xml.JavaAttribute Maven / Gradle / Ivy

package soot.xml;

/*-
 * #%L
 * Soot - a J*va Optimization Framework
 * %%
 * Copyright (C) 2004 Jennifer Lhotak
 * %%
 * This program 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 program 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 General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * .
 * #L%
 */

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import soot.tagkit.ColorTag;
import soot.tagkit.Host;
import soot.tagkit.JimpleLineNumberTag;
import soot.tagkit.LineNumberTag;
import soot.tagkit.LinkTag;
import soot.tagkit.PositionTag;
import soot.tagkit.SourceLnPosTag;
import soot.tagkit.SourcePositionTag;
import soot.tagkit.StringTag;
import soot.tagkit.Tag;

public class JavaAttribute {
  private static final Logger logger = LoggerFactory.getLogger(JavaAttribute.class);

  private int startLn;
  private ArrayList tags;
  private ArrayList vbAttrs;
  public PrintWriter writerOut;

  public JavaAttribute() {
  }

  public int startLn() {
    return startLn;
  }

  public void startLn(int x) {
    startLn = x;
  }

  public ArrayList tags() {
    return tags;
  }

  public ArrayList vbAttrs() {
    return vbAttrs;
  }

  public void addTag(Tag t) {
    if (tags == null) {
      tags = new ArrayList();
    }
    tags.add(t);
  }

  public void addVbAttr(PosColorAttribute vbAttr) {
    if (vbAttrs == null) {
      vbAttrs = new ArrayList();
    }
    vbAttrs.add(vbAttr);
  }

  public boolean hasColorTag() {
    if (tags != null) {
      Iterator it = tags.iterator();
      while (it.hasNext()) {
        Tag t = it.next();
        if (t instanceof ColorTag) {
          return true;
        }
      }
    }
    if (vbAttrs != null) {
      Iterator vbIt = vbAttrs.iterator();
      while (vbIt.hasNext()) {
        PosColorAttribute t = vbIt.next();
        if (t.hasColor()) {
          return true;
        }
      }
    }
    return false;
  }

  private void printAttributeTag(Tag t) {
    if (t instanceof LineNumberTag) {
      int lnNum = (new Integer(((LineNumberTag) t).toString())).intValue();
      printJavaLnAttr(lnNum, lnNum);
    } else if (t instanceof JimpleLineNumberTag) {
      JimpleLineNumberTag jlnTag = (JimpleLineNumberTag) t;
      printJimpleLnAttr(jlnTag.getStartLineNumber(), jlnTag.getEndLineNumber());
    }
    /*
     * else if (t instanceof SourceLineNumberTag) { SourceLineNumberTag jlnTag = (SourceLineNumberTag)t;
     * printJavaLnAttr(jlnTag.getStartLineNumber(), jlnTag.getEndLineNumber()); }
     */
    else if (t instanceof LinkTag) {
      LinkTag lt = (LinkTag) t;
      Host h = lt.getLink();
      printLinkAttr(formatForXML(lt.toString()), getJimpleLnOfHost(h), getJavaLnOfHost(h), lt.getClassName());

    } else if (t instanceof StringTag) {
      printTextAttr(formatForXML(((StringTag) t).toString()));
    } else if (t instanceof SourcePositionTag) {
      SourcePositionTag pt = (SourcePositionTag) t;
      printSourcePositionAttr(pt.getStartOffset(), pt.getEndOffset());
    } else if (t instanceof PositionTag) {
      PositionTag pt = (PositionTag) t;
      printJimplePositionAttr(pt.getStartOffset(), pt.getEndOffset());
    } else if (t instanceof ColorTag) {
      ColorTag ct = (ColorTag) t;
      printColorAttr(ct.getRed(), ct.getGreen(), ct.getBlue(), ct.isForeground());
    } else {
      printTextAttr(t.toString());
    }
  }

  private void printJavaLnAttr(int start_ln, int end_ln) {
    writerOut.println("" + start_ln + "");
    writerOut.println("" + end_ln + "");
  }

  private void printJimpleLnAttr(int start_ln, int end_ln) {
    writerOut.println("" + start_ln + "");
    writerOut.println("" + end_ln + "");
  }

  private void printTextAttr(String text) {
    writerOut.println("" + text + "");
  }

  private void printLinkAttr(String label, int jimpleLink, int javaLink, String className) {
    writerOut.println("");
    writerOut.println("" + label + "");
    writerOut.println("" + jimpleLink + "");
    writerOut.println("" + javaLink + "");
    writerOut.println("" + className + "");
    writerOut.println("");
  }

  private void startPrintValBoxAttr() {
    writerOut.println("");
  }

  private void printSourcePositionAttr(int start, int end) {
    writerOut.println("" + start + "");
    writerOut.println("" + end + "");
  }

  private void printJimplePositionAttr(int start, int end) {
    writerOut.println("" + start + "");
    writerOut.println("" + end + "");
  }

  private void printColorAttr(int r, int g, int b, boolean fg) {
    writerOut.println("" + r + "");
    writerOut.println("" + g + "");
    writerOut.println("" + b + "");
    if (fg) {
      writerOut.println("1");
    } else {
      writerOut.println("0");
    }
  }

  private void endPrintValBoxAttr() {
    writerOut.println("");
  }

  // prints all tags
  public void printAllTags(PrintWriter writer) {
    this.writerOut = writer;
    if (tags != null) {
      Iterator it = tags.iterator();
      while (it.hasNext()) {
        printAttributeTag(it.next());
      }
    }
    if (vbAttrs != null) {
      Iterator vbIt = vbAttrs.iterator();
      while (vbIt.hasNext()) {
        PosColorAttribute attr = vbIt.next();
        if (attr.hasColor()) {
          startPrintValBoxAttr();
          printSourcePositionAttr(attr.javaStartPos(), attr.javaEndPos());
          printJimplePositionAttr(attr.jimpleStartPos(), attr.jimpleEndPos());
          // printColorAttr(attr.color().red(), attr.color().green(), attr.color().blue(), attr.color().fg());
          endPrintValBoxAttr();
        }
      }
    }
  }

  // prints only tags related to strings and links (no pos tags)
  public void printInfoTags(PrintWriter writer) {
    this.writerOut = writer;
    Iterator it = tags.iterator();
    while (it.hasNext()) {
      printAttributeTag(it.next());
    }
  }

  private String formatForXML(String in) {
    in = in.replaceAll("<", "<");
    in = in.replaceAll(">", ">");
    in = in.replaceAll("&", "&");
    return in;
  }

  private int getJavaLnOfHost(Host h) {
    Iterator it = h.getTags().iterator();
    while (it.hasNext()) {
      Tag t = it.next();
      // logger.debug(""+t.getClass().toString());
      if (t instanceof SourceLnPosTag) {
        // logger.debug("t is LineNumberTag");
        return ((SourceLnPosTag) t).startLn();
      } else if (t instanceof LineNumberTag) {
        return (new Integer(((LineNumberTag) t).toString())).intValue();
      }
    }
    return 0;
  }

  private int getJimpleLnOfHost(Host h) {
    Iterator it = h.getTags().iterator();
    while (it.hasNext()) {
      Tag t = it.next();
      if (t instanceof JimpleLineNumberTag) {
        return ((JimpleLineNumberTag) t).getStartLineNumber();
      }
    }
    return 0;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy