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