You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ho...@apache.org on 2002/08/09 04:10:10 UTC
cvs commit: jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5 CoyoteRequest.java LocalStrings.properties
horwat 2002/08/08 19:10:10
Modified: coyote/src/java/org/apache/coyote/tomcat5 CoyoteRequest.java
LocalStrings.properties
Log:
Add servlet request attribute change event support.
Revision Changes Path
1.2 +130 -6 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5/CoyoteRequest.java
Index: CoyoteRequest.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5/CoyoteRequest.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- CoyoteRequest.java 4 Aug 2002 19:39:49 -0000 1.1
+++ CoyoteRequest.java 9 Aug 2002 02:10:10 -0000 1.2
@@ -91,6 +91,10 @@
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.ServletRequestAttributeEvent;
+import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -105,6 +109,7 @@
import org.apache.catalina.Context;
import org.apache.catalina.Globals;
import org.apache.catalina.HttpRequest;
+import org.apache.catalina.Logger;
import org.apache.catalina.Manager;
import org.apache.catalina.Realm;
import org.apache.catalina.Session;
@@ -214,6 +219,12 @@
/**
+ * List of read only attributes for this Request.
+ */
+ private HashMap readOnlyAttributes = new HashMap();
+
+
+ /**
* The preferred Locales assocaited with this Request.
*/
protected ArrayList locales = new ArrayList();
@@ -1136,7 +1147,42 @@
* @param name Name of the request attribute to remove
*/
public void removeAttribute(String name) {
- attributes.remove(name);
+ Object value = null;
+ boolean found = false;
+
+ // Remove the specified attribute
+ synchronized (attributes) {
+ // Check for read only attribute
+ if (readOnlyAttributes.containsKey(name))
+ return;
+ found = attributes.containsKey(name);
+ if (found) {
+ value = attributes.get(name);
+ attributes.remove(name);
+ } else {
+ return;
+ }
+ }
+
+ // Notify interested application event listeners
+ Object listeners[] = context.getApplicationListeners();
+ if ((listeners == null) || (listeners.length == 0))
+ return;
+ ServletRequestAttributeEvent event =
+ new ServletRequestAttributeEvent(context.getServletContext(),
+ getRequest(), name, value);
+ for (int i = 0; i < listeners.length; i++) {
+ if (!(listeners[i] instanceof ServletRequestAttributeListener))
+ continue;
+ ServletRequestAttributeListener listener =
+ (ServletRequestAttributeListener) listeners[i];
+ try {
+ listener.attributeRemoved(event);
+ } catch (Throwable t) {
+ // FIXME - should we do anything besides log these?
+ log(sm.getString("coyoteRequest.attributeEvent"), t);
+ }
+ }
}
@@ -1159,8 +1205,50 @@
return;
}
- attributes.put(name, value);
+ Object oldValue = null;
+ boolean replaced = false;
+ // Add or replace the specified attribute
+ synchronized (attributes) {
+ // Check for read only attribute
+ if (readOnlyAttributes.containsKey(name))
+ return;
+ oldValue = attributes.get(name);
+ if (oldValue != null)
+ replaced = true;
+ attributes.put(name, value);
+ }
+
+ // Notify interested application event listeners
+ Object listeners[] = context.getApplicationListeners();
+ if ((listeners == null) || (listeners.length == 0))
+ return;
+ ServletRequestAttributeEvent event = null;
+ if (replaced)
+ event =
+ new ServletRequestAttributeEvent(context.getServletContext(),
+ getRequest(), name, oldValue);
+ else
+ event =
+ new ServletRequestAttributeEvent(context.getServletContext(),
+ getRequest(), name, value);
+
+ for (int i = 0; i < listeners.length; i++) {
+ if (!(listeners[i] instanceof ServletRequestAttributeListener))
+ continue;
+ ServletRequestAttributeListener listener =
+ (ServletRequestAttributeListener) listeners[i];
+ try {
+ if (replaced) {
+ listener.attributeReplaced(event);
+ } else {
+ listener.attributeAdded(event);
+ }
+ } catch (Throwable t) {
+ // FIXME - should we do anything besides log these?
+ log(sm.getString("coyoteRequest.attributeEvent"), t);
+ }
+ }
}
@@ -2101,5 +2189,41 @@
}
+
+ /**
+ * Log a message on the Logger associated with our Container (if any).
+ *
+ * @param message Message to be logged
+ */
+ private void log(String message) {
+
+ Logger logger = connector.getContainer().getLogger();
+ String localName = "CoyoteRequest";
+ if (logger != null)
+ logger.log(localName + " " + message);
+ else
+ System.out.println(localName + " " + message);
+
+ }
+
+
+ /**
+ * Log a message on the Logger associated with our Container (if any).
+ *
+ * @param message Message to be logged
+ * @param throwable Associated exception
+ */
+ private void log(String message, Throwable throwable) {
+
+ Logger logger = connector.getContainer().getLogger();
+ String localName = "CoyoteRequest";
+ if (logger != null)
+ logger.log(localName + " " + message, throwable);
+ else {
+ System.out.println(localName + " " + message);
+ throwable.printStackTrace(System.out);
+ }
+
+ }
}
1.2 +3 -0 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5/LocalStrings.properties,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LocalStrings.properties 4 Aug 2002 19:39:49 -0000 1.1
+++ LocalStrings.properties 9 Aug 2002 02:10:10 -0000 1.2
@@ -36,3 +36,6 @@
coyoteRequest.getReader.ise=getInputStream() has already been called for this request
coyoteRequest.sessionCreateCommitted=Cannot create a session after the response has been committed
coyoteRequest.setAttribute.namenull=Cannot call setAttribute with a null name
+coyoteRequest.listenerStart=Exception sending context initialized event to listener instance of class {0}
+coyoteRequest.listenerStop=Exception sending context destroyed event to listener instance of class {0}
+coyoteRequest.attributeEvent=Exception thrown by attributes event listener
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>
Re: cvs commit: jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat5 CoyoteRequest.java LocalStrings.properties
Posted by Bill Barker <wb...@wilshire.com>.
> + // Remove the specified attribute
> + synchronized (attributes) {
> + // Check for read only attribute
> + if (readOnlyAttributes.containsKey(name))
> + return;
> + found = attributes.containsKey(name);
> + if (found) {
> + value = attributes.get(name);
> + attributes.remove(name);
> + } else {
> + return;
> + }
> + }
Requests are per-thread, so the synchronized is unnecessary.
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>