/** * 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.jooby.internal.sitemap; import java.util.List; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import org.jooby.MediaType; import org.jooby.Request; import org.jooby.Results; import org.jooby.Route; import org.jooby.sitemap.WebPageProvider; import cz.jiripinkas.jsitemapgenerator.WebPage; import javaslang.Function1; class SitemapHandler implements Route.OneArgHandler { private String name; private Predicate<Route.Definition> filter; private Function1<List<WebPage>, String> gen; public SitemapHandler(final String name, final Predicate<Route.Definition> filter, final Function1<List<WebPage>, String> gen) { this.name = name; this.filter = filter; this.gen = gen; } @Override public Object handle(final Request req) throws Throwable { Set<Route.Definition> routes = req.require(Route.KEY); WebPageProvider provider = req.require(name, WebPageProvider.class); List<WebPage> pages = routes.stream() .filter(filter) .flatMap(r -> provider.apply(r).stream()) .map(page -> { String name = page.getName(); if (name.startsWith("/")) { name = name.substring(1); } page.setName(name); return page; }).collect(Collectors.toList()); return Results.ok(gen.apply(pages)).type(MediaType.xml); } }