I create a temp directory to store the sitemap file(s) in and then generate it on first request and serve up that same version for all subsequent requests because the data in my app doesn't change once it's started.
The benefit of using a temp directory is that you'll definitely be able to write to it (at least I think so).
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.charset.Charset;
import java.io.BufferedReader;
private Path sitemapDirectory;
@RequestMapping("/sitemap.xml")
public void sitemap(HttpServletResponse response) throws IOException {
PrintWriter w = response.getWriter();
boolean isSitemapAlreadyCreated = sitemapDirectory != null;
if (isSitemapAlreadyCreated) {
pipeSitemapToResponse(w);
return;
}
sitemapDirectory = Files.createTempDirectory("mySitemap");
WebSitemapGenerator wsg = new WebSitemapGenerator("http://localhost:8080/app", sitemapDirectory.toFile());
wsg.addUrl("http://localhost:8080/app/home");
wsg.write();
pipeSitemapToResponse(w);
}
private void pipeSitemapToResponse(PrintWriter w) {
Path sitemap = Paths.get(sitemapDir.toString(), "sitemap.xml");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(sitemap, charset)) {
String line = null;
while ((line = reader.readLine()) != null) {
w.write(line);
}
} catch (IOException e) {
logger.error("Failed to read the sitemap file.", e);
}
}
This solution uses Spring request mappings. It also expects the sitemap file to be written out as sitemap.xml
and it will unless you have >50k entries and then you'll need to read the sitemapgen4j doco about dealing with index files and adapt this example.