FileResolverAdapter.java

1
package fr.sii.ogham.template.freemarker.adapter;
2
3
import java.io.File;
4
import java.io.IOException;
5
import java.security.AccessController;
6
import java.security.PrivilegedActionException;
7
import java.security.PrivilegedExceptionAction;
8
9
import fr.sii.ogham.core.resource.resolver.DelegateResourceResolver;
10
import fr.sii.ogham.core.resource.resolver.FileResolver;
11
import fr.sii.ogham.core.resource.resolver.ResourceResolver;
12
import fr.sii.ogham.template.exception.ResolverAdapterConfigurationException;
13
import freemarker.cache.FileTemplateLoader;
14
import freemarker.cache.TemplateLoader;
15
16
/**
17
 * Adapter that converts general {@link FileResolver} into FreeMarker specific
18
 * {@link FileTemplateLoader}.
19
 * 
20
 * @author Cyril Dejonghe
21
 *
22
 */
23
public class FileResolverAdapter extends AbstractFreeMarkerTemplateLoaderOptionsAdapter {
24
	private final File baseDir;
25 1 1. supports : negated conditional → RUN_ERROR
	
26 2 1. supports : replaced boolean return with true for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::supports → RUN_ERROR
2. supports : replaced boolean return with false for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::supports → RUN_ERROR
	public FileResolverAdapter() {
27
		this(new File("/"));
28
	}
29
30
	public FileResolverAdapter(File baseDir) {
31
		super();
32 1 1. adapt : removed call to fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::applyOptions → RUN_ERROR
		this.baseDir = baseDir;
33 1 1. adapt : replaced return value with null for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::adapt → RUN_ERROR
	}
34
35
	@Override
36
	public boolean supports(ResourceResolver resolver) {
37
		ResourceResolver actualResolver = resolver instanceof DelegateResourceResolver ? ((DelegateResourceResolver) resolver).getActualResourceResolver() : resolver;
38
		return actualResolver instanceof FileResolver;
39
	}
40
41
	@Override
42
	public TemplateLoader adapt(ResourceResolver resolver) throws ResolverAdapterConfigurationException {
43
		try {
44
			return new FileTemplateLoaderAllowingAbsolutePaths(baseDir);
45
		} catch (IOException e) {
46
			throw new ResolverAdapterConfigurationException("Invalid configuration for " + FileTemplateLoader.class.getSimpleName(), resolver, e);
47
		}
48
	}
49
50
	private static class FileTemplateLoaderAllowingAbsolutePaths extends FileTemplateLoader {
51
		private static final boolean SEP_IS_SLASH = File.separatorChar == '/';
52
		
53
		public FileTemplateLoaderAllowingAbsolutePaths(File baseDir) throws IOException {
54
			super(baseDir, true);
55
		}
56
57
		@Override
58
		public Object findTemplateSource(String name) throws IOException {
59
			// TODO: add security option to enable/disable absolute paths outside of baseDir
60
			try {
61
				return AccessController.doPrivileged(new PrivilegedExceptionAction<File>() {
62
					@Override
63
					public File run() throws IOException {
64
						File source = new File(name);
65
						if (source.isAbsolute() && source.isFile()) {
66
							return source;
67
						}
68
						source = new File(baseDir, SEP_IS_SLASH ? name : name.replace('/', File.separatorChar));
69
						if (!source.isFile()) {
70
							return null;
71
						}
72
						return source;
73
					}
74
				});
75
			} catch (PrivilegedActionException e) {
76
				throw (IOException) e.getException();
77
			}
78
		}
79
	}
80
}

Mutations

25

1.1
Location : supports
Killed by :
negated conditional → RUN_ERROR

26

1.1
Location : supports
Killed by :
replaced boolean return with true for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::supports → RUN_ERROR

2.2
Location : supports
Killed by :
replaced boolean return with false for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::supports → RUN_ERROR

32

1.1
Location : adapt
Killed by :
removed call to fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::applyOptions → RUN_ERROR

33

1.1
Location : adapt
Killed by :
replaced return value with null for fr/sii/ogham/template/thymeleaf/common/adapter/FileResolverAdapter::adapt → RUN_ERROR

Active mutators

Tests examined


Report generated by PIT 1.13.1