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.obfuscate.AttributeShrinker; 28 29 /** 30 * This AttributeVisitor delegates its visits to one of two other 31 * AttributeVisitor instances, depending on whether the visited attribute 32 * is strictly required or not. 33 * 34 * Stack map attributes and stack map table attributes are treated as optional. 35 * 36 * @see AttributeShrinker 37 * 38 * @author Eric Lafortune 39 */ 40 public class RequiredAttributeFilter 41 implements AttributeVisitor 42 { 43 private final AttributeVisitor requiredAttributeVisitor; 44 private final AttributeVisitor optionalAttributeVisitor; 45 46 47 /** 48 * Creates a new RequiredAttributeFilter for visiting required attributes. 49 * @param requiredAttributeVisitor the visitor that will visit required 50 * attributes. 51 */ 52 public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor) 53 { 54 this(requiredAttributeVisitor, null); 55 } 56 57 58 /** 59 * Creates a new RequiredAttributeFilter for visiting required and 60 * optional attributes. 61 * @param requiredAttributeVisitor the visitor that will visit required 62 * attributes. 63 * @param optionalAttributeVisitor the visitor that will visit optional 64 * attributes. 65 */ 66 public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor, 67 AttributeVisitor optionalAttributeVisitor) 68 { 69 this.requiredAttributeVisitor = requiredAttributeVisitor; 70 this.optionalAttributeVisitor = optionalAttributeVisitor; 71 } 72 73 74 // Implementations for AttributeVisitor. 75 76 public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) 77 { 78 if (optionalAttributeVisitor != null) 79 { 80 optionalAttributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); 81 } 82 } 83 84 85 public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) 86 { 87 if (requiredAttributeVisitor != null) 88 { 89 requiredAttributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); 90 } 91 } 92 93 94 public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) 95 { 96 if (optionalAttributeVisitor != null) 97 { 98 optionalAttributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); 99 } 100 } 101 102 103 public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) 104 { 105 if (optionalAttributeVisitor != null) 106 { 107 optionalAttributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); 108 } 109 } 110 111 112 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 113 { 114 if (optionalAttributeVisitor != null) 115 { 116 optionalAttributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); 117 } 118 } 119 120 121 public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 122 { 123 if (optionalAttributeVisitor != null) 124 { 125 optionalAttributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); 126 } 127 } 128 129 130 public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) 131 { 132 if (optionalAttributeVisitor != null) 133 { 134 optionalAttributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); 135 } 136 } 137 138 139 public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) 140 { 141 if (optionalAttributeVisitor != null) 142 { 143 optionalAttributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); 144 } 145 } 146 147 148 public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) 149 { 150 if (optionalAttributeVisitor != null) 151 { 152 optionalAttributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); 153 } 154 } 155 156 157 public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) 158 { 159 if (optionalAttributeVisitor != null) 160 { 161 optionalAttributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); 162 } 163 } 164 165 166 public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) 167 { 168 if (optionalAttributeVisitor != null) 169 { 170 optionalAttributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); 171 } 172 } 173 174 175 public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) 176 { 177 if (optionalAttributeVisitor != null) 178 { 179 optionalAttributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); 180 } 181 } 182 183 184 public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 185 { 186 if (optionalAttributeVisitor != null) 187 { 188 optionalAttributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); 189 } 190 } 191 192 193 public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) 194 { 195 if (optionalAttributeVisitor != null) 196 { 197 optionalAttributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); 198 } 199 } 200 201 202 public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) 203 { 204 if (optionalAttributeVisitor != null) 205 { 206 optionalAttributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); 207 } 208 } 209 210 211 public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) 212 { 213 if (requiredAttributeVisitor != null) 214 { 215 requiredAttributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); 216 } 217 } 218 219 220 public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) 221 { 222 if (optionalAttributeVisitor != null) 223 { 224 optionalAttributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); 225 } 226 } 227 228 229 public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) 230 { 231 if (optionalAttributeVisitor != null) 232 { 233 optionalAttributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); 234 } 235 } 236 237 238 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 239 { 240 if (requiredAttributeVisitor != null) 241 { 242 requiredAttributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); 243 } 244 } 245 246 247 public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) 248 { 249 if (optionalAttributeVisitor != null) 250 { 251 optionalAttributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); 252 } 253 } 254 255 256 public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) 257 { 258 if (optionalAttributeVisitor != null) 259 { 260 optionalAttributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); 261 } 262 } 263 264 265 public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) 266 { 267 if (optionalAttributeVisitor != null) 268 { 269 optionalAttributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); 270 } 271 } 272 273 274 public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 275 { 276 if (optionalAttributeVisitor != null) 277 { 278 optionalAttributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); 279 } 280 } 281 282 283 public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 284 { 285 if (optionalAttributeVisitor != null) 286 { 287 optionalAttributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); 288 } 289 } 290 291 292 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 293 { 294 if (optionalAttributeVisitor != null) 295 { 296 optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); 297 } 298 } 299 300 301 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 302 { 303 if (optionalAttributeVisitor != null) 304 { 305 optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); 306 } 307 } 308 309 310 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 311 { 312 if (optionalAttributeVisitor != null) 313 { 314 optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); 315 } 316 } 317 318 319 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 320 { 321 if (optionalAttributeVisitor != null) 322 { 323 optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); 324 } 325 } 326 327 328 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 329 { 330 if (optionalAttributeVisitor != null) 331 { 332 optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); 333 } 334 } 335 336 337 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 338 { 339 if (optionalAttributeVisitor != null) 340 { 341 optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); 342 } 343 } 344 345 346 public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) 347 { 348 if (optionalAttributeVisitor != null) 349 { 350 optionalAttributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); 351 } 352 } 353 354 355 public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) 356 { 357 if (optionalAttributeVisitor != null) 358 { 359 optionalAttributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); 360 } 361 } 362 363 364 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 365 { 366 if (optionalAttributeVisitor != null) 367 { 368 optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); 369 } 370 } 371 372 373 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 374 { 375 if (optionalAttributeVisitor != null) 376 { 377 optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); 378 } 379 } 380 381 382 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 383 { 384 if (optionalAttributeVisitor != null) 385 { 386 optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); 387 } 388 } 389 390 391 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 392 { 393 if (optionalAttributeVisitor != null) 394 { 395 optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); 396 } 397 } 398 399 400 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 401 { 402 if (optionalAttributeVisitor != null) 403 { 404 optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); 405 } 406 } 407 408 409 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 410 { 411 if (optionalAttributeVisitor != null) 412 { 413 optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); 414 } 415 } 416 417 418 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 419 { 420 if (optionalAttributeVisitor != null) 421 { 422 optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); 423 } 424 } 425 426 427 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 428 { 429 if (optionalAttributeVisitor != null) 430 { 431 optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); 432 } 433 } 434 435 436 public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 437 { 438 if (optionalAttributeVisitor != null) 439 { 440 optionalAttributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); 441 } 442 } 443 } 444