1 19 20 package soot.xml; 21 22 import soot.*; 23 import soot.jimple.toolkits.annotation.tags.*; 24 import soot.jimple.toolkits.pointer.*; 25 import soot.util.*; 26 import soot.tagkit.*; 27 import java.util.*; 28 import java.io.*; 29 30 public class JavaAttribute { 31 32 private int startLn; 33 private ArrayList tags; 34 private ArrayList vbAttrs; 35 public PrintWriter writerOut; 36 37 public JavaAttribute(){ 38 } 39 40 public int startLn(){ 41 return startLn; 42 } 43 44 45 public void startLn(int x){ 46 startLn = x; 47 } 48 49 50 public ArrayList tags(){ 51 return tags; 52 } 53 54 public ArrayList vbAttrs(){ 55 return vbAttrs; 56 } 57 58 public void addTag(Tag t){ 59 if (tags == null){ 60 tags = new ArrayList(); 61 } 62 tags.add(t); 63 } 64 65 public void addVbAttr(PosColorAttribute vbAttr){ 66 if (vbAttrs == null) { 67 vbAttrs = new ArrayList(); 68 } 69 vbAttrs.add(vbAttr); 70 } 71 72 public boolean hasColorTag(){ 73 if (tags != null){ 74 Iterator it = tags.iterator(); 75 while (it.hasNext()){ 76 Tag t = (Tag)it.next(); 77 if (t instanceof ColorTag) return true; 78 } 79 } 80 if (vbAttrs != null){ 81 Iterator vbIt = vbAttrs.iterator(); 82 while (vbIt.hasNext()){ 83 PosColorAttribute t = (PosColorAttribute)vbIt.next(); 84 if (t.hasColor()) return true; 85 } 86 } 87 return false; 88 } 89 90 private void printAttributeTag(Tag t) { 91 if (t instanceof LineNumberTag) { 92 int lnNum = (new Integer (((LineNumberTag)t).toString())).intValue(); 93 printJavaLnAttr(lnNum, lnNum); 94 } 95 else if (t instanceof JimpleLineNumberTag) { 96 JimpleLineNumberTag jlnTag = (JimpleLineNumberTag)t; 97 printJimpleLnAttr(jlnTag.getStartLineNumber(), jlnTag.getEndLineNumber()); 98 } 99 103 else if (t instanceof LinkTag) { 104 LinkTag lt = (LinkTag)t; 105 Host h = lt.getLink(); 106 printLinkAttr(formatForXML(lt.toString()), getJimpleLnOfHost(h), getJavaLnOfHost(h), lt.getClassName()); 107 108 } 109 else if (t instanceof StringTag) { 110 printTextAttr(formatForXML(((StringTag)t).toString())); 111 } 112 else if (t instanceof SourcePositionTag){ 113 SourcePositionTag pt = (SourcePositionTag)t; 114 printSourcePositionAttr(pt.getStartOffset(), pt.getEndOffset()); 115 } 116 else if (t instanceof PositionTag){ 117 PositionTag pt = (PositionTag)t; 118 printJimplePositionAttr(pt.getStartOffset(), pt.getEndOffset()); 119 } 120 else if (t instanceof ColorTag){ 121 ColorTag ct = (ColorTag)t; 122 printColorAttr(ct.getRed(), ct.getGreen(), ct.getBlue(), ct.isForeground()); 123 } 124 else { 125 printTextAttr(t.toString()); 126 } 127 } 128 129 private void printJavaLnAttr(int start_ln, int end_ln){ 130 writerOut.println("<javaStartLn>"+start_ln+"</javaStartLn>"); 131 writerOut.println("<javaEndLn>"+end_ln+"</javaEndLn>"); 132 } 133 134 135 private void printJimpleLnAttr(int start_ln, int end_ln){ 136 writerOut.println("<jimpleStartLn>"+start_ln+"</jimpleStartLn>"); 137 writerOut.println("<jimpleEndLn>"+end_ln+"</jimpleEndLn>"); 138 } 139 140 private void printTextAttr(String text){ 141 writerOut.println("<text>"+text+"</text>"); 142 } 143 144 private void printLinkAttr(String label, int jimpleLink, int javaLink, String className){ 145 writerOut.println("<link_attribute>"); 146 writerOut.println("<link_label>"+label+"</link_label>"); 147 writerOut.println("<jimple_link>"+jimpleLink+"</jimple_link>"); 148 writerOut.println("<java_link>"+javaLink+"</java_link>"); 149 writerOut.println("<className>"+className+"</className>"); 150 writerOut.println("</link_attribute>"); 151 } 152 153 private void startPrintValBoxAttr(){ 154 writerOut.println("<value_box_attribute>"); 155 } 156 157 private void printSourcePositionAttr(int start, int end){ 158 writerOut.println("<javaStartPos>"+start+"</javaStartPos>"); 159 writerOut.println("<javaEndPos>"+end+"</javaEndPos>"); 160 } 161 162 private void printJimplePositionAttr(int start, int end){ 163 writerOut.println("<jimpleStartPos>"+start+"</jimpleStartPos>"); 164 writerOut.println("<jimpleEndPos>"+end+"</jimpleEndPos>"); 165 } 166 167 private void printColorAttr(int r, int g, int b, boolean fg){ 168 writerOut.println("<red>"+r+"</red>"); 169 writerOut.println("<green>"+g+"</green>"); 170 writerOut.println("<blue>"+b+"</blue>"); 171 if (fg) { 172 writerOut.println("<fg>1</fg>"); 173 } 174 else { 175 writerOut.println("<fg>0</fg>"); 176 } 177 } 178 179 private void endPrintValBoxAttr(){ 180 writerOut.println("</value_box_attribute>"); 181 } 182 183 public void printAllTags(PrintWriter writer){ 185 this.writerOut = writer; 186 if (tags != null) { 187 Iterator it = tags.iterator(); 188 while (it.hasNext()){ 189 printAttributeTag((Tag)it.next()); 190 } 191 } 192 if (vbAttrs != null) { 193 Iterator vbIt = vbAttrs.iterator(); 194 while (vbIt.hasNext()){ 195 PosColorAttribute attr = (PosColorAttribute)vbIt.next(); 196 if (attr.hasColor()){ 197 startPrintValBoxAttr(); 198 printSourcePositionAttr(attr.javaStartPos(), attr.javaEndPos()); 199 printJimplePositionAttr(attr.jimpleStartPos(), attr.jimpleEndPos()); 200 endPrintValBoxAttr(); 202 } 203 } 204 } 205 } 206 207 public void printInfoTags(PrintWriter writer){ 209 this.writerOut = writer; 210 Iterator it = tags.iterator(); 211 while (it.hasNext()){ 212 printAttributeTag((Tag)it.next()); 213 } 214 } 215 216 private String formatForXML(String in) { 217 in = StringTools.replaceAll(in, "<", "<"); 218 in = StringTools.replaceAll(in, ">", ">"); 219 in = StringTools.replaceAll(in, "&", "&"); 220 return in; 221 } 222 223 private int getJavaLnOfHost(Host h){ 224 Iterator it = h.getTags().iterator(); 225 while (it.hasNext()){ 226 Tag t = (Tag)it.next(); 227 if (t instanceof SourceLnPosTag) { 229 return ((SourceLnPosTag)t).startLn(); 231 } 232 else if (t instanceof LineNumberTag){ 233 return (new Integer (((LineNumberTag)t).toString())).intValue(); 234 } 235 } 236 return 0; 237 } 238 239 private int getJimpleLnOfHost(Host h){ 240 Iterator it = h.getTags().iterator(); 241 while (it.hasNext()){ 242 Tag t = (Tag)it.next(); 243 if (t instanceof JimpleLineNumberTag) { 244 return ((JimpleLineNumberTag)t).getStartLineNumber(); 245 } 246 } 247 return 0; 248 } 249 } 250 | Popular Tags |