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