FirstSupportingResourceResolver.java

1
package fr.sii.ogham.core.resource.resolver;
2
3
import static java.util.Arrays.asList;
4
5
import java.util.ArrayList;
6
import java.util.List;
7
8
import org.slf4j.Logger;
9
import org.slf4j.LoggerFactory;
10
11
import fr.sii.ogham.core.exception.resource.NoResolverException;
12
import fr.sii.ogham.core.exception.resource.ResourceResolutionException;
13
import fr.sii.ogham.core.resource.Resource;
14
import fr.sii.ogham.core.resource.path.ResolvedPath;
15
import fr.sii.ogham.core.resource.path.ResourcePath;
16
17
/**
18
 * Decorator that will ask each resource resolver if it is able to handle the
19
 * lookup. If the resource resolver can, then this implementation asks the
20
 * resolver to really provide the resource.
21
 * 
22
 * Only the first resource resolver that can handle the lookup is used.
23
 * 
24
 * @author Aurélien Baudet
25
 * @see ResourceResolver
26
 */
27
public class FirstSupportingResourceResolver implements ResourceResolver, ResourceResolverRegistry {
28
	private static final Logger LOG = LoggerFactory.getLogger(FirstSupportingResourceResolver.class);
29
30
	/**
31
	 * The list of resolvers used to resolve the resource according to the
32
	 * lookup.
33
	 */
34
	private List<ResourceResolver> resolvers;
35
36
	/**
37
	 * Initialize the decorator with the provided resource resolver
38
	 * implementations. The registration order may be important.
39
	 * 
40
	 * @param resolvers
41
	 *            the resolvers to register
42
	 */
43
	public FirstSupportingResourceResolver(ResourceResolver... resolvers) {
44
		this(new ArrayList<>(asList(resolvers)));
45
	}
46
47
	/**
48
	 * Initialize the decorator with the provided resource resolver
49
	 * implementations. The registration order may be important.
50
	 * 
51
	 * @param resolvers
52
	 *            the resolvers to register
53
	 */
54
	public FirstSupportingResourceResolver(List<ResourceResolver> resolvers) {
55
		super();
56
		this.resolvers = resolvers;
57
	}
58
59
	@Override
60
	public Resource getResource(ResourcePath path) throws ResourceResolutionException {
61
		LOG.debug("Finding a resolver able to handle the lookup {}...", path);
62
		ResourceResolver supportingResolver = getSupportingResolver(path);
63 6 1. getResource : negated conditional → NO_COVERAGE
2. getResource : negated conditional → TIMED_OUT
3. getResource : negated conditional → KILLED
4. getResource : negated conditional → KILLED
5. getResource : negated conditional → KILLED
6. getResource : negated conditional → KILLED
		if (supportingResolver != null) {
64 6 1. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → NO_COVERAGE
2. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → TIMED_OUT
3. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED
4. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED
5. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED
6. getResource : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED
			return supportingResolver.getResource(path);
65
		}
66
		throw new NoResolverException("No resource resolver available to find resource " + path.getOriginalPath(), path);
67
	}
68
69
	/**
70
	 * Register a new resolver. The resolver is added at the end.
71
	 * 
72
	 * @param resolver
73
	 *            the resolver to register
74
	 * @return this instance for fluent chaining
75
	 */
76
	@Override
77
	public FirstSupportingResourceResolver register(ResourceResolver resolver) {
78
		resolvers.add(resolver);
79 1 1. register : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::register → NO_COVERAGE
		return this;
80
	}
81
82
	@Override
83
	public boolean supports(ResourcePath path) {
84 4 1. supports : replaced boolean return with true for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::supports → NO_COVERAGE
2. supports : replaced boolean return with true for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::supports → SURVIVED
3. supports : negated conditional → NO_COVERAGE
4. supports : negated conditional → KILLED
		return getSupportingResolver(path) != null;
85
	}
86
87
	/**
88
	 * Find the first supporting resolver.
89
	 * 
90
	 * @param path
91
	 *            the name of the path of the resource
92
	 * @return the first resolver supporting the path
93
	 */
94
	@Override
95
	public ResourceResolver getSupportingResolver(ResourcePath path) {
96
		LOG.debug("Finding resolver for resource {}...", path);
97
		for (ResourceResolver resolver : resolvers) {
98 7 1. getSupportingResolver : negated conditional → NO_COVERAGE
2. getSupportingResolver : negated conditional → TIMED_OUT
3. getSupportingResolver : negated conditional → KILLED
4. getSupportingResolver : negated conditional → KILLED
5. getSupportingResolver : negated conditional → KILLED
6. getSupportingResolver : negated conditional → KILLED
7. getSupportingResolver : negated conditional → KILLED
			if (resolver.supports(path)) {
99
				LOG.debug("{} can handle resource {}", resolver, path);
100 7 1. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → NO_COVERAGE
2. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → TIMED_OUT
3. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED
4. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED
5. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED
6. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED
7. getSupportingResolver : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED
				return resolver;
101
			}
102
		}
103
104
		LOG.debug("No resolver can handle path '{}'", path);
105
		return null;
106
	}
107
108
	@Override
109
	public List<ResourceResolver> getResolvers() {
110 1 1. getResolvers : replaced return value with Collections.emptyList for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResolvers → NO_COVERAGE
		return resolvers;
111
	}
112
113
	@Override
114
	public ResolvedPath resolve(ResourcePath path) {
115
		ResourceResolver supportingResolver = getSupportingResolver(path);
116 4 1. resolve : negated conditional → NO_COVERAGE
2. resolve : negated conditional → SURVIVED
3. resolve : negated conditional → TIMED_OUT
4. resolve : negated conditional → KILLED
		if (supportingResolver != null) {
117 4 1. resolve : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → NO_COVERAGE
2. resolve : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → SURVIVED
3. resolve : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → TIMED_OUT
4. resolve : replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → KILLED
			return supportingResolver.resolve(path);
118
		} else {
119
			return null;
120
		}
121
	}
122
}

Mutations

63

1.1
Location : getResource
Killed by : oghamthymeleafv3.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv3.it.ThymeleafDetectorTest)
negated conditional → KILLED

2.2
Location : getResource
Killed by : oghamthymeleafv2.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv2.it.ThymeleafDetectorTest)
negated conditional → KILLED

3.3
Location : getResource
Killed by : oghamall.it.configuration.EmptyBuilderTest.emailSenderManuallyRegisteredAndImageInliningEnabledButUnconfiguredResourceResolutionCantInlineImages(oghamall.it.configuration.EmptyBuilderTest)
negated conditional → KILLED

4.4
Location : getResource
Killed by : none
negated conditional → NO_COVERAGE

5.5
Location : getResource
Killed by : oghamcore.it.core.resource.resolver.FirstSupportingResolverTest.none(oghamcore.it.core.resource.resolver.FirstSupportingResolverTest)
negated conditional → KILLED

6.6
Location : getResource
Killed by : none
negated conditional → TIMED_OUT

64

1.1
Location : getResource
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → NO_COVERAGE

2.2
Location : getResource
Killed by : oghamthymeleafv3.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv3.it.ThymeleafDetectorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED

3.3
Location : getResource
Killed by : oghamthymeleafv2.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv2.it.ThymeleafDetectorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED

4.4
Location : getResource
Killed by : oghamall.it.html.translator.JsoupInlineCssTranslatorTest.externalStyles(oghamall.it.html.translator.JsoupInlineCssTranslatorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED

5.5
Location : getResource
Killed by : oghamcore.it.core.resource.resolver.FirstSupportingResolverTest.none(oghamcore.it.core.resource.resolver.FirstSupportingResolverTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → KILLED

6.6
Location : getResource
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResource → TIMED_OUT

79

1.1
Location : register
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::register → NO_COVERAGE

84

1.1
Location : supports
Killed by : none
replaced boolean return with true for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::supports → NO_COVERAGE

2.2
Location : supports
Killed by : none
replaced boolean return with true for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::supports → SURVIVED

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

4.4
Location : supports
Killed by : oghamcore.it.core.resource.resolver.FirstSupportingResolverTest.none(oghamcore.it.core.resource.resolver.FirstSupportingResolverTest)
negated conditional → KILLED

98

1.1
Location : getSupportingResolver
Killed by : oghamcore.it.core.resource.resolver.FirstSupportingResolverTest.none(oghamcore.it.core.resource.resolver.FirstSupportingResolverTest)
negated conditional → KILLED

2.2
Location : getSupportingResolver
Killed by : oghamall.it.html.translator.JsoupInlineCssTranslatorTest.unreadableCss(oghamall.it.html.translator.JsoupInlineCssTranslatorTest)
negated conditional → KILLED

3.3
Location : getSupportingResolver
Killed by : oghamthymeleafv2.it.ThymeleafDetectorTest.notFound(oghamthymeleafv2.it.ThymeleafDetectorTest)
negated conditional → KILLED

4.4
Location : getSupportingResolver
Killed by : oghamthymeleafv3.it.ThymeleafDetectorTest.notFound(oghamthymeleafv3.it.ThymeleafDetectorTest)
negated conditional → KILLED

5.5
Location : getSupportingResolver
Killed by : oghamfremarker.it.FreeMarkerParserTest.nested(oghamfremarker.it.FreeMarkerParserTest)
negated conditional → KILLED

6.6
Location : getSupportingResolver
Killed by : none
negated conditional → TIMED_OUT

7.7
Location : getSupportingResolver
Killed by : none
negated conditional → NO_COVERAGE

100

1.1
Location : getSupportingResolver
Killed by : oghamall.it.html.translator.JsoupInlineCssTranslatorTest.externalStyles(oghamall.it.html.translator.JsoupInlineCssTranslatorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED

2.2
Location : getSupportingResolver
Killed by : oghamthymeleafv3.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv3.it.ThymeleafDetectorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED

3.3
Location : getSupportingResolver
Killed by : oghamthymeleafv2.it.ThymeleafDetectorTest.foundButEmpty(oghamthymeleafv2.it.ThymeleafDetectorTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED

4.4
Location : getSupportingResolver
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → NO_COVERAGE

5.5
Location : getSupportingResolver
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → TIMED_OUT

6.6
Location : getSupportingResolver
Killed by : oghamfremarker.it.FreeMarkerParserTest.nested(oghamfremarker.it.FreeMarkerParserTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED

7.7
Location : getSupportingResolver
Killed by : oghamcore.it.core.resource.resolver.FirstSupportingResolverTest.none(oghamcore.it.core.resource.resolver.FirstSupportingResolverTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getSupportingResolver → KILLED

110

1.1
Location : getResolvers
Killed by : none
replaced return value with Collections.emptyList for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::getResolvers → NO_COVERAGE

116

1.1
Location : resolve
Killed by : oghamall.it.email.EmailMultiTemplateTest.withFreemarkerInvalidPath(oghamall.it.email.EmailMultiTemplateTest)
negated conditional → KILLED

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

3.3
Location : resolve
Killed by : none
negated conditional → SURVIVED

4.4
Location : resolve
Killed by : none
negated conditional → TIMED_OUT

117

1.1
Location : resolve
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → TIMED_OUT

2.2
Location : resolve
Killed by : oghamall.it.email.EmailMultiTemplateTest.withFreemarkerInvalidPath(oghamall.it.email.EmailMultiTemplateTest)
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → KILLED

3.3
Location : resolve
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → NO_COVERAGE

4.4
Location : resolve
Killed by : none
replaced return value with null for fr/sii/ogham/core/resource/resolver/FirstSupportingResourceResolver::resolve → SURVIVED

Active mutators

Tests examined


Report generated by PIT OGHAM