aboutsummaryrefslogtreecommitdiffstats
path: root/config/src/main/java/com
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-01-25 20:24:26 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2023-01-25 20:24:26 +0100
commit93109a901deea9aa3e85038dc50fdbb9b32f8c9d (patch)
tree452d3cf2cc44e83bd634aac6ae2c1b5b0fe1fc37 /config/src/main/java/com
parentb538b5cb71919e7192ac7a031bb6624c39969e11 (diff)
Stack => Deque and gc unused ConfigFileFormat
Diffstat (limited to 'config/src/main/java/com')
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/ConfigFileFormat.java228
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java60
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/SlimeTraceSerializer.java5
3 files changed, 31 insertions, 262 deletions
diff --git a/config/src/main/java/com/yahoo/vespa/config/ConfigFileFormat.java b/config/src/main/java/com/yahoo/vespa/config/ConfigFileFormat.java
deleted file mode 100644
index 16a3ef3371d..00000000000
--- a/config/src/main/java/com/yahoo/vespa/config/ConfigFileFormat.java
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.config;
-
-import com.yahoo.config.codegen.CNode;
-import com.yahoo.config.codegen.InnerCNode;
-import com.yahoo.config.codegen.LeafCNode;
-import com.yahoo.slime.*;
-import com.yahoo.text.Utf8;
-import com.yahoo.vespa.config.util.ConfigUtils;
-
-import java.io.*;
-import java.util.Stack;
-
-/**
- * @author Ulf Lilleengen
- */
-public class ConfigFileFormat implements SlimeFormat, ObjectTraverser {
-
- private final InnerCNode root;
- private DataOutputStream out = null;
- private Stack<Node> nodeStack;
-
- public ConfigFileFormat(InnerCNode root) {
- this.root = root;
- this.nodeStack = new Stack<>();
- }
-
- private void printPrefix() throws IOException {
- for (Node node : nodeStack) {
- CNode cnode = node.node;
- if (cnode != root) {
- encodeString(cnode.getName());
- if (cnode.isArray) {
- encodeString("[" + node.arrayIndex + "]");
- if (!(cnode instanceof LeafCNode)) {
- encodeString(".");
- }
- } else if (cnode.isMap) {
- encodeString("{\"" + node.mapKey + "\"}");
- if (!(cnode instanceof LeafCNode)) {
- encodeString(".");
- }
- } else if (cnode instanceof LeafCNode) {
- encodeString("");
- } else {
- encodeString(".");
- }
- }
- }
- encodeString(" ");
- }
-
- private void encode(Inspector inspector, CNode node) throws IOException {
- switch (inspector.type()) {
- case BOOL:
- encodeValue(String.valueOf(inspector.asBool()), (LeafCNode) node);
- return;
- case LONG:
- encodeValue(String.valueOf(inspector.asLong()), (LeafCNode) node);
- return;
- case DOUBLE:
- encodeValue(String.valueOf(inspector.asDouble()), (LeafCNode) node);
- return;
- case STRING:
- encodeValue(inspector.asString(), (LeafCNode) node);
- return;
- case ARRAY:
- encodeArray(inspector, node);
- return;
- case OBJECT:
- if (node.isMap) {
- encodeMap(inspector, node);
- } else {
- encodeObject(inspector, node);
- }
- return;
- case NIX:
- case DATA:
- throw new IllegalArgumentException("Illegal config format supplied. Unknown type for field '" + node.getName() + "'");
- }
- throw new RuntimeException("Should not be reached");
- }
-
- private void encodeMap(Inspector inspector, final CNode node) {
- inspector.traverse(new ObjectTraverser() {
- @Override
- public void field(String name, Inspector inspector) {
- try {
- nodeStack.push(new Node(node, -1, name));
- if (inspector.type().equals(Type.OBJECT)) {
- encodeObject(inspector, node);
- } else {
- encode(inspector, node);
- }
- nodeStack.pop();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
- }
-
- private void encodeArray(Inspector inspector, final CNode node) {
- inspector.traverse(new ArrayTraverser() {
- @Override
- public void entry(int idx, Inspector inspector) {
- try {
- nodeStack.push(new Node(node, idx, ""));
- encode(inspector, node);
- nodeStack.pop();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- });
-
- }
-
- private void encodeObject(Inspector inspector, CNode node) {
- if (!node.isArray && !node.isMap) {
- nodeStack.push(new Node(node));
- inspector.traverse(this);
- nodeStack.pop();
- } else {
- inspector.traverse(this);
- }
- }
-
- private void encodeValue(String value, LeafCNode node) throws IOException {
- printPrefix();
- try {
- if (node instanceof LeafCNode.StringLeaf) {
- encodeStringQuoted(value);
- } else if (node instanceof LeafCNode.IntegerLeaf) {
- //Integer.parseInt(value);
- encodeString(value);
- } else if (node instanceof LeafCNode.LongLeaf) {
- //Long.parseLong(value);
- encodeString(value);
- } else if (node instanceof LeafCNode.DoubleLeaf) {
- //Double.parseDouble(value);
- encodeString(value);
- } else if (node instanceof LeafCNode.BooleanLeaf) {
- encodeString(String.valueOf(Boolean.parseBoolean(value)));
- } else if (node instanceof LeafCNode.EnumLeaf) {
- // LeafCNode.EnumLeaf enumNode = (LeafCNode.EnumLeaf) node;
- // TODO: Reenable this when we can return illegal config id.
- // checkLegalEnumValue(enumNode, value);
- encodeString(value);
- } else {
- encodeStringQuoted(value);
- }
- encodeString("\n");
- } catch (Exception e) {
- throw new IllegalArgumentException("Unable to serialize field '" + node.getFullName() + "': ", e);
- }
- }
-
- private void checkLegalEnumValue(LeafCNode.EnumLeaf enumNode, String value) {
- boolean found = false;
- for (String legalVal : enumNode.getLegalValues()) {
- if (legalVal.equals(value)) {
- found = true;
- }
- }
- if (!found)
- throw new IllegalArgumentException("Illegal enum value '" + value + "'");
- }
-
- private void encodeStringQuoted(String s) throws IOException {
- encodeString("\"" + escapeString(s) + "\"");
- }
-
- private String escapeString(String s) {
- return ConfigUtils.escapeConfigFormatValue(s);
- }
-
- private void encodeString(String s) throws IOException {
- out.write(Utf8.toBytes(s));
- }
-
- @Override
- public void encode(OutputStream os, Slime slime) throws IOException {
- encode(os, slime.get());
- }
-
- private void encode(OutputStream os, Inspector inspector) throws IOException {
- this.out = new DataOutputStream(os);
- this.nodeStack = new Stack<>();
- nodeStack.push(new Node(root));
- encode(inspector, root);
- }
-
- @Override
- public void field(String fieldName, Inspector inspector) {
- try {
- Node parent = nodeStack.peek();
- CNode child = parent.node.getChild(fieldName);
- if (child == null) {
- return; // Skip this field to optimistic
- }
- if (!child.isArray && !child.isMap && child instanceof LeafCNode) {
- nodeStack.push(new Node(child));
- encode(inspector, child);
- nodeStack.pop();
- } else {
- encode(inspector, child);
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private class Node {
- final int arrayIndex;
- final String mapKey;
- final CNode node;
- Node(CNode node, int arrayIndex, String mapKey) {
- this.node = node;
- this.arrayIndex = arrayIndex;
- this.mapKey = mapKey;
- }
-
- Node(CNode node) {
- this(node, -1, "");
- }
- }
-}
diff --git a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
index 3705c167960..e86b13b2c98 100644
--- a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
+++ b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
@@ -8,7 +8,6 @@ import com.yahoo.config.ModelReference;
import com.yahoo.config.UrlReference;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Inspector;
-import com.yahoo.slime.ObjectTraverser;
import com.yahoo.slime.Type;
import java.io.File;
import java.lang.reflect.Constructor;
@@ -17,11 +16,12 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.nio.file.Path;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.Stack;
import java.util.logging.Logger;
import static java.util.logging.Level.INFO;
@@ -42,7 +42,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
private final ConfigInstance.Builder rootBuilder;
private final ConfigTransformer.PathAcquirer pathAcquirer;
private final UrlDownloader urlDownloader;
- private final Stack<NamedBuilder> stack = new Stack<>();
+ private final Deque<NamedBuilder> stack = new ArrayDeque<>();
public ConfigPayloadApplier(T builder) {
this(builder, new IdentityPathAcquirer(), null);
@@ -67,27 +67,17 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
private void handleValue(Inspector inspector) {
switch (inspector.type()) {
- case NIX:
- case BOOL:
- case LONG:
- case DOUBLE:
- case STRING:
- case DATA:
- handleLeafValue(inspector);
- break;
- case ARRAY:
- handleARRAY(inspector);
- break;
- case OBJECT:
- handleOBJECT(inspector);
- break;
- default:
+ case NIX, BOOL, LONG, DOUBLE, STRING, DATA -> handleLeafValue(inspector);
+ case ARRAY -> handleARRAY(inspector);
+ case OBJECT -> handleOBJECT(inspector);
+ default -> {
assert false : "Should not be reached";
+ }
}
}
private void handleARRAY(Inspector inspector) {
- inspector.traverse((ArrayTraverser)(int index, Inspector value) -> handleArrayEntry(index, value));
+ inspector.traverse((ArrayTraverser) this::handleArrayEntry);
}
private void handleArrayEntry(int idx, Inspector inspector) {
@@ -108,11 +98,11 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
}
private void handleOBJECT(Inspector inspector) {
- inspector.traverse((String name, Inspector value) -> handleObjectEntry(name, value));
+ inspector.traverse(this::handleObjectEntry);
NamedBuilder builder = stack.pop();
// Need to set e.g struct(Struct.Builder) here
- if ( ! stack.empty()) {
+ if ( ! stack.isEmpty()) {
try {
invokeSetter(stack.peek().builder, builder.peekName(), builder.builder);
} catch (Exception e) {
@@ -165,7 +155,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
throw new RuntimeException("Missing map builder (this should never happen): " + stack.peek());
setMapLeafValue(name, builder.builder());
stack.push(builder);
- inspector.traverse((ObjectTraverser) (key, value) -> handleObjectEntry(key, value));
+ inspector.traverse(this::handleObjectEntry);
stack.pop();
}
@@ -296,18 +286,24 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
private Object getValueFromInspector(Inspector inspector) {
switch (inspector.type()) {
- case STRING:
+ case STRING -> {
return inspector.asString();
- case LONG:
+ }
+ case LONG -> {
return String.valueOf(inspector.asLong());
- case DOUBLE:
+ }
+ case DOUBLE -> {
return String.valueOf(inspector.asDouble());
- case NIX:
+ }
+ case NIX -> {
return null;
- case BOOL:
+ }
+ case BOOL -> {
return String.valueOf(inspector.asBool());
- case DATA:
+ }
+ case DATA -> {
return String.valueOf(inspector.asData());
+ }
}
throw new IllegalArgumentException("Unhandled type " + inspector.type());
}
@@ -372,7 +368,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
- private Constructor<?> lookupBuilderForStruct(String structName, String name, Class<?> currentClass) {
+ private Constructor<?> lookupBuilderForStruct(String structName, Class<?> currentClass) {
String currentClassName = currentClass.getName();
Class<?> structClass = getInnerClass(currentClass, currentClassName + "$" + structName);
if (structClass == null) {
@@ -420,7 +416,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
String key = constructorCacheKey(structName, name, currentClass);
Constructor<?> constructor = constructorCache.get(key);
if (constructor == null) {
- constructor = lookupBuilderForStruct(structName, name, currentClass);
+ constructor = lookupBuilderForStruct(structName, currentClass);
if (constructor == null) return null;
constructorCache.put(key, constructor);
}
@@ -437,7 +433,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
private static class NamedBuilder {
private final ConfigBuilder builder;
- private final Stack<String> names = new Stack<>(); // if empty, the builder is the root builder
+ private final Deque<String> names = new ArrayDeque<>(); // if empty, the builder is the root builder
NamedBuilder(ConfigBuilder builder) {
this.builder = builder;
@@ -456,7 +452,7 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
return names.peek();
}
- Stack<String> nameStack() {
+ Deque<String> nameStack() {
return names;
}
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeTraceSerializer.java b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeTraceSerializer.java
index 875033f1ffa..5193ecddc82 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeTraceSerializer.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeTraceSerializer.java
@@ -5,8 +5,9 @@ import com.yahoo.slime.Cursor;
import com.yahoo.yolean.trace.TraceNode;
import com.yahoo.yolean.trace.TraceVisitor;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.Iterator;
-import java.util.Stack;
/**
* Serialize a {@link TraceNode} to {@link com.yahoo.slime.Slime}.
@@ -17,7 +18,7 @@ public class SlimeTraceSerializer extends TraceVisitor {
static final String TIMESTAMP = "timestamp";
static final String PAYLOAD = "payload";
static final String CHILDREN = "children";
- final Stack<Cursor> cursors = new Stack<>();
+ final Deque<Cursor> cursors = new ArrayDeque<>();
public SlimeTraceSerializer(Cursor cursor) {
cursors.push(cursor);