/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file 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.web;
import java.net.URL;
import javax.management.ObjectName;
import org.jboss.classloading.spi.DelegatingClassLoader;
import org.jboss.classloading.spi.RealClassLoader;
/** A simple subclass of URLClassLoader that is used in conjunction with the
the WebService mbean to allow dynamic loading of resources and classes from
deployed ears, ejb jars and wars. A WebClassLoader is associated with a
Container and must have an UnifiedClassLoader as its parent. It overrides the
getURLs() method to return a different set of URLs for remote loading than
what is used for local loading.
<p>
WebClassLoader has two methods meant to be overriden by subclasses: getKey()
and getBytes(). The latter is a no-op in this implementation and should be
overriden by subclasses with bytecode generation ability, such as the
classloader used by the iiop module.
<p>
WebClassLoader subclasses must have a constructor with the same signature
as the WebClassLoader constructor.
@see #getUrls()
@see #setWebURLs(URL[])
@author <a href="mailto:Scott.Stark@jboss.org">Scott Stark</a>.
@author Sacha Labourey <sacha.labourey@cogito-info.ch>
@author Vladimir Blagojevic <vladimir@xisnext.2y.net>
@author <a href="mailto:reverbel@ime.usp.br">Francisco Reverbel</a>
@author adrian@jboss.org
@version $Revision: 81030 $
*/
public class WebClassLoader extends DelegatingClassLoader
{
/** This WebClassLoader is associated with this container. */
private ObjectName containerName;
/** The URLs returned by the getURLs() method override */
private URL[] webURLs;
private String codebaseString;
/** Creates new WebClassLoader.
* Subclasses must have a constructor with the same signature.
*
* @param containerName the container name
* @param parent the parent real classloader
*/
public WebClassLoader(ObjectName containerName, RealClassLoader parent)
{
super(parent);
this.containerName = containerName;
}
/** Gets a string key used as the key into the WebServer's loaderMap. */
public String getKey()
{
String className = getClass().getName();
int dot = className.lastIndexOf('.');
if( dot >= 0 )
className = className.substring(dot+1);
String key = className + '[' + hashCode() + ']';
return key;
}
/** Gets the JMX ObjectName of the WebClassLoader's container. */
public ObjectName getContainer()
{
return containerName;
}
/** Get the list of URLs that should be used as the RMI annotated codebase.
This is the URLs previously set via setWebURLs.
@return the local web URLs if not null
*/
public URL[] getURLs()
{
return webURLs;
}
/** Set the URLs that should be returned from this classes getURLs() override.
@param webURLs, the set of URL codebases to be used for remote class loading.
*/
public void setWebURLs(URL[] webURLs)
{
this.webURLs = webURLs;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < webURLs.length; i++)
{
sb.append(webURLs[i].toString());
if (i < webURLs.length - 1)
{
sb.append(" ");
}
}
codebaseString = sb.toString();
}
public String getCodebaseString()
{
return codebaseString;
}
/** Gets the bytecodes for a given class.
* This implementation always returns null, indicating that it is unable
* to get bytecodes for any class. Should be overridden by subclasses
* with bytecode generation capability (such as the classloader used by
* the iiop module, which generates IIOP stubs on the fly).
*
@param cls a <code>Class</code>
@return a byte array with the bytecodes for class <code>cls</code>, or
* null if this classloader is unable to return such byte array.
*/
public byte[] getBytes(Class clz)
{
return null; // this classloader is unable to return bytecodes
}
}