From 4ce087c00ded24533b40629c6ee9ced42e4a5e07 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 6 Oct 2021 10:18:23 +0200 Subject: [PATCH] Improve YangInstanceIdentifierDeserializer.checkValid() The current implementation is slow due to always playing with arguments, even when we do not use them. As it turns out, a bit of restructuring allows us to make this a lot saner and performant. Change-Id: Ic5de0d473fe203703470252b32e54b2e3c325f5e Signed-off-by: Robert Varga (cherry picked from commit 5a1175154e66722370ed783a1200aaebbbcbb567) --- .../YangInstanceIdentifierDeserializer.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java index 3accfb9580..004a99d616 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java @@ -54,8 +54,6 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; public final class YangInstanceIdentifierDeserializer { private static final CharMatcher IDENTIFIER_PREDICATE = CharMatcher.noneOf(ParserConstants.RFC3986_RESERVED_CHARACTERS).precomputed(); - private static final String PARSING_FAILED_MESSAGE = "Could not parse Instance Identifier '%s'. " - + "Offset: '%d' : Reason: "; private static final CharMatcher PERCENT_ENCODING = CharMatcher.is('%'); // position of the first encoded char after percent sign in percent encoded string private static final int FIRST_ENCODED_CHAR = 1; @@ -277,14 +275,16 @@ public final class YangInstanceIdentifierDeserializer { return offset == data.length(); } - private void checkValid(final boolean condition, final ErrorTag errorTag, final String errorMsg, - final Object... messageArgs) { - final Object[] allMessageArguments = new Object[messageArgs.length + 2]; - allMessageArguments[0] = data; - allMessageArguments[1] = offset; - System.arraycopy(messageArgs, 0, allMessageArguments, 2, messageArgs.length); - RestconfDocumentedException.throwIf(!condition, ErrorType.PROTOCOL, errorTag, - PARSING_FAILED_MESSAGE + errorMsg, allMessageArguments); + private void checkValid(final boolean condition, final ErrorTag errorTag, final String errorMsg) { + if (!condition) { + throw createParsingException(errorTag, errorMsg); + } + } + + private void checkValid(final boolean condition, final ErrorTag errorTag, final String fmt, final Object arg) { + if (!condition) { + throw createParsingException(errorTag, String.format(fmt, arg)); + } } private void checkValidIdentifierStart() { @@ -293,9 +293,14 @@ public final class YangInstanceIdentifierDeserializer { } private RestconfDocumentedException getParsingCharFailedException() { - return new RestconfDocumentedException(String.format(PARSING_FAILED_MESSAGE, data, offset) - + String.format("Bad char '%c' on the current position.", currentChar()), - ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); + return createParsingException(ErrorTag.MALFORMED_MESSAGE, + "Bad char '" + currentChar() + "' on the current position."); + } + + private RestconfDocumentedException createParsingException(final ErrorTag errorTag, final String messagePart) { + return new RestconfDocumentedException(String.format( + "Could not parse Instance Identifier '%s'. Offset: '%d' : Reason: %s", data, offset, messagePart), + ErrorType.PROTOCOL, errorTag); } private char currentChar() { -- 2.36.6