1 19 20 package edu.umd.cs.findbugs.classfile.impl; 21 22 import java.io.BufferedInputStream ; 23 import java.io.DataInputStream ; 24 import java.io.File ; 25 import java.io.FileInputStream ; 26 import java.io.FileNotFoundException ; 27 import java.io.IOException ; 28 import java.io.InputStream ; 29 import java.util.NoSuchElementException ; 30 31 import edu.umd.cs.findbugs.classfile.CheckedAnalysisException; 32 import edu.umd.cs.findbugs.classfile.ClassDescriptor; 33 import edu.umd.cs.findbugs.classfile.ICodeBaseEntry; 34 import edu.umd.cs.findbugs.classfile.ICodeBaseIterator; 35 import edu.umd.cs.findbugs.classfile.ICodeBaseLocator; 36 import edu.umd.cs.findbugs.classfile.IScannableCodeBase; 37 import edu.umd.cs.findbugs.classfile.InvalidClassFileFormatException; 38 import edu.umd.cs.findbugs.classfile.ResourceNotFoundException; 39 import edu.umd.cs.findbugs.classfile.analysis.ClassInfo; 40 import edu.umd.cs.findbugs.classfile.analysis.ClassNameAndSuperclassInfo; 41 import edu.umd.cs.findbugs.classfile.engine.ClassInfoAnalysisEngine; 42 import edu.umd.cs.findbugs.classfile.engine.ClassParser; 43 import edu.umd.cs.findbugs.io.IO; 44 45 50 public class SingleFileCodeBase implements IScannableCodeBase { 51 52 private ICodeBaseLocator codeBaseLocator; 53 private String fileName; 54 private boolean isAppCodeBase; 55 private int howDiscovered; 56 private long lastModifiedTime; 57 private boolean resourceNameKnown; 58 private String resourceName; 59 60 public SingleFileCodeBase(ICodeBaseLocator codeBaseLocator, String fileName) { 61 this.codeBaseLocator = codeBaseLocator; 62 this.fileName = fileName; 63 this.lastModifiedTime = new File (fileName).lastModified(); 64 } 65 66 69 public ICodeBaseLocator getCodeBaseLocator() { 70 return codeBaseLocator; 71 } 72 73 76 public boolean containsSourceFiles() throws InterruptedException { 77 return false; 78 } 79 80 83 public ICodeBaseIterator iterator() throws InterruptedException { 84 return new ICodeBaseIterator() { 85 boolean done = false; 86 87 90 public boolean hasNext() throws InterruptedException { 91 return !done; 92 } 93 94 97 public ICodeBaseEntry next() throws InterruptedException { 98 if (done) { 99 throw new NoSuchElementException (); 100 } 101 done = true; 102 return new SingleFileCodeBaseEntry(SingleFileCodeBase.this); 103 } 104 }; 105 } 106 107 110 public ICodeBaseEntry lookupResource(String resourceName) throws ResourceNotFoundException { 111 if (!resourceName.equals(getResourceName())) { 112 throw new ResourceNotFoundException(resourceName); 113 } 114 115 return new SingleFileCodeBaseEntry(this); 116 } 117 118 121 public void setApplicationCodeBase(boolean isAppCodeBase) { 122 this.isAppCodeBase = isAppCodeBase; 123 } 124 125 128 public boolean isApplicationCodeBase() { 129 return isAppCodeBase; 130 } 131 132 135 public void setHowDiscovered(int howDiscovered) { 136 this.howDiscovered = howDiscovered; 137 } 138 139 142 public int getHowDiscovered() { 143 return howDiscovered; 144 } 145 146 149 public void setLastModifiedTime(long lastModifiedTime) { 150 if (lastModifiedTime > 0) { 151 this.lastModifiedTime = lastModifiedTime; 152 } 153 } 154 155 158 public long getLastModifiedTime() { 159 return lastModifiedTime; 160 } 161 162 165 public String getPathName() { 166 return fileName; 167 } 168 169 InputStream openFile() throws IOException { 170 return new BufferedInputStream (new FileInputStream (fileName)); 171 } 172 173 176 public void close() { 177 } 179 180 188 String getResourceName() { 189 if (!resourceNameKnown) { 190 195 try { 196 resourceName = getClassDescriptor().toResourceName(); 197 } catch (Exception e) { 198 resourceName = fileName; 199 } 200 201 resourceNameKnown = true; 202 } 203 return resourceName; 204 } 205 206 ClassDescriptor getClassDescriptor() throws ResourceNotFoundException, InvalidClassFileFormatException { 207 DataInputStream in = null; 208 try { 209 try { 210 in = new DataInputStream (new BufferedInputStream (new FileInputStream (fileName))); 211 ClassParser classParser = new ClassParser(in, null, new SingleFileCodeBaseEntry(this)); 212 ClassNameAndSuperclassInfo classInfo = new ClassNameAndSuperclassInfo(); 213 classParser.parse(classInfo); 214 return classInfo.getClassDescriptor(); 215 } finally { 216 if (in != null) { 217 IO.close(in); 218 } 219 } 220 } catch (IOException e) { 221 throw new ResourceNotFoundException(fileName); 223 } 224 } 225 226 232 int getNumBytes() { 233 File file = new File (fileName); 234 if (!file.exists()) { 235 return -1; 236 } 237 return (int) file.length(); 238 } 239 } 240 | Popular Tags |