JavaMailClasspathConsistencyCondition.java

1
package fr.sii.ogham.spring.email.condition;
2
3
import org.springframework.boot.autoconfigure.condition.*;
4
import org.springframework.context.annotation.ConditionContext;
5
import org.springframework.core.type.AnnotatedTypeMetadata;
6
7
import java.util.ArrayList;
8
import java.util.List;
9
10
import static java.util.Arrays.asList;
11
import static java.util.stream.Collectors.toList;
12
import static org.springframework.boot.autoconfigure.condition.ConditionMessage.of;
13
14
public class JavaMailClasspathConsistencyCondition extends SpringBootCondition {
15
16
    @Override
17
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
18
        // TODO: only if configuration properties are set ?
19
        ConditionOutcome javaxOutcome = checkJavaxMailConsistency(context, metadata);
20
        ConditionOutcome jakartaOutcome = checkJakartaMailConsistency(context, metadata);
21 1 1. getMatchOutcome : replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::getMatchOutcome → RUN_ERROR
        return new ConditionOutcome(
22 1 1. getMatchOutcome : negated conditional → RUN_ERROR
                !isClasspathConsistent(javaxOutcome, jakartaOutcome),
23
                of(asList(javaxOutcome.getConditionMessage(), jakartaOutcome.getConditionMessage())));
24
    }
25
26
    private static boolean isClasspathConsistent(ConditionOutcome javaxOutcome, ConditionOutcome jakartaOutcome) {
27 3 1. isClasspathConsistent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isClasspathConsistent → RUN_ERROR
2. isClasspathConsistent : negated conditional → RUN_ERROR
3. isClasspathConsistent : negated conditional → RUN_ERROR
        return javaxOutcome.isMatch() || jakartaOutcome.isMatch();
28
    }
29
30
31
    private static ConditionOutcome checkJavaxMailConsistency(ConditionContext context, AnnotatedTypeMetadata metadata) {
32
        ConditionInfoMerger merger = new ConditionInfoMerger();
33 1 1. checkJavaxMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
        merger.addCondition(isJavaxMailApiPresent(context),
34
                "javax.mail package is present in the classpath",
35
                "javax.mail is not present in the classpath => ignoring");
36 1 1. checkJavaxMailConsistency : negated conditional → RUN_ERROR
        if (isJavaxMailApiPresent(context)) {
37
            // possible version downgrade with Sprint Boot <= 2
38
            // => possible clash with Ogham
39
            // => check classpath
40 1 1. checkJavaxMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
            merger.addCondition(isJavaxActivationApiPresent(context),
41
                    "javax.activation.DataHandler is present in the classpath",
42
                    "javax.activation.DataHandler is not present in the classpath (dependency jakarta.activation:jakarta.activation-api <= 1.2.2 may not be present in the classpath)");
43 1 1. checkJavaxMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
            merger.addCondition(isSunMailImplementationPresent(context),
44
                    "com.sun.mail package is present in the classpath",
45
                    "com.sun.mail package is not present in the classpath (dependency com.sun.mail:javax.mail <= 1.6.2 or com.sun.mail:jakarta.mail <= 1.6.7 may not be present in the classpath)");
46 1 1. checkJavaxMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR
            merger.addOutcome(new JavaxMailServiceProvidersAvailable().getMatchOutcome(context, metadata));
47 1 1. checkJavaxMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR
            merger.addOutcome(new JavaxActivationDataHandlersAvailable().getMatchOutcome(context, metadata));
48
        }
49 1 1. checkJavaxMailConsistency : replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::checkJavaxMailConsistency → RUN_ERROR
        return merger.get();
50
    }
51
52
53
    private static boolean isJavaxMailApiPresent(ConditionContext context) {
54 2 1. isJavaxMailApiPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxMailApiPresent → RUN_ERROR
2. isJavaxMailApiPresent : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxMailApiPresent → RUN_ERROR
        return exists(context, "javax.mail.internet.MimeMessage");
55
    }
56
57
    private static boolean isJavaxActivationApiPresent(ConditionContext context) {
58 2 1. isJavaxActivationApiPresent : negated conditional → RUN_ERROR
2. isJavaxActivationApiPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxActivationApiPresent → RUN_ERROR
        return exists(context, "javax.activation.MimeType")
59 1 1. isJavaxActivationApiPresent : negated conditional → RUN_ERROR
                && exists(context, "javax.activation.DataHandler");
60
    }
61
62
    private static boolean isSunMailImplementationPresent(ConditionContext context) {
63 2 1. isSunMailImplementationPresent : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isSunMailImplementationPresent → RUN_ERROR
2. isSunMailImplementationPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isSunMailImplementationPresent → RUN_ERROR
        return exists(context, "com.sun.mail.util.MailLogger");
64
    }
65
66
    private static ConditionOutcome checkJakartaMailConsistency(ConditionContext context, AnnotatedTypeMetadata metadata) {
67
        ConditionInfoMerger merger = new ConditionInfoMerger();
68 1 1. checkJakartaMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
        merger.addCondition(isAngusMailImplementationPresent(context),
69
                "org.eclipse.angus:angus-mail is present in the classpath",
70
                "org.eclipse.angus:angus-mail is not present in the classpath => ignoring");
71 1 1. checkJakartaMailConsistency : negated conditional → RUN_ERROR
        if (isAngusMailImplementationPresent(context)) {
72
            // possible version downgrade with Sprint Boot <= 2
73
            // => possible clash with Ogham
74
            // => check classpath
75 1 1. checkJakartaMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
            merger.addCondition(isJakartaMailApiPresent(context),
76
                    "jakarta.mail package is present in the classpath",
77
                    "jakarta.mail package is not present in the classpath (dependency jakarta.mail:jakarta.mail-api >= 2.0.0 is not present in the classpath)");
78 1 1. checkJakartaMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR
            merger.addCondition(isJakartaActivationApiPresent(context),
79
                    "jakarta.activation.DataHandler is present in the classpath",
80
                    "jakarta.activation.DataHandler is not present in the classpath (dependency jakarta.activation:jakarta.activation-api >= 2.0.0 is not present in the classpath)");
81 1 1. checkJakartaMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR
            merger.addOutcome(new JakartaMailServiceProvidersAvailable().getMatchOutcome(context, metadata));
82 1 1. checkJakartaMailConsistency : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR
            merger.addOutcome(new JakartaActivationDataHandlersAvailable().getMatchOutcome(context, metadata));
83
        }
84 1 1. checkJakartaMailConsistency : replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::checkJakartaMailConsistency → RUN_ERROR
        return merger.get();
85
    }
86
87
    private static boolean isAngusMailImplementationPresent(ConditionContext context) {
88 2 1. isAngusMailImplementationPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isAngusMailImplementationPresent → RUN_ERROR
2. isAngusMailImplementationPresent : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isAngusMailImplementationPresent → RUN_ERROR
        return exists(context, "org.eclipse.angus.mail.imap.IMAPProvider");
89
    }
90
91
    private static boolean isJakartaMailApiPresent(ConditionContext context) {
92 2 1. isJakartaMailApiPresent : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaMailApiPresent → RUN_ERROR
2. isJakartaMailApiPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaMailApiPresent → RUN_ERROR
        return exists(context, "jakarta.mail.internet.MimeMessage");
93
    }
94
95
    private static boolean isJakartaActivationApiPresent(ConditionContext context) {
96 2 1. isJakartaActivationApiPresent : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaActivationApiPresent → RUN_ERROR
2. isJakartaActivationApiPresent : negated conditional → RUN_ERROR
        return exists(context, "jakarta.activation.MimeType")
97 1 1. isJakartaActivationApiPresent : negated conditional → RUN_ERROR
                && exists(context, "jakarta.activation.DataHandler");
98
    }
99
100
    private static boolean exists(ConditionContext context, String className) {
101
        try {
102
            Class.forName(className, false, context.getClassLoader());
103 1 1. exists : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → RUN_ERROR
            return true;
104
        } catch (ClassNotFoundException e) {
105 1 1. exists : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → NO_COVERAGE
            return false;
106
        } catch (NoClassDefFoundError e) {
107 2 1. exists : negated conditional → NO_COVERAGE
2. exists : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → NO_COVERAGE
            return !isForSameClass(className, e);
108
        }
109
    }
110
111
    private static boolean isForSameClass(String className, NoClassDefFoundError e) {
112 2 1. isForSameClass : replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isForSameClass → NO_COVERAGE
2. isForSameClass : replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isForSameClass → NO_COVERAGE
        return className.equals(e.getMessage().replace("/", "."));
113
    }
114
115
116
    private static class ConditionInfoMerger {
117
        private final List<ConditionOutcome> outcomes = new ArrayList<>();
118
119
        public void addCondition(boolean condition, String messageIfTrue, String messageIfFalse) {
120 2 1. addCondition : removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR
2. addCondition : negated conditional → RUN_ERROR
            addOutcome(new ConditionOutcome(condition, condition ? messageIfTrue : messageIfFalse));
121
        }
122
123
        public void addOutcome(ConditionOutcome outcome) {
124
            outcomes.add(outcome);
125
        }
126
127
        public ConditionOutcome get() {
128
            boolean matchAll = outcomes.stream().allMatch(ConditionOutcome::isMatch);
129
            List<ConditionMessage> messages = outcomes.stream().map(ConditionOutcome::getConditionMessage).collect(toList());
130 1 1. get : replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::get → RUN_ERROR
            return new ConditionOutcome(matchAll, ConditionMessage.of(messages));
131
        }
132
    }
133
}

Mutations

21

1.1
Location : getMatchOutcome
Killed by :
replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::getMatchOutcome → RUN_ERROR

22

1.1
Location : getMatchOutcome
Killed by :
negated conditional → RUN_ERROR

27

1.1
Location : isClasspathConsistent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isClasspathConsistent → RUN_ERROR

2.2
Location : isClasspathConsistent
Killed by :
negated conditional → RUN_ERROR

3.3
Location : isClasspathConsistent
Killed by :
negated conditional → RUN_ERROR

33

1.1
Location : checkJavaxMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

36

1.1
Location : checkJavaxMailConsistency
Killed by :
negated conditional → RUN_ERROR

40

1.1
Location : checkJavaxMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

43

1.1
Location : checkJavaxMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

46

1.1
Location : checkJavaxMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR

47

1.1
Location : checkJavaxMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR

49

1.1
Location : checkJavaxMailConsistency
Killed by :
replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::checkJavaxMailConsistency → RUN_ERROR

54

1.1
Location : isJavaxMailApiPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxMailApiPresent → RUN_ERROR

2.2
Location : isJavaxMailApiPresent
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxMailApiPresent → RUN_ERROR

58

1.1
Location : isJavaxActivationApiPresent
Killed by :
negated conditional → RUN_ERROR

2.2
Location : isJavaxActivationApiPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJavaxActivationApiPresent → RUN_ERROR

59

1.1
Location : isJavaxActivationApiPresent
Killed by :
negated conditional → RUN_ERROR

63

1.1
Location : isSunMailImplementationPresent
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isSunMailImplementationPresent → RUN_ERROR

2.2
Location : isSunMailImplementationPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isSunMailImplementationPresent → RUN_ERROR

68

1.1
Location : checkJakartaMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

71

1.1
Location : checkJakartaMailConsistency
Killed by :
negated conditional → RUN_ERROR

75

1.1
Location : checkJakartaMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

78

1.1
Location : checkJakartaMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addCondition → RUN_ERROR

81

1.1
Location : checkJakartaMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR

82

1.1
Location : checkJakartaMailConsistency
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR

84

1.1
Location : checkJakartaMailConsistency
Killed by :
replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::checkJakartaMailConsistency → RUN_ERROR

88

1.1
Location : isAngusMailImplementationPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isAngusMailImplementationPresent → RUN_ERROR

2.2
Location : isAngusMailImplementationPresent
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isAngusMailImplementationPresent → RUN_ERROR

92

1.1
Location : isJakartaMailApiPresent
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaMailApiPresent → RUN_ERROR

2.2
Location : isJakartaMailApiPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaMailApiPresent → RUN_ERROR

96

1.1
Location : isJakartaActivationApiPresent
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isJakartaActivationApiPresent → RUN_ERROR

2.2
Location : isJakartaActivationApiPresent
Killed by :
negated conditional → RUN_ERROR

97

1.1
Location : isJakartaActivationApiPresent
Killed by :
negated conditional → RUN_ERROR

103

1.1
Location : exists
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → RUN_ERROR

105

1.1
Location : exists
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → NO_COVERAGE

107

1.1
Location : exists
Killed by :
negated conditional → NO_COVERAGE

2.2
Location : exists
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::exists → NO_COVERAGE

112

1.1
Location : isForSameClass
Killed by :
replaced boolean return with true for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isForSameClass → NO_COVERAGE

2.2
Location : isForSameClass
Killed by :
replaced boolean return with false for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition::isForSameClass → NO_COVERAGE

120

1.1
Location : addCondition
Killed by :
removed call to fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::addOutcome → RUN_ERROR

2.2
Location : addCondition
Killed by :
negated conditional → RUN_ERROR

130

1.1
Location : get
Killed by :
replaced return value with null for fr/sii/ogham/spring/email/condition/JavaMailClasspathConsistencyCondition$ConditionInfoMerger::get → RUN_ERROR

Active mutators

Tests examined


Report generated by PIT 1.13.1