incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From my...@apache.org
Subject svn commit: r959710 - in /sling/trunk/bundles: api/src/main/java/org/apache/sling/api/request/ engine/src/main/java/org/apache/sling/engine/impl/ engine/src/main/java/org/apache/sling/engine/impl/helper/
Date Thu, 01 Jul 2010 16:21:12 GMT
Author: mykee
Date: Thu Jul  1 16:21:12 2010
New Revision: 959710

URL: http://svn.apache.org/viewvc?rev=959710&view=rev
Log:
SLING-1576 Provide a Sling request listener independent from a specific HTTP service

Added:
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java
  (with props)
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java
  (with props)
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java
  (with props)
Modified:
    sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java

Added: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java?rev=959710&view=auto
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java
(added)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java
Thu Jul  1 16:21:12 2010
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sling.api.request;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+
+/**
+ * represents an event published by the Sling engine while
+ * dispatching a request.
+ *  
+ * @see org.apache.sling.api.request.SlingRequestListener
+*/
+public class SlingRequestEvent {
+	private ServletContext sc;
+	private ServletRequest request;
+	private EventType type; 
+	
+	/**
+	 * type of the event  
+	 */
+	public enum EventType { EVENT_INIT, EVENT_DESTROY };
+	
+	public SlingRequestEvent (ServletContext sc, ServletRequest request, EventType type )
+	{
+		this.sc = sc;
+		this.request = request;
+		this.type = type;
+	}
+	
+	/**
+	 * Gets the actual servlet context object as <code>ServletContext</code>
+	 * @return
+	 */
+	public ServletContext getServletContext()
+	{
+		return sc;
+	}
+	
+	/**
+	 * Gets the actual request object as <code>ServletRequest</code>
+	 * @return the actual request object as <code>ServletRequest</code>
+	 */
+	public ServletRequest getServletRequest()
+	{
+		return request;
+	}
+	
+	/**
+	 * get the type of the event, eg. EVENT_INIT or EVENT_DESTROY
+	 * @return the type of the event as <code>EventType</code>, 
+	 * eg. EVENT_INIT or EVENT_DESTROY
+	 */
+	public EventType getType ()
+	{
+		return type;
+	}
+}

Propchange: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestEvent.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java?rev=959710&view=auto
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java
(added)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java
Thu Jul  1 16:21:12 2010
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sling.api.request;
+
+/**
+ * Implementations of this service interface receive notifications about 
+ * changes to Sling request of the Sling application they are part of. 
+ * To receive notification events, the implementation class must be 
+ * registered as an OSGi service with the service name 
+ * org.apache.sling.api.request.SlingRequestListener. 
+ */
+public interface SlingRequestListener {
+	
+	static final String SERVICE_NAME = "org.apache.sling.api.request.SlingRequestListener";

+
+	/**
+	 * This method is called from the Sling application for every
+	 * <code>EventType</code> appearing during the dispatching of
+	 * a Sling request  
+	 * 
+	 * @param sre the object representing the event
+	 * 
+	 * @see org.apache.sling.api.request.SlingRequestEvent.EventType
+	 */
+	public void onEvent( SlingRequestEvent sre );
+}

Propchange: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/request/SlingRequestListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java?rev=959710&r1=959709&r2=959710&view=diff
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
(original)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
Thu Jul  1 16:21:12 2010
@@ -52,6 +52,7 @@ import org.apache.sling.api.adapter.Adap
 import org.apache.sling.api.request.RequestPathInfo;
 import org.apache.sling.api.request.RequestProgressTracker;
 import org.apache.sling.api.request.ResponseUtil;
+import org.apache.sling.api.request.SlingRequestEvent;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceNotFoundException;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -62,6 +63,7 @@ import org.apache.sling.commons.osgi.Osg
 import org.apache.sling.engine.impl.filter.RequestSlingFilterChain;
 import org.apache.sling.engine.impl.filter.SlingComponentFilterChain;
 import org.apache.sling.engine.impl.filter.SlingFilterChainHelper;
+import org.apache.sling.engine.impl.helper.RequestListenerManager;
 import org.apache.sling.engine.impl.helper.SlingFilterConfig;
 import org.apache.sling.engine.impl.helper.SlingServletContext;
 import org.apache.sling.engine.impl.log.RequestLogger;
@@ -171,6 +173,8 @@ public class SlingMainServlet extends Ge
     private SlingFilterChainHelper requestFilterChain = new SlingFilterChainHelper();
 
     private SlingFilterChainHelper innerFilterChain = new SlingFilterChainHelper();
+    
+    private RequestListenerManager requestListenerManager; 
 
     private boolean allowTrace = DEFAULT_ALLOW_TRACE;
 
@@ -183,9 +187,12 @@ public class SlingMainServlet extends Ge
 
         if (req instanceof HttpServletRequest
             && res instanceof HttpServletResponse) {
-
+        	
             HttpServletRequest request = (HttpServletRequest) req;
 
+        	requestListenerManager.sendEvent( new SlingRequestEvent( getServletContext(), 
+        			request, SlingRequestEvent.EventType.EVENT_INIT ) );
+
             // set the thread name according to the request
             String threadName = setThreadName(request);
 
@@ -238,6 +245,8 @@ public class SlingMainServlet extends Ge
 
             } finally {
 
+            	requestListenerManager.sendEvent( new SlingRequestEvent( getServletContext(),

+            			request, SlingRequestEvent.EventType.EVENT_DESTROY ) );
                 // reset the thread name
                 if (threadName != null) {
                     Thread.currentThread().setName(threadName);
@@ -621,6 +630,9 @@ public class SlingMainServlet extends Ge
                 initFilter(componentContext, serviceReference);
             }
         }
+        
+        // initialize requestListenerManager
+        requestListenerManager = new RequestListenerManager( bundleContext );
 
         // try to setup configuration printer
         try {

Added: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java?rev=959710&view=auto
==============================================================================
--- sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java
(added)
+++ sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java
Thu Jul  1 16:21:12 2010
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sling.engine.impl.helper;
+
+import org.apache.sling.api.request.SlingRequestEvent;
+import org.apache.sling.api.request.SlingRequestListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RequestListenerManager  {
+	
+    /** default log */
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    
+    private ServiceTracker serviceTracker;
+
+	public RequestListenerManager ( BundleContext context )
+	{
+		serviceTracker = new ServiceTracker( context, SlingRequestListener.SERVICE_NAME, null );
+		serviceTracker.open();
+		
+	}
+	
+	public void sendEvent ( SlingRequestEvent event )
+	{
+		Object[] services = serviceTracker.getServices();
+		if ( services != null )
+		{
+			for ( Object service : services )
+			{
+				if ( service instanceof SlingRequestListener )
+				{
+					( (SlingRequestListener) service ).onEvent( event );
+				}
+				else
+				{
+					log.error( "Implementation of service named " + SlingRequestListener.SERVICE_NAME +

+							" does not implement service interface " + SlingRequestListener.class.getName() +
"." );
+				}
+			}
+		}
+	}
+	
+
+}

Propchange: sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/helper/RequestListenerManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



Mime
View raw message