Author: remy.maucherat(a)jboss.com
Date: 2009-07-16 13:05:56 -0400 (Thu, 16 Jul 2009)
New Revision: 1136
Modified:
trunk/java/org/apache/catalina/Context.java
trunk/java/org/apache/catalina/core/ApplicationContext.java
trunk/java/org/apache/catalina/core/ApplicationContextFacade.java
trunk/java/org/apache/catalina/core/StandardContext.java
Log:
- Implement the JSP config metadata (which I won't use).
- Add the new addListener methods (with the missing TLD check, it's annoying).
Modified: trunk/java/org/apache/catalina/Context.java
===================================================================
--- trunk/java/org/apache/catalina/Context.java 2009-07-16 00:36:42 UTC (rev 1135)
+++ trunk/java/org/apache/catalina/Context.java 2009-07-16 17:05:56 UTC (rev 1136)
@@ -19,6 +19,8 @@
package org.apache.catalina;
+import java.util.EventListener;
+
import javax.servlet.ServletContext;
import org.apache.catalina.deploy.ApplicationParameter;
@@ -529,6 +531,15 @@
/**
+ * Add a new Listener instance to the set of Listeners
+ * configured for this application.
+ *
+ * @param listener Java instance of a listener
+ */
+ public <T extends EventListener> void addApplicationListenerInstance(T
listener);
+
+
+ /**
* Add a new application parameter for this application.
*
* @param parameter The new application parameter
@@ -803,6 +814,12 @@
/**
+ * Return the set of JSP property groups.
+ */
+ public JspPropertyGroup[] findJspPropertyGroups();
+
+
+ /**
* Return the MIME type to which the specified extension is mapped,
* if any; otherwise return <code>null</code>.
*
Modified: trunk/java/org/apache/catalina/core/ApplicationContext.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationContext.java 2009-07-16 00:36:42 UTC
(rev 1135)
+++ trunk/java/org/apache/catalina/core/ApplicationContext.java 2009-07-16 17:05:56 UTC
(rev 1136)
@@ -76,6 +76,8 @@
import javax.servlet.SessionCookieConfig;
import javax.servlet.SessionTrackingMode;
import javax.servlet.descriptor.JspConfigDescriptor;
+import javax.servlet.descriptor.JspPropertyGroupDescriptor;
+import javax.servlet.descriptor.TaglibDescriptor;
import org.apache.catalina.Container;
import org.apache.catalina.Context;
@@ -84,6 +86,7 @@
import org.apache.catalina.Wrapper;
import org.apache.catalina.deploy.ApplicationParameter;
import org.apache.catalina.deploy.FilterDef;
+import org.apache.catalina.deploy.JspPropertyGroup;
import org.apache.catalina.util.Enumerator;
import org.apache.catalina.util.RequestUtil;
import org.apache.catalina.util.ResourceSet;
@@ -1052,6 +1055,60 @@
}
+ public void addListener(String className) {
+ if (context.isInitialized()) {
+ throw new
IllegalStateException(sm.getString("applicationContext.alreadyInitialized",
+ getContextPath()));
+ }
+ // FIXME: forbidden if the listener is from a TLD
+ context.addApplicationListener(className);
+ }
+
+
+ public <T extends EventListener> void addListener(T listener) {
+ if (context.isInitialized()) {
+ throw new
IllegalStateException(sm.getString("applicationContext.alreadyInitialized",
+ getContextPath()));
+ }
+ // FIXME: forbidden if the listener is from a TLD
+ context.addApplicationListenerInstance(listener);
+ }
+
+
+ public void addListener(Class<? extends EventListener> listenerClass) {
+ if (context.isInitialized()) {
+ throw new
IllegalStateException(sm.getString("applicationContext.alreadyInitialized",
+ getContextPath()));
+ }
+ // FIXME: forbidden if the listener is from a TLD
+ try {
+ context.addApplicationListenerInstance(listenerClass.newInstance());
+ } catch (Exception e) {
+ // FIXME: better error
+ throw new IllegalStateException(e);
+ }
+ }
+
+
+ public JspConfigDescriptor getJspConfigDescriptor() {
+ ArrayList<TaglibDescriptor> taglibDescriptors = new
ArrayList<TaglibDescriptor>();
+ String[] taglibURIs = context.findTaglibs();
+ for (int i = 0; i < taglibURIs.length; i++) {
+ String taglibLocation = context.findTaglib(taglibURIs[i]);
+ TaglibDescriptor taglibDescriptor =
+ new TaglibDescriptorImpl(taglibURIs[i], taglibLocation);
+ taglibDescriptors.add(taglibDescriptor);
+ }
+ ArrayList<JspPropertyGroupDescriptor> jspPropertyGroupDescriptors =
+ new ArrayList<JspPropertyGroupDescriptor>();
+ JspPropertyGroup[] jspPropertyGroups = context.findJspPropertyGroups();
+ for (int i = 0; i < jspPropertyGroups.length; i++) {
+ jspPropertyGroupDescriptors.add(jspPropertyGroups[i]);
+ }
+ return new JspConfigDescriptorImpl(jspPropertyGroupDescriptors,
taglibDescriptors);
+ }
+
+
// -------------------------------------------------------- Package Methods
protected StandardContext getContext() {
return this.context;
@@ -1190,33 +1247,51 @@
}
}
+
+ /**
+ * JSP config metadata class (not used for Jasper).
+ */
+ private static final class JspConfigDescriptorImpl implements JspConfigDescriptor {
- @Override
- public void addListener(String className) {
- // TODO Auto-generated method stub
-
- }
+ private Iterable<JspPropertyGroupDescriptor> jspPropertyGroups;
+ private Iterable<TaglibDescriptor> taglibs;
+ public JspConfigDescriptorImpl(Iterable<JspPropertyGroupDescriptor>
jspPropertyGroups,
+ Iterable<TaglibDescriptor> taglibs) {
+ this.jspPropertyGroups = jspPropertyGroups;
+ this.taglibs = taglibs;
+ }
+ public Iterable<JspPropertyGroupDescriptor> getJspPropertyGroups() {
+ return jspPropertyGroups;
+ }
- @Override
- public <T extends EventListener> void addListener(T t) {
- // TODO Auto-generated method stub
+ public Iterable<TaglibDescriptor> getTaglibs() {
+ return taglibs;
+ }
}
+
+ /**
+ * JSP taglib descriptor metadata class (not used for Jasper).
+ */
+ private static final class TaglibDescriptorImpl implements TaglibDescriptor {
-
- @Override
- public void addListener(Class<? extends EventListener> listenerClass) {
- // TODO Auto-generated method stub
+ private String taglibLocation;
+ private String taglibURI;
- }
+ public TaglibDescriptorImpl(String taglibURI, String taglibLocation) {
+ this.taglibLocation = taglibLocation;
+ this.taglibURI = taglibURI;
+ }
+ public String getTaglibLocation() {
+ return taglibLocation;
+ }
- @Override
- public JspConfigDescriptor getJspConfigDescriptor() {
- // TODO Auto-generated method stub
- return null;
+ public String getTaglibURI() {
+ return taglibURI;
+ }
+
}
-
}
Modified: trunk/java/org/apache/catalina/core/ApplicationContextFacade.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationContextFacade.java 2009-07-16 00:36:42
UTC (rev 1135)
+++ trunk/java/org/apache/catalina/core/ApplicationContextFacade.java 2009-07-16 17:05:56
UTC (rev 1136)
@@ -122,6 +122,7 @@
private void initClassCache(){
+ // FIXME: redo method list
Class[] clazz = new Class[]{String.class};
classCache.put("getContext", clazz);
classCache.put("getMimeType", clazz);
Modified: trunk/java/org/apache/catalina/core/StandardContext.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardContext.java 2009-07-16 00:36:42 UTC (rev
1135)
+++ trunk/java/org/apache/catalina/core/StandardContext.java 2009-07-16 17:05:56 UTC (rev
1136)
@@ -214,6 +214,13 @@
/**
+ * The set of application listener class names configured for this
+ * application, in the order they were encountered in the web.xml file.
+ */
+ protected EventListener applicationListenerInstances[] = new EventListener[0];
+
+
+ /**
* The set of instantiated application event listener objects</code>.
*/
protected Object applicationEventListenersObjects[] =
@@ -2010,7 +2017,7 @@
* @param listener Java class name of a listener class
*/
public void addApplicationListener(String listener) {
- String results[] =new String[applicationListeners.length + 1];
+ String results[] = new String[applicationListeners.length + 1];
for (int i = 0; i < applicationListeners.length; i++) {
if (listener.equals(applicationListeners[i])) {
log.info(sm.getString("standardContext.duplicateListener",
listener));
@@ -2021,11 +2028,31 @@
results[applicationListeners.length] = listener;
applicationListeners = results;
fireContainerEvent("addApplicationListener", listener);
- // FIXME - add instance if already started?
}
/**
+ * Add a new Listener instance to the set of Listeners
+ * configured for this application.
+ *
+ * @param listener Java instance of a listener
+ */
+ public <T extends EventListener> void addApplicationListenerInstance(T
listener) {
+ EventListener results[] = new EventListener[applicationListenerInstances.length +
1];
+ for (int i = 0; i < applicationListenerInstances.length; i++) {
+ if (listener.equals(applicationListenerInstances[i])) {
+ log.info(sm.getString("standardContext.duplicateListener",
listener));
+ return;
+ }
+ results[i] = applicationListenerInstances[i];
+ }
+ results[applicationListenerInstances.length] = listener;
+ applicationListenerInstances = results;
+ fireContainerEvent("addApplicationListenerInstance", listener);
+ }
+
+
+ /**
* Add a new application parameter for this application.
*
* @param parameter The new application parameter
@@ -2798,6 +2825,16 @@
/**
+ * Return the set of JSP property groups.
+ */
+ public JspPropertyGroup[] findJspPropertyGroups() {
+ JspPropertyGroup results[] =
+ new JspPropertyGroup[jspPropertyGroups.size()];
+ return jspPropertyGroups.values().toArray(results);
+ }
+
+
+ /**
* FIXME: Fooling introspection ...
*/
public Context findMappingObject() {
@@ -3691,9 +3728,10 @@
// Instantiate the required listeners
String listeners[] = findApplicationListeners();
- EventListener results[] = new EventListener[listeners.length];
+ EventListener listenerInstances[] = applicationListenerInstances;
+ EventListener results[] = new EventListener[listeners.length +
listenerInstances.length];
boolean ok = true;
- for (int i = 0; i < results.length; i++) {
+ for (int i = 0; i < listeners.length; i++) {
if (getLogger().isDebugEnabled())
getLogger().debug(" Configuring event listener class '" +
listeners[i] + "'");
@@ -3706,6 +3744,9 @@
ok = false;
}
}
+ for (int i = 0; i < listenerInstances.length; i++) {
+ results[i + listeners.length] = listenerInstances[i];
+ }
if (!ok) {
getLogger().error(sm.getString("standardContext.applicationSkipped"));
return (false);