001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.web;
023:
024: import java.net.URL;
025: import java.net.URLClassLoader;
026: import javax.management.ObjectName;
027:
028: import org.jboss.mx.loading.RepositoryClassLoader;
029: import org.jboss.mx.loading.LoaderRepositoryClassLoader;
030:
031: /** A simple subclass of URLClassLoader that is used in conjunction with the
032: the WebService mbean to allow dynamic loading of resources and classes from
033: deployed ears, ejb jars and wars. A WebClassLoader is associated with a
034: Container and must have an UnifiedClassLoader as its parent. It overrides the
035: getURLs() method to return a different set of URLs for remote loading than
036: what is used for local loading.
037: <p>
038: WebClassLoader has two methods meant to be overriden by subclasses: getKey()
039: and getBytes(). The latter is a no-op in this implementation and should be
040: overriden by subclasses with bytecode generation ability, such as the
041: classloader used by the iiop module.
042: <p>
043: WebClassLoader subclasses must have a constructor with the same signature
044: as the WebClassLoader constructor.
045:
046: @see #getUrls()
047: @see #setWebURLs(URL[])
048:
049: @author <a href="mailto:Scott.Stark@jboss.org">Scott Stark</a>.
050: @author Sacha Labourey <sacha.labourey@cogito-info.ch>
051: @author Vladimir Blagojevic <vladimir@xisnext.2y.net>
052: @author <a href="mailto:reverbel@ime.usp.br">Francisco Reverbel</a>
053: @version $Revision: 57209 $
054: */
055: public class WebClassLoader extends LoaderRepositoryClassLoader {
056: /** This WebClassLoader is associated with this container. */
057: private ObjectName containerName;
058:
059: /** The URLs returned by the getURLs() method override */
060: private URL[] webURLs;
061:
062: private String codebaseString;
063:
064: /** Creates new WebClassLoader.
065: Subclasses must have a constructor with the same signature. */
066: public WebClassLoader(ObjectName containerName,
067: RepositoryClassLoader parent) {
068: super (parent, parent.getLoaderRepository());
069: this .containerName = containerName;
070: }
071:
072: /** Gets a string key used as the key into the WebServer's loaderMap. */
073: public String getKey() {
074: String className = getClass().getName();
075: int dot = className.lastIndexOf('.');
076: if (dot >= 0)
077: className = className.substring(dot + 1);
078: String key = className + '[' + hashCode() + ']';
079: return key;
080: }
081:
082: /** Gets the JMX ObjectName of the WebClassLoader's container. */
083: public ObjectName getContainer() {
084: return containerName;
085: }
086:
087: /** Returns the single URL for my parent, an UnifiedClassLoader. */
088: public URL getURL() {
089: return ((RepositoryClassLoader) getParent()).getURL();
090: }
091:
092: /** Get the list of URLs that should be used as the RMI annotated codebase.
093: This is the URLs previously set via setWebURLs. If setWebURLs has not
094: been invoked or was passed in a null value, the super class value of
095: getURLs() is used.
096: @return the local web URLs if not null, else the value of super.getURLs()
097: */
098: public URL[] getURLs() {
099: URL[] urls = webURLs;
100: if (urls == null)
101: urls = super .getURLs();
102: return urls;
103: }
104:
105: /** Access the URLClassLoader.getURLs() value.
106: @return the URLs used for local class and resource loading
107: */
108: public URL[] getLocalURLs() {
109: return super .getURLs();
110: }
111:
112: /** Set the URLs that should be returned from this classes getURLs() override.
113: @param webURLs, the set of URL codebases to be used for remote class loading.
114: */
115: public void setWebURLs(URL[] webURLs) {
116: this .webURLs = webURLs;
117: StringBuffer sb = new StringBuffer();
118: for (int i = 0; i < webURLs.length; i++) {
119: sb.append(webURLs[i].toString());
120: if (i < webURLs.length - 1) {
121: sb.append(" ");
122: }
123: }
124: codebaseString = sb.toString();
125: }
126:
127: public String getCodebaseString() {
128: return codebaseString;
129: }
130:
131: /** Gets the bytecodes for a given class.
132: * This implementation always returns null, indicating that it is unable
133: * to get bytecodes for any class. Should be overridden by subclasses
134: * with bytecode generation capability (such as the classloader used by
135: * the iiop module, which generates IIOP stubs on the fly).
136: *
137: @param cls a <code>Class</code>
138: @return a byte array with the bytecodes for class <code>cls</code>, or
139: * null if this classloader is unable to return such byte array.
140: */
141: public byte[] getBytes(Class clz) {
142: return null; // this classloader is unable to return bytecodes
143: }
144:
145: }
|