This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.testing.sling-mock-1.3.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git
commit 71bbb5c4a5633d5f761f16262be89153bc4b716d Author: Stefan Seifert <[email protected]> AuthorDate: Thu Feb 19 20:20:58 2015 +0000 SLING-4437 MockJcrResourceResolverFactory should allow to register services dynamically git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/mocks/sling-mock@1660995 13f79535-47bb-0310-9956-ffa450edef68 --- .../mock/sling/MockJcrResourceResolverFactory.java | 36 ++++++++++------------ .../apache/sling/testing/mock/sling/MockSling.java | 12 +++++++- .../context/ContextResourceResolverFactory.java | 6 ++-- .../mock/sling/context/SlingContextImpl.java | 2 +- .../sling/testing/mock/sling/package-info.java | 2 +- .../AbstractMultipleResourceResolverTest.java | 5 ++- 6 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java b/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java index d948434..69a8af7 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java @@ -19,6 +19,7 @@ package org.apache.sling.testing.mock.sling; import java.util.Dictionary; +import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; @@ -36,7 +37,6 @@ import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext; import org.apache.sling.testing.mock.osgi.MockOsgi; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; -import org.osgi.framework.ServiceReference; import org.osgi.service.component.ComponentContext; import com.google.common.collect.ImmutableMap; @@ -49,15 +49,14 @@ import com.google.common.collect.ImmutableMap; class MockJcrResourceResolverFactory implements ResourceResolverFactory { private final SlingRepository slingRepository; + private final BundleContext bundleContext; - public MockJcrResourceResolverFactory(final SlingRepository repository) { + public MockJcrResourceResolverFactory(final SlingRepository repository, BundleContext bundleContext) { this.slingRepository = repository; + this.bundleContext = bundleContext; } private ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException { - // setup mock OSGi environment - BundleContext bundleContext = MockOsgi.newBundleContext(); - Dictionary<String, Object> resourceProviderFactoryFactoryProps = new Hashtable<String, Object>(); resourceProviderFactoryFactoryProps.put(Constants.SERVICE_VENDOR, "sling-mock"); resourceProviderFactoryFactoryProps.put(Constants.SERVICE_DESCRIPTION, "sling-mock"); @@ -66,7 +65,9 @@ class MockJcrResourceResolverFactory implements ResourceResolverFactory { ComponentContext resourceProviderComponentContext = MockOsgi.newComponentContext(bundleContext, resourceProviderFactoryFactoryProps); // setup mocked JCR environment - bundleContext.registerService(SlingRepository.class.getName(), this.slingRepository, null); + if (bundleContext.getServiceReference(SlingRepository.class.getName()) == null) { + bundleContext.registerService(SlingRepository.class.getName(), this.slingRepository, null); + } // setup real sling JCR resource provider implementation for use in // mocked context @@ -84,14 +85,10 @@ class MockJcrResourceResolverFactory implements ResourceResolverFactory { Dictionary<Object, Object> resourceProviderProps = new Hashtable<Object, Object>(); resourceProviderProps.put(ResourceProvider.ROOTS, new String[] { "/" }); - bundleContext.registerService(ResourceProvider.class.getName(), resourceProvider, resourceProviderProps); - ServiceReference resourceProviderServiceReference = bundleContext.getServiceReference(ResourceProvider.class.getName()); - // setup real sling resource resolver implementation for use in mocked - // context + // setup real sling resource resolver implementation for use in mocked context MockResourceResolverFactoryActivator activator = new MockResourceResolverFactoryActivator(); - activator.bindResourceProvider(resourceProvider, - getServiceReferenceProperties(resourceProviderServiceReference)); + activator.bindResourceProvider(resourceProvider, toMap(resourceProviderProps)); activator.activate(resourceProviderComponentContext); CommonResourceResolverFactoryImpl commonFactoryImpl = new CommonResourceResolverFactoryImpl(activator); ResourceResolverContext context = new ResourceResolverContext(true, authenticationInfo, new ResourceAccessSecurityTracker()); @@ -99,15 +96,16 @@ class MockJcrResourceResolverFactory implements ResourceResolverFactory { return resourceResolver; } - private Map<String, Object> getServiceReferenceProperties(final ServiceReference serviceReference) { - Map<String, Object> props = new HashMap<String, Object>(); - String[] keys = serviceReference.getPropertyKeys(); - for (String key : keys) { - props.put(key, serviceReference.getProperty(key)); + private static Map<String, Object> toMap(Dictionary<Object, Object> dictionary) { + Map<String,Object> map = new HashMap<String, Object>(); + Enumeration<Object> keys = dictionary.keys(); + while (keys.hasMoreElements()) { + String key = keys.nextElement().toString(); + map.put(key, dictionary.get(key)); } - return props; + return map; } - + @Override public ResourceResolver getResourceResolver(final Map<String, Object> authenticationInfo) throws LoginException { return getResourceResolverInternal(authenticationInfo, false); diff --git a/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java b/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java index 5b7ca82..3f4a9de 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/MockSling.java @@ -58,6 +58,16 @@ public final class MockSling { * @return Resource resolver factory instance */ public static ResourceResolverFactory newResourceResolverFactory(final ResourceResolverType type) { + return newResourceResolverFactory(type, MockOsgi.newBundleContext()); + } + + /** + * Creates new sling resource resolver factory instance. + * @param type Type of underlying repository. + * @return Resource resolver factory instance + */ + public static ResourceResolverFactory newResourceResolverFactory(final ResourceResolverType type, + final BundleContext bundleContext) { ResourceResolverTypeAdapter adapter = getResourceResolverTypeAdapter(type); ResourceResolverFactory factory = adapter.newResourceResolverFactory(); if (factory == null) { @@ -65,7 +75,7 @@ public final class MockSling { if (repository == null) { throw new RuntimeException("Adapter neither provides resource resolver factory nor sling repository."); } - factory = new MockJcrResourceResolverFactory(repository); + factory = new MockJcrResourceResolverFactory(repository, bundleContext); } return factory; } diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java b/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java index 006a448..4d62ffe 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/context/ContextResourceResolverFactory.java @@ -27,6 +27,7 @@ import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.testing.mock.sling.MockSling; import org.apache.sling.testing.mock.sling.ResourceResolverType; +import org.osgi.framework.BundleContext; /** * Create resolve resolver instance and initialize it depending on it's type. @@ -37,13 +38,14 @@ final class ContextResourceResolverFactory { // static methods only } - public static ResourceResolverFactory get(final ResourceResolverType resourceResolverType) { + public static ResourceResolverFactory get(final ResourceResolverType resourceResolverType, + final BundleContext bundleContext) { ResourceResolverType type = resourceResolverType; if (type == null) { type = MockSling.DEFAULT_RESOURCERESOLVER_TYPE; } try { - ResourceResolverFactory factory = MockSling.newResourceResolverFactory(type); + ResourceResolverFactory factory = MockSling.newResourceResolverFactory(type, bundleContext); switch (type) { case JCR_MOCK: diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java b/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java index 39ff90b..a1e5463 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java @@ -100,7 +100,7 @@ public class SlingContextImpl extends OsgiContextImpl { * @return Resource resolver factory */ protected ResourceResolverFactory newResourceResolverFactory() { - return ContextResourceResolverFactory.get(this.resourceResolverType); + return ContextResourceResolverFactory.get(this.resourceResolverType, bundleContext()); } /** diff --git a/src/main/java/org/apache/sling/testing/mock/sling/package-info.java b/src/main/java/org/apache/sling/testing/mock/sling/package-info.java index 7b9feaa..8053938 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/package-info.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/package-info.java @@ -19,5 +19,5 @@ /** * Mock implementation of selected Sling APIs. */ [email protected]("1.0") [email protected]("1.1") package org.apache.sling.testing.mock.sling; diff --git a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractMultipleResourceResolverTest.java b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractMultipleResourceResolverTest.java index aba23e9..cdd0aee 100644 --- a/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractMultipleResourceResolverTest.java +++ b/src/test/java/org/apache/sling/testing/mock/sling/resource/AbstractMultipleResourceResolverTest.java @@ -25,9 +25,11 @@ import static org.junit.Assert.assertNull; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.testing.mock.osgi.MockOsgi; import org.apache.sling.testing.mock.sling.MockSling; import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.junit.Test; +import org.osgi.framework.BundleContext; import com.google.common.collect.ImmutableMap; @@ -36,10 +38,11 @@ import com.google.common.collect.ImmutableMap; */ public abstract class AbstractMultipleResourceResolverTest { + private final BundleContext bundleContext = MockOsgi.newBundleContext(); protected abstract ResourceResolverType getResourceResolverType(); protected ResourceResolverFactory newResourceResolerFactory() { - return MockSling.newResourceResolverFactory(getResourceResolverType()); + return MockSling.newResourceResolverFactory(getResourceResolverType(), bundleContext); } @Test -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
