From af1820f28c56c461f29a1d8521a0ad8f2bd74596 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 5 Jun 2017 18:46:02 +0200 Subject: [PATCH] Intern low-cardinality statement arguments config, mandatory, ordered-by, require-instance, status and yin-element statements have a fixed number of strings they take as an argument, hence we can lower the memory overhead by sharing strings instances. Change-Id: I9b3f470466db8d3463956e4fb010c77671ac3900 Signed-off-by: Robert Varga --- .../stmt/rfc6020/ConfigStatementImpl.java | 7 ++++- .../stmt/rfc6020/MandatoryStatementImpl.java | 5 ++++ .../stmt/rfc6020/OrderedByStatementImpl.java | 11 +++++++ .../rfc6020/RequireInstanceStatementImpl.java | 7 ++++- .../stmt/rfc6020/StatusStatementImpl.java | 13 ++++++++ .../yang/parser/stmt/rfc6020/Utils.java | 30 ++++++++++++------- .../stmt/rfc6020/YinElementStatementImpl.java | 5 ++++ 7 files changed, 66 insertions(+), 12 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java index d7b5fe42c6..bf898379bb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java @@ -61,6 +61,11 @@ public class ConfigStatementImpl extends AbstractDeclaredStatement impl return ret; } + @Override + public String internArgument(final String rawArgument) { + return Utils.internBoolean(rawArgument); + } + @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; @@ -69,6 +74,6 @@ public class ConfigStatementImpl extends AbstractDeclaredStatement impl @Override public boolean getValue() { - return argument(); + return argument().booleanValue(); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java index 3f0f0b38a7..5096e904f5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java @@ -61,6 +61,11 @@ public class MandatoryStatementImpl extends AbstractDeclaredStatement i return ret; } + @Override + public String internArgument(final String rawArgument) { + return Utils.internBoolean(rawArgument); + } + @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java index 9750d178db..90a6d82858 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java @@ -55,6 +55,17 @@ public class OrderedByStatementImpl extends AbstractDeclaredStatement im protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } + + @Override + public String internArgument(final String rawArgument) { + if ("user".equals(rawArgument)) { + return "user"; + } else if ("system".equals(rawArgument)) { + return "system"; + } else { + return rawArgument; + } + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java index d1316600c6..49cd93fe87 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java @@ -48,6 +48,11 @@ public class RequireInstanceStatementImpl extends return new RequireInstanceEffectiveStatementImpl(ctx); } + @Override + public String internArgument(final String rawArgument) { + return Utils.internBoolean(rawArgument); + } + @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; @@ -56,6 +61,6 @@ public class RequireInstanceStatementImpl extends @Override public boolean getValue() { - return argument(); + return argument().booleanValue(); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java index 5231a71252..336abefbf1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java @@ -54,6 +54,19 @@ public class StatusStatementImpl extends AbstractDeclaredStatement return new StatusEffectiveStatementImpl(ctx); } + @Override + public String internArgument(final String rawArgument) { + if ("current".equals(rawArgument)) { + return "current"; + } else if ("deprecated".equals(rawArgument)) { + return "deprecated"; + } else if ("obsolete".equals(rawArgument)) { + return "obsolete"; + } else { + return rawArgument; + } + } + @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java index e80d39d642..abcce90d5d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java @@ -119,7 +119,7 @@ public final class Utils { final List keyTokens = SPACE_SPLITTER.splitToList(value); // to detect if key contains duplicates - if ((new HashSet<>(keyTokens)).size() < keyTokens.size()) { + if (new HashSet<>(keyTokens).size() < keyTokens.size()) { // FIXME: report all duplicate keys throw new SourceException(ctx.getStatementSourceReference(), "Duplicate value in list key: %s", value); } @@ -404,17 +404,27 @@ public final class Utils { ctx.getStatementSourceReference(), "String '%s' is not valid deviate argument", deviateKeyword); } + static String internBoolean(final String input) { + if ("true".equals(input)) { + return "true"; + } else if ("false".equals(input)) { + return "false"; + } else { + return input; + } + } + public static Status parseStatus(final String value) { switch (value) { - case "current": - return Status.CURRENT; - case "deprecated": - return Status.DEPRECATED; - case "obsolete": - return Status.OBSOLETE; - default: - LOG.warn("Invalid 'status' statement: {}", value); - return null; + case "current": + return Status.CURRENT; + case "deprecated": + return Status.DEPRECATED; + case "obsolete": + return Status.OBSOLETE; + default: + LOG.warn("Invalid 'status' statement: {}", value); + return null; } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java index 6c32110d1c..2d309291c1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java @@ -48,6 +48,11 @@ public class YinElementStatementImpl extends AbstractDeclaredStatement return new YinElementEffectiveStatementImpl(ctx); } + @Override + public String internArgument(final String rawArgument) { + return Utils.internBoolean(rawArgument); + } + @Override protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; -- 2.36.6