/* SecureClassLoader.java --- A Secure Class Loader
   Copyright (C) 1999, 2004  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.security;

/**
 * A Secure Class Loader for loading classes with additional 
 * support for specifying code source and permissions when
 * they are retrieved by the system policy handler.
 *
 * @since 1.2
 *
 * @author Mark Benvenuto
 */
public class SecureClassLoader extends ClassLoader
{
  java.util.WeakHashMap protectionDomainCache = new java.util.WeakHashMap();

  protected SecureClassLoader(ClassLoader parent)
  {
    super(parent);
    SecurityManager sm = System.getSecurityManager();
    if(sm != null)
      sm.checkCreateClassLoader();
  }

  protected SecureClassLoader()
  {
    SecurityManager sm = System.getSecurityManager();
    if(sm != null)
      sm.checkCreateClassLoader();
  }

  /** 
   * Creates a class using an array of bytes and a 
   * CodeSource.
   *
   * @param name the name to give the class.  null if unknown.
   * @param b the data representing the classfile, in classfile format.
   * @param off the offset into the data where the classfile starts.
   * @param len the length of the classfile data in the array.
   * @param cs the CodeSource for the class or null when unknown.
   *
   * @return the class that was defined and optional CodeSource.
   *
   * @exception ClassFormatError if the byte array is not in proper classfile format.
   */
  protected final Class defineClass(String name, byte[] b, int off, int len,
				    CodeSource cs)
  {
    if (cs != null)
      {
	ProtectionDomain protectionDomain;
	  
	synchronized (protectionDomainCache)
	  {
	    protectionDomain = (ProtectionDomain)protectionDomainCache.get(cs);
	  }

	if (protectionDomain == null)
	  {
	    protectionDomain 
	      = new ProtectionDomain(cs, getPermissions(cs), this, null);
	    synchronized (protectionDomainCache)
	      {
		ProtectionDomain domain 
		  = (ProtectionDomain)protectionDomainCache.get(cs);
		if (domain == null)
		  protectionDomainCache.put(cs, protectionDomain);
		else
		  protectionDomain = domain;
	      }
	  }
	return super.defineClass(name, b, off, len, protectionDomain);
      } 
    else
      return super.defineClass(name, b, off, len);
  }

  /**
   * Returns a PermissionCollection for the specified CodeSource.
   * The default implementation invokes 
   * java.security.Policy.getPermissions.
   *
   * This method is called by defineClass that takes a CodeSource
   * arguement to build a proper ProtectionDomain for the class
   * being defined.
   */
  protected PermissionCollection getPermissions(CodeSource cs)
  {
    Policy policy = Policy.getCurrentPolicy();
    return policy.getPermissions(cs);
  }
}
