1 19 20 package edu.umd.cs.findbugs.classfile.impl; 21 22 import java.io.FileNotFoundException ; 23 import java.io.IOException ; 24 import java.io.InputStream ; 25 import java.util.HashMap ; 26 import java.util.Iterator ; 27 import java.util.LinkedList ; 28 import java.util.List ; 29 import java.util.Map ; 30 31 import edu.umd.cs.findbugs.classfile.IClassPath; 32 import edu.umd.cs.findbugs.classfile.ICodeBase; 33 import edu.umd.cs.findbugs.classfile.ICodeBaseEntry; 34 import edu.umd.cs.findbugs.classfile.IScannableCodeBase; 35 import edu.umd.cs.findbugs.classfile.ResourceNotFoundException; 36 37 42 public class ClassPathImpl implements IClassPath { 43 private List <IScannableCodeBase> appCodeBaseList; 44 private List <ICodeBase> auxCodeBaseList; 45 private Map <String , ICodeBaseEntry> codeBaseEntryMap; 46 47 public ClassPathImpl() { 48 this.appCodeBaseList = new LinkedList <IScannableCodeBase>(); 49 this.auxCodeBaseList = new LinkedList <ICodeBase>(); 50 this.codeBaseEntryMap = new HashMap <String , ICodeBaseEntry>(); 51 } 52 53 56 public void addCodeBase(ICodeBase codeBase) { 57 if (codeBase.isApplicationCodeBase()) { 58 if (!(codeBase instanceof IScannableCodeBase)) { 59 throw new IllegalStateException (); 60 } 61 appCodeBaseList.add((IScannableCodeBase) codeBase); 62 } else { 63 auxCodeBaseList.add(codeBase); 64 } 65 } 66 67 70 public Iterator <? extends ICodeBase> appCodeBaseIterator() { 71 return appCodeBaseList.iterator(); 72 } 73 74 77 public Iterator <? extends ICodeBase> auxCodeBaseIterator() { 78 return auxCodeBaseList.iterator(); 79 } 80 81 84 public void close() { 85 for (ICodeBase codeBase : appCodeBaseList) { 86 codeBase.close(); 87 } 88 for (ICodeBase codeBase : auxCodeBaseList) { 89 codeBase.close(); 90 } 91 } 92 93 96 public ICodeBaseEntry lookupResource(String resourceName) throws ResourceNotFoundException { 97 ICodeBaseEntry result = codeBaseEntryMap.get(resourceName); 99 100 if (result == null) { 101 103 result = search(appCodeBaseList, resourceName); 105 if (result == null) { 106 result = search(auxCodeBaseList, resourceName); 108 } 109 110 if (result == null) { 112 throw new ResourceNotFoundException(resourceName); 113 } 114 115 codeBaseEntryMap.put(resourceName, result); 117 } 118 119 return result; 120 } 121 122 130 private ICodeBaseEntry search(List <? extends ICodeBase> codeBaseList, String resourceName) { 131 for (ICodeBase codeBase : codeBaseList) { 132 try { 133 return codeBase.lookupResource(resourceName); 134 } catch (ResourceNotFoundException e) { 135 } 137 } 138 return null; 139 } 140 141 144 public void mapResourceNameToCodeBaseEntry(String resourceName, ICodeBaseEntry codeBaseEntry) { 145 codeBaseEntryMap.put(resourceName, codeBaseEntry); 146 } 147 } 148 | Popular Tags |