X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=libjava%2Fjava%2Flang%2FClassLoader.java;fp=libjava%2Fjava%2Flang%2FClassLoader.java;h=0000000000000000000000000000000000000000;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=32351d84040a251b5ed697d3a81f886d0dce179d;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java deleted file mode 100644 index 32351d84..00000000 --- a/libjava/java/lang/ClassLoader.java +++ /dev/null @@ -1,580 +0,0 @@ -// ClassLoader.java - Define policies for loading Java classes. - -/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -package java.lang; - -import java.io.InputStream; -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; -import java.security.AllPermission; -import java.security.CodeSource; -import java.security.Permission; -import java.security.Permissions; -import java.security.Policy; -import java.security.ProtectionDomain; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Stack; - -/** - * The class ClassLoader is intended to be subclassed by - * applications in order to describe new ways of loading classes, - * such as over the network. - * - * @author Kresten Krab Thorup - */ - -public abstract class ClassLoader -{ - private ClassLoader parent; - private HashMap definedPackages = new HashMap(); - - public final ClassLoader getParent () - { - /* FIXME: security */ - return parent; - } - - public static ClassLoader getSystemClassLoader () - { - return gnu.gcj.runtime.VMClassLoader.instance; - } - - /** - * Creates a ClassLoader with no parent. - * @exception java.lang.SecurityException if not allowed - */ - protected ClassLoader() - { - this (null); - } - - /** - * Creates a ClassLoader with the given parent. - * The parent may be null. - * The only thing this - * constructor does, is to call - * checkCreateClassLoader on the current - * security manager. - * @exception java.lang.SecurityException if not allowed - * @since 1.2 - */ - protected ClassLoader(ClassLoader parent) - { - SecurityManager security = System.getSecurityManager (); - if (security != null) - security.checkCreateClassLoader (); - this.parent = parent; - } - - /** - * Loads and link the class by the given name. - * @param name the name of the class. - * @return the class loaded. - * @see ClassLoader#loadClass(String,boolean) - * @exception java.lang.ClassNotFoundException - */ - public Class loadClass(String name) - throws java.lang.ClassNotFoundException - { - return loadClass (name, false); - } - - /** - * Loads the class by the given name. The default implementation - * will search for the class in the following order (similar to jdk 1.2) - * - * If link is true, resolveClass is then - * called.

Normally, this need not be overridden; override - * findClass instead. - * @param name the name of the class. - * @param link if the class should be linked. - * @return the class loaded. - * @exception java.lang.ClassNotFoundException - * @deprecated - */ - protected Class loadClass(String name, boolean link) - throws java.lang.ClassNotFoundException - { - Class c = findLoadedClass (name); - - if (c == null) - { - try { - if (parent != null) - return parent.loadClass (name, link); - else - c = gnu.gcj.runtime.VMClassLoader.instance.findClass (name); - } catch (ClassNotFoundException ex) { - /* ignore, we'll try findClass */; - } - } - - if (c == null) - c = findClass (name); - - if (c == null) - throw new ClassNotFoundException (name); - - if (link) - resolveClass (c); - - return c; - } - - /** Find a class. This should be overridden by subclasses; the - * default implementation throws ClassNotFoundException. - * - * @param name Name of the class to find. - * @return The class found. - * @exception java.lang.ClassNotFoundException - * @since 1.2 - */ - protected Class findClass (String name) - throws ClassNotFoundException - { - throw new ClassNotFoundException (name); - } - - // Protection Domain definitions - // FIXME: should there be a special protection domain used for native code? - - // The permission required to check what a classes protection domain is. - static final Permission protectionDomainPermission - = new RuntimePermission("getProtectionDomain"); - // The protection domain returned if we cannot determine it. - static ProtectionDomain unknownProtectionDomain; - // Protection domain to use when a class is defined without one specified. - static ProtectionDomain defaultProtectionDomain; - - static - { - Permissions permissions = new Permissions(); - permissions.add(new AllPermission()); - unknownProtectionDomain = new ProtectionDomain(null, permissions); - - CodeSource cs = new CodeSource(null, null); - defaultProtectionDomain = - new ProtectionDomain(cs, Policy.getPolicy().getPermissions(cs)); - } - - /** - * Defines a class, given the class-data. According to the JVM, this - * method should not be used; instead use the variant of this method - * in which the name of the class being defined is specified - * explicitly. - *

- * If the name of the class, as specified (implicitly) in the class - * data, denotes a class which has already been loaded by this class - * loader, an instance of - * java.lang.ClassNotFoundException will be thrown. - * - * @param data bytes in class file format. - * @param off offset to start interpreting data. - * @param len length of data in class file. - * @return the class defined. - * @exception java.lang.ClassNotFoundException - * @exception java.lang.LinkageError - * @see ClassLoader#defineClass(String,byte[],int,int) */ - protected final Class defineClass(byte[] data, int off, int len) - throws ClassFormatError - { - return defineClass (null, data, off, len, defaultProtectionDomain); - } - - protected final Class defineClass(String name, byte[] data, int off, int len) - throws ClassFormatError - { - return defineClass (name, data, off, len, defaultProtectionDomain); - } - - /** - * Defines a class, given the class-data. This is preferable - * over defineClass(byte[],off,len) since it is more - * secure. If the expected name does not match that of the class - * file, ClassNotFoundException is thrown. If - * name denotes the name of an already loaded class, a - * LinkageError is thrown. - *

- * - * FIXME: How do we assure that the class-file data is not being - * modified, simultaneously with the class loader running!? If this - * was done in some very clever way, it might break security. - * Right now I am thinking that defineclass should make sure never to - * read an element of this array more than once, and that that would - * assure the ``immutable'' appearance. It is still to be determined - * if this is in fact how defineClass operates. - * - * @param name the expected name. - * @param data bytes in class file format. - * @param off offset to start interpreting data. - * @param len length of data in class file. - * @param protectionDomain security protection domain for the class. - * @return the class defined. - * @exception java.lang.ClassNotFoundException - * @exception java.lang.LinkageError - */ - protected final synchronized Class defineClass(String name, - byte[] data, - int off, - int len, - ProtectionDomain protectionDomain) - throws ClassFormatError - { - if (data==null || data.length < off+len || off<0 || len<0) - throw new ClassFormatError ("arguments to defineClass " - + "are meaningless"); - - // as per 5.3.5.1 - if (name != null && findLoadedClass (name) != null) - throw new java.lang.LinkageError ("class " - + name - + " already loaded"); - - if (protectionDomain == null) - protectionDomain = defaultProtectionDomain; - - try { - // Since we're calling into native code here, - // we better make sure that any generated - // exception is to spec! - - return defineClass0 (name, data, off, len, protectionDomain); - - } catch (LinkageError x) { - throw x; // rethrow - - } catch (java.lang.VirtualMachineError x) { - throw x; // rethrow - - } catch (java.lang.Throwable x) { - // This should never happen, or we are beyond spec. - - throw new InternalError ("Unexpected exception " - + "while defining class " - + name + ": " - + x.toString ()); - } - } - - /** This is the entry point of defineClass into the native code */ - private native Class defineClass0 (String name, - byte[] data, - int off, - int len, - ProtectionDomain protectionDomain) - throws ClassFormatError; - - /** - * Link the given class. This will bring the class to a state where - * the class initializer can be run. Linking involves the following - * steps: - *

- * For gcj-compiled classes, only the first step is - * performed. The compiler will have done the rest already. - *

- * This is called by the system automatically, - * as part of class initialization; there is no reason to ever call - * this method directly. - *

- * For historical reasons, this method has a name which is easily - * misunderstood. Java classes are never ``resolved''. Classes are - * linked; whereas method and field references are resolved. - * - * @param clazz the class to link. - * @exception java.lang.LinkageError - */ - protected final void resolveClass(Class clazz) - { - resolveClass0(clazz); - } - - static void resolveClass0(Class clazz) - { - synchronized (clazz) - { - try { - linkClass0 (clazz); - } catch (Throwable x) { - markClassErrorState0 (clazz); - - if (x instanceof Error) - throw (Error)x; - else - throw new java.lang.InternalError - ("unexpected exception during linking: " + x); - } - } - } - - /** Internal method. Calls _Jv_PrepareClass and - * _Jv_PrepareCompiledClass. This is only called from resolveClass. */ - private static native void linkClass0(Class clazz); - - /** Internal method. Marks the given clazz to be in an erroneous - * state, and calls notifyAll() on the class object. This should only - * be called when the caller has the lock on the class object. */ - private static native void markClassErrorState0(Class clazz); - - /** - * Defines a new package and creates a Package object. - * The package should be defined before any class in the package is - * defined with defineClass(). The package should not yet - * be defined before in this classloader or in one of its parents (which - * means that getPackage() should return null). - * All parameters except the name of the package may be - * null. - *

- * Subclasses should call this method from their findClass() - * implementation before calling defineClass() on a Class - * in a not yet defined Package (which can be checked by calling - * getPackage()). - * - * @param name The name of the Package - * @param specTitle The name of the specification - * @param specVendor The name of the specification designer - * @param specVersion The version of this specification - * @param implTitle The name of the implementation - * @param implVendor The vendor that wrote this implementation - * @param implVersion The version of this implementation - * @param sealed If sealed the origin of the package classes - * @return the Package object for the specified package - * - * @exception IllegalArgumentException if the package name is null or if - * it was already defined by this classloader or one of its parents. - * - * @see Package - * @since 1.2 - */ - protected Package definePackage(String name, - String specTitle, String specVendor, - String specVersion, String implTitle, - String implVendor, String implVersion, - URL sealed) - { - if (getPackage(name) != null) - throw new IllegalArgumentException("Package " + name - + " already defined"); - Package p = new Package(name, - specTitle, specVendor, specVersion, - implTitle, implVendor, implVersion, - sealed); - synchronized (definedPackages) - { - definedPackages.put(name, p); - } - return p; - } - - /** - * Returns the Package object for the requested package name. It returns - * null when the package is not defined by this classloader or one of its - * parents. - * - * @since 1.2 - */ - protected Package getPackage(String name) - { - Package p; - if (parent == null) - // XXX - Should we use the bootstrap classloader? - p = null; - else - p = parent.getPackage(name); - - if (p == null) - { - synchronized (definedPackages) - { - p = (Package) definedPackages.get(name); - } - } - - return p; - } - - /** - * Returns all Package objects defined by this classloader and its parents. - * - * @since 1.2 - */ - protected Package[] getPackages() - { - Package[] allPackages; - - // Get all our packages. - Package[] packages; - synchronized(definedPackages) - { - packages = new Package[definedPackages.size()]; - definedPackages.values().toArray(packages); - } - - // If we have a parent get all packages defined by our parents. - if (parent != null) - { - Package[] parentPackages = parent.getPackages(); - allPackages = new Package[parentPackages.length + packages.length]; - System.arraycopy(parentPackages, 0, allPackages, 0, - parentPackages.length); - System.arraycopy(packages, 0, allPackages, parentPackages.length, - packages.length); - } - else - // XXX - Should we use the bootstrap classloader? - allPackages = packages; - - return allPackages; - } - - /** - * Returns a class found in a system-specific way, typically - * via the java.class.path system property. Loads the - * class if necessary. - * - * @param name the class to resolve. - * @return the class loaded. - * @exception java.lang.LinkageError - * @exception java.lang.ClassNotFoundException - */ - protected final Class findSystemClass(String name) - throws java.lang.ClassNotFoundException - { - return gnu.gcj.runtime.VMClassLoader.instance.loadClass (name); - } - - /* - * Does currently nothing. FIXME. - */ - protected final void setSigners(Class claz, Object[] signers) { - /* claz.setSigners (signers); */ - } - - /** - * If a class named name was previously loaded using - * this ClassLoader, then it is returned. Otherwise - * it returns null. (Unlike the JDK this is native, - * since we implement the class table internally.) - * @param name class to find. - * @return the class loaded, or null. - */ - protected final native Class findLoadedClass(String name); - - public static InputStream getSystemResourceAsStream(String name) { - return getSystemClassLoader().getResourceAsStream (name); - } - - public static URL getSystemResource(String name) { - return getSystemClassLoader().getResource (name); - } - - /** - * Return an InputStream representing the resource name. - * This is essentially like - * getResource(name).openStream(), except - * it masks out any IOException and returns null on failure. - * @param name resource to load - * @return an InputStream, or null - * @see java.lang.ClassLoader#getResource(String) - * @see java.io.InputStream - */ - public InputStream getResourceAsStream(String name) - { - try { - URL res = getResource (name); - if (res == null) return null; - return res.openStream (); - } catch (java.io.IOException x) { - return null; - } - } - - /** - * Return an java.io.URL representing the resouce name. - * The default implementation just returns null. - * @param name resource to load - * @return a URL, or null if there is no such resource. - * @see java.lang.ClassLoader#getResourceAsBytes(String) - * @see java.lang.ClassLoader#getResourceAsStream(String) - * @see java.io.URL - */ - public URL getResource (String name) - { - // The rules say search the parent class if non-null, - // otherwise search the built-in class loader (assumed to be - // the system ClassLoader). If not found, call - // findResource(). - URL result = null; - - ClassLoader delegate = parent; - - if (delegate == null) - delegate = getSystemClassLoader (); - - // Protect ourselves from looping. - if (this != delegate) - result = delegate.getResource (name); - - if (result != null) - return result; - else - return findResource (name); - } - - protected URL findResource (String name) - { - // Default to returning null. Derived classes implement this. - return null; - } - - public final Enumeration getResources (String name) throws IOException - { - // The rules say search the parent class if non-null, - // otherwise search the built-in class loader (assumed to be - // the system ClassLoader). If not found, call - // findResource(). - Enumeration result = null; - - ClassLoader delegate = parent; - - if (delegate == null) - delegate = getSystemClassLoader (); - - // Protect ourselves from looping. - if (this != delegate) - result = delegate.getResources (name); - - if (result != null) - return result; - else - return findResources (name); - } - - protected Enumeration findResources (String name) throws IOException - { - // Default to returning null. Derived classes implement this. - return null; - } -}