1eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project/*
2eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
3eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project *
4eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * you may not use this file except in compliance with the License.
6eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * You may obtain a copy of the License at
7eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project *
8eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project *
10eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * See the License for the specific language governing permissions and
14eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * limitations under the License.
15eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project */
16eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Projectpackage tests.support;
17eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project
18998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumannimport java.io.File;
19eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Projectimport java.net.URL;
20eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Projectimport java.net.URLClassLoader;
21eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project
22998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumannimport dalvik.system.DexClassLoader;
23eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project
24eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project/**
25eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * Support class for creating a file-based ClassLoader. Delegates to either
26eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * Dalvik's PathClassLoader or the RI's URLClassLoader, but does so by-name.
27eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project * This allows us to run corresponding tests in both environments.
28eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project */
29eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Projectpublic abstract class Support_ClassLoader {
30eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project
31eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project    public abstract ClassLoader getClassLoader(URL url, ClassLoader parent);
32f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
33eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project    public static ClassLoader getInstance(URL url, ClassLoader parent) {
34eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        try {
35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            Support_ClassLoader factory;
36f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
37eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            if ("Dalvik".equals(System.getProperty("java.vm.name"))) {
38eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project                factory = (Support_ClassLoader)Class.forName(
39eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project                    "tests.support.Support_ClassLoader$Dalvik").newInstance();
40eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            } else {
41eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project                factory = (Support_ClassLoader)Class.forName(
42eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project                    "tests.support.Support_ClassLoader$RefImpl").newInstance();
43eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            }
44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
45eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            return factory.getClassLoader(url, parent);
46eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        } catch (Exception ex) {
47eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            throw new RuntimeException("Unable to create ClassLoader", ex);
48eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        }
49eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project    }
50998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann
51998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann    /**
52998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * Implementation for Dalvik. Uses the DexClassLoader, so we can write
53998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * temporary DEX files to a special directory. We don't want to spoil the
54998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * system's DEX cache with our files. Also, we might not have write access
55998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * to the system's DEX cache at all (which is the case when we're running
56998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * CTS).
57998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     */
58ab9bdb0e83663493b6518c0067873abef42f90adJorg Pleumann    static class Dalvik extends Support_ClassLoader {
59998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann
60998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann        private static File tmp;
61998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann
62998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann        static {
63998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann            tmp = new File(System.getProperty("java.io.tmpdir"), "dex-cache");
64998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann            tmp.mkdirs();
65998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann        }
66998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann
67998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann        @Override
68eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        public ClassLoader getClassLoader(URL url, ClassLoader parent) {
69998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann            return new DexClassLoader(url.getPath(), tmp.getAbsolutePath(),
70998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann                    null, parent);
71eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        }
72eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project    }
73f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
74998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann    /**
75998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * Implementation for the reference implementation. Nothing interesting to
76998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     * see here. Please get along.
77998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann     */
78ab9bdb0e83663493b6518c0067873abef42f90adJorg Pleumann    static class RefImpl extends Support_ClassLoader {
79998421c91bc71aa3677dd91ac4a6b106f4bd297bJorg Pleumann        @Override
80eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        public ClassLoader getClassLoader(URL url, ClassLoader parent) {
81eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project            return new URLClassLoader(new URL[] { url }, parent);
82eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project        }
83eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project    }
84eeb220adf9eea613d6cd97a131b0a9ef49e31a5bThe Android Open Source Project}
85