This is an automated email from the ASF dual-hosted git repository. diru pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit ccc8c6b5ad640e229bdbe2382e82ada3bc4de360 Author: Dirk Rudolph <[email protected]> AuthorDate: Wed Jun 9 22:20:52 2021 +0200 replaced scheduler's names configuration with generators Names may be dynamic per sitemap root (categories, locations, etc.) and so may not be configured as osgi confiugrations. The class names of the implementations providing them otoh make sense to have different schedules (product vs. page tree) --- .../sling/sitemap/impl/SitemapScheduler.java | 88 +++++++++------ .../sling/sitemap/impl/SitemapServiceImpl.java | 43 +++---- .../sling/sitemap/impl/SitemapSchedulerTest.java | 125 +++++++++++++++++---- .../impl/SitemapServiceImplSchedulingTest.java | 119 +++++++++++++------- 4 files changed, 253 insertions(+), 122 deletions(-) diff --git a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapScheduler.java b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapScheduler.java index 0ce4615..313af60 100644 --- a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapScheduler.java +++ b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapScheduler.java @@ -26,7 +26,7 @@ import org.apache.sling.commons.scheduler.Scheduler; import org.apache.sling.event.jobs.Job; import org.apache.sling.event.jobs.JobManager; import org.apache.sling.serviceusermapping.ServiceUserMapped; -import org.apache.sling.sitemap.generator.SitemapGenerator; +import org.jetbrains.annotations.Nullable; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.ConfigurationPolicy; @@ -38,6 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; +import java.util.stream.Collectors; import static org.apache.sling.sitemap.impl.SitemapUtil.findSitemapRoots; @@ -62,8 +63,10 @@ public class SitemapScheduler implements Runnable { "sitemap generation jobs will be scheduled.") String scheduler_expression(); - @AttributeDefinition(name = "Names", description = "A list of names for which this schedule should be used.") - String[] names() default {SitemapGenerator.DEFAULT_SITEMAP}; + @AttributeDefinition(name = "Generators", description = "A list of full qualified class names of " + + "SitemapGenerator implementations. If set only the listed SitemapGenerators will be called. If left " + + "empty all will be called.") + String[] generators() default {}; @AttributeDefinition(name = "Search Path", description = "The path under which sitemap roots should be " + "searched for") @@ -83,56 +86,75 @@ public class SitemapScheduler implements Runnable { @Reference(target = "(subServiceName=sitemap-reader)") private ServiceUserMapped serviceUserMapped; - private String[] names; + private Set<String> generators; private String searchPath; @Activate protected void activate(Configuration configuration) { - names = configuration.names(); + String[] configuredGenerators = configuration.generators(); + if (configuredGenerators != null && configuredGenerators.length > 0) { + generators = new HashSet<>(Arrays.asList(configuredGenerators)); + } else { + generators = null; + } searchPath = configuration.searchPath(); } @Override public void run() { - run(Arrays.asList(names)); + schedule(null); } - public void run(String name) { - run(Collections.singleton(name)); + public void schedule(@Nullable Collection<String> names) { + try (ResourceResolver resolver = resourceResolverFactory.getServiceResourceResolver(AUTH)) { + Iterator<Resource> sitemapRoots = findSitemapRoots(resolver, searchPath); + while (sitemapRoots.hasNext()) { + schedule(sitemapRoots.next(), names); + } + } catch (LoginException ex) { + LOG.warn("Failed start sitemap jobs: {}", ex.getMessage(), ex); + } } - public void run(Resource sitemapRoot) { - run(sitemapRoot, Arrays.asList(names)); - } + public void schedule(Resource sitemapRoot, @Nullable Collection<String> names) { + Set<String> configuredNames = getNames(sitemapRoot); - public void run(Resource sitemapRoot, Collection<String> names) { - Set<String> applicableNames = generatorManager.getApplicableNames(sitemapRoot, names); - for (String applicableName : applicableNames) { - Map<String, Object> jobProperties = new HashMap<>(); - jobProperties.put(SitemapGeneratorExecutor.JOB_PROPERTY_SITEMAP_NAME, applicableName); - jobProperties.put(SitemapGeneratorExecutor.JOB_PROPERTY_SITEMAP_ROOT, sitemapRoot.getPath()); - Job job = jobManager.addJob(SitemapGeneratorExecutor.JOB_TOPIC, jobProperties); - LOG.debug("Added job {}", job.getId()); + if (names != null) { + configuredNames = new HashSet<>(configuredNames); + configuredNames.retainAll(names); } - } - void run(ResourceResolver resolver) { - run(resolver, Arrays.asList(names)); + for (String applicableName : configuredNames) { + addJob(sitemapRoot.getPath(), applicableName); + } } - private void run(Collection<String> names) { - try (ResourceResolver resolver = resourceResolverFactory.getServiceResourceResolver(AUTH)) { - run(resolver, names); - } catch (LoginException ex) { - LOG.warn("Failed start sitemap jobs: {}", ex.getMessage(), ex); - } + protected void addJob(String sitemapRoot, String applicableName) { + Map<String, Object> jobProperties = new HashMap<>(); + jobProperties.put(SitemapGeneratorExecutor.JOB_PROPERTY_SITEMAP_NAME, applicableName); + jobProperties.put(SitemapGeneratorExecutor.JOB_PROPERTY_SITEMAP_ROOT, sitemapRoot); + Job job = jobManager.addJob(SitemapGeneratorExecutor.JOB_TOPIC, jobProperties); + LOG.debug("Added job {}", job.getId()); } - private void run(ResourceResolver resolver, Collection<String> names) { - Iterator<Resource> sitemapRoots = findSitemapRoots(resolver, searchPath); - while (sitemapRoots.hasNext()) { - run(sitemapRoots.next(), names); + /** + * Returns the names for the given sitemap root. This depends on the configured generators. If no generators were + * configured the names of all are returned. If some where configured the names provided only by those where the + * class name matches are returned. + * + * @param sitemapRoot + * @return + */ + private Set<String> getNames(Resource sitemapRoot) { + if (generators == null || generators.isEmpty()) { + // all names + return generatorManager.getGenerators(sitemapRoot).keySet(); + } else { + // only those of the contained geneators + return generatorManager.getGenerators(sitemapRoot).entrySet().stream() + .filter(entry -> generators.contains(entry.getValue().getClass().getName())) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); } } - } diff --git a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceImpl.java b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceImpl.java index b8925e9..f5c8935 100644 --- a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceImpl.java +++ b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceImpl.java @@ -26,7 +26,8 @@ import org.apache.sling.sitemap.SitemapService; import org.apache.sling.sitemap.common.SitemapLinkExternalizer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.osgi.framework.*; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; import org.osgi.service.component.annotations.*; import org.osgi.service.metatype.annotations.AttributeDefinition; import org.osgi.service.metatype.annotations.Designate; @@ -98,28 +99,19 @@ public class SitemapServiceImpl implements SitemapService { @Override public void scheduleGeneration() { - if (schedulers.getServiceReferences() == null) { - return; - } - for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { - schedulers.getService(scheduler).run(); + if (schedulers.getServiceReferences() != null) { + for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { + schedulers.getService(scheduler).run(); + } } } @Override public void scheduleGeneration(String name) { - if (schedulers.getServiceReferences() == null) { - return; - } - try { - Filter filter = FrameworkUtil.createFilter("(names=" + name + ")"); + if (schedulers.getServiceReferences() != null) { for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { - if (filter.match(scheduler)) { - schedulers.getService(scheduler).run(name); - } + schedulers.getService(scheduler).schedule(Collections.singleton(name)); } - } catch (InvalidSyntaxException ex) { - LOG.warn("Failed to build filter for given argument: {}", name, ex); } } @@ -131,7 +123,7 @@ public class SitemapServiceImpl implements SitemapService { for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { Object searchPath = scheduler.getProperty("searchPath"); if (searchPath instanceof String && sitemapRoot.getPath().startsWith(searchPath + "/")) { - schedulers.getService(scheduler).run(sitemapRoot); + schedulers.getService(scheduler).schedule(sitemapRoot, null); } } } @@ -141,19 +133,12 @@ public class SitemapServiceImpl implements SitemapService { if (schedulers.getServiceReferences() == null || !SitemapUtil.isSitemapRoot(sitemapRoot)) { return; } - try { - Filter filter = FrameworkUtil.createFilter("(names=" + name + ")"); - for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { - if (!filter.match(scheduler)) { - continue; - } - Object searchPath = scheduler.getProperty("searchPath"); - if (searchPath instanceof String && sitemapRoot.getPath().startsWith(searchPath + "/")) { - schedulers.getService(scheduler).run(sitemapRoot, Collections.singleton(name)); - } + + for (ServiceReference<SitemapScheduler> scheduler : schedulers.getServiceReferences()) { + Object searchPath = scheduler.getProperty("searchPath"); + if (searchPath instanceof String && sitemapRoot.getPath().startsWith(searchPath + "/")) { + schedulers.getService(scheduler).schedule(sitemapRoot, Collections.singleton(name)); } - } catch (InvalidSyntaxException ex) { - LOG.warn("Failed to build filter for given argument: {}", name, ex); } } diff --git a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapSchedulerTest.java b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapSchedulerTest.java index 2c9c69e..db4efe6 100644 --- a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapSchedulerTest.java +++ b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapSchedulerTest.java @@ -19,31 +19,38 @@ package org.apache.sling.sitemap.impl; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; +import org.apache.sling.api.resource.LoginException; 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.event.jobs.Job; import org.apache.sling.event.jobs.JobManager; import org.apache.sling.serviceusermapping.ServiceUserMapped; +import org.apache.sling.sitemap.SitemapException; import org.apache.sling.sitemap.SitemapService; +import org.apache.sling.sitemap.builder.Sitemap; import org.apache.sling.sitemap.generator.SitemapGenerator; import org.apache.sling.testing.mock.jcr.MockJcr; import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.apache.sling.testing.mock.sling.junit5.SlingContext; import org.apache.sling.testing.mock.sling.junit5.SlingContextExtension; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatcher; import org.mockito.Mock; +import org.mockito.internal.util.reflection.Fields; import org.mockito.junit.jupiter.MockitoExtension; import javax.jcr.Node; import javax.jcr.Session; import javax.jcr.query.Query; -import java.util.Collections; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; @@ -56,13 +63,12 @@ public class SitemapSchedulerTest { private final SitemapScheduler subject = new SitemapScheduler(); private final SitemapGeneratorManager generatorManager = new SitemapGeneratorManager(); + private final TestGenerator generator1 = new TestGenerator() {}; + private final TestGenerator generator2 = new TestGenerator() {}; + @Mock private ServiceUserMapped serviceUser; @Mock - private SitemapGenerator generator1; - @Mock - private SitemapGenerator generator2; - @Mock private JobManager jobManager; private Resource rootDe; @@ -82,8 +88,6 @@ public class SitemapSchedulerTest { context.registerService(SitemapGenerator.class, generator1, "service.ranking", 1); context.registerService(SitemapGenerator.class, generator2, "service.ranking", 2); context.registerInjectActivateService(generatorManager); - context.registerInjectActivateService(subject, "names", new String[]{ - SitemapGenerator.DEFAULT_SITEMAP, "sitemap1", "sitemap2"}); AtomicInteger jobCount = new AtomicInteger(0); @@ -97,20 +101,21 @@ public class SitemapSchedulerTest { @Test public void testOneDefaultSitemapJobStartedForEachRoot() { // given - MockJcr.setQueryResult( - context.resourceResolver().adaptTo(Session.class), + context.registerInjectActivateService(subject); + initResourceResolver(subject, resolver -> MockJcr.setQueryResult( + resolver.adaptTo(Session.class), "/jcr:root/content//*[@" + SitemapService.PROPERTY_SITEMAP_ROOT + "=true]", Query.XPATH, ImmutableList.of( rootDe.adaptTo(Node.class), rootEnContent.adaptTo(Node.class) ) - ); - when(generator1.getNames(any())).thenReturn(Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP)); - when(generator2.getNames(any())).thenReturn(Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP)); + )); + generator1.setNames(SitemapGenerator.DEFAULT_SITEMAP); + generator2.setNames(SitemapGenerator.DEFAULT_SITEMAP); // when - subject.run(context.resourceResolver()); + subject.run(); // then verify(jobManager, times(1)).addJob( @@ -126,17 +131,18 @@ public class SitemapSchedulerTest { @Test public void testOneSitemapJobStartedForEachName() { // given - MockJcr.setQueryResult( - context.resourceResolver().adaptTo(Session.class), + context.registerInjectActivateService(subject); + initResourceResolver(subject, resolver -> MockJcr.setQueryResult( + resolver.adaptTo(Session.class), "/jcr:root/content//*[@" + SitemapService.PROPERTY_SITEMAP_ROOT + "=true]", Query.XPATH, Collections.singletonList(rootDe.adaptTo(Node.class)) - ); - when(generator1.getNames(any())).thenReturn(ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP, "sitemap1")); - when(generator2.getNames(any())).thenReturn(ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP, "sitemap2")); + )); + generator1.setNames(SitemapGenerator.DEFAULT_SITEMAP, "sitemap1"); + generator2.setNames(SitemapGenerator.DEFAULT_SITEMAP, "sitemap2"); // when - subject.run(context.resourceResolver()); + subject.run(); // then verify(jobManager, times(1)).addJob( @@ -153,7 +159,84 @@ public class SitemapSchedulerTest { ); } + @Test + public void testNothingScheduledWhenNameDoesNotMatchGeneratorFromConfiguration() { + // given + context.registerInjectActivateService(subject, "generators", new String[]{ + generator1.getClass().getName() + }); + initResourceResolver(subject, resolver -> MockJcr.setQueryResult( + resolver.adaptTo(Session.class), + "/jcr:root/content//*[@" + SitemapService.PROPERTY_SITEMAP_ROOT + "=true]", + Query.XPATH, + Collections.singletonList(rootDe.adaptTo(Node.class)) + )); + generator1.setNames("sitemap1"); + generator2.setNames(SitemapGenerator.DEFAULT_SITEMAP, "sitemap2"); + + // when + subject.schedule(Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP)); + + // then + verify(jobManager, never()).addJob(any(), any()); + + // and when + subject.schedule(Collections.singleton("sitemap1")); + + // then + verify(jobManager, times(1)).addJob( + eq("org/apache/sling/sitemap/build"), + argThat(sitemapJobPropertiesMatch("sitemap1", "/content/site/de")) + ); + } + + private void initResourceResolver(SitemapScheduler scheduler, Consumer<ResourceResolver> resolverConsumer) { + initResourceResolver(context, scheduler, resolverConsumer); + } + + static void initResourceResolver(SlingContext context, SitemapScheduler scheduler, + Consumer<ResourceResolver> resolverConsumer) { + try { + ResourceResolverFactory original = context.getService(ResourceResolverFactory.class); + ResourceResolverFactory mock = mock(ResourceResolverFactory.class); + Fields.allDeclaredFieldsOf(scheduler).instanceFields().stream() + .filter(instanceField -> "resourceResolverFactory".equals(instanceField.name())) + .forEach(instanceField -> instanceField.set(mock)); + + lenient().when(mock.getServiceResourceResolver(any())).then(inv -> { + ResourceResolver resolver = original.getServiceResourceResolver(inv.getArgument(0)); + resolverConsumer.accept(resolver); + return resolver; + }); + } catch (LoginException ex) { + fail("Did not expect LoginException while mocking."); + } + } + private static ArgumentMatcher<Map<String, Object>> sitemapJobPropertiesMatch(String name, String path) { return map -> map.get("sitemap.root").equals(path) && map.get("sitemap.name").equals(name); } + + private static class TestGenerator implements SitemapGenerator { + + private Set<String> names; + + TestGenerator(String... names) { + this.names = new HashSet<>(Arrays.asList(names)); + } + + public void setNames(String... names) { + this.names = new HashSet<>(Arrays.asList(names)); + } + + @Override + public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) { + return names; + } + + @Override + public void generate(@NotNull Resource sitemapRoot, @NotNull String name, @NotNull Sitemap sitemap, @NotNull GenerationContext context) throws SitemapException { + fail(); + } + } } diff --git a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplSchedulingTest.java b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplSchedulingTest.java index 8cfe513..e3950e9 100644 --- a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplSchedulingTest.java +++ b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplSchedulingTest.java @@ -18,27 +18,41 @@ */ package org.apache.sling.sitemap.impl; +import com.google.common.collect.ImmutableSet; +import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.event.jobs.JobManager; import org.apache.sling.serviceusermapping.ServiceUserMapped; +import org.apache.sling.sitemap.SitemapException; import org.apache.sling.sitemap.SitemapService; +import org.apache.sling.sitemap.builder.Sitemap; import org.apache.sling.sitemap.generator.SitemapGenerator; +import org.apache.sling.testing.mock.jcr.MockJcr; +import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.apache.sling.testing.mock.sling.junit5.SlingContext; import org.apache.sling.testing.mock.sling.junit5.SlingContextExtension; +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import javax.jcr.Node; +import javax.jcr.Session; +import javax.jcr.query.Query; import java.util.Collections; +import java.util.Set; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.*; @ExtendWith({SlingContextExtension.class, MockitoExtension.class}) public class SitemapServiceImplSchedulingTest { - public final SlingContext context = new SlingContext(); + public final SlingContext context = new SlingContext(ResourceResolverType.JCR_MOCK); private final SitemapServiceImpl subject = new SitemapServiceImpl(); private final SitemapStorage storage = new SitemapStorage(); @@ -46,91 +60,118 @@ public class SitemapServiceImplSchedulingTest { @Mock private ServiceUserMapped serviceUser; - @Mock + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private JobManager jobManager; - @Mock - private SitemapGenerator generator; - - private Resource root1; - private Resource root2; - private SitemapScheduler scheduler1; - private SitemapScheduler scheduler2; + private SitemapGenerator generator1 = new SitemapGenerator() { + @Override + public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) { + return Collections.singleton(DEFAULT_SITEMAP); + } + + @Override + public void generate(@NotNull Resource sitemapRoot, @NotNull String name, @NotNull Sitemap sitemap, @NotNull GenerationContext context) throws SitemapException { + fail(); + } + }; + private SitemapGenerator generator2 = new SitemapGenerator() { + @Override + public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) { + return ImmutableSet.of("foo"); + } + + @Override + public void generate(@NotNull Resource sitemapRoot, @NotNull String name, @NotNull Sitemap sitemap, @NotNull GenerationContext context) throws SitemapException { + fail(); + } + }; + + private Resource siteRoot; + private Resource micrositeRoot; + private SitemapScheduler schedulerWithGenerator1OnSite; + private SitemapScheduler schedulerWithGenerator2OnMicrosite; @BeforeEach - public void setup() { - root1 = context.create().resource("/content/site/de", Collections.singletonMap( + public void setup() throws LoginException { + siteRoot = context.create().resource("/content/site/de", Collections.singletonMap( SitemapService.PROPERTY_SITEMAP_ROOT, Boolean.TRUE )); - root2 = context.create().resource("/content/microsite/de", Collections.singletonMap( + micrositeRoot = context.create().resource("/content/microsite/de", Collections.singletonMap( SitemapService.PROPERTY_SITEMAP_ROOT, Boolean.TRUE )); context.registerService(ServiceUserMapped.class, serviceUser, "subServiceName", "sitemap-writer"); context.registerService(ServiceUserMapped.class, serviceUser, "subServiceName", "sitemap-reader"); - context.registerService(SitemapGenerator.class, generator); + context.registerService(SitemapGenerator.class, generator1); + context.registerService(SitemapGenerator.class, generator2); context.registerService(JobManager.class, jobManager); context.registerInjectActivateService(generatorManager); context.registerInjectActivateService(storage); context.registerInjectActivateService(subject); - scheduler1 = context.registerInjectActivateService(spy(new SitemapScheduler()), - "names", "<default>", + schedulerWithGenerator1OnSite = context.registerInjectActivateService(spy(new SitemapScheduler()), "searchPath", "/content/site" ); - scheduler2 = context.registerInjectActivateService(spy(new SitemapScheduler()), - "names", new String[]{"<default>", "foo"}, + schedulerWithGenerator2OnMicrosite = context.registerInjectActivateService(spy(new SitemapScheduler()), "searchPath", "/content/microsite" ); - } - @Test - public void testAllSchedulersCalled() { - // when - subject.scheduleGeneration(); + SitemapSchedulerTest.initResourceResolver(context, schedulerWithGenerator1OnSite, this::setupResourceResolver); + SitemapSchedulerTest.initResourceResolver(context, schedulerWithGenerator2OnMicrosite, this::setupResourceResolver); + } - // then - verify(scheduler1, times(1)).run(); - verify(scheduler2, times(1)).run(); + private void setupResourceResolver(ResourceResolver resolver) { + MockJcr.setQueryResult( + resolver.adaptTo(Session.class), + "/jcr:root/content/site//*[@sling:sitemapRoot=true]", + Query.XPATH, + Collections.singletonList(siteRoot.adaptTo(Node.class)) + ); + MockJcr.setQueryResult( + resolver.adaptTo(Session.class), + "/jcr:root/content/microsite//*[@sling:sitemapRoot=true]", + Query.XPATH, + Collections.singletonList(micrositeRoot.adaptTo(Node.class)) + ); } @Test - public void testAllSchedulersCalledForName() { + public void testAllSchedulersCalled() { // when - subject.scheduleGeneration("<default>"); + subject.scheduleGeneration(); // then - verify(scheduler1, times(1)).run("<default>"); - verify(scheduler2, times(1)).run("<default>"); + verify(schedulerWithGenerator1OnSite, atLeastOnce()).addJob(any(), any()); + verify(schedulerWithGenerator2OnMicrosite, atLeastOnce()).addJob(any(), any()); } @Test public void testSchedulersCalledForName() { // when - subject.scheduleGeneration("foo"); + subject.scheduleGeneration("<default>"); // then - verify(scheduler1, never()).run(); - verify(scheduler2, times(1)).run("foo"); + verify(schedulerWithGenerator1OnSite, atLeastOnce()).addJob(any(), eq("<default>")); + verify(schedulerWithGenerator2OnMicrosite, atLeastOnce()).addJob(any(), eq("<default>")); } @Test public void testSchedulersCalledForPath() { // when - subject.scheduleGeneration(root1); + subject.scheduleGeneration(siteRoot); // then - verify(scheduler1, times(1)).run(root1); - verify(scheduler2, never()).run(); + verify(schedulerWithGenerator1OnSite, atLeastOnce()).addJob(eq(siteRoot.getPath()), any()); + verify(schedulerWithGenerator2OnMicrosite, never()).addJob(any(), any()); } @Test public void testSchedulersCalledForPathAndName() { // when - subject.scheduleGeneration(root1, "foo"); - subject.scheduleGeneration(root2, "foo"); + subject.scheduleGeneration(siteRoot, "foo"); + subject.scheduleGeneration(micrositeRoot, "foo"); // then - verify(scheduler1, never()).run(eq(root1), argThat(collection -> collection.contains("foo"))); - verify(scheduler2, times(1)).run(eq(root2), argThat(collection -> collection.contains("foo"))); + verify(schedulerWithGenerator1OnSite, times(1)).addJob(eq(siteRoot.getPath()), eq("foo")); + verify(schedulerWithGenerator2OnMicrosite, times(1)).addJob(eq(micrositeRoot.getPath()), eq("foo")); } }
