Improve YangInstanceIdentifierDeserializer.checkValid() 91/97791/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 6 Oct 2021 08:18:23 +0000 (10:18 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 6 Oct 2021 08:40:39 +0000 (10:40 +0200)
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 <robert.varga@pantheon.tech>
(cherry picked from commit 5a1175154e66722370ed783a1200aaebbbcbb567)

restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/parser/YangInstanceIdentifierDeserializer.java

index 3accfb95801309dcc4b070cc1dd9e916e7dee3fa..004a99d6166d42082f40267652ecc7570575d677 100644 (file)
@@ -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() {