You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2009/02/27 09:28:02 UTC

svn commit: r748426 - /incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java

Author: fmeschbe
Date: Fri Feb 27 08:28:02 2009
New Revision: 748426

URL: http://svn.apache.org/viewvc?rev=748426&view=rev
Log:
SLING-651 Apply patch by Eric Normann (Many thanks)

Modified:
    incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java

Modified: incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java?rev=748426&r1=748425&r2=748426&view=diff
==============================================================================
--- incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java (original)
+++ incubator/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/SlingPostServlet.java Fri Feb 27 08:28:02 2009
@@ -67,6 +67,10 @@
  * @scr.reference name="postProcessor"
  *                interface="org.apache.sling.servlets.post.SlingPostProcessor"
  *                cardinality="0..n" policy="dynamic"
+ * @scr.reference name="postOperation" 
+ * 					interface="org.apache.sling.servlets.post.SlingPostOperation" 
+ * 					cardinality="0..n" 
+ * 					policy="dynamic"
  */
 public class SlingPostServlet extends SlingAllMethodsServlet {
 
@@ -109,10 +113,12 @@
 
     private SlingPostOperation modifyOperation;
 
+    private final List<ServiceReference> delayedPostOperations = new ArrayList<ServiceReference>();
+
     private final Map<String, SlingPostOperation> postOperations = new HashMap<String, SlingPostOperation>();
 
     private final List<ServiceReference> delayedPostProcessors = new ArrayList<ServiceReference>();
-
+    
     private final List<ServiceReference> postProcessors = new ArrayList<ServiceReference>();
 
     private SlingPostProcessor[] cachedPostProcessors = new SlingPostProcessor[0];
@@ -285,6 +291,12 @@
             }
             this.delayedPostProcessors.clear();
         }
+        synchronized ( this.delayedPostOperations ) {
+            for(final ServiceReference ref : this.delayedPostOperations) {
+                this.registerPostOperation(ref);
+            }
+            this.delayedPostOperations.clear();
+        }
         Dictionary<?, ?> props = context.getProperties();
 
         String[] nameHints = OsgiUtil.toStringArray(props.get(PROP_NODE_NAME_HINT_PROPERTIES));
@@ -304,6 +316,33 @@
         dateParser = null;
         this.componentContext = null;
     }
+    
+    protected void bindPostOperation(ServiceReference ref) {
+    	synchronized ( this.delayedPostOperations ) {
+			if (this.componentContext == null) {
+				this.delayedPostOperations.add(ref);
+			} else {
+				this.registerPostOperation(ref);
+			}
+		}
+    }
+    
+    protected void registerPostOperation(ServiceReference ref) {
+    	String operationName = (String) ref.getProperty(SlingPostOperation.PROP_OPERATION_NAME);
+		SlingPostOperation operation = (SlingPostOperation) this.componentContext.locateService("postOperation", ref);
+    	synchronized (this.postOperations) {
+			this.postOperations.put(operationName, operation);
+    	}
+    }
+    
+    protected void unbindPostOperation(ServiceReference ref) {
+    	synchronized ( this.delayedPostOperations ) {
+        	String operationName = (String) ref.getProperty(SlingPostOperation.PROP_OPERATION_NAME);
+        	synchronized (this.postOperations) {
+        		this.postOperations.remove(operationName);
+        	}
+    	}
+    }
 
     protected void bindPostProcessor(ServiceReference ref) {
         synchronized ( this.delayedPostProcessors ) {