[Jboss-cvs] JBossAS SVN: r56371 - branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Aug 28 20:39:09 EDT 2006
Author: scott.stark at jboss.org
Date: 2006-08-28 20:39:06 -0400 (Mon, 28 Aug 2006)
New Revision: 56371
Added:
branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/LegacyDomainClassLoader.java
Removed:
branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/RepositoryClassLoader.java
Log:
Copy RepositoryClassLoader to LegacyDomainClassLoader
Copied: branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/LegacyDomainClassLoader.java (from rev 56370, branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/RepositoryClassLoader.java)
Deleted: branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/RepositoryClassLoader.java
===================================================================
--- branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/RepositoryClassLoader.java 2006-08-29 00:27:32 UTC (rev 56370)
+++ branches/MC_VDF_WORK/j2se/src/main/org/jboss/mx/loading/RepositoryClassLoader.java 2006-08-29 00:39:06 UTC (rev 56371)
@@ -1,863 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software 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
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.mx.loading;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.CodeSource;
-import java.security.PermissionCollection;
-import java.security.Policy;
-import java.security.ProtectionDomain;
-import java.security.cert.Certificate;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Vector;
-import java.util.Collections;
-import java.util.Set;
-
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
-import org.jboss.logging.Logger;
-import org.jboss.util.loading.Translator;
-import org.jboss.util.collection.SoftSet;
-
-import EDU.oswego.cs.dl.util.concurrent.ReentrantLock;
-import EDU.oswego.cs.dl.util.concurrent.ConcurrentReaderHashMap;
-
-/**
- * A RepositoryClassLoader.
- *
- * @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision$
- */
-public abstract class RepositoryClassLoader extends URLClassLoader
-{
- // Constants -----------------------------------------------------
-
- /** The log */
- private static final Logger log = Logger.getLogger(RepositoryClassLoader.class);
-
- /** The value returned by {@link #getURLs}. */
- private static final URL[] EMPTY_URL_ARRAY = {};
-
- // Attributes -----------------------------------------------------
-
- /** Reference to the repository. */
- protected LoaderRepository repository = null;
- /** The location where unregister is called from */
- protected Exception unregisterTrace;
-
- /** The relative order in which this class loader was added to the respository */
- private int addedOrder;
-
- /** The parent classloader */
- protected ClassLoader parent = null;
-
- /** Names of classes which have resulted in CNFEs in loadClassLocally */
- private Set classBlackList = Collections.synchronizedSet(new SoftSet());
- /** Names of resources that were not found in loadResourceLocally */
- private Set resourceBlackList = Collections.synchronizedSet(new HashSet());
- /** A HashMap<String, URL> for resource found in loadResourceLocally */
- private ConcurrentReaderHashMap resourceCache = new ConcurrentReaderHashMap();
-
- /** Lock */
- protected ReentrantLock loadLock = new ReentrantLock();
-
- /** A debugging variable used to track the recursive depth of loadClass() */
- protected int loadClassDepth;
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
- /**
- * Create a new LoaderRepositoryClassLoader
- *
- * @param urls the urls
- * @param parent the parent classloader
- */
- protected RepositoryClassLoader(URL[] urls, ClassLoader parent)
- {
- super(urls, parent);
- this.parent = parent;
- // Check the blacklist mode
- String mode = ClassToStringAction.getProperty("org.jboss.mx.loading.blacklistMode", null);
- if( mode == null || mode.equalsIgnoreCase("HashSet") )
- {
- classBlackList = Collections.synchronizedSet(new HashSet());
- resourceBlackList = Collections.synchronizedSet(new HashSet());
- }
- else if( mode.equalsIgnoreCase("SoftSet") )
- {
- classBlackList = Collections.synchronizedSet(new SoftSet());
- resourceBlackList = Collections.synchronizedSet(new SoftSet());
- }
- }
-
- // Public --------------------------------------------------------
-
- /**
- * Get the ObjectName
- *
- * @return the object name
- */
- public abstract ObjectName getObjectName() throws MalformedObjectNameException;
-
- /**
- * Get the loader repository for this classloader
- */
- public LoaderRepository getLoaderRepository()
- {
- return repository;
- }
-
- /**
- * Set the loader repository
- *
- * @param repository the repository
- */
- public void setRepository(LoaderRepository repository)
- {
- log.debug("setRepository, repository="+repository+", cl=" + this);
- this.repository = repository;
- }
-
- /**
- * Get the order this classloader was added to the repository
- *
- * @return the order
- */
- public int getAddedOrder()
- {
- return addedOrder;
- }
-
- /**
- * Set the order this classloader was added to the repository
- *
- * @param addedOrder the added order
- */
- public void setAddedOrder(int addedOrder)
- {
- this.addedOrder = addedOrder;
- }
-
- /**
- * Called to attempt to load a class from the set of URLs associated with this classloader.
- */
- public Class loadClassLocally(String name, boolean resolve)
- throws ClassNotFoundException
- {
- boolean trace = log.isTraceEnabled();
- if( trace )
- log.trace("loadClassLocally, " + this + " name=" + name);
- Class result = null;
- try
- {
- if (isClassBlackListed(name))
- {
- if( trace )
- log.trace("Class in blacklist, name="+name);
- throw new ClassNotFoundException("Class Not Found(blacklist): " + name);
- }
-
- try
- {
- result = super.loadClass(name, resolve);
- return result;
- }
- catch (ClassNotFoundException cnfe)
- {
- addToClassBlackList(name);
- // If this is an array class, use Class.forName to resolve it
- if( name.charAt(0) == '[' )
- {
- result = Class.forName(name, true, this);
- removeFromClassBlackList(name);
- return result;
- }
- if( trace )
- log.trace("CFNE: Adding to blacklist: "+name);
- throw cnfe;
- }
- }
- finally
- {
- if (trace)
- {
- if (result != null)
- log.trace("loadClassLocally, " + this + " name=" + name + " class=" + result + " cl=" + result.getClassLoader());
- else
- log.trace("loadClassLocally, " + this + " name=" + name + " not found");
- }
- }
- }
-
- /**
- * Provides the same functionality as {@link java.net.URLClassLoader#getResource}.
- */
- public URL getResourceLocally(String name)
- {
- URL resURL = (URL) resourceCache.get(name);
- if (resURL != null)
- return resURL;
- if (isResourceBlackListed(name))
- return null;
- resURL = super.getResource(name);
- if( log.isTraceEnabled() == true )
- log.trace("getResourceLocally("+this+"), name="+name+", resURL:"+resURL);
- if (resURL == null)
- addToResourceBlackList(name);
- else
- resourceCache.put(name, resURL);
- return resURL;
- }
-
- /**
- * Get the URL associated with the UCL.
- *
- * @return the url
- */
- public URL getURL()
- {
- URL[] urls = super.getURLs();
- if (urls.length > 0)
- return urls[0];
- else
- return null;
- }
-
- public void unregister()
- {
- log.debug("Unregistering cl=" + this);
- if (repository != null)
- repository.removeClassLoader(this);
- clearBlacklists();
- resourceCache.clear();
- repository = null;
- this.unregisterTrace = new Exception();
- }
-
- /**
- * This method simply invokes the super.getURLs() method to access the
- * list of URLs that make up the RepositoryClassLoader classpath.
- *
- * @return the urls that make up the classpath
- */
- public URL[] getClasspath()
- {
- return super.getURLs();
- }
-
- /**
- * Return all library URLs associated with this RepositoryClassLoader
- *
- * <p>Do not remove this method without running the WebIntegrationTestSuite
- */
- public URL[] getAllURLs()
- {
- return repository.getURLs();
- }
-
- /**
- * Black list a class
- *
- * @param name the name of the class
- */
- public void addToClassBlackList(String name)
- {
- classBlackList.add(name);
- }
-
- /**
- * Remove class from black list
- *
- * @param name the name of the class
- */
- public void removeFromClassBlackList(String name)
- {
- classBlackList.remove(name);
- }
-
- /**
- * Is the class black listed?
- *
- * @param name the name of the class
- * @return true when the class is black listed, false otherwise
- */
- public boolean isClassBlackListed(String name)
- {
- return classBlackList.contains(name);
- }
-
- /**
- * Clear any class black list.
- */
- public void clearClassBlackList()
- {
- classBlackList.clear();
- }
-
- /**
- * Black list a resource
- *
- * @param name the name of the resource
- */
- public void addToResourceBlackList(String name)
- {
- resourceBlackList.add(name);
- }
-
- /**
- * Remove resource from black list
- *
- * @param name the name of the resource
- */
- public void removeFromResourceBlackList(String name)
- {
- resourceBlackList.remove(name);
- }
-
- /**
- * Is the resource black listed?
- *
- * @param name the name of the resource
- * @return true when the resource is black listed, false otherwise
- */
- public boolean isResourceBlackListed(String name)
- {
- return resourceBlackList.contains(name);
- }
-
- /**
- * Clear any resource blacklist.
- */
- public void clearResourceBlackList()
- {
- resourceBlackList.clear();
- }
-
- /**
- * Clear all blacklists
- */
- public void clearBlacklists()
- {
- clearClassBlackList();
- clearResourceBlackList();
- }
-
-
- // URLClassLoader overrides --------------------------------------
-
- /** The only caller of this method should be the VM initiated
- * loadClassInternal() method. This method attempts to acquire the
- * UnifiedLoaderRepository2 lock and then asks the repository to
- * load the class.
- *
- * <p>Forwards request to {@link LoaderRepository}.
- */
- public Class loadClass(String name, boolean resolve)
- throws ClassNotFoundException
- {
- boolean trace = log.isTraceEnabled();
- if (trace)
- log.trace("loadClass " + this + " name=" + name+", loadClassDepth="+loadClassDepth);
- Class clazz = null;
- try
- {
- if (repository != null)
- {
- clazz = repository.getCachedClass(name);
- if (clazz != null)
- {
- if( log.isTraceEnabled() )
- {
- StringBuffer buffer = new StringBuffer("Loaded class from cache, ");
- ClassToStringAction.toString(clazz, buffer);
- log.trace(buffer.toString());
- }
- return clazz;
- }
- }
- clazz = loadClassImpl(name, resolve, Integer.MAX_VALUE);
- return clazz;
- }
- finally
- {
- if (trace)
- {
- if (clazz != null)
- log.trace("loadClass " + this + " name=" + name + " class=" + clazz + " cl=" + clazz.getClassLoader());
- else
- log.trace("loadClass " + this + " name=" + name + " not found");
- }
- }
- }
-
- /** The only caller of this method should be the VM initiated
- * loadClassInternal() method. This method attempts to acquire the
- * UnifiedLoaderRepository2 lock and then asks the repository to
- * load the class.
- *
- * <p>Forwards request to {@link LoaderRepository}.
- */
- public Class loadClassBefore(String name)
- throws ClassNotFoundException
- {
- boolean trace = log.isTraceEnabled();
- if (trace)
- log.trace("loadClassBefore " + this + " name=" + name);
- Class clazz = null;
- try
- {
- clazz = loadClassImpl(name, false, addedOrder);
- return clazz;
- }
- finally
- {
- if (trace)
- {
- if (clazz != null)
- log.trace("loadClassBefore " + this + " name=" + name + " class=" + clazz + " cl=" + clazz.getClassLoader());
- else
- log.trace("loadClassBefore " + this + " name=" + name + " not found");
- }
- }
- }
-
- public abstract Class loadClassImpl(String name, boolean resolve, int stopAt)
- throws ClassNotFoundException;
-
- /**
- * Attempts to load the resource from its URL and if not found
- * forwards to the request to {@link LoaderRepository}.
- */
- public URL getResource(String name)
- {
- if (repository != null)
- return repository.getResource(name, this);
- return null;
- }
-
- /** Find all resource URLs for the given name. This overrides the
- * URLClassLoader version to look for resources in the repository.
- *
- * @param name the name of the resource
- * @return Enumeration<URL>
- * @throws java.io.IOException
- */
- public Enumeration findResources(String name) throws IOException
- {
- Vector resURLs = new Vector();
- if( repository == null )
- {
- String msg = "Invalid use of destroyed classloader, UCL destroyed at:";
- IOException e = new IOException(msg);
- e.initCause(this.unregisterTrace);
- throw e;
- }
- repository.getResources(name, this, resURLs);
- return resURLs.elements();
- }
-
- /**
- * Provides the same functionality as {@link java.net.URLClassLoader#findResources}.
- */
- public Enumeration findResourcesLocally(String name) throws IOException
- {
- return super.findResources(name);
- }
-
- /** Called by loadClassLocally to find the requested class within this
- * class loaders class path.
- *
- * @param name the name of the class
- * @return the resulting class
- * @exception ClassNotFoundException if the class could not be found
- */
- protected Class findClass(String name) throws ClassNotFoundException
- {
- boolean trace = log.isTraceEnabled();
- if( trace )
- log.trace("findClass, name="+name);
- if (isClassBlackListed(name))
- {
- if( trace )
- log.trace("Class in blacklist, name="+name);
- throw new ClassNotFoundException("Class Not Found(blacklist): " + name);
- }
-
- Translator translator = repository.getTranslator();
- if (translator != null)
- {
- // Obtain the transformed class bytecode
- try
- {
- // Obtain the raw bytecode from the classpath
- URL classUrl = getClassURL(name);
- byte[] rawcode = loadByteCode(classUrl);
- URL codeSourceUrl = getCodeSourceURL(name, classUrl);
- ProtectionDomain pd = getProtectionDomain(codeSourceUrl);
- byte[] bytecode = translator.transform(this, name, null, pd, rawcode);
- // If there was no transform use the raw bytecode
- if( bytecode == null )
- bytecode = rawcode;
- // Define the class package and instance
- definePackage(name);
- return defineClass(name, bytecode, 0, bytecode.length, pd);
- }
- catch(ClassNotFoundException e)
- {
- throw e;
- }
- catch (Throwable ex)
- {
- throw new ClassNotFoundException(name, ex);
- }
- }
-
- Class clazz = null;
- try
- {
- clazz = findClassLocally(name);
- }
- catch(ClassNotFoundException e)
- {
- if( trace )
- log.trace("CFNE: Adding to blacklist: "+name);
- addToClassBlackList(name);
- throw e;
- }
- return clazz;
- }
-
- /**
- * Find the class
- *
- * @param name the name of the class
- * @return the class
- */
- protected Class findClassLocally(String name) throws ClassNotFoundException
- {
- return super.findClass(name);
- }
-
- /**
- * Define the package for the class if not already done
- *
- * @todo this properly
- * @param className the class name
- */
- protected void definePackage(String className)
- {
- int i = className.lastIndexOf('.');
- if (i == -1)
- return;
-
- try
- {
- definePackage(className.substring(0, i), null, null, null, null, null, null, null);
- }
- catch (IllegalArgumentException alreadyDone)
- {
- }
- }
-
- /** Append the given url to the URLs used for class and resource loading
- * @param url the URL to load from
- */
- public void addURL(URL url)
- {
- if( url == null )
- throw new IllegalArgumentException("url cannot be null");
-
- if( repository.addClassLoaderURL(this, url) == true )
- {
- log.debug("Added url: "+url+", to ucl: "+this);
- // Strip any query parameters
- String query = url.getQuery();
- if( query != null )
- {
- String ext = url.toExternalForm();
- String ext2 = ext.substring(0, ext.length() - query.length() - 1);
- try
- {
- url = new URL (ext2);
- }
- catch(MalformedURLException e)
- {
- log.warn("Failed to strip query from: "+url, e);
- }
- }
- super.addURL(url);
- clearBlacklists();
- }
- else if( log.isTraceEnabled() )
- {
- log.trace("Ignoring duplicate url: "+url+", for ucl: "+this);
- }
- }
-
- /**
- * Return an empty URL array to force the RMI marshalling subsystem to
- * use the <tt>java.server.codebase</tt> property as the annotated codebase.
- *
- * <p>Do not remove this method without discussing it on the dev list.
- *
- * @return Empty URL[]
- */
- public URL[] getURLs()
- {
- return EMPTY_URL_ARRAY;
- }
-
- public Package getPackage(String name)
- {
- return super.getPackage(name);
- }
-
- public Package[] getPackages()
- {
- return super.getPackages();
- }
-
- // Object overrides ----------------------------------------------
-
- /**
- * This is here to document that this must delegate to the
- * super implementation to perform identity based equality. Using
- * URL based equality caused conflicts with the Class.forName(String,
- * boolean, ClassLoader).
- */
- public final boolean equals(Object other)
- {
- return super.equals(other);
- }
-
- /**
- * This is here to document that this must delegate to the
- * super implementation to perform identity based hashing. Using
- * URL based hashing caused conflicts with the Class.forName(String,
- * boolean, ClassLoader).
- */
- public final int hashCode()
- {
- return super.hashCode();
- }
-
- /**
- * Returns a string representation.
- */
- public String toString()
- {
- return super.toString() + "{ url=" + getURL() + " }";
- }
-
- // Protected -----------------------------------------------------
-
- /** Attempt to acquire the class loading lock. This lock must be acquired
- * before a thread enters the class loading task loop in loadClass. This
- * method maintains any interrupted state of the calling thread.
- *@see #loadClass(String, boolean)
- */
- protected boolean attempt(long waitMS)
- {
- boolean acquired = false;
- boolean trace = log.isTraceEnabled();
- // Save and clear the interrupted state of the incoming thread
- boolean threadWasInterrupted = Thread.interrupted();
- try
- {
- acquired = loadLock.attempt(waitMS);
- }
- catch(InterruptedException e)
- {
- }
- finally
- {
- // Restore the interrupted state of the thread
- if( threadWasInterrupted )
- Thread.currentThread().interrupt();
- }
- if( trace )
- log.trace("attempt("+loadLock.holds()+") was: "+acquired+" for :"+this);
- return acquired;
- }
-
- /** Acquire the class loading lock. This lock must be acquired
- * before a thread enters the class loading task loop in loadClass.
- *@see #loadClass(String, boolean)
- */
- protected void acquire()
- {
- // Save and clear the interrupted state of the incoming thread
- boolean threadWasInterrupted = Thread.interrupted();
- try
- {
- loadLock.acquire();
- }
- catch(InterruptedException e)
- {
- }
- finally
- {
- // Restore the interrupted state of the thread
- if( threadWasInterrupted )
- Thread.currentThread().interrupt();
- }
- if( log.isTraceEnabled() )
- log.trace("acquired("+loadLock.holds()+") for :"+this);
- }
- /** Release the class loading lock previous acquired through the acquire
- * method.
- */
- protected void release()
- {
- if( log.isTraceEnabled() )
- log.trace("release("+loadLock.holds()+") for :"+this);
- loadLock.release();
- if( log.isTraceEnabled() )
- log.trace("released, holds: "+loadLock.holds());
- }
-
- /** Obtain the bytecode for the indicated class from this class loaders
- * classpath.
- *
- * @param classname
- * @return the bytecode array if found
- * @exception ClassNotFoundException - if the class resource could not
- * be found
- */
- protected byte[] loadByteCode(String classname)
- throws ClassNotFoundException, IOException
- {
- byte[] bytecode = null;
- URL classURL = getClassURL(classname);
-
- // Load the class bytecode
- InputStream is = null;
- try
- {
- is = classURL.openStream();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] tmp = new byte[1024];
- int read = 0;
- while( (read = is.read(tmp)) > 0 )
- {
- baos.write(tmp, 0, read);
- }
- bytecode = baos.toByteArray();
- }
- finally
- {
- if( is != null )
- is.close();
- }
-
- return bytecode;
- }
-
- /** Obtain the bytecode for the indicated class from this class loaders
- * classpath.
- *
- * @param classURL
- * @return the bytecode array if found
- * @exception ClassNotFoundException - if the class resource could not
- * be found
- */
- protected byte[] loadByteCode(URL classURL)
- throws ClassNotFoundException, IOException
- {
- byte[] bytecode = null;
- // Load the class bytecode
- InputStream is = null;
- try
- {
- is = classURL.openStream();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] tmp = new byte[1024];
- int read = 0;
- while( (read = is.read(tmp)) > 0 )
- {
- baos.write(tmp, 0, read);
- }
- bytecode = baos.toByteArray();
- }
- finally
- {
- if( is != null )
- is.close();
- }
-
- return bytecode;
- }
-
- /**
- * Determine the protection domain. If we are a copy of the original
- * deployment, use the original url as the codebase.
- * @return the protection domain
- * @todo certificates and principles?
- */
- protected ProtectionDomain getProtectionDomain(URL codesourceUrl)
- {
- Certificate certs[] = null;
- CodeSource cs = new CodeSource(codesourceUrl, certs);
- PermissionCollection permissions = Policy.getPolicy().getPermissions(cs);
- if (log.isTraceEnabled())
- log.trace("getProtectionDomain, url=" + codesourceUrl +
- " codeSource=" + cs + " permissions=" + permissions);
- return new ProtectionDomain(cs, permissions);
- }
-
- // Package Private -----------------------------------------------
-
- // Private -------------------------------------------------------
-
- private URL getCodeSourceURL(String classname, URL classURL) throws java.net.MalformedURLException
- {
- String classRsrcName = classname.replace('.', '/') + ".class";
- String urlAsString = classURL.toString();
- int idx = urlAsString.indexOf(classRsrcName);
- if (idx == -1) return classURL;
- urlAsString = urlAsString.substring(0, idx);
- return new URL(urlAsString);
- }
-
- private URL getClassURL(String classname) throws ClassNotFoundException
- {
- String classRsrcName = classname.replace('.', '/') + ".class";
- URL classURL = this.getResourceLocally(classRsrcName);
- if( classURL == null )
- {
- String msg = "Failed to find: "+classname+" as resource: "+classRsrcName;
- throw new ClassNotFoundException(msg);
- }
- return classURL;
- }
-
- // Inner classes -------------------------------------------------
-}
More information about the jboss-cvs-commits
mailing list