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
