Revert "SLING-8946 implement consistent shadowing of observation"
This reverts commit 4f48deeddde060447cdcd00730263a9cb8e9ae6d.
This commit remains on the feature/SLING-8946 branch for further
development.
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
index f8f41b8..98d60ff 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
@@ -151,7 +151,15 @@
this.providerReporter = generator.createProviderReporter();
synchronized ( this.handlers ) {
this.reporterGenerator = generator;
- this.updateHandlers();
+ for (List<ResourceProviderHandler> list : handlers.values()) {
+ if ( !list.isEmpty() ) {
+ final ResourceProviderHandler h = list.get(0);
+ if (h != null) {
+ updateProviderContext(h);
+ h.update();
+ }
+ }
+ }
}
}
@@ -347,7 +355,7 @@
*/
private boolean activate(final ResourceProviderHandler handler) {
synchronized (this.handlers) {
- updateHandlers();
+ updateProviderContext(handler);
}
if ( !handler.activate() ) {
logger.warn("Activating resource provider {} failed", handler.getInfo());
@@ -365,9 +373,6 @@
*/
private void deactivate(final ResourceProviderHandler handler) {
handler.deactivate();
- synchronized (this.handlers) {
- updateHandlers();
- }
logger.debug("Deactivated resource provider {}", handler.getInfo());
}
@@ -480,18 +485,6 @@
}
}
- private void updateHandlers() {
- for (List<ResourceProviderHandler> list : handlers.values()) {
- if ( !list.isEmpty() ) {
- final ResourceProviderHandler h = list.get(0);
- if (h != null) {
- updateProviderContext(h);
- h.update();
- }
- }
- }
- }
-
private void updateProviderContext(final ResourceProviderHandler handler) {
final Set<String> excludedPaths = new HashSet<>();
final Path handlerPath = new Path(handler.getPath());
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
index 21ead48..d0ed944 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
@@ -19,21 +19,15 @@
package org.apache.sling.resourceresolver.impl.providers;
import static org.hamcrest.Matchers.arrayWithSize;
-import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
-import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.sling.api.resource.observation.ResourceChange;
@@ -51,8 +45,6 @@
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.event.EventAdmin;
public class ResourceProviderTrackerTest {
@@ -63,7 +55,7 @@
private EventAdmin eventAdmin;
private ResourceProviderInfo rp2Info;
private Fixture fixture;
-
+
@Before
public void prepare() throws Exception {
eventAdmin = context.getService(EventAdmin.class);
@@ -83,7 +75,7 @@
fixture.registerResourceProvider(rp3, "invalid", AuthType.no);
ResourceProviderTracker tracker = new ResourceProviderTracker();
- tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new DoNothingObservationReporter()));
+ tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
tracker.activate(context.bundleContext(), eventAdmin, new DoNothingChangeListener());
return tracker;
}
@@ -113,7 +105,7 @@
@Test
public void testActivationDeactivation() throws Exception {
final ResourceProviderTracker tracker = new ResourceProviderTracker();
- tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new DoNothingObservationReporter()));
+ tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
// create boolean markers for the listener
final AtomicBoolean addedCalled = new AtomicBoolean(false);
@@ -167,7 +159,7 @@
@Test
public void testReactivation() throws Exception {
final ResourceProviderTracker tracker = new ResourceProviderTracker();
- tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new DoNothingObservationReporter()));
+ tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
// create boolean markers for the listener
final AtomicBoolean addedCalled = new AtomicBoolean(false);
@@ -248,62 +240,6 @@
assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(0));
}
- /**
- * This test verifies that shadowing of Resource observation is deterministic when ResourceProviders get registered and unregistered,
- * meaning it is independent of the order in which those events happen.
- * <p>
- * It does so by
- * 1) registering a ResourceProvider A on a deeper path then root (shadowing root)
- * 2) registering a ResourceProvider B on root
- * 3) unregistering the ResourceProvider A
- * 4) and registering the ResoucreProvider A
- * <p>
- * This guarantees in both cases (A before B and B before A) the same excludes are applied in the ObservationReporter.
- *
- * @throws InvalidSyntaxException
- */
- @Test
- public void testDeterministicObservationShadowing() throws InvalidSyntaxException {
- final ResourceProviderTracker tracker = new ResourceProviderTracker();
- final Map<String, List<String>> excludeSets = new HashMap<>();
-
- tracker.activate(context.bundleContext(), eventAdmin, null);
- tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new DoNothingObservationReporter()) {
- @Override
- public ObservationReporter create(Path path, PathSet excludes) {
- List<String> excludeSetsPerPath = excludeSets.get(path.getPath());
- if (excludeSetsPerPath == null) {
- excludeSetsPerPath = new ArrayList<>(1);
- excludeSets.put(path.getPath(), excludeSetsPerPath);
- }
-
- excludeSetsPerPath.clear();
- for (Path exclude : excludes) {
- excludeSetsPerPath.add(exclude.getPath());
- }
-
- return super.create(path, excludes);
- }
- });
-
- ResourceProvider<?> rp = mock(ResourceProvider.class);
- ResourceProviderInfo info;
- // register RP on /path, empty exclude set expected
- info = fixture.registerResourceProvider(rp, "/path", AuthType.no);
- assertNull(excludeSets.get("/"));
- // register RP on /, expect /path excluded
- fixture.registerResourceProvider(rp, "/", AuthType.no);
- assertThat(excludeSets.get("/"), hasSize(1));
- assertThat(excludeSets.get("/"), contains("/path"));
- // unregister RP on /path, empty exclude set expected
- fixture.unregisterResourceProvider(info);
- assertThat(excludeSets.get("/"), hasSize(0));
- // register RP on /path again, expect /path excluded
- fixture.registerResourceProvider(rp, "/path", AuthType.no);
- assertThat(excludeSets.get("/"), hasSize(1));
- assertThat(excludeSets.get("/"), contains("/path"));
- }
-
@Test
public void fillDto() throws Exception {
ResourceProviderTracker tracker = registerDefaultResourceProviderTracker();
@@ -316,7 +252,7 @@
assertThat( dto.failedProviders, arrayWithSize(1));
}
- static class DoNothingObservationReporter implements ObservationReporter {
+ static final class NoDothingObservationReporter implements ObservationReporter {
@Override
public void reportChanges(Iterable<ResourceChange> changes, boolean distribute) {
}
@@ -331,7 +267,7 @@
}
}
- static class SimpleObservationReporterGenerator implements ObservationReporterGenerator {
+ static final class SimpleObservationReporterGenerator implements ObservationReporterGenerator {
private final ObservationReporter reporter;
SimpleObservationReporterGenerator(ObservationReporter reporter) {