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 48dd8db6111013f022dff0afa9870bbcb971542c
Author: Dirk Rudolph <[email protected]>
AuthorDate: Fri Jun 11 14:34:14 2021 +0200

    repalce on-demand names with on-demand generators
    
    Names may be something exposed to a business users so they are not working 
well as
    OSGI configurations. Replaced with geneator class names to provide the 
names for
    on-demand rendering per sitemap root
---
 .../sitemap/generator/SitemapGeneratorManager.java | 34 ++++++++-
 .../sitemap/impl/SitemapGeneratorExecutor.java     |  4 +-
 .../sitemap/impl/SitemapGeneratorManagerImpl.java  | 36 +++++++--
 .../sling/sitemap/impl/SitemapScheduler.java       | 22 +++---
 .../sitemap/impl/SitemapServiceConfiguration.java  | 68 +++++++++++++++++
 .../sling/sitemap/impl/SitemapServiceImpl.java     | 86 +++++++++++-----------
 .../apache/sling/sitemap/impl/SitemapServlet.java  | 49 ++++++------
 .../apache/sling/sitemap/impl/SitemapStorage.java  |  8 +-
 ...reeSitemapGenerator.java => TestGenerator.java} | 39 +++++++---
 .../sitemap/TestResourceTreeSitemapGenerator.java  |  1 +
 .../sitemap/impl/SitemapGeneratorExecutorTest.java |  4 +-
 .../impl/SitemapGeneratorManagerImplTest.java      |  2 +
 .../sling/sitemap/impl/SitemapSchedulerTest.java   | 28 +------
 .../impl/SitemapServiceImplSchedulingTest.java     |  2 +
 .../sling/sitemap/impl/SitemapServiceImplTest.java | 36 +++++----
 .../sling/sitemap/impl/SitemapServletTest.java     | 51 ++++++++++---
 .../sling/sitemap/impl/SitemapStorageTest.java     |  2 +
 17 files changed, 322 insertions(+), 150 deletions(-)

diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/generator/SitemapGeneratorManager.java
 
b/sitemap/src/main/java/org/apache/sling/sitemap/generator/SitemapGeneratorManager.java
index cc05fdd..86a4f4b 100644
--- 
a/sitemap/src/main/java/org/apache/sling/sitemap/generator/SitemapGeneratorManager.java
+++ 
b/sitemap/src/main/java/org/apache/sling/sitemap/generator/SitemapGeneratorManager.java
@@ -72,5 +72,37 @@ public interface SitemapGeneratorManager {
      * @return
      */
     @NotNull
-    Map<String, SitemapGenerator> getGenerators(@Nullable Resource 
sitemapRoot);
+    Map<String, SitemapGenerator> getGenerators(@NotNull Resource sitemapRoot);
+
+    /**
+     * Returns all names produced by all {@link SitemapGenerator}s for the 
given sitemap root, limited to those
+     * {@link SitemapGenerator}s that are configured to be served on demand.
+     *
+     * @param sitemapRoot
+     * @return
+     */
+    @NotNull
+    Set<String> getOnDemandNames(@NotNull Resource sitemapRoot);
+
+    /**
+     * Returns the names of all {@link SitemapGenerator}s for the given 
resource but only retains those in the given
+     * {@link Collection} of names. The result {@link Set} will be less or 
equal in size then the given
+     * {@link Collection}.
+     *
+     * @param sitemapRoot
+     * @param retainOnly
+     * @return
+     */
+    @NotNull
+    Set<String> getOnDemandNames(@NotNull Resource sitemapRoot, @NotNull 
Collection<String> retainOnly);
+
+    /**
+     * Returns a {@link Map} of {@link SitemapGenerator}s for each name 
returned by
+     * {@link SitemapGeneratorManager#getOnDemandNames(Resource)}.
+     *
+     * @param sitemapRoot
+     * @return
+     */
+    @NotNull
+    Map<String, SitemapGenerator> getOnDemandGenerators(@Nullable Resource 
sitemapRoot);
 }
diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutor.java
 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutor.java
index 5452c7f..451d3af 100644
--- 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutor.java
+++ 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutor.java
@@ -95,7 +95,7 @@ public class SitemapGeneratorExecutor implements JobExecutor {
     @Reference
     private EventAdmin eventAdmin;
     @Reference
-    private SitemapServiceImpl sitemapService;
+    private SitemapServiceConfiguration sitemapServiceConfiguration;
 
     private int chunkSize = 10;
 
@@ -177,7 +177,7 @@ public class SitemapGeneratorExecutor implements 
JobExecutor {
             
eventProperties.put(SitemapGenerator.EVENT_PROPERTY_SITEMAP_STORAGE_PATH, 
storagePath);
             
eventProperties.put(SitemapGenerator.EVENT_PROPERTY_SITEMAP_STORAGE_SIZE, 
buffer.size());
             
eventProperties.put(SitemapGenerator.EVENT_PROPERTY_SITEMAP_EXCEEDS_LIMITS,
-                    !sitemapService.isWithinLimits(buffer.size(), 
sitemap.getUrlCount()));
+                    !sitemapServiceConfiguration.isWithinLimits(buffer.size(), 
sitemap.getUrlCount()));
             
             eventAdmin.sendEvent(new 
Event(SitemapGenerator.EVENT_TOPIC_SITEMAP_UPDATED, new 
EventProperties(eventProperties)));
         } catch (JobStoppedException ex) {
diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImpl.java
 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImpl.java
index 74c9511..53b3c43 100644
--- 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImpl.java
+++ 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImpl.java
@@ -28,6 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Component(service = SitemapGeneratorManager.class)
 public class SitemapGeneratorManagerImpl implements SitemapGeneratorManager {
@@ -37,6 +38,8 @@ public class SitemapGeneratorManagerImpl implements 
SitemapGeneratorManager {
     @Reference(service = SitemapGenerator.class, cardinality = 
ReferenceCardinality.AT_LEAST_ONE,
             policyOption = ReferencePolicyOption.GREEDY)
     private List<SitemapGenerator> generators;
+    @Reference
+    private SitemapServiceConfiguration sitemapServiceConfiguration;
 
     @Activate
     protected void activate() {
@@ -60,20 +63,20 @@ public class SitemapGeneratorManagerImpl implements 
SitemapGeneratorManager {
 
     @Override
     public Set<String> getNames(@NotNull Resource sitemapRoot) {
-        return getGenerators(sitemapRoot).keySet();
+        return 
Collections.unmodifiableSet(getGenerators(sitemapRoot).keySet());
     }
 
     @Override
     @NotNull
     public Set<String> getNames(@NotNull Resource sitemapRoot, @NotNull 
Collection<String> retainOnly) {
-        Set<String> allNames = new HashSet<>(getNames(sitemapRoot));
+        Set<String> allNames = new 
HashSet<>(getGenerators(sitemapRoot).keySet());
         allNames.retainAll(retainOnly);
-        return allNames;
+        return Collections.unmodifiableSet(allNames);
     }
 
     @Override
     @NotNull
-    public Map<String, SitemapGenerator> getGenerators(@Nullable Resource 
sitemapRoot) {
+    public Map<String, SitemapGenerator> getGenerators(@NotNull Resource 
sitemapRoot) {
         Map<String, SitemapGenerator> consolidatedGenerators = new HashMap<>();
 
         for (SitemapGenerator generator : this.generators) {
@@ -98,6 +101,29 @@ public class SitemapGeneratorManagerImpl implements 
SitemapGeneratorManager {
             }
         }
 
-        return consolidatedGenerators;
+        return Collections.unmodifiableMap(consolidatedGenerators);
+    }
+
+    @Override
+    @NotNull
+    public Map<String, SitemapGenerator> getOnDemandGenerators(@Nullable 
Resource sitemapRoot) {
+        Set<String> generators = 
sitemapServiceConfiguration.getOnDemandGenerators();
+        return getGenerators(sitemapRoot).entrySet().stream()
+                .filter(entry -> 
generators.contains(entry.getValue().getClass().getName()))
+                .collect(Collectors.toMap(Map.Entry::getKey, 
Map.Entry::getValue));
+    }
+
+    @Override
+    @NotNull
+    public Set<String> getOnDemandNames(@NotNull Resource sitemapRoot) {
+        return 
Collections.unmodifiableSet(getOnDemandGenerators(sitemapRoot).keySet());
+    }
+
+    @Override
+    @NotNull
+    public Set<String> getOnDemandNames(@NotNull Resource sitemapRoot, 
@NotNull Collection<String> retainOnly) {
+        Set<String> allNames = new 
HashSet<>(getOnDemandGenerators(sitemapRoot).keySet());
+        allNames.retainAll(retainOnly);
+        return Collections.unmodifiableSet(allNames);
     }
 }
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 8bce19e..b2767ec 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
@@ -97,6 +97,7 @@ public class SitemapScheduler implements Runnable {
             generators = Arrays.stream(configuredGenerators)
                     .filter(configuredGenerator -> 
!"".equals(configuredGenerator.trim()))
                     .collect(Collectors.toSet());
+
             if (generators.isEmpty()) {
                 generators = null;
             }
@@ -111,23 +112,22 @@ public class SitemapScheduler implements Runnable {
         schedule(null);
     }
 
-    public void schedule(@Nullable Collection<String> names) {
+    public void schedule(@Nullable Collection<String> includeNames) {
         try (ResourceResolver resolver = 
resourceResolverFactory.getServiceResourceResolver(AUTH)) {
             Iterator<Resource> sitemapRoots = findSitemapRoots(resolver, 
searchPath);
             while (sitemapRoots.hasNext()) {
-                schedule(sitemapRoots.next(), names);
+                schedule(sitemapRoots.next(), includeNames);
             }
         } catch (LoginException ex) {
             LOG.warn("Failed start sitemap jobs: {}", ex.getMessage(), ex);
         }
     }
 
-    public void schedule(Resource sitemapRoot, @Nullable Collection<String> 
names) {
-        Set<String> configuredNames = getNames(sitemapRoot);
+    public void schedule(Resource sitemapRoot, @Nullable Collection<String> 
includeNames) {
+        Set<String> configuredNames = new HashSet<>(getNames(sitemapRoot));
 
-        if (names != null) {
-            configuredNames = new HashSet<>(configuredNames);
-            configuredNames.retainAll(names);
+        if (includeNames != null) {
+            configuredNames.retainAll(includeNames);
         }
 
         for (String applicableName : configuredNames) {
@@ -152,13 +152,17 @@ public class SitemapScheduler implements Runnable {
      * @return
      */
     private Set<String> getNames(Resource sitemapRoot) {
+        Set<String> onDemandNames = 
generatorManager.getOnDemandNames(sitemapRoot);
         if (generators == null || generators.isEmpty()) {
             // all names
-            return generatorManager.getGenerators(sitemapRoot).keySet();
+            Set<String> names = new 
HashSet<>(generatorManager.getNames(sitemapRoot));
+            names.removeAll(onDemandNames);
+            return names;
         } else {
-            // only those of the contained geneators
+            // only those of the contained generators
             return 
generatorManager.getGenerators(sitemapRoot).entrySet().stream()
                     .filter(entry -> 
generators.contains(entry.getValue().getClass().getName()))
+                    .filter(entry -> !onDemandNames.contains(entry.getKey()))
                     .map(Map.Entry::getKey)
                     .collect(Collectors.toSet());
         }
diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceConfiguration.java
 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceConfiguration.java
new file mode 100644
index 0000000..c9f65de
--- /dev/null
+++ 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServiceConfiguration.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.sitemap.impl;
+
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Component(service = SitemapServiceConfiguration.class)
+@Designate(ocd = SitemapServiceConfiguration.Configuration.class)
+public class SitemapServiceConfiguration {
+
+    @ObjectClassDefinition(name = "Apache Sling Sitemap - Sitemap Service")
+    @interface Configuration {
+        @AttributeDefinition(name = "Serve on-demand", description = "A list 
of generator full qualified generator " +
+                "class names to serve on-demand.")
+        String[] onDemandGenerators() default {};
+
+        @AttributeDefinition(name = "Max Size", description = "The maximum 
size of a sitemap in bytes. Files that " +
+                "exceed the size will be flagged with a warning.")
+        int maxSize() default 10 * 1024 * 1024;
+
+        @AttributeDefinition(name = "Max Entries", description = "The maximum 
number of urls of a sitemap. Files " +
+                "that exceed this number will be flagged with a warning.")
+        int maxEntries() default 50000;
+    }
+
+    private Set<String> onDemandGenerators;
+    private int maxSize;
+    private int maxEntries;
+
+    @Activate
+    protected void activate(Configuration configuration) {
+        onDemandGenerators = 
Arrays.stream(configuration.onDemandGenerators()).collect(Collectors.toSet());
+        maxSize = configuration.maxSize();
+        maxEntries = configuration.maxEntries();
+    }
+
+    public Set<String> getOnDemandGenerators() {
+        return onDemandGenerators;
+    }
+
+    public boolean isWithinLimits(int size, int entries) {
+        return size <= maxSize && entries <= maxEntries;
+    }
+}
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 e9ae3b8..cc61a25 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
@@ -25,42 +25,24 @@ import org.apache.sling.sitemap.SitemapInfo;
 import org.apache.sling.sitemap.SitemapService;
 import org.apache.sling.sitemap.common.SitemapLinkExternalizer;
 import org.apache.sling.sitemap.common.SitemapUtil;
+import org.apache.sling.sitemap.generator.SitemapGenerator;
 import org.apache.sling.sitemap.generator.SitemapGeneratorManager;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 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;
-import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.osgi.util.tracker.ServiceTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 import static org.apache.sling.sitemap.common.SitemapUtil.*;
 
-@Component(service = {SitemapServiceImpl.class, SitemapService.class})
-@Designate(ocd = SitemapServiceImpl.Configuration.class)
+@Component(service = SitemapService.class)
 public class SitemapServiceImpl implements SitemapService {
 
-    @ObjectClassDefinition(name = "Apache Sling Sitemap - Sitemap Service")
-    @interface Configuration {
-        @AttributeDefinition(name = "Serve on-demand", description = "A list 
of sitemap names to serve on-demand.")
-        String[] onDemandNames() default {};
-
-        @AttributeDefinition(name = "Max Size", description = "The maximum 
size of a sitemap in bytes. Files that " +
-                "exceed the size will be flagged with a warning.")
-        int maxSize() default 10 * 1024 * 1024;
-
-        @AttributeDefinition(name = "Max Entries", description = "The maximum 
number of urls of a sitemap. Files " +
-                "that exceed this number will be flagged with a warning.")
-        int maxEntries() default 50000;
-    }
-
     private static final Logger LOG = 
LoggerFactory.getLogger(SitemapServiceImpl.class);
 
     @Reference(cardinality = ReferenceCardinality.OPTIONAL, policyOption = 
ReferencePolicyOption.GREEDY)
@@ -71,17 +53,13 @@ public class SitemapServiceImpl implements SitemapService {
     private SitemapGeneratorManager generatorManager;
     @Reference
     private SitemapStorage storage;
+    @Reference
+    private SitemapServiceConfiguration sitemapServiceConfiguration;
 
     private ServiceTracker<SitemapScheduler, SitemapScheduler> schedulers;
-    private Set<String> onDemandNames;
-    private int maxSize;
-    private int maxEntries;
 
     @Activate
-    protected void activate(Configuration configuration, BundleContext 
bundleContext) {
-        onDemandNames = 
Arrays.stream(configuration.onDemandNames()).collect(Collectors.toSet());
-        maxSize = configuration.maxSize();
-        maxEntries = configuration.maxEntries();
+    protected void activate(BundleContext bundleContext) {
         schedulers = new ServiceTracker<>(bundleContext, 
SitemapScheduler.class, null);
         schedulers.open();
     }
@@ -91,14 +69,6 @@ public class SitemapServiceImpl implements SitemapService {
         schedulers.close();
     }
 
-    public Set<String> getSitemapNamesServedOnDemand() {
-        return Collections.unmodifiableSet(onDemandNames);
-    }
-
-    public boolean isWithinLimits(int size, int entries) {
-        return size <= maxSize && entries <= maxEntries;
-    }
-
     @Override
     public void scheduleGeneration() {
         if (schedulers.getServiceReferences() != null) {
@@ -159,7 +129,8 @@ public class SitemapServiceImpl implements SitemapService {
         }
 
         String url = externalize(sitemapRoot);
-        Collection<String> names = 
generatorManager.getGenerators(sitemapRoot).keySet();
+        Collection<String> names = new 
HashSet<>(generatorManager.getGenerators(sitemapRoot).keySet());
+        Set<String> onDemandNames = 
generatorManager.getOnDemandNames(sitemapRoot);
 
         if (url == null) {
             LOG.debug("Could not get absolute url to sitemap: {}", 
resource.getPath());
@@ -173,15 +144,31 @@ public class SitemapServiceImpl implements SitemapService 
{
                     url + '.' + SitemapServlet.SITEMAP_INDEX_SELECTOR + '.' + 
SitemapServlet.SITEMAP_EXTENSION));
         }
 
-        for (SitemapStorageInfo storageInfo : storage.getSitemaps(sitemapRoot, 
names)) {
-            String location = url + '.' + SitemapServlet.SITEMAP_SELECTOR + 
'.';
-            if 
(storageInfo.getSitemapSelector().equals(SitemapServlet.SITEMAP_SELECTOR)) {
-                location += SitemapServlet.SITEMAP_EXTENSION;
-            } else {
-                location += storageInfo.getSitemapSelector() + '.' + 
SitemapServlet.SITEMAP_EXTENSION;
+        for (String name : names) {
+            if (onDemandNames.contains(name)) {
+                String location = url + '.' + SitemapServlet.SITEMAP_SELECTOR 
+ '.';
+                if (name.equals(SitemapGenerator.DEFAULT_SITEMAP)) {
+                    location += SitemapServlet.SITEMAP_EXTENSION;
+                } else {
+                    location += SitemapUtil.getSitemapSelector(sitemapRoot, 
sitemapRoot, name) + '.' + SitemapServlet.SITEMAP_EXTENSION;
+                }
+                infos.add(newSitemapInfo(null, location, name, -1, -1));
+            }
+        }
+
+        names.removeAll(onDemandNames);
+
+        if (names.size() > 0) {
+            for (SitemapStorageInfo storageInfo : 
storage.getSitemaps(sitemapRoot, names)) {
+                String location = url + '.' + SitemapServlet.SITEMAP_SELECTOR 
+ '.';
+                if 
(storageInfo.getSitemapSelector().equals(SitemapServlet.SITEMAP_SELECTOR)) {
+                    location += SitemapServlet.SITEMAP_EXTENSION;
+                } else {
+                    location += storageInfo.getSitemapSelector() + '.' + 
SitemapServlet.SITEMAP_EXTENSION;
+                }
+                infos.add(newSitemapInfo(storageInfo.getPath(), location, 
storageInfo.getName(), storageInfo.getSize(),
+                        storageInfo.getEntries()));
             }
-            infos.add(newSitemapInfo(storageInfo.getPath(), location, 
storageInfo.getName(), storageInfo.getSize(),
-                    storageInfo.getEntries()));
         }
 
         return infos;
@@ -190,6 +177,13 @@ public class SitemapServiceImpl implements SitemapService {
     @Override
     public boolean isSitemapGenerationPending(@NotNull Resource sitemapRoot) {
         sitemapRoot = normalizeSitemapRoot(sitemapRoot);
+
+        if (sitemapRoot == null) {
+            return false;
+        }
+
+        Set<String> onDemandNames = 
generatorManager.getOnDemandNames(sitemapRoot);
+
         // not a sitemap root, always more then one sitemap, all sitemaps 
on-demand
         if (!isSitemapRoot(sitemapRoot)
                 || requiresSitemapIndex(sitemapRoot)
@@ -240,6 +234,7 @@ public class SitemapServiceImpl implements SitemapService {
         }
 
         topLevelSitemapRootUrl += '.' + SitemapServlet.SITEMAP_SELECTOR + '.';
+        Set<String> onDemandNames = 
generatorManager.getOnDemandNames(sitemapRoot);
         Collection<SitemapInfo> infos = new ArrayList<>(names.size());
         Set<SitemapStorageInfo> storageInfos = null;
 
@@ -275,7 +270,8 @@ public class SitemapServiceImpl implements SitemapService {
 
     private SitemapInfo newSitemapInfo(@Nullable String path, @NotNull String 
url, @Nullable String name, int size,
                                        int entries) {
-        return new SitemapInfoImpl(path, url, name, size, entries, false, 
isWithinLimits(size, entries));
+        return new SitemapInfoImpl(path, url, name, size, entries, false,
+                sitemapServiceConfiguration.isWithinLimits(size, entries));
     }
 
     private static class SitemapInfoImpl implements SitemapInfo {
diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServlet.java 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServlet.java
index e8adc6f..6d00910 100644
--- a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServlet.java
+++ b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapServlet.java
@@ -23,13 +23,13 @@ import org.apache.sling.api.SlingHttpServletResponse;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.servlets.ServletResolverConstants;
 import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
-import org.apache.sling.sitemap.common.SitemapLinkExternalizer;
 import org.apache.sling.sitemap.SitemapException;
+import org.apache.sling.sitemap.common.SitemapLinkExternalizer;
 import org.apache.sling.sitemap.generator.SitemapGenerator;
 import org.apache.sling.sitemap.generator.SitemapGeneratorManager;
-import 
org.apache.sling.sitemap.impl.builder.extensions.ExtensionProviderManager;
 import org.apache.sling.sitemap.impl.builder.SitemapImpl;
 import org.apache.sling.sitemap.impl.builder.SitemapIndexImpl;
+import 
org.apache.sling.sitemap.impl.builder.extensions.ExtensionProviderManager;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.osgi.service.component.annotations.*;
@@ -42,8 +42,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.*;
 
-import static org.apache.sling.sitemap.impl.SitemapServlet.*;
 import static org.apache.sling.sitemap.common.SitemapUtil.*;
+import static org.apache.sling.sitemap.impl.SitemapServlet.*;
 
 @Component(
         service = Servlet.class,
@@ -88,7 +88,7 @@ public class SitemapServlet extends SlingSafeMethodsServlet {
     @Reference
     private SitemapStorage storage;
     @Reference
-    private SitemapServiceImpl sitemapService;
+    private SitemapServiceConfiguration sitemapServiceConfiguration;
 
     @Override
     protected void doGet(@NotNull SlingHttpServletRequest request, @NotNull 
SlingHttpServletResponse response)
@@ -153,26 +153,20 @@ public class SitemapServlet extends 
SlingSafeMethodsServlet {
 
     protected void doGetSitemap(@NotNull SlingHttpServletRequest request, 
@NotNull SlingHttpServletResponse response,
                                 Resource topLevelSitemapRoot, String 
sitemapSelector) throws SitemapException, IOException {
-        Set<String> onDemandSitemaps = 
sitemapService.getSitemapNamesServedOnDemand();
-
-        if (onDemandSitemaps.size() > 0) {
-            // resolve the actual sitemap root from the sitemapFileName
-            Map<Resource, String> candidates = 
resolveSitemapRoots(topLevelSitemapRoot, sitemapSelector);
-            // retain only those values/entries which are configured to be 
served on-demand
-            candidates = new HashMap<>(candidates);
-            candidates.values().retainAll(onDemandSitemaps);
-
-            for (Map.Entry<Resource, String> entry : candidates.entrySet()) {
-                Resource sitemapRoot = entry.getKey();
-                String name = entry.getValue();
-                SitemapGenerator generator = 
generatorManager.getGenerator(sitemapRoot, name);
-
-                if (generator != null) {
-                    SitemapImpl sitemap = new 
SitemapImpl(response.getWriter(), extensionProviderManager);
-                    generator.generate(sitemapRoot, name, sitemap, 
NOOP_CONTEXT);
-                    sitemap.close();
-                    return;
-                }
+        // resolve the actual sitemap root from the sitemapFileName
+        Map<Resource, String> candidates = 
resolveSitemapRoots(topLevelSitemapRoot, sitemapSelector);
+
+        for (Map.Entry<Resource, String> entry : candidates.entrySet()) {
+            Resource sitemapRoot = entry.getKey();
+            String name = entry.getValue();
+            SitemapGenerator generator = 
generatorManager.getGenerator(sitemapRoot, name);
+
+            if (generator != null
+                    && 
sitemapServiceConfiguration.getOnDemandGenerators().contains(generator.getClass().getName()))
 {
+                SitemapImpl sitemap = new SitemapImpl(response.getWriter(), 
extensionProviderManager);
+                generator.generate(sitemapRoot, name, sitemap, NOOP_CONTEXT);
+                sitemap.close();
+                return;
             }
         }
 
@@ -192,13 +186,12 @@ public class SitemapServlet extends 
SlingSafeMethodsServlet {
      */
     private Set<String> addOnDemandSitemapsToIndex(SlingHttpServletRequest 
request, Resource parentSitemapRoot,
                                                    SitemapIndexImpl index) 
throws SitemapException {
-        Set<String> onDemandSitemaps = 
sitemapService.getSitemapNamesServedOnDemand();
+        Set<String> onDemandSitemaps = 
sitemapServiceConfiguration.getOnDemandGenerators();
 
         if (onDemandSitemaps.isEmpty()) {
             return Collections.emptySet();
         }
-
-        Set<String> addedSitemapSelectors = new 
HashSet<>(onDemandSitemaps.size());
+        Set<String> addedSitemapSelectors = new HashSet<>();
         Iterator<Resource> sitemapRoots = 
findSitemapRoots(request.getResourceResolver(), parentSitemapRoot.getPath());
         if (!sitemapRoots.hasNext()) {
             // serve at least the top level sitemap
@@ -206,7 +199,7 @@ public class SitemapServlet extends SlingSafeMethodsServlet 
{
         }
         while (sitemapRoots.hasNext()) {
             Resource sitemapRoot = sitemapRoots.next();
-            Set<String> applicableNames = 
generatorManager.getNames(sitemapRoot, onDemandSitemaps);
+            Set<String> applicableNames = 
generatorManager.getOnDemandNames(sitemapRoot);
             // applicable names we may serve directly, not applicable names, 
if any, we have to serve from storage
             for (String applicableName : applicableNames) {
                 String sitemapSelector = getSitemapSelector(sitemapRoot, 
sitemapRoot, applicableName);
diff --git 
a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapStorage.java 
b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapStorage.java
index 0308b21..374cfb4 100644
--- a/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapStorage.java
+++ b/sitemap/src/main/java/org/apache/sling/sitemap/impl/SitemapStorage.java
@@ -350,8 +350,12 @@ public class SitemapStorage implements Runnable {
         Map<Resource, String> candidates = 
SitemapUtil.resolveSitemapRoots(sitemapRoot, name.substring(0, lastDot));
         // check if for any of the candidate resource roots a generator with 
the name exists
         return candidates.entrySet().stream()
-                .map(entry -> generatorManager.getNames(entry.getKey(), 
Collections.singleton(entry.getValue())))
-                .anyMatch(names -> names.size() > 0);
+                .anyMatch(entry -> {
+                    Resource resource = entry.getKey();
+                    Set<String> candidateName = 
Collections.singleton(entry.getValue());
+                    return generatorManager.getNames(resource, 
candidateName).size() > 0
+                            && generatorManager.getOnDemandNames(resource, 
candidateName).isEmpty();
+                });
     }
 
     /**
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
 b/sitemap/src/test/java/org/apache/sling/sitemap/TestGenerator.java
similarity index 50%
copy from 
sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
copy to sitemap/src/test/java/org/apache/sling/sitemap/TestGenerator.java
index 90e446c..ad1b24e 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
+++ b/sitemap/src/test/java/org/apache/sling/sitemap/TestGenerator.java
@@ -19,23 +19,44 @@
 package org.apache.sling.sitemap;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.sitemap.SitemapException;
 import org.apache.sling.sitemap.builder.Sitemap;
-import org.apache.sling.sitemap.generator.ResourceTreeSitemapGenerator;
 import org.apache.sling.sitemap.generator.SitemapGenerator;
 import org.jetbrains.annotations.NotNull;
 
-import java.util.Collections;
-import java.util.Set;
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.fail;
+
+public abstract class TestGenerator implements SitemapGenerator {
+
+    private Map<String, List<String>> names = new HashMap<>();
+
+    public TestGenerator() {
+        this.names.put(null, Collections.emptyList());
+    }
+
+    public TestGenerator(String... names) {
+        this.names.put(null, Arrays.asList(names));
+    }
+
+    public void setNames(String... names) {
+        this.names.put(null, Arrays.asList(names));
+    }
+
+    public void setNames(Resource resource, String... names) {
+        this.names.put(resource.getPath(), Arrays.asList(names));
+    }
 
-public class TestResourceTreeSitemapGenerator extends 
ResourceTreeSitemapGenerator {
     @Override
-    public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) {
-        return Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP);
+    @NotNull
+    public Set<String> getNames(@NotNull Resource sitemapRoot) {
+        return new HashSet<>(names.containsKey(sitemapRoot.getPath())
+                ? names.get(sitemapRoot.getPath())
+                : names.get(null));
     }
 
     @Override
-    protected void addResource(String name, Sitemap sitemap, Resource 
resource) throws SitemapException {
-        sitemap.addUrl(resource.getPath());
+    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/TestResourceTreeSitemapGenerator.java
 
b/sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
index 90e446c..d8ac5ba 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/TestResourceTreeSitemapGenerator.java
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.Set;
 
 public class TestResourceTreeSitemapGenerator extends 
ResourceTreeSitemapGenerator {
+
     @Override
     public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) {
         return Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP);
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutorTest.java
 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutorTest.java
index 3492eb1..7457d72 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutorTest.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorExecutorTest.java
@@ -62,7 +62,7 @@ public class SitemapGeneratorExecutorTest {
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
     private final ExtensionProviderManager extensionProviderManager = new 
ExtensionProviderManager();
     private final SitemapStorage storage = spy(new SitemapStorage());
-    private final SitemapServiceImpl sitemapService = new SitemapServiceImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
 
     @Mock
     private JobManager jobManager;
@@ -89,10 +89,10 @@ public class SitemapGeneratorExecutorTest {
         context.registerService(ServiceUserMapped.class, serviceUser, 
"subServiceName", "sitemap-writer");
         context.registerService(SitemapGenerator.class, generator);
         context.registerService(JobManager.class, jobManager);
+        context.registerInjectActivateService(sitemapServiceConfiguration);
         context.registerInjectActivateService(generatorManager);
         context.registerInjectActivateService(storage);
         context.registerInjectActivateService(extensionProviderManager);
-        context.registerInjectActivateService(sitemapService);
 
         
when(job.getProperty(SitemapGeneratorExecutor.JOB_PROPERTY_SITEMAP_NAME, 
SitemapGenerator.DEFAULT_SITEMAP))
                 .thenReturn(SitemapGenerator.DEFAULT_SITEMAP);
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImplTest.java
 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImplTest.java
index dbc3117..ad6587a 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImplTest.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapGeneratorManagerImplTest.java
@@ -44,6 +44,7 @@ public class SitemapGeneratorManagerImplTest {
     public final SlingContext context = new SlingContext();
 
     private final SitemapGeneratorManagerImpl subject = new 
SitemapGeneratorManagerImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
 
     @Mock
     private SitemapGenerator generator1;
@@ -58,6 +59,7 @@ public class SitemapGeneratorManagerImplTest {
         context.registerService(SitemapGenerator.class, generator2, 
"service.ranking", 2);
         context.registerService(SitemapGenerator.class, generator3, 
"service.ranking", 3);
 
+        context.registerInjectActivateService(new 
SitemapServiceConfiguration());
         context.registerInjectActivateService(subject);
     }
 
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 050b055..de325e3 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
@@ -26,15 +26,13 @@ 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.TestGenerator;
 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;
@@ -62,6 +60,7 @@ public class SitemapSchedulerTest {
 
     private final SitemapScheduler subject = new SitemapScheduler();
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
 
     private final TestGenerator generator1 = new TestGenerator() {};
     private final TestGenerator generator2 = new TestGenerator() {};
@@ -87,6 +86,7 @@ public class SitemapSchedulerTest {
         context.registerService(JobManager.class, jobManager);
         context.registerService(SitemapGenerator.class, generator1, 
"service.ranking", 1);
         context.registerService(SitemapGenerator.class, generator2, 
"service.ranking", 2);
+        context.registerInjectActivateService(sitemapServiceConfiguration);
         context.registerInjectActivateService(generatorManager);
 
         AtomicInteger jobCount = new AtomicInteger(0);
@@ -220,26 +220,4 @@ public class SitemapSchedulerTest {
         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 1dfd9fa..d634217 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
@@ -57,6 +57,7 @@ public class SitemapServiceImplSchedulingTest {
     private final SitemapServiceImpl subject = new SitemapServiceImpl();
     private final SitemapStorage storage = new SitemapStorage();
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
 
     @Mock
     private ServiceUserMapped serviceUser;
@@ -104,6 +105,7 @@ public class SitemapServiceImplSchedulingTest {
         context.registerService(SitemapGenerator.class, generator1);
         context.registerService(SitemapGenerator.class, generator2);
         context.registerService(JobManager.class, jobManager);
+        context.registerInjectActivateService(sitemapServiceConfiguration);
         context.registerInjectActivateService(generatorManager);
         context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplTest.java
 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplTest.java
index 8bc8e15..0879efe 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplTest.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServiceImplTest.java
@@ -25,6 +25,7 @@ import org.apache.sling.event.jobs.JobManager;
 import org.apache.sling.serviceusermapping.ServiceUserMapped;
 import org.apache.sling.sitemap.SitemapInfo;
 import org.apache.sling.sitemap.SitemapService;
+import org.apache.sling.sitemap.TestGenerator;
 import org.apache.sling.sitemap.generator.SitemapGenerator;
 import org.apache.sling.testing.mock.jcr.MockJcr;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
@@ -67,13 +68,15 @@ public class SitemapServiceImplTest {
     private final SitemapServiceImpl subject = new SitemapServiceImpl();
     private final SitemapStorage storage = new SitemapStorage();
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
+
+    private TestGenerator generator = new TestGenerator() {};
+    private TestGenerator newsGenerator = new TestGenerator() {};
 
     @Mock
     private ServiceUserMapped serviceUser;
     @Mock
     private JobManager jobManager;
-    @Mock
-    private SitemapGenerator generator;
 
     private Resource deRoot;
     private Resource enRoot;
@@ -103,10 +106,14 @@ public class SitemapServiceImplTest {
 
         context.registerService(ServiceUserMapped.class, serviceUser, 
"subServiceName", "sitemap-writer");
         context.registerService(SitemapGenerator.class, generator);
+        context.registerService(SitemapGenerator.class, newsGenerator);
         context.registerService(JobManager.class, jobManager);
+        context.registerInjectActivateService(sitemapServiceConfiguration,
+                "onDemandGenerators", newsGenerator.getClass().getName()
+        );
         context.registerInjectActivateService(generatorManager);
         context.registerInjectActivateService(storage);
-        context.registerInjectActivateService(subject, "onDemandNames", 
"news");
+        context.registerInjectActivateService(subject);
     }
 
     @Test
@@ -114,7 +121,8 @@ public class SitemapServiceImplTest {
         // given
         storage.writeSitemap(deRoot, SitemapGenerator.DEFAULT_SITEMAP, new 
ByteArrayInputStream(new byte[0]), 0, 0);
 
-        
when(generator.getNames(any())).thenReturn(Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP));
+        generator.setNames(SitemapGenerator.DEFAULT_SITEMAP);
+
         when(jobManager.findJobs(
                 eq(JobManager.QueryType.ALL),
                 eq(SitemapGeneratorExecutor.JOB_TOPIC),
@@ -134,9 +142,10 @@ public class SitemapServiceImplTest {
         // given
         storage.writeSitemap(deRoot, SitemapGenerator.DEFAULT_SITEMAP, new 
ByteArrayInputStream(new byte[0]), 0, 0);
 
-        
when(generator.getNames(any())).thenReturn(ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP));
-        when(generator.getNames(frRoot)).thenReturn(ImmutableSet.of("a", "b"));
-        when(generator.getNames(enNews)).thenReturn(ImmutableSet.of("news"));
+        generator.setNames(SitemapGenerator.DEFAULT_SITEMAP);
+        generator.setNames(frRoot, "a", "b");
+        newsGenerator.setNames(enNews, "news");
+
         when(jobManager.findJobs(
                 eq(JobManager.QueryType.ALL),
                 eq(SitemapGeneratorExecutor.JOB_TOPIC),
@@ -170,8 +179,8 @@ public class SitemapServiceImplTest {
     @Test
     public void testSitemapIndexUrlReturned() {
         // given
-        
when(generator.getNames(any())).thenReturn(Collections.singleton(SitemapGenerator.DEFAULT_SITEMAP));
-        when(generator.getNames(frRoot)).thenReturn(ImmutableSet.of("a", "b"));
+        generator.setNames(SitemapGenerator.DEFAULT_SITEMAP);
+        generator.setNames(frRoot, "a", "b");
 
         MockJcr.setQueryResult(
                 context.resourceResolver().adaptTo(Session.class),
@@ -217,10 +226,11 @@ public class SitemapServiceImplTest {
         storage.writeSitemap(enNews, "foo", new ByteArrayInputStream(new 
byte[0]), 100, 1);
         storage.writeSitemap(enNews, "bar", new ByteArrayInputStream(new 
byte[0]), 100, 1);
 
-        
when(generator.getNames(deRoot)).thenReturn(ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP));
-        when(generator.getNames(frRoot)).thenReturn(ImmutableSet.of("foobar"));
-        when(generator.getNames(enNews)).thenReturn(ImmutableSet.of("foo", 
"bar", "news"));
-        
when(generator.getNames(enRoot)).thenReturn(ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP));
+        generator.setNames(deRoot, SitemapGenerator.DEFAULT_SITEMAP);
+        generator.setNames(frRoot, "foobar");
+        generator.setNames(enNews, "foo", "bar");
+        generator.setNames(enRoot, SitemapGenerator.DEFAULT_SITEMAP);
+        newsGenerator.setNames(enNews, "news");
 
         MockJcr.setQueryResult(
                 context.resourceResolver().adaptTo(Session.class),
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServletTest.java 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServletTest.java
index 60464a6..f73b972 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServletTest.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapServletTest.java
@@ -65,14 +65,20 @@ public class SitemapServletTest {
 
     private final SitemapServlet subject = new SitemapServlet();
     private final SitemapStorage storage = spy(new SitemapStorage());
-    private final SitemapServiceImpl sitemapService = new SitemapServiceImpl();
+    private final SitemapServiceConfiguration sitemapServiceConfiguration = 
new SitemapServiceConfiguration();
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
     private final ExtensionProviderManager extensionProviderManager = new 
ExtensionProviderManager();
 
     private SitemapGenerator generator = new 
TestResourceTreeSitemapGenerator() {
         @Override
         public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) {
-            return ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP, "news");
+            return ImmutableSet.of(SitemapGenerator.DEFAULT_SITEMAP);
+        }
+    };
+    private SitemapGenerator newsGenerator = new 
TestResourceTreeSitemapGenerator() {
+        @Override
+        public @NotNull Set<String> getNames(@NotNull Resource sitemapRoot) {
+            return ImmutableSet.of("news");
         }
     };
 
@@ -98,9 +104,8 @@ public class SitemapServletTest {
 
         context.registerService(ServiceUserMapped.class, serviceUser, 
"subServiceName", "sitemap-writer");
         context.registerService(SitemapGenerator.class, generator);
+        context.registerService(SitemapGenerator.class, newsGenerator);
         context.registerService(JobManager.class, jobManager);
-        context.registerInjectActivateService(generatorManager);
-        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(extensionProviderManager);
 
         // overrule the getLastModified() of all SitemapStorageInfos to get 
predictable behaviour
@@ -123,6 +128,7 @@ public class SitemapServletTest {
     public void testBadRequestForResourcesThatAreNotSitemapRoot() throws 
ServletException, IOException {
         // given
         Resource notATopLevelRoot = 
context.create().resource("/content/site/en");
+
         MockSlingHttpServletRequest request = 
newSitemapIndexReq(notATopLevelRoot);
         MockSlingHttpServletResponse response = context.response();
 
@@ -152,10 +158,14 @@ public class SitemapServletTest {
     @Test
     public void testSitemapIndexContainsOnlySitemapsFromStorage() throws 
IOException, ServletException {
         // given
-        context.registerInjectActivateService(sitemapService);
+        context.registerInjectActivateService(sitemapServiceConfiguration);
+        context.registerInjectActivateService(generatorManager);
+        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
+
         storage.writeSitemap(root, SitemapGenerator.DEFAULT_SITEMAP, new 
ByteArrayInputStream(new byte[0]), 0, 0);
         storage.writeSitemap(root, "news", new ByteArrayInputStream(new 
byte[0]), 0, 0);
+
         MockSlingHttpServletRequest request = newSitemapIndexReq(root);
         MockSlingHttpServletResponse response = context.response();
 
@@ -178,9 +188,15 @@ public class SitemapServletTest {
     @Test
     public void 
testSitemapIndexContainsOnDemandSitemapsAndSitemapsFromStorage() throws 
ServletException, IOException {
         // given
-        context.registerInjectActivateService(sitemapService, "onDemandNames", 
"news");
+        context.registerInjectActivateService(sitemapServiceConfiguration,
+                "onDemandGenerators", newsGenerator.getClass().getName()
+        );
+        context.registerInjectActivateService(generatorManager);
+        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
+
         storage.writeSitemap(root, SitemapGenerator.DEFAULT_SITEMAP, new 
ByteArrayInputStream(new byte[0]), 0, 0);
+
         MockSlingHttpServletRequest request = newSitemapIndexReq(root);
         MockSlingHttpServletResponse response = context.response();
 
@@ -203,8 +219,13 @@ public class SitemapServletTest {
     @Test
     public void testSitemapServedOnDemand() throws ServletException, 
IOException {
         // given
-        context.registerInjectActivateService(sitemapService, "onDemandNames", 
"news");
+        context.registerInjectActivateService(sitemapServiceConfiguration,
+                "onDemandGenerators", newsGenerator.getClass().getName()
+        );
+        context.registerInjectActivateService(generatorManager);
+        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
+
         MockSlingHttpServletRequest request = newSitemapReq("news-sitemap", 
root);
         MockSlingHttpServletResponse response = context.response();
 
@@ -230,10 +251,17 @@ public class SitemapServletTest {
                 + "<url><loc>/content/site/en</loc></url>"
                 + "</urlset>";
         byte[] expectedOutcomeBytes = 
expectedOutcome.getBytes(StandardCharsets.UTF_8);
-        context.registerInjectActivateService(sitemapService, "onDemandNames", 
"news");
+
+        context.registerInjectActivateService(sitemapServiceConfiguration,
+                "onDemandGenerators", newsGenerator.getClass().getName()
+        );
+        context.registerInjectActivateService(generatorManager);
+        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
+
         storage.writeSitemap(root, "foo", new 
ByteArrayInputStream(expectedOutcomeBytes),
                 expectedOutcomeBytes.length, 1);
+
         MockSlingHttpServletRequest request = newSitemapReq("foo-sitemap", 
root);
         MockSlingHttpServletResponse response = context.response();
 
@@ -253,8 +281,13 @@ public class SitemapServletTest {
     @Test
     public void testSitemapNotServed() throws ServletException, IOException {
         // given
-        context.registerInjectActivateService(sitemapService, "onDemandNames", 
"news");
+        context.registerInjectActivateService(sitemapServiceConfiguration,
+                "onDemandGenerators", newsGenerator.getClass().getName()
+        );
+        context.registerInjectActivateService(generatorManager);
+        context.registerInjectActivateService(storage);
         context.registerInjectActivateService(subject);
+
         MockSlingHttpServletRequest request = newSitemapReq("sitemap", root);
         MockSlingHttpServletResponse response = context.response();
 
diff --git 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapStorageTest.java 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapStorageTest.java
index 5b83b15..fc828d0 100644
--- 
a/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapStorageTest.java
+++ 
b/sitemap/src/test/java/org/apache/sling/sitemap/impl/SitemapStorageTest.java
@@ -58,6 +58,7 @@ public class SitemapStorageTest {
 
     private final SitemapStorage subject = new SitemapStorage();
     private final SitemapGeneratorManagerImpl generatorManager = new 
SitemapGeneratorManagerImpl();
+    private final SitemapServiceConfiguration configuration = new 
SitemapServiceConfiguration();
 
     @Mock(lenient = true)
     private SitemapGenerator generator;
@@ -68,6 +69,7 @@ public class SitemapStorageTest {
     public void setup() {
         context.registerService(SitemapGenerator.class, generator);
         context.registerService(ServiceUserMapped.class, serviceUser, 
"subServiceName", "sitemap-writer");
+        context.registerInjectActivateService(configuration);
         context.registerInjectActivateService(generatorManager);
         context.registerInjectActivateService(subject,
                 "stateMaxAge", 100

Reply via email to