001: /*
002: * Copyright 1999,2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.catalina;
018:
019: import java.beans.PropertyChangeListener;
020:
021: /**
022: * A <b>Loader</b> represents a Java ClassLoader implementation that can
023: * be used by a Container to load class files (within a repository associated
024: * with the Loader) that are designed to be reloaded upon request, as well as
025: * a mechanism to detect whether changes have occurred in the underlying
026: * repository.
027: * <p>
028: * In order for a <code>Loader</code> implementation to successfully operate
029: * with a <code>Context</code> implementation that implements reloading, it
030: * must obey the following constraints:
031: * <ul>
032: * <li>Must implement <code>Lifecycle</code> so that the Context can indicate
033: * that a new class loader is required.
034: * <li>The <code>start()</code> method must unconditionally create a new
035: * <code>ClassLoader</code> implementation.
036: * <li>The <code>stop()</code> method must throw away its reference to the
037: * <code>ClassLoader</code> previously utilized, so that the class loader,
038: * all classes loaded by it, and all objects of those classes, can be
039: * garbage collected.
040: * <li>Must allow a call to <code>stop()</code> to be followed by a call to
041: * <code>start()</code> on the same <code>Loader</code> instance.
042: * <li>Based on a policy chosen by the implementation, must call the
043: * <code>Context.reload()</code> method on the owning <code>Context</code>
044: * when a change to one or more of the class files loaded by this class
045: * loader is detected.
046: * </ul>
047: *
048: * @author Craig R. McClanahan
049: * @version $Revision: 1.3 $ $Date: 2004/02/27 14:58:38 $
050: */
051:
052: public interface Loader {
053:
054: // ------------------------------------------------------------- Properties
055:
056: /**
057: * Return the Java class loader to be used by this Container.
058: */
059: public ClassLoader getClassLoader();
060:
061: /**
062: * Return the Container with which this Loader has been associated.
063: */
064: public Container getContainer();
065:
066: /**
067: * Set the Container with which this Loader has been associated.
068: *
069: * @param container The associated Container
070: */
071: public void setContainer(Container container);
072:
073: /**
074: * Return the DefaultContext with which this Manager is associated.
075: */
076: public DefaultContext getDefaultContext();
077:
078: /**
079: * Set the DefaultContext with which this Manager is associated.
080: *
081: * @param defaultContext The newly associated DefaultContext
082: */
083: public void setDefaultContext(DefaultContext defaultContext);
084:
085: /**
086: * Return the "follow standard delegation model" flag used to configure
087: * our ClassLoader.
088: */
089: public boolean getDelegate();
090:
091: /**
092: * Set the "follow standard delegation model" flag used to configure
093: * our ClassLoader.
094: *
095: * @param delegate The new flag
096: */
097: public void setDelegate(boolean delegate);
098:
099: /**
100: * Return descriptive information about this Loader implementation and
101: * the corresponding version number, in the format
102: * <code><description>/<version></code>.
103: */
104: public String getInfo();
105:
106: /**
107: * Return the reloadable flag for this Loader.
108: */
109: public boolean getReloadable();
110:
111: /**
112: * Set the reloadable flag for this Loader.
113: *
114: * @param reloadable The new reloadable flag
115: */
116: public void setReloadable(boolean reloadable);
117:
118: // --------------------------------------------------------- Public Methods
119:
120: /**
121: * Add a property change listener to this component.
122: *
123: * @param listener The listener to add
124: */
125: public void addPropertyChangeListener(
126: PropertyChangeListener listener);
127:
128: /**
129: * Add a new repository to the set of repositories for this class loader.
130: *
131: * @param repository Repository to be added
132: */
133: public void addRepository(String repository);
134:
135: /**
136: * Return the set of repositories defined for this class loader.
137: * If none are defined, a zero-length array is returned.
138: */
139: public String[] findRepositories();
140:
141: /**
142: * Has the internal repository associated with this Loader been modified,
143: * such that the loaded classes should be reloaded?
144: */
145: public boolean modified();
146:
147: /**
148: * Remove a property change listener from this component.
149: *
150: * @param listener The listener to remove
151: */
152: public void removePropertyChangeListener(
153: PropertyChangeListener listener);
154:
155: }
|