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());
}
}