summaryrefslogtreecommitdiffstats
path: root/flags/src
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2019-01-17 10:53:02 +0100
committerValerij Fredriksen <valerijf@verizonmedia.com>2019-01-24 10:01:27 +0100
commit9f22f42eca5d2fec98077170b4ee4f2bacf2cb99 (patch)
tree1f81c1482c7bc7998b37d9c0c08e2343e2498d6a /flags/src
parentb62ea5328f268c8bbf12d5c5c241b1948ead8b97 (diff)
Add ListFlag
Diffstat (limited to 'flags/src')
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java6
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/JacksonArraySerializer.java21
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/ListFlag.java19
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/UnboundListFlag.java22
-rw-r--r--flags/src/test/java/com/yahoo/vespa/flags/FlagsTest.java8
5 files changed, 76 insertions, 0 deletions
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index 0f521649a6c..bfccbd1e46c 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -118,6 +118,12 @@ public class Flags {
flagId, defaultValue, description, modificationEffect, dimensions);
}
+ /** WARNING: public for testing: All flags should be defined in {@link Flags}. */
+ public static <T> UnboundListFlag<T> defineListFlag(String flagId, List<T> defaultValue, String description,
+ String modificationEffect, FetchVector.Dimension... dimensions) {
+ return define(UnboundListFlag::new, flagId, defaultValue, description, modificationEffect, dimensions);
+ }
+
@FunctionalInterface
private interface TypedUnboundFlagFactory<T, U extends UnboundFlag<?, ?, ?>> {
U create(FlagId id, T defaultVale, FetchVector defaultFetchVector);
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/JacksonArraySerializer.java b/flags/src/main/java/com/yahoo/vespa/flags/JacksonArraySerializer.java
new file mode 100644
index 00000000000..619c0c51c17
--- /dev/null
+++ b/flags/src/main/java/com/yahoo/vespa/flags/JacksonArraySerializer.java
@@ -0,0 +1,21 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.flags;
+
+import java.util.List;
+
+/**
+ * @author freva
+ */
+public class JacksonArraySerializer<T> implements FlagSerializer<List<T>> {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<T> deserialize(RawFlag rawFlag) {
+ return (List<T>) JsonNodeRawFlag.fromJsonNode(rawFlag.asJsonNode()).toJacksonClass(List.class);
+ }
+
+ @Override
+ public RawFlag serialize(List<T> value) {
+ return null;
+ }
+}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/ListFlag.java b/flags/src/main/java/com/yahoo/vespa/flags/ListFlag.java
new file mode 100644
index 00000000000..6fefc5e22e3
--- /dev/null
+++ b/flags/src/main/java/com/yahoo/vespa/flags/ListFlag.java
@@ -0,0 +1,19 @@
+// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.flags;
+
+import javax.annotation.concurrent.Immutable;
+import java.util.List;
+
+/**
+ * @author freva
+ */
+@Immutable
+public class ListFlag<T> extends FlagImpl<List<T>, ListFlag<T>> {
+ public ListFlag(FlagId id, List<T> defaultValue, FetchVector vector, FlagSerializer<List<T>> serializer, FlagSource source) {
+ super(id, defaultValue, vector, serializer, source, ListFlag::new);
+ }
+
+ public List<T> value() {
+ return boxedValue();
+ }
+}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/UnboundListFlag.java b/flags/src/main/java/com/yahoo/vespa/flags/UnboundListFlag.java
new file mode 100644
index 00000000000..f5150604231
--- /dev/null
+++ b/flags/src/main/java/com/yahoo/vespa/flags/UnboundListFlag.java
@@ -0,0 +1,22 @@
+// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.flags;
+
+import javax.annotation.concurrent.Immutable;
+import java.util.List;
+
+/**
+ * @author freva
+ */
+@Immutable
+public class UnboundListFlag<T> extends UnboundFlagImpl<List<T>, ListFlag<T>, UnboundListFlag<T>> {
+ public UnboundListFlag(FlagId id, List<T> defaultValue) {
+ this(id, defaultValue, new FetchVector());
+ }
+
+ public UnboundListFlag(FlagId id, List<T> defaultValue, FetchVector defaultFetchVector) {
+ super(id, defaultValue, defaultFetchVector,
+ new JacksonArraySerializer<T>(),
+ UnboundListFlag::new,
+ ListFlag::new);
+ }
+}
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/FlagsTest.java b/flags/src/test/java/com/yahoo/vespa/flags/FlagsTest.java
index 570058ae1d2..aa41cbbd94d 100644
--- a/flags/src/test/java/com/yahoo/vespa/flags/FlagsTest.java
+++ b/flags/src/test/java/com/yahoo/vespa/flags/FlagsTest.java
@@ -7,6 +7,8 @@ import com.fasterxml.jackson.databind.node.BooleanNode;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.Objects;
import java.util.Optional;
@@ -87,6 +89,12 @@ public class FlagsTest {
}
@Test
+ public void testList() {
+ testGeneric(Flags.defineListFlag("list-id", Collections.singletonList("a"), "desc", "mod"),
+ Collections.singletonList("a"), Arrays.asList("a", "b", "c"));
+ }
+
+ @Test
public void testJacksonClass() {
ExampleJacksonClass defaultInstance = new ExampleJacksonClass();
ExampleJacksonClass instance = new ExampleJacksonClass();