diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-25 20:24:26 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-01-25 20:24:26 +0100 |
commit | 93109a901deea9aa3e85038dc50fdbb9b32f8c9d (patch) | |
tree | 452d3cf2cc44e83bd634aac6ae2c1b5b0fe1fc37 /config/src/main/java | |
parent | b538b5cb71919e7192ac7a031bb6624c39969e11 (diff) |
Stack => Deque and gc unused ConfigFileFormat
Diffstat (limited to 'config/src/main/java')
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); |