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