1 21 package proguard; 22 23 import proguard.classfile.attribute.annotation.visitor.*; 24 import proguard.classfile.attribute.annotation.visitor.AnnotatedClassVisitor; 25 import proguard.classfile.attribute.visitor.AllAttributeVisitor; 26 import proguard.classfile.visitor.*; 27 28 import java.util.*; 29 30 36 public class ClassSpecificationVisitorFactory 37 { 38 50 public static ClassPoolVisitor createClassPoolVisitor(List keepSpecifications, 51 ClassVisitor classVisitor, 52 MemberVisitor memberVisitor, 53 boolean shrinking, 54 boolean optimizing, 55 boolean obfuscating) 56 { 57 MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor(); 58 59 if (keepSpecifications != null) 60 { 61 for (int index = 0; index < keepSpecifications.size(); index++) 62 { 63 KeepSpecification keepSpecification = 64 (KeepSpecification)keepSpecifications.get(index); 65 66 if ((shrinking && !keepSpecification.allowShrinking) || 67 (optimizing && !keepSpecification.allowOptimization) || 68 (obfuscating && !keepSpecification.allowObfuscation)) 69 { 70 multiClassPoolVisitor.addClassPoolVisitor( 71 createClassPoolVisitor(keepSpecification, 72 classVisitor, 73 memberVisitor)); 74 } 75 } 76 } 77 78 return multiClassPoolVisitor; 79 } 80 81 82 94 public static ClassPoolVisitor createClassPoolVisitor(List classSpecifications, 95 ClassVisitor classVisitor, 96 MemberVisitor memberVisitor) 97 { 98 MultiClassPoolVisitor multiClassPoolVisitor = new MultiClassPoolVisitor(); 99 100 if (classSpecifications != null) 101 { 102 for (int index = 0; index < classSpecifications.size(); index++) 103 { 104 ClassSpecification classSpecification = 105 (ClassSpecification)classSpecifications.get(index); 106 107 multiClassPoolVisitor.addClassPoolVisitor( 108 createClassPoolVisitor(classSpecification, 109 classVisitor, 110 memberVisitor)); 111 } 112 } 113 114 return multiClassPoolVisitor; 115 } 116 117 118 129 private static ClassPoolVisitor createClassPoolVisitor(KeepSpecification keepSpecification, 130 ClassVisitor classVisitor, 131 MemberVisitor memberVisitor) 132 { 133 if (!keepSpecification.markClasses && 135 !keepSpecification.markConditionally) 136 { 137 classVisitor = null; 138 } 139 140 if (keepSpecification.markConditionally) 143 { 144 ClassVisitor composedClassVisitor = 146 createCombinedClassVisitor(keepSpecification, 147 classVisitor, 148 memberVisitor); 149 150 classVisitor = 152 createClassMemberTester(keepSpecification, 153 composedClassVisitor); 154 155 memberVisitor = null; 157 } 158 159 return createClassPoolVisitor((ClassSpecification)keepSpecification, 160 classVisitor, 161 memberVisitor); 162 } 163 164 165 176 private static ClassPoolVisitor createClassPoolVisitor(ClassSpecification classSpecification, 177 ClassVisitor classVisitor, 178 MemberVisitor memberVisitor) 179 { 180 ClassVisitor composedClassVisitor = 182 createCombinedClassVisitor(classSpecification, 183 classVisitor, 184 memberVisitor); 185 186 String className = classSpecification.className; 188 189 String extendsAnnotationType = classSpecification.extendsAnnotationType; 191 String extendsClassName = classSpecification.extendsClassName; 192 193 if (className != null && 195 (extendsAnnotationType != null || 196 extendsClassName != null || 197 containsWildCards(className))) 198 { 199 composedClassVisitor = 200 new ClassNameFilter(className, composedClassVisitor); 201 202 className = null; 204 } 205 206 String annotationType = classSpecification.annotationType; 208 209 if (annotationType != null) 210 { 211 composedClassVisitor = 212 new AllAttributeVisitor( 213 new AllAnnotationVisitor( 214 new AnnotationTypeFilter(annotationType, 215 new AnnotatedClassVisitor(composedClassVisitor)))); 216 } 217 218 if (classSpecification.requiredSetAccessFlags != 0 || 220 classSpecification.requiredUnsetAccessFlags != 0) 221 { 222 composedClassVisitor = 223 new ClassAccessFilter(classSpecification.requiredSetAccessFlags, 224 classSpecification.requiredUnsetAccessFlags, 225 composedClassVisitor); 226 } 227 228 if (extendsAnnotationType != null || 230 extendsClassName != null) 231 { 232 composedClassVisitor = 234 new ClassHierarchyTraveler(false, false, false, true, 235 composedClassVisitor); 236 237 if (extendsAnnotationType != null) 239 { 240 composedClassVisitor = 241 new AllAttributeVisitor( 242 new AllAnnotationVisitor( 243 new AnnotationTypeFilter(extendsAnnotationType, 244 new AnnotatedClassVisitor(composedClassVisitor)))); 245 } 246 247 if (extendsClassName != null) 249 { 250 if (containsWildCards(extendsClassName)) 252 { 253 composedClassVisitor = 254 new ClassNameFilter(extendsClassName, 255 composedClassVisitor); 256 } 257 else 258 { 259 className = extendsClassName; 261 } 262 } 263 } 264 265 return className != null ? 267 (ClassPoolVisitor)new NamedClassVisitor(composedClassVisitor, className) : 268 (ClassPoolVisitor)new AllClassVisitor(composedClassVisitor); 269 } 270 271 272 283 private static ClassVisitor createCombinedClassVisitor(ClassSpecification classSpecification, 284 ClassVisitor classVisitor, 285 MemberVisitor memberVisitor) 286 { 287 if (classSpecification.fieldSpecifications == null && 289 classSpecification.methodSpecifications == null) 290 { 291 memberVisitor = null; 292 } 293 294 MultiClassVisitor multiClassVisitor = new MultiClassVisitor(); 296 297 if (classVisitor != null) 299 { 300 if (memberVisitor == null) 302 { 303 return classVisitor; 304 } 305 306 multiClassVisitor.addClassVisitor(classVisitor); 307 } 308 309 if (memberVisitor != null) 311 { 312 ClassVisitor memberClassVisitor = 313 createClassVisitor(classSpecification, memberVisitor); 314 315 if (classVisitor == null) 317 { 318 return memberClassVisitor; 319 } 320 321 multiClassVisitor.addClassVisitor(memberClassVisitor); 322 } 323 324 return multiClassVisitor; 325 } 326 327 328 336 private static ClassVisitor createClassVisitor(ClassSpecification classSpecification, 337 MemberVisitor memberVisitor) 338 { 339 MultiClassVisitor multiClassVisitor = new MultiClassVisitor(); 340 341 addMemberVisitors(classSpecification.fieldSpecifications, true, multiClassVisitor, memberVisitor); 342 addMemberVisitors(classSpecification.methodSpecifications, false, multiClassVisitor, memberVisitor); 343 344 return new ClassHierarchyTraveler(true, true, false, false, 346 multiClassVisitor); 347 } 348 349 350 355 private static void addMemberVisitors(List memberSpecifications, 356 boolean isField, 357 MultiClassVisitor multiClassVisitor, 358 MemberVisitor memberVisitor) 359 { 360 if (memberSpecifications != null) 361 { 362 for (int index = 0; index < memberSpecifications.size(); index++) 363 { 364 MemberSpecification memberSpecification = 365 (MemberSpecification)memberSpecifications.get(index); 366 367 multiClassVisitor.addClassVisitor( 368 createClassVisitor(memberSpecification, 369 isField, 370 memberVisitor)); 371 } 372 } 373 } 374 375 376 380 private static ClassVisitor createClassMemberTester(ClassSpecification classSpecification, 381 ClassVisitor classVisitor) 382 { 383 return createClassMemberTester(classSpecification.fieldSpecifications, 386 true, 387 createClassMemberTester(classSpecification.methodSpecifications, 388 false, 389 classVisitor)); 390 } 391 392 393 398 private static ClassVisitor createClassMemberTester(List memberSpecifications, 399 boolean isField, 400 ClassVisitor classVisitor) 401 { 402 if (memberSpecifications != null) 404 { 405 for (int index = 0; index < memberSpecifications.size(); index++) 406 { 407 MemberSpecification memberSpecification = 408 (MemberSpecification)memberSpecifications.get(index); 409 410 classVisitor = 411 createClassVisitor(memberSpecification, 412 isField, 413 new MemberToClassVisitor(classVisitor)); 414 } 415 } 416 417 return classVisitor; 418 } 419 420 421 430 private static ClassVisitor createClassVisitor(MemberSpecification memberSpecification, 431 boolean isField, 432 MemberVisitor memberVisitor) 433 { 434 String name = memberSpecification.name; 435 String descriptor = memberSpecification.descriptor; 436 437 boolean fullySpecified = 440 name != null && 441 descriptor != null && 442 !containsWildCards(name) && 443 !containsWildCards(descriptor); 444 445 if (!fullySpecified) 446 { 447 if (descriptor != null) 448 { 449 memberVisitor = 450 new MemberDescriptorFilter(descriptor, memberVisitor); 451 } 452 453 if (name != null) 454 { 455 memberVisitor = 456 new MemberNameFilter(name, memberVisitor); 457 } 458 } 459 460 if (memberSpecification.annotationType != null) 462 { 463 memberVisitor = 464 new AllAttributeVisitor( 465 new AllAnnotationVisitor( 466 new AnnotationTypeFilter(memberSpecification.annotationType, 467 new AnnotationToMemberVisitor(memberVisitor)))); 468 } 469 470 if (memberSpecification.requiredSetAccessFlags != 0 || 472 memberSpecification.requiredUnsetAccessFlags != 0) 473 { 474 memberVisitor = 475 new MemberAccessFilter(memberSpecification.requiredSetAccessFlags, 476 memberSpecification.requiredUnsetAccessFlags, 477 memberVisitor); 478 } 479 480 return isField ? 483 fullySpecified ? 484 (ClassVisitor)new NamedFieldVisitor(name, descriptor, memberVisitor) : 485 (ClassVisitor)new AllFieldVisitor(memberVisitor) : 486 fullySpecified ? 487 (ClassVisitor)new NamedMethodVisitor(name, descriptor, memberVisitor) : 488 (ClassVisitor)new AllMethodVisitor(memberVisitor); 489 } 490 491 492 494 private static boolean containsWildCards(String string) 495 { 496 return string != null && 497 (string.indexOf('*') >= 0 || 498 string.indexOf('?') >= 0 || 499 string.indexOf('%') >= 0 || 500 string.indexOf(',') >= 0); 501 } 502 } 503
| Popular Tags
|