19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage junit.runner; 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.*; 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.*; 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.URL; 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.zip.*; 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A custom class loader which enables the reloading 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of classes for each test run. The class loader 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be configured with a list of package paths that 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be excluded from loading. The loading 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of these packages is delegated to the system class 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader. They will be shared across test runs. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The list of excluded package paths is specified in 17f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot * a properties file "excluded.properties" that is located in 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same place as the TestCaseClassLoader class. 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>Known limitation:</b> the TestCaseClassLoader cannot load classes 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from jar files. 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} - Not needed for 1.0 SDK 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TestCaseClassLoader extends ClassLoader { 25f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** scanned class path */ 26f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private Vector fPathItems; 27f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** default excluded paths */ 28f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private String[] defaultExclusions= { 29f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot "junit.framework.", 30f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot "junit.extensions.", 31f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot "junit.runner." 32f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot }; 33f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** name of excluded properties file */ 34f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot static final String EXCLUDED_FILE= "excluded.properties"; 35f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** excluded paths */ 36f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private Vector fExcluded; 37f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 38f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** 39f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot * Constructs a TestCaseLoader. It scans the class path 40f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot * and the excluded package paths 41f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot */ 42f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public TestCaseClassLoader() { 43f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot this(System.getProperty("java.class.path")); 44f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 45f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 46f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot /** 47f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot * Constructs a TestCaseLoader. It scans the class path 48f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot * and the excluded package paths 49f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot */ 50f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public TestCaseClassLoader(String classPath) { 51f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot scanPath(classPath); 52f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot readExcludedPackages(); 53f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 54f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 55f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private void scanPath(String classPath) { 56f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot String separator= System.getProperty("path.separator"); 57f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot fPathItems= new Vector(10); 58f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot StringTokenizer st= new StringTokenizer(classPath, separator); 59f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot while (st.hasMoreTokens()) { 60f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot fPathItems.addElement(st.nextToken()); 61f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 62f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 63f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 64f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public URL getResource(String name) { 65f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return ClassLoader.getSystemResource(name); 66f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 67f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 68f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public InputStream getResourceAsStream(String name) { 69f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return ClassLoader.getSystemResourceAsStream(name); 70f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 71f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 72f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public boolean isExcluded(String name) { 73f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot for (int i= 0; i < fExcluded.size(); i++) { 74f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (name.startsWith((String) fExcluded.elementAt(i))) { 75f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return true; 76f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 77f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 78f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return false; 79f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 80f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 81f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot public synchronized Class loadClass(String name, boolean resolve) 82f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot throws ClassNotFoundException { 83f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 84f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot Class c= findLoadedClass(name); 85f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (c != null) 86f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return c; 87f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot // 88f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot // Delegate the loading of excluded classes to the 89f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot // standard class loader. 90f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot // 91f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (isExcluded(name)) { 92f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 93f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot c= findSystemClass(name); 94f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return c; 95f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch (ClassNotFoundException e) { 96f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot // keep searching 97f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 98f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 99f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (c == null) { 100f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot byte[] data= lookupClassData(name); 101f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (data == null) 102f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot throw new ClassNotFoundException(); 103f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot c= defineClass(name, data, 0, data.length); 104f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 105f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (resolve) 106f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot resolveClass(c); 107f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return c; 108f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 109f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 110f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private byte[] lookupClassData(String className) throws ClassNotFoundException { 111f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot byte[] data= null; 112f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot for (int i= 0; i < fPathItems.size(); i++) { 113f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot String path= (String) fPathItems.elementAt(i); 114f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot String fileName= className.replace('.', '/')+".class"; 115f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (isJar(path)) { 116f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot data= loadJarData(path, fileName); 117f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } else { 118f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot data= loadFileData(path, fileName); 119f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 120f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (data != null) 121f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return data; 122f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 123f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot throw new ClassNotFoundException(className); 124f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 125f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 126f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot boolean isJar(String pathEntry) { 127f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return pathEntry.endsWith(".jar") || 128f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot pathEntry.endsWith(".apk") || 129f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot pathEntry.endsWith(".zip"); 130f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 131f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 132f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private byte[] loadFileData(String path, String fileName) { 133f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot File file= new File(path, fileName); 134f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (file.exists()) { 135f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return getClassData(file); 136f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 137f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 138f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 139f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 140f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private byte[] getClassData(File f) { 141f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 142f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot FileInputStream stream= new FileInputStream(f); 143f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot ByteArrayOutputStream out= new ByteArrayOutputStream(1000); 144f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot byte[] b= new byte[1000]; 145f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot int n; 146f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot while ((n= stream.read(b)) != -1) 147f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot out.write(b, 0, n); 148f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot stream.close(); 149f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot out.close(); 150f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return out.toByteArray(); 151f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 152f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch (IOException e) { 153f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 154f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 155f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 156f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 157f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private byte[] loadJarData(String path, String fileName) { 158f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot ZipFile zipFile= null; 159f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot InputStream stream= null; 160f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot File archive= new File(path); 161f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (!archive.exists()) 162f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 163f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 164f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot zipFile= new ZipFile(archive); 165f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch(IOException io) { 166f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 167f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 168f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot ZipEntry entry= zipFile.getEntry(fileName); 169f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (entry == null) 170f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 171f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot int size= (int) entry.getSize(); 172f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 173f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot stream= zipFile.getInputStream(entry); 174f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot byte[] data= new byte[size]; 175f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot int pos= 0; 176f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot while (pos < size) { 177f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot int n= stream.read(data, pos, data.length - pos); 178f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot pos += n; 179f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 180f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot zipFile.close(); 181f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return data; 182f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch (IOException e) { 183f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } finally { 184f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 185f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (stream != null) 186f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot stream.close(); 187f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch (IOException e) { 188f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 189f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 190f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return null; 191f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 192f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 193f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot private void readExcludedPackages() { 194f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot fExcluded= new Vector(10); 195f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot for (int i= 0; i < defaultExclusions.length; i++) 196f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot fExcluded.addElement(defaultExclusions[i]); 197f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot 198f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot InputStream is= getClass().getResourceAsStream(EXCLUDED_FILE); 199f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (is == null) 200f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return; 201f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot Properties p= new Properties(); 202f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 203f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot p.load(is); 204f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 205f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot catch (IOException e) { 206f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot return; 207f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } finally { 208f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot try { 209f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot is.close(); 210f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } catch (IOException e) { 211f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 212f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 213f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot for (Enumeration e= p.propertyNames(); e.hasMoreElements(); ) { 214f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot String key= (String)e.nextElement(); 215f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (key.startsWith("excluded.")) { 216f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot String path= p.getProperty(key); 217f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot path= path.trim(); 218f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (path.endsWith("*")) 219f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot path= path.substring(0, path.length()-1); 220f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot if (path.length() > 0) 221f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot fExcluded.addElement(path); 222f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 223f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 224f1253cd68a1ef45f4bb0c15d3e2834ca8f91e03fBrett Chabot } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 226