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 8a9b3c49525ebde311e59625cfff56367790ae19 Author: Stefan Seifert <[email protected]> AuthorDate: Wed May 20 23:17:03 2015 +0000 SLING-4729 Sling Mock: Add "NONE" resource resolver type git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/mocks/sling-mock@1680697 13f79535-47bb-0310-9956-ffa450edef68 --- ...va => AbstractMockResourceResolverFactory.java} | 50 ++------- ...er.java => MockJcrResourceResolverAdapter.java} | 2 +- .../mock/sling/MockJcrResourceResolverFactory.java | 116 ++++++--------------- ...r.java => MockNoneResourceResolverAdapter.java} | 10 +- ...o.java => MockNoneResourceResolverFactory.java} | 16 ++- .../apache/sling/testing/mock/sling/MockSling.java | 15 ++- .../testing/mock/sling/ResourceResolverType.java | 16 ++- .../context/ContextResourceResolverFactory.java | 7 ++ .../sling/testing/mock/sling/package-info.java | 2 +- 9 files changed, 89 insertions(+), 145 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/AbstractMockResourceResolverFactory.java similarity index 69% copy from src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java copy to src/main/java/org/apache/sling/testing/mock/sling/AbstractMockResourceResolverFactory.java index dbc54fd..c1377c3 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverFactory.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/AbstractMockResourceResolverFactory.java @@ -22,15 +22,9 @@ import java.util.Dictionary; import java.util.Hashtable; import java.util.Map; -import javax.jcr.query.Query; - import org.apache.sling.api.resource.LoginException; -import org.apache.sling.api.resource.QueriableResourceProvider; -import org.apache.sling.api.resource.ResourceProvider; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; -import org.apache.sling.jcr.api.SlingRepository; -import org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory; import org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl; import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker; import org.apache.sling.resourceresolver.impl.ResourceResolverFactoryActivator; @@ -44,56 +38,26 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.service.event.EventAdmin; -import com.google.common.collect.ImmutableMap; - /** - * Mock {@link ResourceResolver} implementation. Simulates OSGi environment and - * initiates real Sling ResourceResolver and JCR implementation, but with a - * mocked JCR repository implementation underneath. + * Mock {@link ResourceResolverFactory} implementation. + * Uses real Sling ResourceResolverFactory in simulated OSGi environment. */ -class MockJcrResourceResolverFactory implements ResourceResolverFactory { +abstract class AbstractMockResourceResolverFactory implements ResourceResolverFactory { - private final SlingRepository slingRepository; - private final BundleContext bundleContext; + protected final BundleContext bundleContext; - public MockJcrResourceResolverFactory(final SlingRepository repository, BundleContext bundleContext) { - this.slingRepository = repository; + public AbstractMockResourceResolverFactory(BundleContext bundleContext) { this.bundleContext = bundleContext; } - @SuppressWarnings("deprecation") - private ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException { + protected ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException { + // setup real sling resource resolver implementation for use in mocked context Dictionary<String, Object> resourceProviderFactoryFactoryProps = new Hashtable<String, Object>(); resourceProviderFactoryFactoryProps.put(Constants.SERVICE_VENDOR, "sling-mock"); resourceProviderFactoryFactoryProps.put(Constants.SERVICE_DESCRIPTION, "sling-mock"); resourceProviderFactoryFactoryProps.put("resource.resolver.manglenamespaces", true); resourceProviderFactoryFactoryProps.put("resource.resolver.searchpath", new String[] { "/apps", "/libs" }); - // setup mocked JCR environment - 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 - JcrResourceProviderFactory jcrResourceProviderFactory = new JcrResourceProviderFactory(); - MockOsgi.injectServices(jcrResourceProviderFactory, bundleContext); - MockOsgi.activate(jcrResourceProviderFactory, bundleContext, ImmutableMap.<String, Object> of()); - - ResourceProvider resourceProvider; - if (isAdmin) { - resourceProvider = jcrResourceProviderFactory.getAdministrativeResourceProvider(authenticationInfo); - } - else { - resourceProvider = jcrResourceProviderFactory.getResourceProvider(authenticationInfo); - } - - Dictionary<Object, Object> resourceProviderProps = new Hashtable<Object, Object>(); - resourceProviderProps.put(ResourceProvider.ROOTS, new String[] { "/" }); - resourceProviderProps.put(QueriableResourceProvider.LANGUAGES, new String[] { Query.XPATH, Query.SQL, Query.JCR_SQL2 }); - bundleContext.registerService(ResourceProvider.class.getName(), resourceProvider, resourceProviderProps); - - // setup real sling resource resolver implementation for use in mocked context ensureResourceResolverFactoryActivatorDependencies(); ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator(); MockOsgi.injectServices(activator, bundleContext); diff --git a/src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java b/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverAdapter.java similarity index 95% copy from src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java copy to src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverAdapter.java index 6aafe5d..87705b6 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/MockJcrResourceResolverAdapter.java @@ -28,7 +28,7 @@ import org.apache.sling.testing.mock.sling.spi.ResourceResolverTypeAdapter; /** * Resource resolver type adapter for JCR Mocks implementation. */ -class JcrMockResourceResolverAdapter implements ResourceResolverTypeAdapter { +class MockJcrResourceResolverAdapter implements ResourceResolverTypeAdapter { @Override public ResourceResolverFactory newResourceResolverFactory() { 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 dbc54fd..1396284 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 @@ -24,51 +24,37 @@ import java.util.Map; import javax.jcr.query.Query; +import org.apache.commons.lang3.ArrayUtils; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.QueriableResourceProvider; import org.apache.sling.api.resource.ResourceProvider; import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.commons.osgi.PropertiesUtil; import org.apache.sling.jcr.api.SlingRepository; import org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProviderFactory; -import org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl; -import org.apache.sling.resourceresolver.impl.ResourceAccessSecurityTracker; -import org.apache.sling.resourceresolver.impl.ResourceResolverFactoryActivator; -import org.apache.sling.resourceresolver.impl.ResourceResolverImpl; -import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext; -import org.apache.sling.serviceusermapping.ServiceUserMapper; -import org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl; -import org.apache.sling.testing.mock.osgi.MockEventAdmin; import org.apache.sling.testing.mock.osgi.MockOsgi; import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.service.event.EventAdmin; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; import com.google.common.collect.ImmutableMap; /** - * Mock {@link ResourceResolver} implementation. Simulates OSGi environment and - * initiates real Sling ResourceResolver and JCR implementation, but with a - * mocked JCR repository implementation underneath. + * Mock {@link ResourceResolverFactory} implementation. + * Uses real Sling ResourceResolverFactory in simulated OSGi environment + * with a mocked JCR repository implementation underneath. */ -class MockJcrResourceResolverFactory implements ResourceResolverFactory { +class MockJcrResourceResolverFactory extends AbstractMockResourceResolverFactory { private final SlingRepository slingRepository; - private final BundleContext bundleContext; public MockJcrResourceResolverFactory(final SlingRepository repository, BundleContext bundleContext) { + super(bundleContext); this.slingRepository = repository; - this.bundleContext = bundleContext; } @SuppressWarnings("deprecation") - private ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException { - Dictionary<String, Object> resourceProviderFactoryFactoryProps = new Hashtable<String, Object>(); - resourceProviderFactoryFactoryProps.put(Constants.SERVICE_VENDOR, "sling-mock"); - resourceProviderFactoryFactoryProps.put(Constants.SERVICE_DESCRIPTION, "sling-mock"); - resourceProviderFactoryFactoryProps.put("resource.resolver.manglenamespaces", true); - resourceProviderFactoryFactoryProps.put("resource.resolver.searchpath", new String[] { "/apps", "/libs" }); - + protected ResourceResolver getResourceResolverInternal(Map<String, Object> authenticationInfo, boolean isAdmin) throws LoginException { // setup mocked JCR environment if (bundleContext.getServiceReference(SlingRepository.class.getName()) == null) { bundleContext.registerService(SlingRepository.class.getName(), this.slingRepository, null); @@ -88,69 +74,33 @@ class MockJcrResourceResolverFactory implements ResourceResolverFactory { resourceProvider = jcrResourceProviderFactory.getResourceProvider(authenticationInfo); } - Dictionary<Object, Object> resourceProviderProps = new Hashtable<Object, Object>(); - resourceProviderProps.put(ResourceProvider.ROOTS, new String[] { "/" }); - resourceProviderProps.put(QueriableResourceProvider.LANGUAGES, new String[] { Query.XPATH, Query.SQL, Query.JCR_SQL2 }); - bundleContext.registerService(ResourceProvider.class.getName(), resourceProvider, resourceProviderProps); - - // setup real sling resource resolver implementation for use in mocked context - ensureResourceResolverFactoryActivatorDependencies(); - ResourceResolverFactoryActivator activator = new ResourceResolverFactoryActivator(); - MockOsgi.injectServices(activator, bundleContext); - MockOsgi.activate(activator, resourceProviderFactoryFactoryProps); + // register JCR resource provider if not already registered + if (!isRootServiceProviderRegistered(bundleContext)) { + Dictionary<Object, Object> resourceProviderProps = new Hashtable<Object, Object>(); + resourceProviderProps.put(ResourceProvider.ROOTS, new String[] { "/" }); + resourceProviderProps.put(QueriableResourceProvider.LANGUAGES, new String[] { Query.XPATH, Query.SQL, Query.JCR_SQL2 }); + bundleContext.registerService(ResourceProvider.class.getName(), resourceProvider, resourceProviderProps); + } - CommonResourceResolverFactoryImpl commonFactoryImpl = new CommonResourceResolverFactoryImpl(activator); - ResourceResolverContext context = new ResourceResolverContext(true, authenticationInfo, new ResourceAccessSecurityTracker()); - ResourceResolverImpl resourceResolver = new ResourceResolverImpl(commonFactoryImpl, context); - return resourceResolver; + return super.getResourceResolverInternal(authenticationInfo, isAdmin); } - /** - * Make sure all dependencies required by {@link ResourceResolverFactoryActivator} exist - if not register them. - */ - private void ensureResourceResolverFactoryActivatorDependencies() { - if (bundleContext.getServiceReference(ServiceUserMapper.class.getName()) == null) { - ServiceUserMapper serviceUserMapper = new ServiceUserMapperImpl(); - MockOsgi.injectServices(serviceUserMapper, bundleContext); - MockOsgi.activate(serviceUserMapper); - bundleContext.registerService(ServiceUserMapper.class.getName(), serviceUserMapper, null); - } - - if (bundleContext.getServiceReference(ResourceAccessSecurityTracker.class.getName()) == null) { - ResourceAccessSecurityTracker resourceAccessSecurityTracker = new ResourceAccessSecurityTracker(); - MockOsgi.injectServices(resourceAccessSecurityTracker, bundleContext); - MockOsgi.activate(resourceAccessSecurityTracker); - bundleContext.registerService(ResourceAccessSecurityTracker.class.getName(), resourceAccessSecurityTracker, null); + private boolean isRootServiceProviderRegistered(BundleContext bundleContext) { + try { + ServiceReference[] serviceReferences = bundleContext.getServiceReferences(ResourceProvider.class.getName(), null) ; + if (serviceReferences != null) { + for (ServiceReference serviceReference : serviceReferences) { + String[] roots = PropertiesUtil.toStringArray(serviceReference.getProperty(ResourceProvider.ROOTS)); + if (ArrayUtils.contains(roots, "/")) { + return true; + } + } + } + return false; } - - if (bundleContext.getServiceReference(EventAdmin.class.getName()) == null) { - EventAdmin eventAdmin = new MockEventAdmin(); - MockOsgi.injectServices(eventAdmin, bundleContext); - MockOsgi.activate(eventAdmin); - bundleContext.registerService(EventAdmin.class.getName(), eventAdmin, null); + catch (InvalidSyntaxException ex) { + throw new RuntimeException(ex); } } - - @Override - public ResourceResolver getResourceResolver(final Map<String, Object> authenticationInfo) throws LoginException { - return getResourceResolverInternal(authenticationInfo, false); - } - - @Override - public ResourceResolver getAdministrativeResourceResolver(final Map<String, Object> authenticationInfo) - throws LoginException { - return getResourceResolverInternal(authenticationInfo, true); - } - - // part of Sling API 2.7 - public ResourceResolver getServiceResourceResolver(final Map<String, Object> authenticationInfo) - throws LoginException { - return getResourceResolverInternal(authenticationInfo, true); - } - - // part of Sling API 2.8 - public ResourceResolver getThreadResourceResolver() { - throw new UnsupportedOperationException(); - } - + } diff --git a/src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java b/src/main/java/org/apache/sling/testing/mock/sling/MockNoneResourceResolverAdapter.java similarity index 78% rename from src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java rename to src/main/java/org/apache/sling/testing/mock/sling/MockNoneResourceResolverAdapter.java index 6aafe5d..05a427c 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/JcrMockResourceResolverAdapter.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/MockNoneResourceResolverAdapter.java @@ -18,17 +18,14 @@ */ package org.apache.sling.testing.mock.sling; -import javax.jcr.Repository; - import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.jcr.api.SlingRepository; -import org.apache.sling.testing.mock.jcr.MockJcr; import org.apache.sling.testing.mock.sling.spi.ResourceResolverTypeAdapter; /** - * Resource resolver type adapter for JCR Mocks implementation. + * Resource resolver type with no resource provider registered. */ -class JcrMockResourceResolverAdapter implements ResourceResolverTypeAdapter { +class MockNoneResourceResolverAdapter implements ResourceResolverTypeAdapter { @Override public ResourceResolverFactory newResourceResolverFactory() { @@ -37,8 +34,7 @@ class JcrMockResourceResolverAdapter implements ResourceResolverTypeAdapter { @Override public SlingRepository newSlingRepository() { - Repository repository = MockJcr.newRepository(); - return new MockSlingRepository(repository); + return null; } } 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/MockNoneResourceResolverFactory.java similarity index 63% copy from src/main/java/org/apache/sling/testing/mock/sling/package-info.java copy to src/main/java/org/apache/sling/testing/mock/sling/MockNoneResourceResolverFactory.java index 7938475..2ee1ac6 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/package-info.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/MockNoneResourceResolverFactory.java @@ -16,8 +16,18 @@ * specific language governing permissions and limitations * under the License. */ +package org.apache.sling.testing.mock.sling; + +import org.osgi.framework.BundleContext; + /** - * Mock implementation of selected Sling APIs. + * Mock {@link ResourceResolverFactory} implementation. + * Uses real Sling ResourceResolverFactory in simulated OSGi environment. + * Resource Resolver factory has no ResourceProvider registered; you have to registere one yourself to do anything useful with it. */ [email protected]("1.2.1") -package org.apache.sling.testing.mock.sling; +class MockNoneResourceResolverFactory extends AbstractMockResourceResolverFactory { + + public MockNoneResourceResolverFactory(BundleContext bundleContext) { + super(bundleContext); + } +} 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 3f4a9de..cc60cdd 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 @@ -73,9 +73,11 @@ public final class MockSling { if (factory == null) { SlingRepository repository = adapter.newSlingRepository(); if (repository == null) { - throw new RuntimeException("Adapter neither provides resource resolver factory nor sling repository."); + factory = new MockNoneResourceResolverFactory(bundleContext); + } + else { + factory = new MockJcrResourceResolverFactory(repository, bundleContext); } - factory = new MockJcrResourceResolverFactory(repository, bundleContext); } return factory; } @@ -84,17 +86,20 @@ public final class MockSling { try { Class clazz = Class.forName(type.getResourceResolverTypeAdapterClass()); return (ResourceResolverTypeAdapter) clazz.newInstance(); - } catch (ClassNotFoundException ex) { + } + catch (ClassNotFoundException ex) { throw new RuntimeException("Unable to instantiate resourcer resolver: " + type.getResourceResolverTypeAdapterClass() + (type.getArtifactCoordinates() != null ? "Make sure this maven dependency is included: " + type.getArtifactCoordinates() : ""), ex); - } catch (InstantiationException ex) { + } + catch (InstantiationException ex) { throw new RuntimeException("Unable to instantiate resourcer resolver: " + type.getResourceResolverTypeAdapterClass() + (type.getArtifactCoordinates() != null ? "Make sure this maven dependency is included: " + type.getArtifactCoordinates() : ""), ex); - } catch (IllegalAccessException ex) { + } + catch (IllegalAccessException ex) { throw new RuntimeException("Unable to instantiate resourcer resolver: " + type.getResourceResolverTypeAdapterClass() + (type.getArtifactCoordinates() != null ? "Make sure this maven dependency is included: " diff --git a/src/main/java/org/apache/sling/testing/mock/sling/ResourceResolverType.java b/src/main/java/org/apache/sling/testing/mock/sling/ResourceResolverType.java index 915c124..f1550e5 100644 --- a/src/main/java/org/apache/sling/testing/mock/sling/ResourceResolverType.java +++ b/src/main/java/org/apache/sling/testing/mock/sling/ResourceResolverType.java @@ -51,7 +51,7 @@ public enum ResourceResolverType { * <li>This resource resolver type is quite fast.</li> * </ul> */ - JCR_MOCK(JcrMockResourceResolverAdapter.class.getName(), null), + JCR_MOCK(MockJcrResourceResolverAdapter.class.getName(), null), /** * Uses a real JCR Jackrabbit repository. @@ -65,7 +65,19 @@ public enum ResourceResolverType { * </ul> */ JCR_JACKRABBIT("org.apache.sling.testing.mock.sling.jackrabbit.JackrabbitMockResourceResolverAdapter", - "org.apache.sling:org.apache.sling.testing.sling-mock-jackrabbit"); + "org.apache.sling:org.apache.sling.testing.sling-mock-jackrabbit"), + + /** + * Provides resource resolver environment without any ResourceProvider. + * You have to register one yourself to do anything useful with it. + * <ul> + * <li>Uses the real Sling Resource Resolver implementation.</li> + * <li>The performance of this resource resolver type depends on the resource provider registered.</li> + * </ul> + */ + NONE(MockNoneResourceResolverAdapter.class.getName(), null); + + private final String resourceResolverTypeAdapterClass; private final String artifactCoordinates; 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 4d62ffe..d895d1a 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 @@ -57,6 +57,9 @@ final class ContextResourceResolverFactory { case RESOURCERESOLVER_MOCK: initializeResourceResolverMock(factory); break; + case NONE: + initializeResourceResolverNone(factory); + break; default: throw new IllegalArgumentException("Invalid resource resolver type: " + type); } @@ -84,4 +87,8 @@ final class ContextResourceResolverFactory { // nothing to do } + private static void initializeResourceResolverNone(ResourceResolverFactory factory) { + // nothing to do + } + } 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 7938475..0d89d03 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.2.1") [email protected]("1.3") package org.apache.sling.testing.mock.sling; -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
