| 1 | package fr.sii.ogham.core.builder.resolution; | |
| 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.builder.Builder; | |
| 12 | import fr.sii.ogham.core.builder.configuration.ConfigurationValueBuilderHelper; | |
| 13 | import fr.sii.ogham.core.builder.context.BuildContext; | |
| 14 | import fr.sii.ogham.core.fluent.AbstractParent; | |
| 15 | import fr.sii.ogham.core.resource.resolver.RelativeResolver; | |
| 16 | import fr.sii.ogham.core.resource.resolver.RelativisableResourceResolver; | |
| 17 | import fr.sii.ogham.core.resource.resolver.ResourceResolver; | |
| 18 | ||
| 19 | /** | |
| 20 | * Base implementation to handle lookup prefix configuration. Path prefix/suffix | |
| 21 | * configuration is also partially managed. As path prefix/suffix for string | |
| 22 | * resolution has no sense, this base class doesn't implement | |
| 23 | * {@link PrefixSuffixBuilder}. | |
| 24 | * | |
| 25 | * @author Aurélien Baudet | |
| 26 | * | |
| 27 | * @param <MYSELF> | |
| 28 | * The type of this instance. This is needed to have the right return | |
| 29 | * type for fluent chaining with inheritance | |
| 30 | * @param <P> | |
| 31 | * the type of the parent builder (when calling {@link #and()} | |
| 32 | * method) | |
| 33 | */ | |
| 34 | @SuppressWarnings("squid:S00119") | |
| 35 | public abstract class AbstractSingleResolutionBuilder<MYSELF extends AbstractSingleResolutionBuilder<MYSELF, P>, P> extends AbstractParent<P> implements Builder<ResourceResolver> { | |
| 36 | private static final Logger LOG = LoggerFactory.getLogger(AbstractSingleResolutionBuilder.class); | |
| 37 | ||
| 38 | protected final BuildContext buildContext; | |
| 39 | protected final List<String> lookups; | |
| 40 | protected final ConfigurationValueBuilderHelper<MYSELF, String> pathPrefixValueBuilder; | |
| 41 | protected final ConfigurationValueBuilderHelper<MYSELF, String> pathSuffixValueBuilder; | |
| 42 | protected final MYSELF myself; | |
| 43 | ||
| 44 | @SuppressWarnings("unchecked") | |
| 45 | protected AbstractSingleResolutionBuilder(Class<?> selfType, P parent, BuildContext buildContext) { | |
| 46 | super(parent); | |
| 47 | myself = (MYSELF) selfType.cast(this); | |
| 48 | this.buildContext = buildContext; | |
| 49 | lookups = new ArrayList<>(); | |
| 50 | pathPrefixValueBuilder = buildContext.newConfigurationValueBuilder(myself, String.class); | |
| 51 | pathSuffixValueBuilder = buildContext.newConfigurationValueBuilder(myself, String.class); | |
| 52 | } | |
| 53 | ||
| 54 | /** | |
| 55 | * Configure lookup prefix. For example: | |
| 56 | * | |
| 57 | * <pre> | |
| 58 | * .classpath().lookup("classpath:"); | |
| 59 | * | |
| 60 | * // path prefixed by classpath: matches | |
| 61 | * // then classpath resolver is used | |
| 62 | * resourceResolver.getResource("classpath:foo/bar.html"); | |
| 63 | * // path is not prefixed (or using another prefix) doesn't match | |
| 64 | * // then classpath resolver is not used | |
| 65 | * resourceResolver.getResource("foo/bar.html"); | |
| 66 | * </pre> | |
| 67 | * | |
| 68 | * <p> | |
| 69 | * Several lookups can be provided: | |
| 70 | * | |
| 71 | * <pre> | |
| 72 | * .classpath().lookup("classpath:", "cp:"); | |
| 73 | * </pre> | |
| 74 | * | |
| 75 | * If a path starts with one of the prefix ("classpath:" or "cp:"), the | |
| 76 | * corresponding resolver (classpath resolver in this example) is used to | |
| 77 | * resolve the file. | |
| 78 | * | |
| 79 | * <p> | |
| 80 | * Lookup may be empty meaning that if the path has no prefix, the | |
| 81 | * corresponding resolver is use as default. For example: | |
| 82 | * | |
| 83 | * <pre> | |
| 84 | * .classpath().lookup(""); | |
| 85 | * </pre> | |
| 86 | * | |
| 87 | * If the path is "foo/bar.html" is provided then the classpath resolver is | |
| 88 | * used. | |
| 89 | * | |
| 90 | * @param prefix | |
| 91 | * one or several prefixes that indicates which resolver to use | |
| 92 | * according to path | |
| 93 | * @return this instance for fluent chaining | |
| 94 | */ | |
| 95 | public MYSELF lookup(String... prefix) { | |
| 96 | this.lookups.addAll(asList(prefix)); | |
| 97 |
4
1. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → NO_COVERAGE 2. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 3. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 4. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED |
return myself; |
| 98 | } | |
| 99 | ||
| 100 | /** | |
| 101 | * Configure lookup prefix. For example: | |
| 102 | * | |
| 103 | * <pre> | |
| 104 | * .classpath().lookup("classpath:"); | |
| 105 | * | |
| 106 | * // path prefixed by classpath: matches | |
| 107 | * // then classpath resolver is used | |
| 108 | * resourceResolver.getResource("classpath:foo/bar.html"); | |
| 109 | * // path is not prefixed (or using another prefix) doesn't match | |
| 110 | * // then classpath resolver is not used | |
| 111 | * resourceResolver.getResource("foo/bar.html"); | |
| 112 | * </pre> | |
| 113 | * | |
| 114 | * <p> | |
| 115 | * Several lookups can be provided: | |
| 116 | * | |
| 117 | * <pre> | |
| 118 | * .classpath().lookup("classpath:", "cp:"); | |
| 119 | * </pre> | |
| 120 | * | |
| 121 | * If a path starts with one of the prefix ("classpath:" or "cp:"), the | |
| 122 | * corresponding resolver (classpath resolver in this example) is used to | |
| 123 | * resolve the file. | |
| 124 | * | |
| 125 | * <p> | |
| 126 | * Lookup may be empty meaning that if the path has no prefix, the | |
| 127 | * corresponding resolver is use as default. For example: | |
| 128 | * | |
| 129 | * <pre> | |
| 130 | * .classpath().lookup(""); | |
| 131 | * </pre> | |
| 132 | * | |
| 133 | * If the path is "foo/bar.html" is provided then the classpath resolver is | |
| 134 | * used. | |
| 135 | * | |
| 136 | * @param prefix | |
| 137 | * one or several prefixes that indicates which resolver to use | |
| 138 | * according to path | |
| 139 | * @return this instance for fluent chaining | |
| 140 | */ | |
| 141 | public MYSELF lookup(List<String> prefix) { | |
| 142 | this.lookups.addAll(prefix); | |
| 143 |
8
1. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → NO_COVERAGE 2. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 3. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 4. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 5. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 6. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 7. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED 8. lookup : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::lookup → KILLED |
return myself; |
| 144 | } | |
| 145 | ||
| 146 | @Override | |
| 147 | public ResourceResolver build() { | |
| 148 | ResourceResolver resolver = buildContext.register(createResolver()); | |
| 149 |
6
1. build : negated conditional → SURVIVED 2. build : negated conditional → NO_COVERAGE 3. build : negated conditional → KILLED 4. build : negated conditional → KILLED 5. build : negated conditional → KILLED 6. build : negated conditional → KILLED |
if (!(resolver instanceof RelativisableResourceResolver)) { |
| 150 |
8
1. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → SURVIVED 2. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → NO_COVERAGE 3. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 4. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 5. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 6. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 7. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 8. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED |
return resolver; |
| 151 | } | |
| 152 | String resolvedPathPrefix = pathPrefixValueBuilder.getValue(""); | |
| 153 | String resolvedPathSuffix = pathSuffixValueBuilder.getValue(""); | |
| 154 |
8
1. build : negated conditional → NO_COVERAGE 2. build : negated conditional → SURVIVED 3. build : negated conditional → SURVIVED 4. build : negated conditional → NO_COVERAGE 5. build : negated conditional → KILLED 6. build : negated conditional → KILLED 7. build : negated conditional → KILLED 8. build : negated conditional → KILLED |
if (!resolvedPathPrefix.isEmpty() || !resolvedPathSuffix.isEmpty()) { |
| 155 | LOG.debug("Using parentPath {} and extension {} for resource resolution", resolvedPathPrefix, resolvedPathSuffix); | |
| 156 | resolver = buildContext.register(new RelativeResolver((RelativisableResourceResolver) resolver, resolvedPathPrefix, resolvedPathSuffix)); | |
| 157 | } | |
| 158 |
8
1. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → SURVIVED 2. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → NO_COVERAGE 3. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 4. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 5. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 6. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 7. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED 8. build : replaced return value with null for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::build → KILLED |
return resolver; |
| 159 | } | |
| 160 | ||
| 161 | protected abstract ResourceResolver createResolver(); | |
| 162 | ||
| 163 | /** | |
| 164 | * Provide the list of registered lookups | |
| 165 | * | |
| 166 | * @return the list of lookups | |
| 167 | */ | |
| 168 | public List<String> getLookups() { | |
| 169 |
5
1. getLookups : replaced return value with Collections.emptyList for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::getLookups → NO_COVERAGE 2. getLookups : replaced return value with Collections.emptyList for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::getLookups → SURVIVED 3. getLookups : replaced return value with Collections.emptyList for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::getLookups → KILLED 4. getLookups : replaced return value with Collections.emptyList for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::getLookups → KILLED 5. getLookups : replaced return value with Collections.emptyList for fr/sii/ogham/core/builder/resolution/AbstractSingleResolutionBuilder::getLookups → KILLED |
return lookups; |
| 170 | } | |
| 171 | } | |
Mutations | ||
| 97 |
1.1 2.2 3.3 4.4 |
|
| 143 |
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 |
|
| 149 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
| 150 |
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 |
|
| 154 |
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 |
|
| 158 |
1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 |
|
| 169 |
1.1 2.2 3.3 4.4 5.5 |