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 1 1. supports : negated conditional → NO_COVERAGE
		ResourceResolver actualResolver = resolver instanceof DelegateResourceResolver ? ((DelegateResourceResolver) resolver).getActualResourceResolver() : resolver;
38 2 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
		return actualResolver instanceof FileResolver;
39
	}
40
41
	@Override
42
	public TemplateLoader adapt(ResourceResolver resolver) throws ResolverAdapterConfigurationException {
43
		try {
44 1 1. adapt : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter::adapt → NO_COVERAGE
			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 1 1. findTemplateSource : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths::findTemplateSource → NO_COVERAGE
				return AccessController.doPrivileged(new PrivilegedExceptionAction<File>() {
62
					@Override
63
					public File run() throws IOException {
64
						File source = new File(name);
65 2 1. run : negated conditional → NO_COVERAGE
2. run : negated conditional → NO_COVERAGE
						if (source.isAbsolute() && source.isFile()) {
66 1 1. run : replaced return value with null for fr/sii/ogham/template/freemarker/adapter/FileResolverAdapter$FileTemplateLoaderAllowingAbsolutePaths$1::run → NO_COVERAGE
							return source;
67
						}
68 1 1. run : negated conditional → NO_COVERAGE
						source = new File(baseDir, SEP_IS_SLASH ? name : name.replace('/', File.separatorChar));
69 1 1. run : negated conditional → NO_COVERAGE
						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 :
negated conditional → NO_COVERAGE

38

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

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

44

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

61

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

65

1.1
Location : run
Killed by :
negated conditional → NO_COVERAGE

2.2
Location : run
Killed by :
negated conditional → NO_COVERAGE

66

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

68

1.1
Location : run
Killed by :
negated conditional → NO_COVERAGE

69

1.1
Location : run
Killed by :
negated conditional → NO_COVERAGE

72

1.1
Location : run
Killed by :
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 1.13.1