1 21 package proguard.io; 22 23 import proguard.classfile.*; 24 import proguard.classfile.io.*; 25 import proguard.classfile.util.*; 26 import proguard.classfile.visitor.ClassVisitor; 27 28 import java.io.*; 29 30 42 public class ClassReader implements DataEntryReader 43 { 44 private boolean isLibrary; 45 private boolean skipNonPublicLibraryClasses; 46 private boolean skipNonPublicLibraryClassMembers; 47 private WarningPrinter warningPrinter; 48 private ClassVisitor classVisitor; 49 50 51 55 public ClassReader(boolean isLibrary, 56 boolean skipNonPublicLibraryClasses, 57 boolean skipNonPublicLibraryClassMembers, 58 WarningPrinter warningPrinter, 59 ClassVisitor classVisitor) 60 { 61 this.isLibrary = isLibrary; 62 this.skipNonPublicLibraryClasses = skipNonPublicLibraryClasses; 63 this.skipNonPublicLibraryClassMembers = skipNonPublicLibraryClassMembers; 64 this.warningPrinter = warningPrinter; 65 this.classVisitor = classVisitor; 66 } 67 68 69 71 public void read(DataEntry dataEntry) throws IOException 72 { 73 try 74 { 75 InputStream inputStream = dataEntry.getInputStream(); 77 78 DataInputStream dataInputStream = new DataInputStream(inputStream); 80 81 Clazz clazz; 83 if (isLibrary) 84 { 85 clazz = new LibraryClass(); 86 clazz.accept(new LibraryClassReader(dataInputStream, skipNonPublicLibraryClasses, skipNonPublicLibraryClassMembers)); 87 } 88 else 89 { 90 clazz = new ProgramClass(); 91 clazz.accept(new ProgramClassReader(dataInputStream)); 92 } 93 94 String className = clazz.getName(); 96 if (className != null) 97 { 98 if (!dataEntry.getName().replace(File.pathSeparatorChar, ClassConstants.INTERNAL_PACKAGE_SEPARATOR).equals(className+ClassConstants.CLASS_FILE_EXTENSION) && 99 warningPrinter != null) 100 { 101 warningPrinter.print("Warning: class [" + dataEntry.getName() + "] unexpectedly contains class [" + ClassUtil.externalClassName(className) + "]"); 102 } 103 104 clazz.accept(classVisitor); 105 } 106 107 dataEntry.closeInputStream(); 108 } 109 catch (Exception ex) 110 { 111 throw new IOException("Can't process class ["+dataEntry.getName()+"] ("+ex.getMessage()+")"); 112 } 113 } 114 } 115 | Popular Tags |