| 1 | package fr.sii.ogham.core.service; | |
| 2 | ||
| 3 | import static fr.sii.ogham.core.util.LogUtils.logString; | |
| 4 | ||
| 5 | import java.util.Arrays; | |
| 6 | import java.util.List; | |
| 7 | ||
| 8 | import org.slf4j.Logger; | |
| 9 | import org.slf4j.LoggerFactory; | |
| 10 | ||
| 11 | import fr.sii.ogham.core.exception.MessageNotSentException; | |
| 12 | import fr.sii.ogham.core.exception.MessagingException; | |
| 13 | import fr.sii.ogham.core.message.Message; | |
| 14 | import fr.sii.ogham.core.sender.ConditionalSender; | |
| 15 | ||
| 16 | /** | |
| 17 | * Implementation that will ask each sender if it is able to handle the message. | |
| 18 | * If the sender can, then the service asks the sender to really send the | |
| 19 | * message. | |
| 20 | * | |
| 21 | * If several senders can handle the message, then each sender that is able to | |
| 22 | * handle it will be used. | |
| 23 | * | |
| 24 | * @author Aurélien Baudet | |
| 25 | * @see ConditionalSender | |
| 26 | */ | |
| 27 | public class EverySupportingMessagingService implements MessagingService { | |
| 28 | private static final Logger LOG = LoggerFactory.getLogger(EverySupportingMessagingService.class); | |
| 29 | ||
| 30 | /** | |
| 31 | * The list of senders used to handle messages | |
| 32 | */ | |
| 33 | private List<ConditionalSender> senders; | |
| 34 | ||
| 35 | /** | |
| 36 | * Initialize the service with none, one or several sender implementations. | |
| 37 | * The registration order has no consequence. | |
| 38 | * | |
| 39 | * @param senders | |
| 40 | * the senders to register | |
| 41 | */ | |
| 42 | public EverySupportingMessagingService(ConditionalSender... senders) { | |
| 43 | this(Arrays.asList(senders)); | |
| 44 | } | |
| 45 | ||
| 46 | /** | |
| 47 | * Initialize the service with the provided sender implementations. The | |
| 48 | * registration order has no consequence. | |
| 49 | * | |
| 50 | * @param senders | |
| 51 | * the senders to register | |
| 52 | */ | |
| 53 | public EverySupportingMessagingService(List<ConditionalSender> senders) { | |
| 54 | super(); | |
| 55 | this.senders = senders; | |
| 56 | } | |
| 57 | ||
| 58 | /** | |
| 59 | * Sends the message. The message can be anything with any content and that | |
| 60 | * must be delivered to something or someone. | |
| 61 | * | |
| 62 | * Ask each sender if it is able to handle the message. Each sender that | |
| 63 | * can't handle the message is skipped. Each sender that is able to handle | |
| 64 | * it will be called in order to really send the message. | |
| 65 | * | |
| 66 | * @param message | |
| 67 | * the message to send | |
| 68 | * @throws MessagingException | |
| 69 | * when the message couldn't be sent | |
| 70 | * @throws MessageNotSentException | |
| 71 | * when no sender could handle the message | |
| 72 | */ | |
| 73 | @Override | |
| 74 | public void send(Message message) throws MessagingException { | |
| 75 | LOG.info("Sending message..."); | |
| 76 | LOG.trace("{}", message); | |
| 77 | LOG.debug("Find senders that is able to send the message {}", logString(message)); | |
| 78 | boolean sent = false; | |
| 79 | for (ConditionalSender sender : senders) { | |
| 80 |
6
1. send : negated conditional → NO_COVERAGE 2. send : negated conditional → TIMED_OUT 3. send : negated conditional → KILLED 4. send : negated conditional → KILLED 5. send : negated conditional → KILLED 6. send : negated conditional → KILLED |
if (sender.supports(message)) { |
| 81 | LOG.debug("Sending message {} using sender {}...", logString(message), sender); | |
| 82 |
6
1. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → NO_COVERAGE 2. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → TIMED_OUT 3. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → KILLED 4. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → KILLED 5. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → KILLED 6. send : removed call to fr/sii/ogham/core/sender/ConditionalSender::send → KILLED |
sender.send(message); |
| 83 | LOG.debug("Message {} sent using sender {}", logString(message), sender); | |
| 84 | sent = true; | |
| 85 | } else { | |
| 86 | LOG.debug("Sender {} can't handle the message {}", sender, logString(message)); | |
| 87 | } | |
| 88 | } | |
| 89 |
5
1. send : negated conditional → NO_COVERAGE 2. send : negated conditional → TIMED_OUT 3. send : negated conditional → KILLED 4. send : negated conditional → KILLED 5. send : negated conditional → KILLED |
if(sent) { |
| 90 | LOG.info("Message sent"); | |
| 91 | LOG.trace("{}", message); | |
| 92 | } else { | |
| 93 | throw new MessageNotSentException("No sender available to send the message", message); | |
| 94 | } | |
| 95 | } | |
| 96 | ||
| 97 | /** | |
| 98 | * Register a new sender. The sender is added at the end. | |
| 99 | * | |
| 100 | * @param sender | |
| 101 | * the sender to register | |
| 102 | * @return this instance for fluent chaining | |
| 103 | */ | |
| 104 | public EverySupportingMessagingService addSender(ConditionalSender sender) { | |
| 105 | senders.add(sender); | |
| 106 |
1
1. addSender : replaced return value with null for fr/sii/ogham/core/service/EverySupportingMessagingService::addSender → NO_COVERAGE |
return this; |
| 107 | } | |
| 108 | } | |
Mutations | ||
| 80 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
| 82 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
| 89 |
1.1 2.2 3.3 4.4 5.5 |
|
| 106 |
1.1 |