13b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project/*
23b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
33b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project *
43b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
53b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * you may not use this file except in compliance with the License.
63b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * You may obtain a copy of the License at
73b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project *
83b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
93b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project *
103b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
113b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
123b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * See the License for the specific language governing permissions and
143b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * limitations under the License.
153b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project */
163b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Projectpackage tests.support;
173b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
1814da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumannimport java.io.File;
193b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Projectimport java.net.URL;
203b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Projectimport java.net.URLClassLoader;
213b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
2214da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumannimport dalvik.system.DexClassLoader;
233b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
243b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project/**
253b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * Support class for creating a file-based ClassLoader. Delegates to either
263b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * Dalvik's PathClassLoader or the RI's URLClassLoader, but does so by-name.
273b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project * This allows us to run corresponding tests in both environments.
283b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project */
293b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Projectpublic abstract class Support_ClassLoader {
303b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
313b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project    public abstract ClassLoader getClassLoader(URL url, ClassLoader parent);
323b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
333b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project    public static ClassLoader getInstance(URL url, ClassLoader parent) {
343b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        try {
353b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            Support_ClassLoader factory;
363b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
373b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            if ("Dalvik".equals(System.getProperty("java.vm.name"))) {
383b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project                factory = (Support_ClassLoader)Class.forName(
393b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project                    "tests.support.Support_ClassLoader$Dalvik").newInstance();
403b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            } else {
413b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project                factory = (Support_ClassLoader)Class.forName(
423b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project                    "tests.support.Support_ClassLoader$RefImpl").newInstance();
433b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            }
443b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
453b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            return factory.getClassLoader(url, parent);
463b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        } catch (Exception ex) {
473b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            throw new RuntimeException("Unable to create ClassLoader", ex);
483b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        }
493b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project    }
5014da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann
5114da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann    /**
5214da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * Implementation for Dalvik. Uses the DexClassLoader, so we can write
5314da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * temporary DEX files to a special directory. We don't want to spoil the
5414da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * system's DEX cache with our files. Also, we might not have write access
5514da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * to the system's DEX cache at all (which is the case when we're running
5614da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * CTS).
5714da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     */
58c44aef5337e92f9a7b871356d217fee67547f8c8Jorg Pleumann    static class Dalvik extends Support_ClassLoader {
5914da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann
6014da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann        private static File tmp;
6114da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann
6214da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann        static {
6314da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann            tmp = new File(System.getProperty("java.io.tmpdir"), "dex-cache");
6414da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann            tmp.mkdirs();
6514da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann        }
6614da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann
6714da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann        @Override
683b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        public ClassLoader getClassLoader(URL url, ClassLoader parent) {
6914da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann            return new DexClassLoader(url.getPath(), tmp.getAbsolutePath(),
7014da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann                    null, parent);
713b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        }
723b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project    }
733b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project
7414da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann    /**
7514da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * Implementation for the reference implementation. Nothing interesting to
7614da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     * see here. Please get along.
7714da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann     */
78c44aef5337e92f9a7b871356d217fee67547f8c8Jorg Pleumann    static class RefImpl extends Support_ClassLoader {
7914da4ccdd69d8db7cef00b2ae5aabd32b6e1bdb4Jorg Pleumann        @Override
803b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        public ClassLoader getClassLoader(URL url, ClassLoader parent) {
813b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project            return new URLClassLoader(new URL[] { url }, parent);
823b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project        }
833b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project    }
843b5fe2883109da9470a8baf20e6700aba0d78193The Android Open Source Project}
85