Author: chetanm
Date: Thu Jan 28 11:49:25 2016
New Revision: 1727311

URL: http://svn.apache.org/viewvc?rev=1727311&view=rev
Log:
OAK-3944 - OsgiWhiteboard should handle multiple unregister call

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboardTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java?rev=1727311&r1=1727310&r2=1727311&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboard.java
 Thu Jan 28 11:49:25 2016
@@ -75,10 +75,14 @@ public class OsgiWhiteboard implements W
         final ServiceRegistration registration =
                 context.registerService(type.getName(), service, dictionary);
         return new Registration() {
+            private boolean unregistered;
             @Override
             public void unregister() {
                 try {
-                    registration.unregister();
+                    if (!unregistered) {
+                        registration.unregister();
+                        unregistered = true;
+                    }
                 } catch (IllegalStateException ex) {
                     log.warn("Error unregistering service: {} of type {}",
                             service, type.getName(), ex);

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboardTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboardTest.java?rev=1727311&r1=1727310&r2=1727311&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboardTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/osgi/OsgiWhiteboardTest.java
 Thu Jan 28 11:49:25 2016
@@ -17,13 +17,17 @@
 
 package org.apache.jackrabbit.oak.osgi;
 
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import ch.qos.logback.classic.Level;
+import org.apache.jackrabbit.oak.commons.junit.LogCustomizer;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
@@ -37,6 +41,8 @@ public class OsgiWhiteboardTest {
      */
     @Test
     public void testDoubleUnregister() {
+        LogCustomizer logs = 
LogCustomizer.forLogger(OsgiWhiteboard.class.getName())
+                .filter(Level.WARN).create();
         BundleContext bundleContext = mock(BundleContext.class);
         OsgiWhiteboard w = new OsgiWhiteboard(bundleContext);
 
@@ -47,17 +53,16 @@ public class OsgiWhiteboardTest {
             }
         };
 
+        final AtomicBoolean unregistered = new AtomicBoolean();
         ServiceRegistration sr = new ServiceRegistration() {
 
-            boolean isUnregistering = false;
-
             @Override
             public void unregister() {
-                if (isUnregistering) {
+                if (unregistered.get()) {
                     throw new IllegalStateException(
                             "Service already unregistered.");
                 }
-                isUnregistering = true;
+                unregistered.set(true);
             }
 
             @Override
@@ -76,7 +81,13 @@ public class OsgiWhiteboardTest {
         Registration reg = w.register(Runnable.class, r,
                 new HashMap<String, Object>());
         reg.unregister();
+
+        assertTrue(unregistered.get());
+        logs.starting();
         reg.unregister();
+        logs.finished();
+
+        assertTrue(logs.getLogs().isEmpty());
     }
 
 }


Reply via email to