io.honeybadger.com.github.mustachejava.resolver.FileSystemResolver Maven / Gradle / Ivy
package com.github.mustachejava.resolver;
import com.github.mustachejava.MustacheException;
import com.github.mustachejava.MustacheResolver;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* MustacheResolver implementation that resolves
* mustache files from the filesystem.
*/
public class FileSystemResolver implements MustacheResolver {
private final File fileRoot;
public FileSystemResolver() {
this.fileRoot = null;
}
/**
* Use the file system to resolve mustache templates.
*
* @param fileRoot where in the file system to find the templates
*/
public FileSystemResolver(File fileRoot) {
if (!fileRoot.exists()) {
throw new MustacheException(fileRoot + " does not exist");
}
if (!fileRoot.isDirectory()) {
throw new MustacheException(fileRoot + " is not a directory");
}
this.fileRoot = fileRoot;
}
@Override
public Reader getReader(String resourceName) {
InputStream is = null;
File file = fileRoot == null ? new File(resourceName) : new File(fileRoot, resourceName);
if (file.exists() && file.isFile()) {
try {
// Check to make sure that the file is under the file root or current directory.
// Without this check you might accidentally open a security whole when exposing
// mustache templates to end users.
File checkRoot = fileRoot == null ? new File("").getCanonicalFile() : fileRoot.getCanonicalFile();
File parent = file.getCanonicalFile();
while ((parent = parent.getParentFile()) != null) {
if (parent.equals(checkRoot)) break;
}
if (parent == null) {
throw new MustacheException("File not under root: " + checkRoot.getAbsolutePath());
}
is = new FileInputStream(file);
} catch (IOException e) {
throw new MustacheException("Found file, could not open: " + file, e);
}
}
if (is != null) {
return new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
} else {
return null;
}
}
}