Sitemap.java

/*-
 * #%L
 * io.earcam.utilitarian.site.sitemap
 * %%
 * Copyright (C) 2017 earcam
 * %%
 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
 *
 * You <b>must</b> choose to accept, in full - any individual or combination of
 * the following licenses:
 * <ul>
 * 	<li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
 * 	<li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
 * 	<li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
 * 	<li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
 * </ul>
 * #L%
 */
package io.earcam.utilitarian.site.sitemap;

import static io.earcam.utilitarian.site.sitemap.SitemapParameters.INCLUDE_ALL;

import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

import javax.annotation.concurrent.NotThreadSafe;

@NotThreadSafe
public class Sitemap extends AbstractSitemap {

	public static final String NAME_SITEMAP = "sitemap";

	private static final String TAG_URL = "url";

	private static final String HEAD = "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">";

	private static final String TAIL = "</urlset>";

	URI sourceUri;


	public Sitemap(SitemapParameters parameters, Consumer<Path> generatedFileRecorder)
	{
		super(parameters, HEAD, TAG_URL, TAIL, generatedFileRecorder);
		sourceUri = parameters.sourceDir.toUri();
	}


	public void run() throws IOException
	{
		Stream<Path> files = Files.walk(parameters.sourceDir)
				.filter(Files::isRegularFile);
		files = filter(files);
		process(files.sequential());
	}


	private Stream<Path> filter(Stream<Path> files)
	{
		if(!INCLUDE_ALL.equals(parameters.options().include())) {
			Predicate<String> filter = parameters.options().include().asPredicate();
			return files.filter(f -> filter.test(f.toAbsolutePath().toString()));
		}
		return files;
	}


	@Override
	protected Path filename()
	{
		return filename(parameters, NAME_SITEMAP + (++indexFileSuffix));
	}


	/*
	 * Relativize the local dir as URI then apply as resolve to base URL
	 */
	@Override
	protected String createUrl(Path siteResourceFile) throws IOException
	{
		URI uri = sourceUri.relativize(siteResourceFile.toUri());
		return parameters.base.resolve(uri).toString();
	}
}