1 19 20 package edu.umd.cs.findbugs.classfile.impl; 21 22 import java.io.BufferedOutputStream ; 23 import java.io.File ; 24 import java.io.FileOutputStream ; 25 import java.io.IOException ; 26 import java.io.InputStream ; 27 import java.io.OutputStream ; 28 import java.util.Iterator ; 29 30 import edu.umd.cs.findbugs.classfile.ICodeBase; 31 import edu.umd.cs.findbugs.classfile.ICodeBaseEntry; 32 import edu.umd.cs.findbugs.classfile.ICodeBaseIterator; 33 import edu.umd.cs.findbugs.classfile.ICodeBaseLocator; 34 import edu.umd.cs.findbugs.classfile.IScannableCodeBase; 35 import edu.umd.cs.findbugs.classfile.ResourceNotFoundException; 36 import edu.umd.cs.findbugs.io.IO; 37 38 46 public class NestedZipFileCodeBase extends AbstractScannableCodeBase implements IScannableCodeBase { 47 private ICodeBase parentCodeBase; 48 private String resourceName; 49 private File tempFile; 50 private ZipFileCodeBase delegateCodeBase; 51 52 57 public NestedZipFileCodeBase(NestedZipFileCodeBaseLocator codeBaseLocator) 58 throws ResourceNotFoundException, IOException { 59 super(codeBaseLocator); 60 this.parentCodeBase = codeBaseLocator.getParentCodeBase(); 61 this.resourceName = codeBaseLocator.getResourceName(); 62 63 InputStream inputStream = null; 64 OutputStream outputStream = null; 65 try { 66 this.tempFile = File.createTempFile("findbugs", ".zip"); 68 tempFile.deleteOnExit(); 70 inputStream = parentCodeBase.lookupResource(resourceName).openResource(); 73 outputStream = new BufferedOutputStream (new FileOutputStream (tempFile)); 74 IO.copy(inputStream, outputStream); 75 outputStream.flush(); 76 77 delegateCodeBase = new ZipFileCodeBase(codeBaseLocator, tempFile); 79 } finally { 80 if (inputStream != null) { 81 IO.close(inputStream); 82 } 83 84 if (outputStream != null) { 85 IO.close(outputStream); 86 } 87 } 88 } 89 90 93 public ICodeBaseIterator iterator() throws InterruptedException { 94 return new DelegatingCodeBaseIterator(this, delegateCodeBase); 95 } 96 97 100 public ICodeBaseEntry lookupResource(String resourceName) throws ResourceNotFoundException { 101 ICodeBaseEntry delegateCodeBaseEntry = delegateCodeBase.lookupResource(resourceName); 102 return new DelegatingCodeBaseEntry(this, delegateCodeBaseEntry); 103 } 104 105 108 public String getPathName() { 109 return null; 110 } 111 112 115 public void close() { 116 delegateCodeBase.close(); 117 tempFile.delete(); 118 } 119 } 120 | Popular Tags |