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