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