PlaceholderReplacer.java

1
package pro.verron.officestamper.core;
2
3
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
4
import org.docx4j.wml.Br;
5
import org.docx4j.wml.R;
6
import org.docx4j.wml.STBrType;
7
import org.jvnet.jaxb2_commons.ppp.Child;
8
import org.springframework.expression.spel.SpelEvaluationException;
9
import org.springframework.expression.spel.SpelParseException;
10
import pro.verron.officestamper.api.*;
11
12
/**
13
 * Replaces expressions in a document with the values provided by the {@link ExpressionResolver}.
14
 *
15
 * @author Joseph Verron
16
 * @author Tom Hombergs
17
 * @version ${version}
18
 * @since 1.0.0
19
 */
20
public class PlaceholderReplacer
21
        implements ParagraphPlaceholderReplacer {
22
23
    private final ExpressionResolver resolver;
24
    private final ObjectResolverRegistry registry;
25
    private final Placeholder lineBreakPlaceholder;
26
    private final ExceptionResolver exceptionResolver;
27
28
    /**
29
     * <p>Constructor for PlaceholderReplacer.</p>
30
     *
31
     * @param registry             the registry containing all available type resolvers.
32
     * @param resolver             the expression resolver used to resolve expressions in the document.
33
     * @param linebreakPlaceholder if set to a non-null value,
34
     *                             all occurrences of this placeholder will be
35
     *                             replaced with a line break.
36
     */
37
    public PlaceholderReplacer(
38
            ObjectResolverRegistry registry,
39
            ExpressionResolver resolver,
40
            Placeholder linebreakPlaceholder,
41
            ExceptionResolver exceptionResolver
42
    ) {
43
        this.registry = registry;
44
        this.resolver = resolver;
45
        this.lineBreakPlaceholder = linebreakPlaceholder;
46
        this.exceptionResolver = exceptionResolver;
47
    }
48
49
    /**
50
     * Finds expressions in a document and resolves them against the specified context object.
51
     * The resolved values will then replace the expressions in the document.
52
     *
53
     * @param expressionContext the context root
54
     */
55
    public void resolveExpressions(DocxPart document, Object expressionContext) {
56
        document.streamParagraphs()
57
                .map(StandardParagraph::new)
58 2 1. lambda$resolveExpressions$0 : removed call to pro/verron/officestamper/core/PlaceholderReplacer::resolveExpressionsForParagraph → KILLED
2. resolveExpressions : removed call to java/util/stream/Stream::forEach → KILLED
                .forEach(paragraph -> resolveExpressionsForParagraph(document, paragraph, expressionContext));
59
    }
60
61
    /**
62
     * Finds expressions in the given paragraph and replaces them with the values provided by the expression resolver.
63
     *
64
     * @param docxPart  the document in which to replace all expressions.
65
     * @param paragraph the paragraph in which to replace expressions.
66
     * @param context   the context root
67
     */
68
    @Override public void resolveExpressionsForParagraph(
69
            DocxPart docxPart,
70
            Paragraph paragraph,
71
            Object context
72
    ) {
73
        var expressions = Placeholders.findVariables(paragraph);
74
        for (var expression : expressions) {
75
            var replacement = resolve(docxPart, context, expression);
76 1 1. resolveExpressionsForParagraph : removed call to pro/verron/officestamper/api/Paragraph::replace → KILLED
            paragraph.replace(expression, replacement);
77
        }
78 1 1. resolveExpressionsForParagraph : removed call to pro/verron/officestamper/api/Paragraph::replace → KILLED
        paragraph.replace(lineBreakPlaceholder, getBr());
79
    }
80
81
    private R resolve(DocxPart docxPart, Object context, Placeholder placeholder) {
82
        try {
83 1 1. resolve : removed call to pro/verron/officestamper/core/ExpressionResolver::setContext → KILLED
            resolver.setContext(context);
84
            var resolution = resolver.resolve(placeholder);
85 1 1. resolve : replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::resolve → KILLED
            return registry.resolve(docxPart, placeholder, resolution);
86
        } catch (SpelEvaluationException
87
                 | SpelParseException
88
                 | OfficeStamperException e) {
89
            var message = "Expression %s could not be resolved against context of type %s"
90
                    .formatted(placeholder.expression(), context.getClass().getSimpleName());
91
            var resolution = exceptionResolver.resolve(placeholder, message, e);
92 1 1. resolve : replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::resolve → KILLED
            return RunUtil.create(resolution);
93
        }
94
    }
95
96
    private static Child getBr() {
97
        var br = new Br();
98 1 1. getBr : removed call to org/docx4j/wml/Br::setType → SURVIVED
        br.setType(STBrType.TEXT_WRAPPING);
99 1 1. getBr : removed call to org/docx4j/wml/Br::setClear → SURVIVED
        br.setClear(null);
100 1 1. getBr : replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::getBr → KILLED
        return br;
101
    }
102
103
    @Override
104
    public void resolveExpressionsForParagraph(Paragraph paragraph, Object context, WordprocessingMLPackage document) {
105
        throw new OfficeStamperException("Should not be called, since deprecated");
106
    }
107
}

Mutations

58

1.1
Location : lambda$resolveExpressions$0
Killed by : pro.verron.officestamper.test.ResolutionTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ResolutionTest]/[test-template:testCustomResolution(java.lang.String, boolean, boolean, boolean, boolean, boolean, java.lang.String, boolean, java.lang.String)]/[test-template-invocation:#17]
removed call to pro/verron/officestamper/core/PlaceholderReplacer::resolveExpressionsForParagraph → KILLED

2.2
Location : resolveExpressions
Killed by : pro.verron.officestamper.test.ResolutionTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ResolutionTest]/[test-template:testCustomResolution(java.lang.String, boolean, boolean, boolean, boolean, boolean, java.lang.String, boolean, java.lang.String)]/[test-template-invocation:#17]
removed call to java/util/stream/Stream::forEach → KILLED

76

1.1
Location : resolveExpressionsForParagraph
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#25]
removed call to pro/verron/officestamper/api/Paragraph::replace → KILLED

78

1.1
Location : resolveExpressionsForParagraph
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#34]
removed call to pro/verron/officestamper/api/Paragraph::replace → KILLED

83

1.1
Location : resolve
Killed by : pro.verron.officestamper.test.ResolutionTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ResolutionTest]/[test-template:testCustomResolution(java.lang.String, boolean, boolean, boolean, boolean, boolean, java.lang.String, boolean, java.lang.String)]/[test-template-invocation:#8]
removed call to pro/verron/officestamper/core/ExpressionResolver::setContext → KILLED

85

1.1
Location : resolve
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#25]
replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::resolve → KILLED

92

1.1
Location : resolve
Killed by : pro.verron.officestamper.test.ResolutionTest.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.ResolutionTest]/[test-template:testCustomResolution(java.lang.String, boolean, boolean, boolean, boolean, boolean, java.lang.String, boolean, java.lang.String)]/[test-template-invocation:#9]
replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::resolve → KILLED

98

1.1
Location : getBr
Killed by : none
removed call to org/docx4j/wml/Br::setType → SURVIVED
Covering tests

99

1.1
Location : getBr
Killed by : none
removed call to org/docx4j/wml/Br::setClear → SURVIVED
Covering tests

100

1.1
Location : getBr
Killed by : pro.verron.officestamper.test.DefaultTests.[engine:junit-jupiter]/[class:pro.verron.officestamper.test.DefaultTests]/[test-template:features(java.lang.String, pro.verron.officestamper.api.OfficeStamperConfiguration, java.lang.Object, java.io.InputStream, java.lang.String)]/[test-template-invocation:#34]
replaced return value with null for pro/verron/officestamper/core/PlaceholderReplacer::getBr → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0