Logo
Distributed Genetic Programming Framework
print print

File org.sfc.code.BasicClassLoader.java

Here you can find all the information about the file org.sfc.code.BasicClassLoader.java. You may explore it here or download it onto your local disk.
/*
 * Copyright (c) 2006 Thomas Weise
 * 
 * E-Mail           : tweise@gmx.de
 * Creation Date    : 2006-06-14 06:58:31
 * Original Filename: org.sfc.code.BasicClassLoader.java
 * Version          : 1.0.2
 * Last modification: 2006-06-22
 *                by: Thomas Weise
 * 
 * License          : GNU LESSER GENERAL PUBLIC LICENSE
 *                    Version 2.1, February 1999
 *                    You should have received a copy of this license along
 *                    with this library; if not, write to the Free Software
 *                    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *                    MA 02111-1307, USA or download the license under
 *                    http://www.gnu.org/copyleft/lesser.html.
 *                    
 * Warranty         : This software is provided "as is" without any
 *                    warranty; without even the implied warranty of
 *                    merchantability or fitness for a particular purpose.
 *                    See the Gnu Lesser General Public License for more
 *                    details.
 */

 
package org.sfc.code;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessController;
import java.security.CodeSource;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.util.Enumeration;
import java.util.jar.Manifest;

import org.sfc.collections.ArrayIterator;
import org.sfc.utils.ClassContext;
import org.sfc.utils.Typesafe;

/**
 * The basic, internally used class loader.
 * 
 * @param <OT>  The owner type.
 * 
 * @author Thomas Weise
 */

class BasicClassLoader<OT extends CodeSession> extends URLClassLoader
  {
/**
 * The empty urls.
 */

  private static final URL[] EMPTY = new URL[0];
/**
 * The owning code session.
 */

                 final OT    m_owner ;
  
/**
 * Create a new basic class loader.
 * @param p_owner The owning code session.
 */

  BasicClassLoader(final OT p_owner)
    {
    super(EMPTY, get_default_class_loader());
    this.m_owner = p_owner;
    }
  
/**
 * Obtain the default class loader to delegate to.
 * @return The default class loader to delegate to.
 */

  private static  final ClassLoader get_default_class_loader()
    {
    return AccessController.doPrivileged(
        new PrivilegedAction<ClassLoader>()
          {
          public  final ClassLoader run()
            {
            ClassContext l_cc;
            int          l_i, l_j;
            ClassLoader  l_o, l_n, l_q;
            
            l_cc = Typesafe.get_class_context();
            l_j  = l_cc.size();
            l_o  = l_cc.get(0).getClassLoader();
            if(l_o == null) l_o = ClassLoader.getSystemClassLoader();
            
            for(l_i = 6; l_i < l_j; l_i++)
              {
              l_n = l_cc.get(l_i).getClassLoader();
              if( (l_n != l_o) && (l_n != null) )
                {
                l_o = l_n;
                break;
                }
              }
            
            for(++l_i; l_i < l_j; l_i++)
              {
              l_n = l_cc.get(l_i).getClassLoader();
              if(l_n != null)
                {
                for(l_q = l_n.getParent(); l_q != null; l_q = l_q.getParent())
                  {
                  if(l_q == l_o)
                    {
                    l_o = l_n;
                    break;
                    }
                  }
                }
              }
            
            
            return l_o;
            }
          }
      );   
    
    }
  
/**
 * Loads the class with the specified binary name.  
 *
 * @param  p_name  The <a href="#name">binary name</a> of the class.
 *
 * @param  p_resolve   If <tt>true</tt> then resolve the class.
 *
 * @return  The resulting <tt>Class</tt> object
 *
 * @throws  ClassNotFoundException
 *          If the class could not be found
 */

  @Override
  protected Class<?> loadClass(final String  p_name,
                               final boolean p_resolve)
                                            throws ClassNotFoundException
    {
    Class<?> l_c;
    
    l_c = this.m_owner.get_class_mapping(p_name);
    if(l_c != null)
      {
      if(l_c == CodeSession.BCLASS)
        {
        throw new ClassNotFoundException(p_name);
        }
      return l_c;
      }
    
    return super.loadClass(p_name, p_resolve);
    }
  
/**
 * Finds the resource with the given name.  A resource is some data
 * (images, audio, text, etc) that can be accessed by class code in a way
 * that is independent of the location of the code.
 *
 * <p> The name of a resource is a '<tt>/</tt>'-separated path name that
 * identifies the resource.
 *
 * <p> This method will first search the parent class loader for the
 * resource; if the parent is <tt>null</tt> the path of the class loader
 * built-in to the virtual machine is searched.  That failing, this method
 * will invoke {@link #findResource(String)} to find the resource.  </p>
 *
 * @param  p_name
 *         The resource name
 *
 * @return  A <tt>URL</tt> object for reading the resource, or
 *          <tt>null</tt> if the resource could not be found or the invoker
 *          doesn't have adequate  privileges to get the resource.
 *
 * @since  1.1
 */

  @Override
  public  URL getResource(final String p_name)
    {
    URL l_u;
    
    l_u = this.m_owner.get_resource_mapping(p_name);
    if(l_u != null)
      {
      if(l_u == CodeSession.BURL) return null;
      return l_u;
      }
    
    return super.getResource(p_name);
    }
  
/**
 * Finds all the resources with the given name. A resource is some data
 * (images, audio, text, etc) that can be accessed by class code in a way
 * that is independent of the location of the code.
 *
 * <p>The name of a resource is a <tt>/</tt>-separated path name that
 * identifies the resource.
 *
 * <p> The search order is described in the documentation for {@link
 * #getResource(String)}.  </p>
 *
 * @param  p_name
 *         The resource name
 *
 * @return  An enumeration of {@link java.net.URL <tt>URL</tt>} objects for
 *          the resource.  If no resources could  be found, the enumeration
 *          will be empty.  Resources that the class loader doesn't have
 *          access to will not be in the enumeration.
 *
 * @throws  IOException
 *          If I/O errors occur
 *
 * @see  #findResources(String)
 */

  @Override
  public  Enumeration<URL> getResources(final String p_name)
                                       throws IOException
    {
    URL l_u;
    
    l_u = this.m_owner.get_resource_mapping(p_name);    
    if(l_u != null)
      {      
      if(l_u != CodeSession.BURL)
        {
        return new ArrayIterator<URL>(new URL[] {l_u});
        }
      return CodeSession.EUE;
      }
    
    return super.getResources(p_name);
    }
  
  
/**
 * Returns an Enumeration of URLs representing all of the resources
 * on the URL search path having the specified name.
 *
 * @param p_name the resource name
 * @return an <code>Enumeration</code> of <code>URL</code>s
 * 
 * @throws  IOException If I/O errors occur.
 */

  final Enumeration<URL> old_find_resources(final String p_name)
                                    throws IOException
    {
    return super.findResources(p_name);
    }
  
/**
 * Add the specified url to the classpath.
 * @param p_url The url to be added.
 */

  final void  add_url (final URL p_url)
    {
    this.addURL(p_url);
    }
  
  
/**
 * Converts an array of bytes into an instance of class Class,
 * with an optional CodeSource. Before the
 * class can be used it must be resolved.
 * <p>
 * If a non-null CodeSource is supplied a ProtectionDomain is
 * constructed and associated with the class being defined.
 * <p>
 * @param      p_name the expected name of the class, or <code>null</code>
 *                  if not known, using '.' and not '/' as the separator
 *                  and without a trailing ".class" suffix.
 * @param      p_b    the bytes that make up the class data. The bytes in 
 *             positions <code>off</code> through <code>off+len-1</code> 
 *             should have the format of a valid class file as defined 
 *             by the 
 *             <a href="http://java.sun.com/docs/books/vmspec/">Java 
 *             Virtual Machine Specification</a>.
 * @param      p_off  the start offset in <code>b</code> of the class data
 * @param      p_len  the length of the class data
 * @param      p_cs   the associated CodeSource, or <code>null</code> if none
 * @return the <code>Class</code> object created from the data,
 *         and optional CodeSource.
 * @exception  ClassFormatError if the data did not contain a valid class
 * @exception  IndexOutOfBoundsException if either <code>off</code> or 
 *             <code>len</code> is negative, or if 
 *             <code>off+len</code> is greater than <code>b.length</code>.
 *
 * @exception  SecurityException if an attempt is made to add this class
 *             to a package that contains classes that were signed by
 *             a different set of certificates than this class, or if 
 *             the class name begins with "java.".
 */

  final Class<?> define_class(final String     p_name,
                              final byte[]     p_b,
                              final int        p_off,
                              final int        p_len,
                              final CodeSource p_cs)
    {
    return defineClass(p_name, p_b, p_off, p_len, p_cs);
    }

/**
 * Converts a {@link java.nio.ByteBuffer <tt>ByteBuffer</tt>}
 * into an instance of class <tt>Class</tt>, with an optional CodeSource. 
 * Before the class can be used it must be resolved.
 * <p>
 * If a non-null CodeSource is supplied a ProtectionDomain is
 * constructed and associated with the class being defined.
 * <p>
 * @param      p_name the expected name of the class, or <code>null</code>
 *                  if not known, using '.' and not '/' as the separator
 *                  and without a trailing ".class" suffix.
 * @param      p_b    the bytes that make up the class data.  The bytes from positions
 *                  <tt>b.position()</tt> through <tt>b.position() + b.limit() -1</tt>
 *                  should have the format of a valid class file as defined by the
 *                  <a href="http://java.sun.com/docs/books/vmspec/">Java Virtual
 *                  Machine Specification</a>.
 * @param      p_cs   the associated CodeSource, or <code>null</code> if none
 * @return the <code>Class</code> object created from the data,
 *         and optional CodeSource.
 * @exception  ClassFormatError if the data did not contain a valid class
 * @exception  SecurityException if an attempt is made to add this class
 *             to a package that contains classes that were signed by
 *             a different set of certificates than this class, or if 
 *             the class name begins with "java.".
 */

  final Class<?> define_class(final String               p_name,
                              final java.nio.ByteBuffer  p_b,
                              final CodeSource           p_cs)
    {
    return this.defineClass(p_name, p_b, p_cs);
    }
  
/**
 * Converts a {@link java.nio.ByteBuffer <tt>ByteBuffer</tt>}
 * into an instance of class <tt>Class</tt>,
 * with an optional <tt>ProtectionDomain</tt>.  If the domain is
 * <tt>null</tt>, then a default domain will be assigned to the class as
 * specified in the documentation for {@link #defineClass(String, byte[],
 * int, int)}.  Before the class can be used it must be resolved.
 *
 * <p>The rules about the first class defined in a package determining the set of
 * certificates for the package, and the restrictions on class names are identical
 * to those specified in the documentation for {@link #defineClass(String, byte[],
 * int, int, ProtectionDomain)}.
 *
 * <p> An invocation of this method of the form
 * <i>cl</i><tt>.defineClass(</tt><i>name</i><tt>,</tt>
 * <i>bBuffer</i><tt>,</tt> <i>pd</i><tt>)</tt> yields exactly the same
 * result as the statements
 *
 * <blockquote><tt>
 * ...<br>
 * byte[] temp = new byte[</tt><i>bBuffer</i><tt>.java.nio.ByteBuffer#remaining
 * remaining()];<br>
 *     </tt><i>bBuffer</i><tt>.{@link java.nio.ByteBuffer#get(byte[])
 * get}(temp);<br>
 *     return {@link #defineClass(String, byte[], int, int, ProtectionDomain)
 * </tt><i>cl</i><tt>.defineClass}(</tt><i>name</i><tt>, temp, 0, temp.length, </tt><i>pd</i><tt>);<br>
 * </tt></blockquote>
 *
 * @param  p_name
 *         The expected <a href="#name">binary name</a. of the class, or
 *         <tt>null</tt> if not known
 *
 * @param  p_b
 *         The bytes that make up the class data. The bytes from positions
 *         <tt>b.position()</tt> through <tt>b.position() + b.limit() -1 </tt>
 *         should have the format of a valid class file as defined by the <a
 *         href="http://java.sun.com/docs/books/vmspec/">Java Virtual
 *         Machine Specification</a>.
 *
 * @param  p_protection_domain
 *         The ProtectionDomain of the class, or <tt>null</tt>.
 *
 * @return  The <tt>Class</tt> object created from the data,
 *          and optional <tt>ProtectionDomain</tt>.
 *
 * @throws  ClassFormatError
 *          If the data did not contain a valid class.
 *
 * @throws  NoClassDefFoundError
 *          If <tt>name</tt> is not equal to the <a href="#name">binary
 *          name</a> of the class specified by <tt>b</tt>
 *
 * @throws  SecurityException
 *          If an attempt is made to add this class to a package that
 *          contains classes that were signed by a different set of
 *          certificates than this class, or if <tt>name</tt> begins with
 *          "<tt>java.</tt>".
 *
 * @see      #defineClass(String, byte[], int, int, ProtectionDomain)
 */

  final Class<?> define_class(final String              p_name,
                              final java.nio.ByteBuffer p_b,
                              final ProtectionDomain    p_protection_domain)
    {
    return this.defineClass(p_name, p_b, p_protection_domain);
    }
  
  
/**
 * Converts an array of bytes into an instance of class <tt>Class</tt>.
 * Before the <tt>Class</tt> can be used it must be resolved.
 *
 * <p> This method assigns a default {@link java.security.ProtectionDomain
 * <tt>ProtectionDomain</tt>} to the newly defined class.  The
 * <tt>ProtectionDomain</tt> is effectively granted the same set of
 * permissions returned when {@link
 * java.security.Policy#getPermissions(java.security.CodeSource)
 * <tt>Policy.getPolicy().getPermissions(new CodeSource(null, null))</tt>}
 * is invoked.  The default domain is created on the first invocation of
 * {@link #defineClass(String, byte[], int, int) <tt>defineClass</tt>},
 * and re-used on subsequent invocations.
 *
 * <p> To assign a specific <tt>ProtectionDomain</tt> to the class, use
 * the {@link #defineClass(String, byte[], int, int,
 * java.security.ProtectionDomain) <tt>defineClass</tt>} method that takes a
 * <tt>ProtectionDomain</tt> as one of its arguments.  </p>
 *
 * @param  p_name
 *         The expected <a href="#name">binary name</a> of the class, or
 *         <tt>null</tt> if not known
 *
 * @param  p_b
 *         The bytes that make up the class data.  The bytes in positions
 *         <tt>off</tt> through <tt>off+len-1</tt> should have the format
 *         of a valid class file as defined by the <a
 *         href="http://java.sun.com/docs/books/vmspec/">Java Virtual
 *         Machine Specification</a>.
 *
 * @param  p_off
 *         The start offset in <tt>b</tt> of the class data
 *
 * @param  p_len
 *         The length of the class data
 *
 * @return  The <tt>Class</tt> object that was created from the specified
 *          class data.
 *
 * @throws  ClassFormatError
 *          If the data did not contain a valid class
 *
 * @throws  IndexOutOfBoundsException
 *          If either <tt>off</tt> or <tt>len</tt> is negative, or if
 *          <tt>off+len</tt> is greater than <tt>b.length</tt>.
 *
 * @throws  SecurityException
 *          If an attempt is made to add this class to a package that
 *          contains classes that were signed by a different set of
 *          certificates than this class (which is unsigned), or if
 *          <tt>name</tt> begins with "<tt>java.</tt>".
 *
 * @see  #loadClass(String, boolean)
 * @see  #resolveClass(Class)
 * @see  java.security.CodeSource
 * @see  java.security.SecureClassLoader
 */

  final Class<?> define_class(final String p_name,
                              final byte[] p_b,
                              final int    p_off,
                              final int    p_len)
  throws ClassFormatError
    {
    return this.defineClass(p_name, p_b, p_off, p_len);
    }
  
/**
 * Converts an array of bytes into an instance of class <tt>Class</tt>,
 * with an optional <tt>ProtectionDomain</tt>.  If the domain is
 * <tt>null</tt>, then a default domain will be assigned to the class as
 * specified in the documentation for {@link #defineClass(String, byte[],
 * int, int)}.  Before the class can be used it must be resolved.
 *
 * <p> The first class defined in a package determines the exact set of
 * certificates that all subsequent classes defined in that package must
 * contain.  The set of certificates for a class is obtained from the
 * {@link java.security.CodeSource <tt>CodeSource</tt>} within the
 * <tt>ProtectionDomain</tt> of the class.  Any classes added to that
 * package must contain the same set of certificates or a
 * <tt>SecurityException</tt> will be thrown.  Note that if
 * <tt>name</tt> is <tt>null</tt>, this check is not performed.
 * You should always pass in the <a href="#name">binary name</a> of the
 * class you are defining as well as the bytes.  This ensures that the
 * class you are defining is indeed the class you think it is.
 *
 * <p> The specified <tt>name</tt> cannot begin with "<tt>java.</tt>", since
 * all classes in the "<tt>java.*</tt> packages can only be defined by the
 * bootstrap class loader.  If <tt>name</tt> is not <tt>null</tt>, it
 * must be equal to the <a href="#name">binary name</a> of the class
 * specified by the byte array "<tt>b</tt>", otherwise a 
 * <tt>NoClassDefFoundError</tt> will be thrown.  </p>
 *
 * @param  p_name
 *         The expected <a href="#name">binary name</a> of the class, or
 *         <tt>null</tt> if not known
 *
 * @param  p_b
 *         The bytes that make up the class data. The bytes in positions
 *         <tt>off</tt> through <tt>off+len-1</tt> should have the format
 *         of a valid class file as defined by the <a
 *         href="http://java.sun.com/docs/books/vmspec/">Java Virtual
 *         Machine Specification</a>.
 *
 * @param  p_off
 *         The start offset in <tt>b</tt> of the class data
 *
 * @param  p_len
 *         The length of the class data
 *
 * @param  p_protection_domain
 *         The ProtectionDomain of the class
 *
 * @return  The <tt>Class</tt> object created from the data,
 *          and optional <tt>ProtectionDomain</tt>.
 *
 * @throws  ClassFormatError
 *          If the data did not contain a valid class
 *
 * @throws  NoClassDefFoundError
 *          If <tt>name</tt> is not equal to the <a href="#name">binary
 *          name</a> of the class specified by <tt>b</tt>
 *
 * @throws  IndexOutOfBoundsException
 *          If either <tt>off</tt> or <tt>len</tt> is negative, or if
 *          <tt>off+len</tt> is greater than <tt>b.length</tt>.
 *
 * @throws  SecurityException
 *          If an attempt is made to add this class to a package that
 *          contains classes that were signed by a different set of
 *          certificates than this class, or if <tt>name</tt> begins with
 *          "<tt>java.</tt>".
 */

  final Class<?> define_class(final String           p_name,
                              final byte[]           p_b,
                              final int              p_off,
                              final int              p_len,
                              final ProtectionDomain p_protection_domain)
  throws ClassFormatError
    {
    return this.defineClass(p_name, p_b, p_off, p_len, p_protection_domain);
    }
  
  
/**
 * Defines a package by name in this <tt>ClassLoader</tt>.  This allows
 * class loaders to define the packages for their classes. Packages must
 * be created before the class is defined, and package names must be
 * unique within a class loader and cannot be redefined or changed once
 * created.  </p>
 *
 * @param  p_name
 *         The package name
 *
 * @param  p_spec_title
 *         The specification title
 *
 * @param  p_spec_version
 *         The specification version
 *
 * @param  p_spec_vendor
 *         The specification vendor
 *
 * @param  p_impl_title
 *         The implementation title
 *
 * @param  p_impl_version
 *         The implementation version
 *
 * @param  p_impl_vendor
 *         The implementation vendor
 *
 * @param  p_seal_base
 *         If not <tt>null</tt>, then this package is sealed with
 *         respect to the given code source {@link java.net.URL
 *         <tt>URL</tt>}  object.  Otherwise, the package is not sealed.
 *
 * @return  The newly defined <tt>Package</tt> object
 *
 * @throws  IllegalArgumentException
 *          If package name duplicates an existing package either in this
 *          class loader or one of its ancestors
 */

  final Package define_package(final String p_name,
                               final String p_spec_title,
                               final String p_spec_version,
                               final String p_spec_vendor,
                               final String p_impl_title,
                               final String p_impl_version,
                               final String p_impl_vendor,
                               final URL    p_seal_base)
    throws IllegalArgumentException
    {
    return this.definePackage(p_name, p_spec_title, p_spec_version,
                              p_spec_vendor, p_impl_title, p_impl_version,
                              p_impl_vendor, p_seal_base);
    }
  
  
/**
 * Defines a new package by name in this ClassLoader. The attributes
 * contained in the specified Manifest will be used to obtain package
 * version and sealing information. For sealed packages, the additional
 * URL specifies the code source URL from which the package was loaded.
 *
 * @param p_name  the package name
 * @param p_man   the Manifest containing package version and sealing
 *              information
 * @param p_url   the code source url for the package, or null if none
 * @exception   IllegalArgumentException if the package name duplicates
 *              an existing package either in this class loader or one
 *              of its ancestors
 * @return the newly defined Package object
 */

  final Package define_package(final String    p_name,
                               final Manifest  p_man,
                               final URL       p_url)
  throws IllegalArgumentException
    {
    return this.definePackage(p_name, p_man, p_url);
    }
  
/**
 * Returns a <tt>Package</tt> that has been defined by this class loader
 * or any of its ancestors.  </p>
 *
 * @param  p_name
 *         The package name
 *
 * @return  The <tt>Package</tt> corresponding to the given name, or
 *          <tt>null</tt> if not found
 *
 * @since  1.2
 */

  final Package get_package(final String p_name)
    {
    return this.getPackage(p_name);
    }
  
/**
 * Returns all of the <tt>Packages</tt> defined by this class loader and
 * its ancestors.  </p>
 *
 * @return  The array of <tt>Package</tt> objects defined by this
 *          <tt>ClassLoader</tt>
 *
 * @since  1.2
 */

  final Package[] get_packages()
    {
    return this.getPackages();
    }
  }

File Information:

file name:BasicClassLoader.java
package:org.sfc.code
qualified name:org.sfc.code.BasicClassLoader.java
file type:Java Source File
download location:download http://dgpf.sourceforge.net/source/org/sfc/code/BasicClassLoader.java
size:23.897 KB (24471 B)
uploaded: 2018-01-07 12:03:36 GMT+0000
last update: 2006-06-22 06:09:42 GMT+0000
last access: 2018-04-25 23:57:09 GMT+0000

statistics online since 2006-01-02.   RSS Feed
Contact us by sending an email to tweise@gmx.de to receive further information, to report errors, or to join our project.
All content on this site (http://dgpf.sourceforge.net/) is LGPL-licensed.
http://dgpf.sourceforge.net/scripts/source/source.php last modified at 2018-01-07 12:03:34 GMT+0000 served at 2018-04-25 23:57:09 GMT+0000.
Valid CSS Valid XHTML 1.1
Valid RSS SourceForge.net Logo