1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.flags;
import com.yahoo.component.AbstractComponent;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
/**
* Basic in-memory flag source useful for testing
*
* Creates an empty flag source that will make all flags return their default values (from {@code value()}).
* The with* methods can be used to set a different return value.
*
* @author freva
*/
public class InMemoryFlagSource extends AbstractComponent implements FlagSource {
private final Map<FlagId, RawFlag> rawFlagsById = new ConcurrentHashMap<>();
public InMemoryFlagSource withBooleanFlag(FlagId flagId, boolean value) {
return withRawFlag(flagId, new UnboundBooleanFlag(flagId, value).serializer().serialize(value));
}
public InMemoryFlagSource withStringFlag(FlagId flagId, String value) {
return withRawFlag(flagId, new UnboundStringFlag(flagId, value).serializer().serialize(value));
}
public InMemoryFlagSource withIntFlag(FlagId flagId, int value) {
return withRawFlag(flagId, new UnboundIntFlag(flagId, value).serializer().serialize(value));
}
public InMemoryFlagSource withLongFlag(FlagId flagId, long value) {
return withRawFlag(flagId, new UnboundLongFlag(flagId, value).serializer().serialize(value));
}
public InMemoryFlagSource withDoubleFlag(FlagId flagId, double value) {
return withRawFlag(flagId, new UnboundDoubleFlag(flagId, value).serializer().serialize(value));
}
public <T> InMemoryFlagSource withJacksonFlag(FlagId flagId, T value, Class<T> jacksonClass) {
return withRawFlag(flagId, new UnboundJacksonFlag<>(flagId, value, jacksonClass).serializer().serialize(value));
}
public <T> InMemoryFlagSource withListFlag(FlagId flagId, List<T> value, Class<T> elementClass) {
return withRawFlag(flagId, new UnboundListFlag<T>(flagId, value, elementClass).serializer().serialize(value));
}
public InMemoryFlagSource removeFlag(FlagId flagId) {
rawFlagsById.remove(flagId);
return this;
}
private InMemoryFlagSource withRawFlag(FlagId flagId, RawFlag rawFlag) {
rawFlagsById.put(flagId, rawFlag);
return this;
}
@Override
public Optional<RawFlag> fetch(FlagId id, FetchVector vector) {
return Optional.ofNullable(rawFlagsById.get(id));
}
}
|