BUG-1275: speedup toPredicateValue() 43/8543/3
authorRobert Varga <rovarga@cisco.com>
Wed, 2 Jul 2014 10:12:45 +0000 (12:12 +0200)
committerRobert Varga <rovarga@cisco.com>
Wed, 2 Jul 2014 16:17:16 +0000 (18:17 +0200)
Instead of performing startsWith/endsWith, we first check the first
character and based on that we optinally trim the string to the matching
character. Also fixes a bug, where string like 'abc" would be accepted.

Change-Id: I683074ec53a7924812d9fe77b669e7cab5f32ea8
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/InstanceIdentifierForXmlCodec.java

index 7528de93542f8b8993c8e90bcd667533f7b80f83..0e2eb0ec60d489acca06804fbd7973cc826840b1 100644 (file)
@@ -35,11 +35,9 @@ public final class InstanceIdentifierForXmlCodec {
     private static final Pattern PREDICATE_PATTERN = Pattern.compile("\\[(.*?)\\]");
     private static final Splitter SLASH_SPLITTER = Splitter.on('/');
     private static final Splitter COLON_SPLITTER = Splitter.on(':');
-    private static final String SQUOTE = "'";
-    private static final String DQUOTE = "\"";
 
     private InstanceIdentifierForXmlCodec() {
-
+        throw new UnsupportedOperationException("Utility class");
     }
 
     public static InstanceIdentifier deserialize(final Element element, final SchemaContext schemaContext) {
@@ -191,13 +189,29 @@ public final class InstanceIdentifierForXmlCodec {
         return result;
     }
 
+    private static String trimIfEndIs(final String str, final char end) {
+        final int l = str.length() - 1;
+        if (str.charAt(l) != end) {
+            return null;
+        }
+
+        return str.substring(1, l);
+    }
+
     private static String toPredicateValue(final String predicatedValue) {
-        String predicatedValueTrimmed = predicatedValue.trim();
-        if ((predicatedValueTrimmed.startsWith(DQUOTE) || predicatedValueTrimmed.startsWith(SQUOTE))
-                && (predicatedValueTrimmed.endsWith(DQUOTE) || predicatedValueTrimmed.endsWith(SQUOTE))) {
-            return predicatedValueTrimmed.substring(1, predicatedValueTrimmed.length() - 1);
+        final String predicatedValueTrimmed = predicatedValue.trim();
+        if (predicatedValue.isEmpty()) {
+            return null;
+        }
+
+        switch (predicatedValueTrimmed.charAt(0)) {
+        case '"':
+            return trimIfEndIs(predicatedValueTrimmed, '"');
+        case '\'':
+            return trimIfEndIs(predicatedValueTrimmed, '\'');
+        default:
+            return null;
         }
-        return null;
     }
 
     private static void writeIdentifierWithNamespacePrefix(final Element element, final StringBuilder textContent, final QName qName,