12cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom/* 22cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Copyright (C) 2007 The Android Open Source Project 32cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 42cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 52cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * you may not use this file except in compliance with the License. 62cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * You may obtain a copy of the License at 72cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 82cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 92cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 102cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 112cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 122cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * See the License for the specific language governing permissions and 142cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * limitations under the License. 152cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 162cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 172cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrompackage java.lang; 182cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 192ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.io.File; 202ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.io.IOException; 212cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.net.URL; 222ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport java.net.URLStreamHandler; 232cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.util.ArrayList; 242cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromimport java.util.List; 252ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fullerimport libcore.io.ClassPathURLStreamHandler; 262cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 272cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstromclass VMClassLoader { 282cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 292ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller private static final ClassPathURLStreamHandler[] bootClassPathUrlHandlers; 302ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller static { 312ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller bootClassPathUrlHandlers = createBootClassPathUrlHandlers(); 322ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller } 332ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller 342ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller /** 352ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * Creates an array of ClassPathURLStreamHandler objects for handling resource loading from 362ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * the boot classpath. 372ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller */ 382ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller private static ClassPathURLStreamHandler[] createBootClassPathUrlHandlers() { 392ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller String[] bootClassPathEntries = getBootClassPathEntries(); 402ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller ArrayList<String> zipFileUris = new ArrayList<String>(bootClassPathEntries.length); 412ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller ArrayList<URLStreamHandler> urlStreamHandlers = 422ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller new ArrayList<URLStreamHandler>(bootClassPathEntries.length); 432ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller for (String bootClassPathEntry : bootClassPathEntries) { 442ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller try { 452ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller String entryUri = new File(bootClassPathEntry).toURI().toString(); 462ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller 472ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller // We assume all entries are zip or jar files. 482ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller URLStreamHandler urlStreamHandler = 492ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller new ClassPathURLStreamHandler(bootClassPathEntry); 502ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller zipFileUris.add(entryUri); 512ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller urlStreamHandlers.add(urlStreamHandler); 522ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller } catch (IOException e) { 532ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller // Skip it 542ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller System.logE("Unable to open boot classpath entry: " + bootClassPathEntry, e); 552ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller } 562ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller } 572ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller return urlStreamHandlers.toArray(new ClassPathURLStreamHandler[urlStreamHandlers.size()]); 582ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller } 592ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller 602cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 612cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Get a resource from a file in the bootstrap class path. 622cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * 632ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * We assume that the bootclasspath can't change once the VM has started. 642ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller * This assumption seems to be supported by the spec. 652cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 662cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom static URL getResource(String name) { 672ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller for (ClassPathURLStreamHandler urlHandler : bootClassPathUrlHandlers) { 682ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller URL url = urlHandler.getEntryUrlOrNull(name); 692ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller if (url != null) { 702ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller return url; 712cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 722cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 732cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return null; 742cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 752cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 762cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /* 772cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Get an enumeration with all matching resources. 782cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 792cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom static List<URL> getResources(String name) { 802cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom ArrayList<URL> list = new ArrayList<URL>(); 812ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller for (ClassPathURLStreamHandler urlHandler : bootClassPathUrlHandlers) { 822ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller URL url = urlHandler.getEntryUrlOrNull(name); 832ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller if (url != null) { 842ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller list.add(url); 852cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 862cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 872cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom return list; 882cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom } 892cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 902cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom native static Class findLoadedClass(ClassLoader cl, String name); 912cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom 922cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom /** 932cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom * Boot class path manipulation, for getResources(). 942cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom */ 952ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller native private static String[] getBootClassPathEntries(); 962ce899fcb81707dd5447a15c29c2c137697f2f5eNeil Fuller 972cf03dc15c40b92634ff606694af5a6e9aa4db09Brian Carlstrom} 98