| 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 |
|
| 22 |
1.1 |
|
| 27 |
1.1 2.2 3.3 |
|
| 33 |
1.1 |
|
| 36 |
1.1 |
|
| 40 |
1.1 |
|
| 43 |
1.1 |
|
| 46 |
1.1 |
|
| 47 |
1.1 |
|
| 49 |
1.1 |
|
| 54 |
1.1 2.2 |
|
| 58 |
1.1 2.2 |
|
| 59 |
1.1 |
|
| 63 |
1.1 2.2 |
|
| 68 |
1.1 |
|
| 71 |
1.1 |
|
| 75 |
1.1 |
|
| 78 |
1.1 |
|
| 81 |
1.1 |
|
| 82 |
1.1 |
|
| 84 |
1.1 |
|
| 88 |
1.1 2.2 |
|
| 92 |
1.1 2.2 |
|
| 96 |
1.1 2.2 |
|
| 97 |
1.1 |
|
| 103 |
1.1 |
|
| 105 |
1.1 |
|
| 107 |
1.1 2.2 |
|
| 112 |
1.1 2.2 |
|
| 120 |
1.1 2.2 |
|
| 130 |
1.1 |