costin 2003/01/27 15:27:27
Modified: catalina/src/share/org/apache/catalina/core
StandardContext.java
Log:
Few changes - sorry for mixing them up in a single commit.
- use commons-logging
- one small experiment: change the logger on context startup, so each context can
log in a separate log. The 'experimental' part is the namming of the log - I'm not
sure which is best
- merged the code from mbeans/ directory - the ContextMBean is no longer needed ( but
some code needs to be fixed - some of the added methods have names that conflict
with the
base class )
- fixed registration so all servlets will be registered
- added code to support dynamic addition of Contexts as mbeans ( i.e. using only JMX
registration ). The Context mbean will register itself with the server.
- use TldCache to read the Tlds.
Revision Changes Path
1.14 +391 -93
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java
Index: StandardContext.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- StandardContext.java 16 Jan 2003 21:38:25 -0000 1.13
+++ StandardContext.java 27 Jan 2003 23:27:26 -0000 1.14
@@ -67,12 +67,14 @@
import java.io.File;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.Hashtable;
import java.util.Stack;
+import java.net.URLDecoder;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
@@ -82,6 +84,8 @@
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.management.ObjectName;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
import org.apache.naming.ContextBindings;
import org.apache.naming.resources.BaseDirContext;
import org.apache.naming.resources.FileDirContext;
@@ -105,6 +109,9 @@
import org.apache.catalina.Response;
import org.apache.catalina.Valve;
import org.apache.catalina.Wrapper;
+import org.apache.catalina.startup.ContextConfig;
+import org.apache.catalina.startup.TldConfig;
+import org.apache.catalina.mbeans.MBeanUtils;
import org.apache.catalina.deploy.ApplicationParameter;
import org.apache.catalina.deploy.ContextEjb;
import org.apache.catalina.deploy.ContextEnvironment;
@@ -129,6 +136,7 @@
import org.apache.tomcat.util.log.SystemLogHandler;
import org.apache.commons.modeler.Registry;
+import org.apache.commons.modeler.ManagedBean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -144,9 +152,9 @@
public class StandardContext
extends ContainerBase
- implements Context
+ implements Context, Serializable
{
- private static Log log = LogFactory.getLog(StandardContext.class);
+ private Log log = LogFactory.getLog(StandardContext.class);
@@ -179,7 +187,7 @@
* The set of instantiated application listener objects, in a one-to-one
* correspondence to the class names in <code>applicationListeners</code>.
*/
- private Object applicationListenersObjects[] = new Object[0];
+ private transient Object applicationListenersObjects[] = new Object[0];
/**
@@ -198,7 +206,7 @@
/**
* The Locale to character set mapper for this application.
*/
- private CharsetMapper charsetMapper = null;
+ private transient CharsetMapper charsetMapper = null;
/**
@@ -229,7 +237,7 @@
/**
* The ServletContext implementation associated with this Context.
*/
- private ApplicationContext context = null;
+ private transient ApplicationContext context = null;
/**
@@ -314,7 +322,7 @@
/**
* The naming context listener for this web application.
*/
- private NamingContextListener namingContextListener = null;
+ private transient NamingContextListener namingContextListener = null;
/**
@@ -501,9 +509,14 @@
private ArrayList wrappers=new ArrayList();
- // ----------------------------------------------------- Context Properties
+ private long startupTime;
+ private long tldScanTime;
+ // ----------------------------------------------------- Context Properties
+ public void setName( String name ) {
+ super.setName( name );
+ }
/**
* Is caching allowed ?
*/
@@ -634,6 +647,8 @@
CharsetMapper oldCharsetMapper = this.charsetMapper;
this.charsetMapper = mapper;
+ if( mapper != null )
+ this.charsetMapperClass= mapper.getClass().getName();
support.firePropertyChange("charsetMapper", oldCharsetMapper,
this.charsetMapper);
@@ -739,6 +754,21 @@
}
+ public long getStartupTime() {
+ return startupTime;
+ }
+
+ public void setStartupTime(long startupTime) {
+ this.startupTime = startupTime;
+ }
+
+ public long getTldScanTime() {
+ return tldScanTime;
+ }
+
+ public void setTldScanTime(long tldScanTime) {
+ this.tldScanTime = tldScanTime;
+ }
/**
* Return the display name of this web application.
@@ -938,7 +968,7 @@
* @param path The new context path
*/
public void setPath(String path) {
-
+ // XXX Use host in name
setName(RequestUtil.URLDecode(path));
}
@@ -963,8 +993,8 @@
*/
public void setPublicId(String publicId) {
- if (debug >= 1)
- log("Setting deployment descriptor public ID to '" +
+ if (log.isDebugEnabled())
+ log.debug("Setting deployment descriptor public ID to '" +
publicId + "'");
String oldPublicId = this.publicId;
@@ -1884,7 +1914,7 @@
(InstanceListener) clazz.newInstance();
wrapper.addInstanceListener(listener);
} catch (Throwable t) {
- log("createWrapper", t);
+ log.error("createWrapper", t);
return (null);
}
}
@@ -1899,7 +1929,7 @@
if (wrapper instanceof Lifecycle)
((Lifecycle) wrapper).addLifecycleListener(listener);
} catch (Throwable t) {
- log("createWrapper", t);
+ log.error("createWrapper", t);
return (null);
}
}
@@ -1913,7 +1943,7 @@
(ContainerListener) clazz.newInstance();
wrapper.addContainerListener(listener);
} catch (Throwable t) {
- log("createWrapper", t);
+ log.error("createWrapper", t);
return (null);
}
}
@@ -2585,7 +2615,7 @@
// if (!reloadable)
// throw new IllegalStateException
// (sm.getString("standardContext.notReloadable"));
- log(sm.getString("standardContext.reloadingStarted"));
+ log.info(sm.getString("standardContext.reloadingStarted"));
// Stop accepting requests temporarily
setPaused(true);
@@ -2598,7 +2628,7 @@
try {
((Lifecycle) manager).stop();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.stoppingManager"), e);
+ log.error(sm.getString("standardContext.stoppingManager"), e);
}
}
@@ -2610,7 +2640,7 @@
try {
((Lifecycle) wrapper).stop();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.stoppingWrapper",
+ log.error(sm.getString("standardContext.stoppingWrapper",
wrapper.getName()),
e);
}
@@ -2641,7 +2671,7 @@
try {
((Lifecycle) loader).stop();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.stoppingLoader"), e);
+ log.error(sm.getString("standardContext.stoppingLoader"), e);
}
}
@@ -2653,7 +2683,7 @@
try {
((Lifecycle) loader).start();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.startingLoader"), e);
+ log.error(sm.getString("standardContext.startingLoader"), e);
}
}
@@ -2675,13 +2705,13 @@
// Restart our application event listeners and filters
if (ok) {
if (!listenerStart()) {
- log(sm.getString("standardContext.listenerStartFailed"));
+ log.error(sm.getString("standardContext.listenerStartFailed"));
ok = false;
}
}
if (ok) {
if (!filterStart()) {
- log(sm.getString("standardContext.filterStartFailed"));
+ log.error(sm.getString("standardContext.filterStartFailed"));
ok = false;
}
}
@@ -2689,7 +2719,7 @@
// Create request listener valve
if (ok) {
if (!requestListenerConfig()) {
- log(sm.getString("standardContext.requestListenerStartFailed"));
+
log.error(sm.getString("standardContext.requestListenerStartFailed"));
}
}
@@ -2706,7 +2736,7 @@
try {
((Lifecycle) wrapper).start();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.startingWrapper",
+ log.error(sm.getString("standardContext.startingWrapper",
wrapper.getName()),
e);
ok = false;
@@ -2722,7 +2752,7 @@
try {
((Lifecycle) manager).start();
} catch (LifecycleException e) {
- log(sm.getString("standardContext.startingManager"), e);
+ log.error(sm.getString("standardContext.startingManager"), e);
}
}
@@ -2731,10 +2761,10 @@
// Start accepting requests again
if (ok) {
- log(sm.getString("standardContext.reloadingCompleted"));
+ log.info(sm.getString("standardContext.reloadingCompleted"));
} else {
setAvailable(false);
- log(sm.getString("standardContext.reloadingFailed"));
+ log.error(sm.getString("standardContext.reloadingFailed"));
}
setPaused(false);
@@ -2880,6 +2910,14 @@
* @param name Name of the environment entry to remove
*/
public void removeEnvironment(String name) {
+ if (namingResources == null) {
+ return;
+ }
+ ContextEnvironment env = namingResources.findEnvironment(name);
+ if (env == null) {
+ throw new IllegalArgumentException
+ ("Invalid environment name '" + name + "'");
+ }
namingResources.removeEnvironment(name);
fireContainerEvent("removeEnvironment", name);
@@ -3078,6 +3116,15 @@
* @param name Name of the resource reference to remove
*/
public void removeResource(String name) {
+ name = URLDecoder.decode(name);
+ if (namingResources == null) {
+ return;
+ }
+ ContextResource resource = namingResources.findResource(name);
+ if (resource == null) {
+ throw new IllegalArgumentException
+ ("Invalid resource name '" + name + "'");
+ }
namingResources.removeResource(name);
fireContainerEvent("removeResource", name);
@@ -3104,6 +3151,15 @@
* @param name Name of the resource link to remove
*/
public void removeResourceLink(String name) {
+ name = URLDecoder.decode(name);
+ if (namingResources == null) {
+ return;
+ }
+ ContextResourceLink resource = namingResources.findResourceLink(name);
+ if (resource == null) {
+ throw new IllegalArgumentException
+ ("Invalid resource name '" + name + "'");
+ }
namingResources.removeResourceLink(name);
fireContainerEvent("removeResourceLink", name);
@@ -3320,8 +3376,8 @@
*/
public boolean filterStart() {
- if (debug >= 1)
- log("Starting filters");
+ if (log.isDebugEnabled())
+ log.debug("Starting filters");
// Instantiate and record a FilterConfig for each defined filter
boolean ok = true;
@@ -3330,15 +3386,15 @@
Iterator names = filterDefs.keySet().iterator();
while (names.hasNext()) {
String name = (String) names.next();
- if (debug >= 1)
- log(" Starting filter '" + name + "'");
+ if (log.isDebugEnabled())
+ log.debug(" Starting filter '" + name + "'");
ApplicationFilterConfig filterConfig = null;
try {
filterConfig = new ApplicationFilterConfig
(this, (FilterDef) filterDefs.get(name));
filterConfigs.put(name, filterConfig);
} catch (Throwable t) {
- log(sm.getString("standardContext.filterStart", name), t);
+ log.error(sm.getString("standardContext.filterStart", name), t);
ok = false;
}
}
@@ -3356,16 +3412,16 @@
*/
public boolean filterStop() {
- if (debug >= 1)
- log("Stopping filters");
+ if (log.isDebugEnabled())
+ log.debug("Stopping filters");
// Release all Filter and FilterConfig instances
synchronized (filterConfigs) {
Iterator names = filterConfigs.keySet().iterator();
while (names.hasNext()) {
String name = (String) names.next();
- if (debug >= 1)
- log(" Stopping filter '" + name + "'");
+ if (log.isDebugEnabled())
+ log.debug(" Stopping filter '" + name + "'");
ApplicationFilterConfig filterConfig =
(ApplicationFilterConfig) filterConfigs.get(name);
filterConfig.release();
@@ -3399,8 +3455,8 @@
*/
public boolean listenerStart() {
- if (debug >= 1)
- log("Configuring application event listeners");
+ if (log.isDebugEnabled())
+ log.debug("Configuring application event listeners");
// Instantiate the required listeners
ClassLoader loader = getLoader().getClassLoader();
@@ -3408,27 +3464,27 @@
Object results[] = new Object[listeners.length];
boolean ok = true;
for (int i = 0; i < results.length; i++) {
- if (debug >= 2)
- log(" Configuring event listener class '" +
+ if (log.isDebugEnabled())
+ log.debug(" Configuring event listener class '" +
listeners[i] + "'");
try {
Class clazz = loader.loadClass(listeners[i]);
results[i] = clazz.newInstance();
} catch (Throwable t) {
- log(sm.getString("standardContext.applicationListener",
+ log.error(sm.getString("standardContext.applicationListener",
listeners[i]), t);
ok = false;
}
}
if (!ok) {
- log(sm.getString("standardContext.applicationSkipped"));
+ log.error(sm.getString("standardContext.applicationSkipped"));
return (false);
}
// Send application start events
- if (debug >= 1)
- log("Sending application start events");
+ if (log.isDebugEnabled())
+ log.debug("Sending application start events");
setApplicationListeners(results);
Object instances[] = getApplicationListeners();
@@ -3449,7 +3505,7 @@
fireContainerEvent("afterContextInitialized", listener);
} catch (Throwable t) {
fireContainerEvent("afterContextInitialized", listener);
- log(sm.getString("standardContext.listenerStart",
+ log.error(sm.getString("standardContext.listenerStart",
instances[i].getClass().getName()), t);
ok = false;
}
@@ -3466,8 +3522,8 @@
*/
public boolean listenerStop() {
- if (debug >= 1)
- log("Sending application stop events");
+ if (log.isDebugEnabled())
+ log.debug("Sending application stop events");
boolean ok = true;
Object listeners[] = getApplicationListeners();
@@ -3489,7 +3545,7 @@
fireContainerEvent("beforeContextDestroyed", listener);
} catch (Throwable t) {
fireContainerEvent("beforeContextDestroyed", listener);
- log(sm.getString("standardContext.listenerStop",
+ log.error(sm.getString("standardContext.listenerStop",
listeners[j].getClass().getName()), t);
ok = false;
}
@@ -3523,7 +3579,7 @@
}
this.resources = proxyDirContext;
} catch (Throwable t) {
- log(sm.getString("standardContext.resourcesStart", t));
+ log.error(sm.getString("standardContext.resourcesStart", t));
ok = false;
}
@@ -3549,7 +3605,7 @@
}
}
} catch (Throwable t) {
- log(sm.getString("standardContext.resourcesStop", t));
+ log.error(sm.getString("standardContext.resourcesStop", t));
ok = false;
}
@@ -3598,7 +3654,7 @@
try {
wrapper.load();
} catch (ServletException e) {
- log(sm.getString("standardWrapper.loadException",
+ log.error(sm.getString("standardWrapper.loadException",
getName()), e);
// NOTE: load errors (including a servlet that throws
// UnavailableException from tht init() method) are NOT
@@ -3621,15 +3677,18 @@
throw new LifecycleException
(sm.getString("containerBase.alreadyStarted", logName()));
- if (debug >= 1)
- log("Starting");
- registerJMX();
+ String logName="tomcat." + getParent().getName() + "." +
+ ("".equals(getName()) ? "ROOT" : getName()) + ".Context";
+ log=org.apache.commons.logging.LogFactory.getLog(logName);
+
+ //if (log.isDebugEnabled())
+ log.info("Starting " + logName);
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
- if (debug >= 1)
- log("Processing start(), current available=" + getAvailable());
+ if (log.isDebugEnabled())
+ log.debug("Processing start(), current available=" + getAvailable());
setAvailable(false);
setConfigured(false);
boolean ok = true;
@@ -3643,41 +3702,45 @@
}
File file = new File(appBase);
file = new File(file, name + ".xml");
+ if( log.isDebugEnabled() )
+ log.debug( "Set config file " + file);
setConfigFile(file.getPath());
}
// Add missing components as necessary
if (webappResources == null) { // (1) Required by Loader
- if (debug >= 1)
- log("Configuring default Resources");
+ if (log.isDebugEnabled())
+ log.debug("Configuring default Resources");
try {
if ((docBase != null) && (docBase.endsWith(".war")))
setResources(new WARDirContext());
else
setResources(new FileDirContext());
} catch (IllegalArgumentException e) {
- log("Error initializing resources: " + e.getMessage());
+ log.error("Error initializing resources: " + e.getMessage());
ok = false;
}
}
if (ok) {
- if (!resourcesStart())
+ if (!resourcesStart()) {
+ log.error( "Error in resourceStart()");
ok = false;
+ }
}
if (getLoader() == null) { // (2) Required by Manager
if (getPrivileged()) {
- if (debug >= 1)
- log("Configuring privileged default Loader");
+ if (log.isDebugEnabled())
+ log.debug("Configuring privileged default Loader");
setLoader(new WebappLoader(this.getClass().getClassLoader()));
} else {
- if (debug >= 1)
- log("Configuring non-privileged default Loader");
+ if (log.isDebugEnabled())
+ log.debug("Configuring non-privileged default Loader");
setLoader(new WebappLoader(getParentClassLoader()));
}
}
if (getManager() == null) { // (3) After prerequisites
- if (debug >= 1)
- log("Configuring default Manager");
+ if (log.isDebugEnabled())
+ log.debug("Configuring default Manager");
if (getCluster() != null) {
setManager(getCluster().createManager(getName()));
} else {
@@ -3697,6 +3760,7 @@
getResources(), this);
if (!dependencyCheck) {
// do not make application available if depency check fails
+ log.error( "Error in dependencyCheck");
ok = false;
}
@@ -3720,8 +3784,8 @@
ClassLoader oldCCL = bindThread();
// Standard container startup
- if (debug >= 1)
- log("Processing standard container startup");
+ if (log.isDebugEnabled())
+ log.debug("Processing standard container startup");
if (ok) {
@@ -3768,6 +3832,16 @@
if (pipeline instanceof Lifecycle)
((Lifecycle) pipeline).start();
+ // Read tldListeners. XXX Option to disable
+ TldConfig tldConfig=new TldConfig();
+ tldConfig.setContext( this );
+ try {
+ tldConfig.execute();
+ } catch( Exception ex ) {
+ log.error("Error reading tld listeners " + ex.toString(), ex);
+ //ok=false;
+ }
+
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(START_EVENT, null);
@@ -3780,8 +3854,10 @@
}
}
- if (!getConfigured())
+ if (!getConfigured()) {
+ log.error( "Error getConfigured");
ok = false;
+ }
// We put the resources into the servlet context
if (ok)
@@ -3793,25 +3869,29 @@
// Create context attributes that will be required
if (ok) {
- if (debug >= 1)
- log("Posting standard context attributes");
+ if (log.isDebugEnabled())
+ log.debug("Posting standard context attributes");
postWelcomeFiles();
}
// Configure and call application event listeners and filters
if (ok) {
- if (!listenerStart())
+ if (!listenerStart()) {
+ log.error( "Error listenerStart");
ok = false;
+ }
}
if (ok) {
- if (!filterStart())
+ if (!filterStart()) {
+ log.error( "Error filterStart");
ok = false;
+ }
}
// Create request listener lifecycle valve
if (ok) {
if (!requestListenerConfig()) {
- log(sm.getString("standardContext.requestListenerStartFailed"));
+
log.error(sm.getString("standardContext.requestListenerStartFailed"));
}
}
@@ -3824,18 +3904,19 @@
// Set available status depending upon startup success
if (ok) {
- if (debug >= 1)
- log("Starting completed");
+ if (log.isDebugEnabled())
+ log.debug("Starting completed");
setAvailable(true);
} else {
- log(sm.getString("standardContext.startFailed"));
+ log.error(sm.getString("standardContext.startFailed"));
try {
stop();
} catch (Throwable t) {
- log(sm.getString("standardContext.startCleanup"), t);
+ log.error(sm.getString("standardContext.startCleanup"), t);
}
setAvailable(false);
}
+ registerJMX();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
@@ -3855,8 +3936,8 @@
throw new LifecycleException
(sm.getString("containerBase.notStarted", logName()));
- if (debug >= 1)
- log("Stopping");
+ if (log.isDebugEnabled())
+ log.debug("Stopping");
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
@@ -3878,8 +3959,8 @@
}
// Normal container shutdown processing
- if (debug >= 1)
- log("Processing standard container shutdown");
+ if (log.isDebugEnabled())
+ log.debug("Processing standard container shutdown");
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
@@ -3937,8 +4018,8 @@
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);
- if (debug >= 1)
- log("Stopping complete");
+ if (log.isDebugEnabled())
+ log.debug("Stopping complete");
}
@@ -3993,7 +4074,7 @@
return (urlPattern);
if (!isServlet22())
return (urlPattern);
- log(sm.getString("standardContext.urlPattern.patternWarning",
+ log.info(sm.getString("standardContext.urlPattern.patternWarning",
urlPattern));
return ("/" + urlPattern);
@@ -4330,15 +4411,15 @@
// Add this Valve to our Pipeline
try {
if (this instanceof ContainerBase) {
- Pipeline pipeline = ((ContainerBase) this).getPipeline();
+ Pipeline pipeline = this.getPipeline();
if (pipeline != null) {
- ((ContainerBase) this).addValve(requestListener);
- log(sm.getString
+ this.addValve(requestListener);
+ log.info(sm.getString
("standardContext.requestListenerConfig.added"));
}
}
} catch (Throwable t) {
- log(sm.getString("standardContext.requestListenerConfig.error"), t);
+ log.error(sm.getString("standardContext.requestListenerConfig.error"),
t);
ok = false;
}
return ok;
@@ -4347,6 +4428,169 @@
// -------------------- JMX methods --------------------
+ /**
+ * Return the MBean Names of the set of defined environment entries for
+ * this web application
+ */
+ public String[] getEnvironments() {
+ ContextEnvironment[] envs = getNamingResources().findEnvironments();
+ ArrayList results = new ArrayList();
+ for (int i = 0; i < envs.length; i++) {
+ try {
+ ObjectName oname =
+ MBeanUtils.createObjectName(this.getDomain(), envs[i]);
+ results.add(oname.toString());
+ } catch (MalformedObjectNameException e) {
+ throw new IllegalArgumentException
+ ("Cannot create object name for environment " + envs[i]);
+ }
+ }
+ return ((String[]) results.toArray(new String[results.size()]));
+
+ }
+
+
+ /**
+ * Return the MBean Names of all the defined resource references for this
+ * application.
+ */
+ public String[] getResourceNames() {
+
+ ContextResource[] resources = getNamingResources().findResources();
+ ArrayList results = new ArrayList();
+ for (int i = 0; i < resources.length; i++) {
+ try {
+ ObjectName oname =
+ MBeanUtils.createObjectName(this.getDomain(), resources[i]);
+ results.add(oname.toString());
+ } catch (MalformedObjectNameException e) {
+ throw new IllegalArgumentException
+ ("Cannot create object name for resource " + resources[i]);
+ }
+ }
+ return ((String[]) results.toArray(new String[results.size()]));
+
+ }
+
+
+ /**
+ * Return the MBean Names of all the defined resource links for this
+ * application
+ */
+ public String[] getResourceLinks() {
+
+ ContextResourceLink[] links = getNamingResources().findResourceLinks();
+ ArrayList results = new ArrayList();
+ for (int i = 0; i < links.length; i++) {
+ try {
+ ObjectName oname =
+ MBeanUtils.createObjectName(this.getDomain(), links[i]);
+ results.add(oname.toString());
+ } catch (MalformedObjectNameException e) {
+ throw new IllegalArgumentException
+ ("Cannot create object name for resource " + links[i]);
+ }
+ }
+ return ((String[]) results.toArray(new String[results.size()]));
+
+ }
+
+ // ------------------------------------------------------------- Operations
+
+
+ /**
+ * Add an environment entry for this web application.
+ *
+ * @param envName New environment entry name
+ */
+ public String addEnvironment(String envName, String type)
+ throws MalformedObjectNameException {
+
+ NamingResources nresources = getNamingResources();
+ if (nresources == null) {
+ return null;
+ }
+ ContextEnvironment env = nresources.findEnvironment(envName);
+ if (env != null) {
+ throw new IllegalArgumentException
+ ("Invalid environment name - already exists '" + envName + "'");
+ }
+ env = new ContextEnvironment();
+ env.setName(envName);
+ env.setType(type);
+ nresources.addEnvironment(env);
+
+ // Return the corresponding MBean name
+ ManagedBean managed =
Registry.getRegistry().findManagedBean("ContextEnvironment");
+ ObjectName oname =
+ MBeanUtils.createObjectName(managed.getDomain(), env);
+ return (oname.toString());
+
+ }
+
+
+ /**
+ * Add a resource reference for this web application.
+ *
+ * @param resourceName New resource reference name
+ */
+ public String addResource(String resourceName, String type)
+ throws MalformedObjectNameException {
+
+ NamingResources nresources = getNamingResources();
+ if (nresources == null) {
+ return null;
+ }
+ ContextResource resource = nresources.findResource(resourceName);
+ if (resource != null) {
+ throw new IllegalArgumentException
+ ("Invalid resource name - already exists'" + resourceName + "'");
+ }
+ resource = new ContextResource();
+ resource.setName(resourceName);
+ resource.setType(type);
+ nresources.addResource(resource);
+
+ // Return the corresponding MBean name
+ ManagedBean managed =
Registry.getRegistry().findManagedBean("ContextResource");
+ ObjectName oname =
+ MBeanUtils.createObjectName(managed.getDomain(), resource);
+ return (oname.toString());
+ }
+
+
+ /**
+ * Add a resource link for this web application.
+ *
+ * @param resourceLinkName New resource link name
+ */
+ public String addResourceLink(String resourceLinkName, String global,
+ String name, String type) throws MalformedObjectNameException {
+
+ NamingResources nresources = getNamingResources();
+ if (nresources == null) {
+ return null;
+ }
+ ContextResourceLink resourceLink =
+ nresources.findResourceLink(resourceLinkName);
+ if (resourceLink != null) {
+ throw new IllegalArgumentException
+ ("Invalid resource link name - already exists'" +
+ resourceLinkName + "'");
+ }
+ resourceLink = new ContextResourceLink();
+ resourceLink.setGlobal(global);
+ resourceLink.setName(resourceLinkName);
+ resourceLink.setType(type);
+ nresources.addResourceLink(resourceLink);
+
+ // Return the corresponding MBean name
+ ManagedBean managed =
Registry.getRegistry().findManagedBean("ContextResourceLink");
+ ObjectName oname =
+ MBeanUtils.createObjectName(managed.getDomain(), resourceLink);
+ return (oname.toString());
+ }
+
/** JSR77 servlets attribute
*
* @return list of all servlets ( we know about )
@@ -4367,7 +4611,7 @@
ContainerBase ctx=(ContainerBase)parent;
String pathName=getName();
String hostName=getParent().getName();
- String name= ((hostName==null)? "DEFAULT" : hostName) +
+ String name= "//" + ((hostName==null)? "DEFAULT" : hostName) +
(("".equals(pathName))?"/":pathName );
onameStr="j2eeType=WebModule,name=" + name +
@@ -4382,7 +4626,7 @@
for( Iterator it=wrappers.iterator(); it.hasNext() ; ) {
StandardWrapper wrapper=(StandardWrapper)it.next();
// XXX prevent duplicated registration
- wrapper.registerJMX( this, wrapper );
+ wrapper.registerJMX( this );
}
} catch( Exception ex ) {
log.info("Error registering context with jmx " + this + " " +
@@ -4390,5 +4634,59 @@
}
}
+ /** There are 2 cases:
+ * 1.The context is created and registered by internal APIS
+ * 2. The context is created by JMX, and it'll self-register.
+ *
+ * @param server
+ * @param name
+ * @return
+ * @throws Exception
+ */
+ public ObjectName preRegister(MBeanServer server,
+ ObjectName name)
+ throws Exception
+ {
+ if( oname != null ) {
+ //log.info( "Already registered " + oname + " " + name);
+ // Temporary - /admin uses the old names
+ return name;
+ }
+ ObjectName result=super.preRegister(server,name);
+ return name;
+ }
+
+ public void init() throws Exception {
+
+ if( this.getParent() != null ) {
+ log.info( "Already configured" );
+ return;
+ }
+ // "Life" update
+ String path=oname.getKeyProperty("name");
+ if( path == null ) {
+ log.error( "No name attribute " +name );
+ return;
+ }
+ int delim=path.indexOf( "/" );
+ String hostName="localhost"; // Should be default...
+ if( delim > 0 ) {
+ hostName=path.substring(0, delim);
+ this.setName( path.substring(delim));
+ } else {
+ this.setName( path );
+ }
+ // XXX The service and domain should be the same.
+ ObjectName parentName=new ObjectName( domain + ":" +
+ "type=Host,host=" + hostName + ",service=Tomcat-Standalone");
+ log.info("Adding to " + parentName );
+
+ ContextConfig config = new ContextConfig();
+ this.addLifecycleListener(config);
+
+ mserver.invoke(parentName, "addChild", new Object[] { this },
+ new String[] {"org.apache.catalina.Container"});
+
+ }
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>