1 /* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 package proguard.classfile.attribute.visitor; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.annotation.*; 26 import proguard.classfile.attribute.preverification.*; 27 import proguard.util.*; 28 29 import java.util.List; 30 31 /** 32 * This AttributeVisitor delegates its visits another AttributeVisitor, but 33 * only when the visited attribute has a name that that matches a given regular 34 * expression. 35 * 36 * @author Eric Lafortune 37 */ 38 public class AttributeNameFilter 39 implements AttributeVisitor 40 { 41 private final StringMatcher regularExpressionMatcher; 42 private final AttributeVisitor attributeVisitor; 43 44 45 /** 46 * Creates a new AttributeNameFilter. 47 * @param regularExpression the regular expression against which attribute 48 * names will be matched. 49 * @param attributeVisitor the <code>AttributeVisitor</code> to which 50 * visits will be delegated. 51 */ 52 public AttributeNameFilter(String regularExpression, 53 AttributeVisitor attributeVisitor) 54 { 55 this(new ListParser(new NameParser()).parse(regularExpression), 56 attributeVisitor); 57 } 58 59 60 /** 61 * Creates a new AttributeNameFilter. 62 * @param regularExpression the regular expression against which attribute 63 * names will be matched. 64 * @param attributeVisitor the <code>AttributeVisitor</code> to which 65 * visits will be delegated. 66 */ 67 public AttributeNameFilter(List regularExpression, 68 AttributeVisitor attributeVisitor) 69 { 70 this(new ListParser(new NameParser()).parse(regularExpression), 71 attributeVisitor); 72 } 73 74 75 /** 76 * Creates a new AttributeNameFilter. 77 * @param regularExpressionMatcher the string matcher against which 78 * attribute names will be matched. 79 * @param attributeVisitor the <code>AttributeVisitor</code> to 80 * which visits will be delegated. 81 */ 82 public AttributeNameFilter(StringMatcher regularExpressionMatcher, 83 AttributeVisitor attributeVisitor) 84 { 85 this.regularExpressionMatcher = regularExpressionMatcher; 86 this.attributeVisitor = attributeVisitor; 87 } 88 89 90 // Implementations for AttributeVisitor. 91 92 public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) 93 { 94 if (accepted(clazz, unknownAttribute)) 95 { 96 attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); 97 } 98 } 99 100 101 public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) 102 { 103 if (accepted(clazz, bootstrapMethodsAttribute)) 104 { 105 attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); 106 } 107 } 108 109 110 public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) 111 { 112 if (accepted(clazz, sourceFileAttribute)) 113 { 114 attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); 115 } 116 } 117 118 119 public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) 120 { 121 if (accepted(clazz, sourceDirAttribute)) 122 { 123 attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); 124 } 125 } 126 127 128 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 129 { 130 if (accepted(clazz, innerClassesAttribute)) 131 { 132 attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); 133 } 134 } 135 136 137 public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 138 { 139 if (accepted(clazz, enclosingMethodAttribute)) 140 { 141 attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); 142 } 143 } 144 145 146 public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) 147 { 148 if (accepted(clazz, deprecatedAttribute)) 149 { 150 attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); 151 } 152 } 153 154 155 public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) 156 { 157 if (accepted(clazz, deprecatedAttribute)) 158 { 159 attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); 160 } 161 } 162 163 164 public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) 165 { 166 if (accepted(clazz, deprecatedAttribute)) 167 { 168 attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); 169 } 170 } 171 172 173 public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) 174 { 175 if (accepted(clazz, syntheticAttribute)) 176 { 177 attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); 178 } 179 } 180 181 182 public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) 183 { 184 if (accepted(clazz, syntheticAttribute)) 185 { 186 attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); 187 } 188 } 189 190 191 public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) 192 { 193 if (accepted(clazz, syntheticAttribute)) 194 { 195 attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); 196 } 197 } 198 199 200 public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 201 { 202 if (accepted(clazz, signatureAttribute)) 203 { 204 attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); 205 } 206 } 207 208 209 public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) 210 { 211 if (accepted(clazz, signatureAttribute)) 212 { 213 attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); 214 } 215 } 216 217 218 public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) 219 { 220 if (accepted(clazz, signatureAttribute)) 221 { 222 attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); 223 } 224 } 225 226 227 public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) 228 { 229 if (accepted(clazz, constantValueAttribute)) 230 { 231 attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); 232 } 233 } 234 235 236 public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) 237 { 238 if (accepted(clazz, exceptionsAttribute)) 239 { 240 attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); 241 } 242 } 243 244 245 public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) 246 { 247 if (accepted(clazz, exceptionsAttribute)) 248 { 249 attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); 250 } 251 } 252 253 254 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 255 { 256 if (accepted(clazz, codeAttribute)) 257 { 258 attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); 259 } 260 } 261 262 263 public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) 264 { 265 if (accepted(clazz, stackMapAttribute)) 266 { 267 attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); 268 } 269 } 270 271 272 public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) 273 { 274 if (accepted(clazz, stackMapTableAttribute)) 275 { 276 attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); 277 } 278 } 279 280 281 public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) 282 { 283 if (accepted(clazz, lineNumberTableAttribute)) 284 { 285 attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); 286 } 287 } 288 289 290 public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 291 { 292 if (accepted(clazz, localVariableTableAttribute)) 293 { 294 attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); 295 } 296 } 297 298 299 public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 300 { 301 if (accepted(clazz, localVariableTypeTableAttribute)) 302 { 303 attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); 304 } 305 } 306 307 308 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 309 { 310 if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) 311 { 312 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); 313 } 314 } 315 316 317 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 318 { 319 if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) 320 { 321 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); 322 } 323 } 324 325 326 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 327 { 328 if (accepted(clazz, runtimeVisibleAnnotationsAttribute)) 329 { 330 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); 331 } 332 } 333 334 335 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 336 { 337 if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) 338 { 339 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); 340 } 341 } 342 343 344 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 345 { 346 if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) 347 { 348 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); 349 } 350 } 351 352 353 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 354 { 355 if (accepted(clazz, runtimeInvisibleAnnotationsAttribute)) 356 { 357 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); 358 } 359 } 360 361 362 public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) 363 { 364 if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute)) 365 { 366 attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); 367 } 368 } 369 370 371 public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) 372 { 373 if (accepted(clazz, runtimeInvisibleParameterAnnotationsAttribute)) 374 { 375 attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); 376 } 377 } 378 379 380 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 381 { 382 if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) 383 { 384 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); 385 } 386 } 387 388 389 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 390 { 391 if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) 392 { 393 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); 394 } 395 } 396 397 398 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 399 { 400 if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) 401 { 402 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); 403 } 404 } 405 406 407 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 408 { 409 if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute)) 410 { 411 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); 412 } 413 } 414 415 416 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 417 { 418 if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) 419 { 420 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); 421 } 422 } 423 424 425 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 426 { 427 if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) 428 { 429 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); 430 } 431 } 432 433 434 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 435 { 436 if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) 437 { 438 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); 439 } 440 } 441 442 443 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 444 { 445 if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute)) 446 { 447 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); 448 } 449 } 450 451 452 public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 453 { 454 if (accepted(clazz, annotationDefaultAttribute)) 455 { 456 attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); 457 } 458 } 459 460 461 // Small utility methods. 462 463 private boolean accepted(Clazz clazz, Attribute attribute) 464 { 465 return regularExpressionMatcher.matches(attribute.getAttributeName(clazz)); 466 } 467 } 468