accept(Message)   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 7
c 1
b 0
f 0
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 10
cc 3
crap 3
1
/*
2
 * This file is part of SingleInstance.
3
 *
4
 * SingleInstance is free software: you can redistribute it and/or modify
5
 * it under the terms of the GNU Lesser General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * SingleInstance is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public License
15
 * along with SingleInstance.  If not, see <https://www.gnu.org/licenses/>.
16
 *
17
 * Copyright (c) 2020 Vincent Quatrevieux
18
 */
19
20
package fr.quatrevieux.singleinstance.ipc.consumer;
21
22
import fr.quatrevieux.singleinstance.ipc.Message;
23
24
import java.util.HashMap;
25
import java.util.Map;
26
import java.util.function.Consumer;
27
import java.util.function.Function;
28
29
/**
30
 * {@link fr.quatrevieux.singleinstance.ipc.InstanceServer} consumer implementation
31
 * allowing transformation of the received message, based on the message name.
32
 *
33
 * Usage:
34
 * <pre>{@code
35
 * // Create the consumer
36
 * MessageTransformerConsumer consumer = new MessageTransformerConsumer(message -> {
37
 *     // Switch on the message type
38
 *     if (message instanceof Foo) {
39
 *         // ...
40
 *     } else if (message instanceof Bar) {
41
 *         // ...
42
 *     } else {
43
 *         System.out.println("Unsupported message");
44
 *     }
45
 * });
46
 *
47
 * // Register transformers
48
 * consumer.register("Foo", message -> new Foo(message.data()));
49
 * consumer.register("Bar", message -> new Bar(message.data()));
50
 *
51
 * // Start consume messages
52
 * SingleInstance.onMessage(consumer);
53
 * }</pre>
54
 *
55
 * @see fr.quatrevieux.singleinstance.ipc.InstanceServer#consume(Consumer)
56
 */
57
final public class MessageTransformerConsumer implements Consumer<Message> {
58
    final private Consumer<Message> next;
59 1
    final private Map<String, Function<Message, Message>> transformers = new HashMap<>();
60
61 1
    public MessageTransformerConsumer(Consumer<Message> next) {
62 1
        this.next = next;
63 1
    }
64
65
    /**
66
     * Register a new message transformer
67
     *
68
     * Usage:
69
     * <pre>{@code
70
     * MessageTransformerConsumer consumer = xxx;
71
     *
72
     * consumer
73
     *     .register("Foo", message -> new Foo(message.data()))
74
     *     .register("Bar", message -> new Bar(message.data()))
75
     * ;
76
     * }</pre>
77
     *
78
     * @param messageName The message name {@link Message#name()}
79
     * @param transformer The transformer function. If the transformer returns null, the message will be ignored.
80
     *
81
     * @return this instance
82
     */
83
    public MessageTransformerConsumer register(String messageName, Function<Message, Message> transformer) {
84 1
        transformers.put(messageName, transformer);
85
86 1
        return this;
87
    }
88
89
    @Override
90
    public void accept(Message message) {
91 1
        Function<Message, Message> transformer = transformers.get(message.name());
92
93 1
        if (transformer != null) {
94 1
            message = transformer.apply(message);
95
        }
96
97 1
        if (message != null) {
98 1
            next.accept(message);
99
        }
100 1
    }
101
}
102