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
	
26
	public FileResolverAdapter() {
27
		this(new File("/"));
28
	}
29
30
	public FileResolverAdapter(File baseDir) {
31
		super();
32
		this.baseDir = baseDir;
33
	}
34
35
	@Override
36
	public boolean supports(ResourceResolver resolver) {
37 2 1. supports : negated conditional → NO_COVERAGE
2. supports : negated conditional → KILLED
		ResourceResolver actualResolver = resolver instanceof DelegateResourceResolver ? ((DelegateResourceResolver) resolver).getActualResourceResolver() : resolver;
38 4 1. supports : replaced boolean return with false for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → NO_COVERAGE
2. supports : replaced boolean return with true for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → NO_COVERAGE
3. supports : replaced boolean return with false for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → KILLED
4. supports : replaced boolean return with true for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → KILLED
		return actualResolver instanceof FileResolver;
39
	}
40
41
	@Override
42
	public TemplateLoader adapt(ResourceResolver resolver) throws ResolverAdapterConfigurationException {
43
		try {
44 2 1. adapt : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::adapt → NO_COVERAGE
2. adapt : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::adapt → KILLED
			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 2 1. findTemplateSource : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths::findTemplateSource → NO_COVERAGE
2. findTemplateSource : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths::findTemplateSource → KILLED
				return AccessController.doPrivileged(new PrivilegedExceptionAction<File>() {
62
					@Override
63
					public File run() throws IOException {
64
						File source = new File(name);
65 4 1. run : negated conditional → SURVIVED
2. run : negated conditional → NO_COVERAGE
3. run : negated conditional → NO_COVERAGE
4. run : negated conditional → KILLED
						if (source.isAbsolute() && source.isFile()) {
66 2 1. run : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → NO_COVERAGE
2. run : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → KILLED
							return source;
67
						}
68 2 1. run : negated conditional → SURVIVED
2. run : negated conditional → NO_COVERAGE
						source = new File(baseDir, SEP_IS_SLASH ? name : name.replace('/', File.separatorChar));
69 2 1. run : negated conditional → NO_COVERAGE
2. run : negated conditional → KILLED
						if (!source.isFile()) {
70
							return null;
71
						}
72 1 1. run : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → NO_COVERAGE
						return source;
73
					}
74
				});
75
			} catch (PrivilegedActionException e) {
76
				throw (IOException) e.getException();
77
			}
78
		}
79
	}
80
}

Mutations

37

1.1
Location : supports
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : supports
Killed by : oghamall.it.configuration.EmptyBuilderTest.emailSenderManuallyRegisteredAndFreemarkerOnlyRegisteredButResourceResolutionNotConfiguredCantHandleTemplateContent(oghamall.it.configuration.EmptyBuilderTest)
negated conditional → KILLED

38

1.1
Location : supports
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
replaced boolean return with false for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → KILLED

2.2
Location : supports
Killed by : none
replaced boolean return with false for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → NO_COVERAGE

3.3
Location : supports
Killed by : oghamall.it.configuration.EmptyBuilderTest.emailSenderManuallyRegisteredAndFreemarkerOnlyRegisteredButResourceResolutionNotConfiguredCantHandleTemplateContent(oghamall.it.configuration.EmptyBuilderTest)
replaced boolean return with true for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → KILLED

4.4
Location : supports
Killed by : none
replaced boolean return with true for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::supports → NO_COVERAGE

44

1.1
Location : adapt
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::adapt → KILLED

2.2
Location : adapt
Killed by : none
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::adapt → NO_COVERAGE

61

1.1
Location : findTemplateSource
Killed by : none
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths::findTemplateSource → NO_COVERAGE

2.2
Location : findTemplateSource
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths::findTemplateSource → KILLED

65

1.1
Location : run
Killed by : none
negated conditional → SURVIVED

2.2
Location : run
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : run
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : run
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
negated conditional → KILLED

66

1.1
Location : run
Killed by : none
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → NO_COVERAGE

2.2
Location : run
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → KILLED

68

1.1
Location : run
Killed by : none
negated conditional → SURVIVED

2.2
Location : run
Killed by : none
negated conditional → NO_COVERAGE

69

1.1
Location : run
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : run
Killed by : oghamall.it.email.ExternalFileTest.thymeleafHtmlFileFreemarkerTextFile(oghamall.it.email.ExternalFileTest)
negated conditional → KILLED

72

1.1
Location : run
Killed by : none
replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT OGHAM