ExceptionResolvers.java

1
package pro.verron.officestamper.preset;
2
3
import org.slf4j.Logger;
4
import org.slf4j.LoggerFactory;
5
import pro.verron.officestamper.api.ExceptionResolver;
6
import pro.verron.officestamper.api.OfficeStamperException;
7
import pro.verron.officestamper.api.Placeholder;
8
9
10
/// The ExceptionResolvers class provides a set of static factory methods to create different types of ExceptionResolver
11
/// implementations.
12
/// These resolvers are designed to handle exceptions that occur during the processing of placeholders in text
13
/// documents.
14
/// This class is a utility class and cannot be instantiated.
15
public class ExceptionResolvers {
16
17
    private static final Logger logger = LoggerFactory.getLogger(ExceptionResolvers.class);
18
19
    static {
20
        if (!logger.isTraceEnabled())
21
            logger.info("Set TRACE log level, to add stacktrace info to resolution exceptions");
22
    }
23
24
    private ExceptionResolvers() {
25
        throw new OfficeStamperException("Utility class");
26
    }
27
28
    /// The passing resolver will handle exceptions by returning the placeholder expression.
29
    /// It logs the exception message and the stack trace if tracing is enabled.
30
    ///
31
    /// @return An instance of `ExceptionResolver` that returns the placeholder expression.
32
    public static ExceptionResolver passing() {
33
        return new PassingResolver(logger.isTraceEnabled());
34
    }
35
36
    /// The defaulting resolver class will handle exceptions by returning an empty string.
37
    /// It logs the exception message and the stack trace if tracing is enabled.
38
    ///
39
    /// @return An instance of `ExceptionResolver` that returns an empty string.
40
    public static ExceptionResolver defaulting() {
41
        return new DefaultingResolver("", logger.isTraceEnabled());
42
    }
43
44
    /// The defaulting resolver class will handle exceptions by returning a default value.
45
    /// It logs the exception message and the stack trace if tracing is enabled.
46
    /// @param value The default value to be returned if an exception occurs.
47
    /// @return An instance of `ExceptionResolver` that returns a default value.
48
    public static ExceptionResolver defaulting(String value) {
49
        return new DefaultingResolver(value, logger.isTraceEnabled());
50
    }
51
52
    /// The throwing resolver will handle exceptions by immediately throwing an OfficeStamperException.
53
    /// It is used to propagate errors encountered during the processing of placeholders in text documents.
54
    ///
55
    /// @return An instance of `ExceptionResolver` that throws an exception.
56
    public static ExceptionResolver throwing() {
57
        return new ThrowingResolver(logger.isTraceEnabled());
58
    }
59
60
        /// Provides a legacy behavior for creating an appropriate `ExceptionResolver` based on the input parameters.
61
        /// @deprecated This method is deprecated and scheduled for removal in future versions. Use more specific factory
62
        /// methods instead.
63
        ///
64
        /// @param shouldFail       if `true`, returns a resolver that throws an exception.
65
        /// @param emptyOnError     if `true`, returns a resolver that provides an empty string on error.
66
        /// @param shouldReplace    if `true`, returns a resolver that uses the specified replacement value.
67
        /// @param replacementValue the replacement value to be used if `shouldReplace` is `true`.
68
        ///                         This parameter is ignored if `shouldReplace` is `false`.
69
        /// @return an `ExceptionResolver` instance that behaves according to the specified parameters.
70
        @Deprecated(since="2.5", forRemoval = true)
71
    public static ExceptionResolver legacyBehavior(
72
            boolean shouldFail,
73
            boolean emptyOnError,
74
            boolean shouldReplace,
75
            String replacementValue
76
    ) {
77
        if (shouldFail) return new ThrowingResolver(logger.isTraceEnabled());
78
        if (emptyOnError) return new DefaultingResolver("", logger.isTraceEnabled());
79
        if (shouldReplace) return new DefaultingResolver(replacementValue, logger.isTraceEnabled());
80
        return new PassingResolver(logger.isTraceEnabled());
81
    }
82
83
    private record DefaultingResolver(String value, boolean tracing)
84
            implements ExceptionResolver {
85
86
        private static final Logger logger = LoggerFactory.getLogger(DefaultingResolver.class);
87
88
        @Override public String resolve(Placeholder placeholder, String message, Exception cause) {
89
            if (tracing) logger.warn(message, cause);
90
            else logger.warn(message);
91 1 1. resolve : replaced return value with "" for pro/verron/officestamper/preset/ExceptionResolvers$DefaultingResolver::resolve → KILLED
            return value;
92
        }
93
    }
94
95
    private record PassingResolver(boolean tracing)
96
            implements ExceptionResolver {
97
98
        @Override public String resolve(Placeholder placeholder, String message, Exception cause) {
99
            if (tracing) logger.warn(message, cause);
100
            else logger.warn(message);
101 1 1. resolve : replaced return value with "" for pro/verron/officestamper/preset/ExceptionResolvers$PassingResolver::resolve → KILLED
            return placeholder.expression();
102
        }
103
    }
104
105
    private record ThrowingResolver(boolean tracing)
106
            implements ExceptionResolver {
107
108
        @Override public String resolve(Placeholder placeholder, String message, Exception cause) {
109 1 1. resolve : negated conditional → SURVIVED
            if (tracing) throw new OfficeStamperException(message, cause);
110
            else throw new OfficeStamperException(message);
111
        }
112
    }
113
}

Mutations

91

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:#7]
replaced return value with "" for pro/verron/officestamper/preset/ExceptionResolvers$DefaultingResolver::resolve → KILLED

101

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:#2]
replaced return value with "" for pro/verron/officestamper/preset/ExceptionResolvers$PassingResolver::resolve → KILLED

109

1.1
Location : resolve
Killed by : none
negated conditional → SURVIVED
Covering tests

Active mutators

Tests examined


Report generated by PIT 1.21.0