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 ) {


Reply via email to