From 59e9efad20205ac30cf0ecdb179501fbf284a82e Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 4 Jul 2014 14:57:10 +0200 Subject: [PATCH] Eliminate use of String.split() Another round of optimizations, centered about not instantiating implicit pattern matchers, but rather using Splitters. Change-Id: I9ebba19fd9f211e7fa55e9bb55e35ae5e2a7b379 Signed-off-by: Robert Varga --- .../parser/builder/impl/GroupingUtils.java | 84 +++++++++-------- .../yang/parser/impl/BasicValidations.java | 29 +++--- .../yang/parser/impl/ValidationUtil.java | 29 +++--- .../yang/parser/impl/YangParserImpl.java | 19 ++-- .../parser/impl/YangParserListenerImpl.java | 91 ++++++++++--------- 5 files changed, 134 insertions(+), 118 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java index 2442d47b75..59689e16aa 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java @@ -7,11 +7,15 @@ */ package org.opendaylight.yangtools.yang.parser.builder.impl; +import com.google.common.base.Splitter; + import java.util.Comparator; import java.util.Date; +import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; + import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -24,10 +28,43 @@ import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.yangtools.yang.parser.util.YangParseException; public final class GroupingUtils { + private static final Splitter COLON_SPLITTER = Splitter.on(':'); + private static final Splitter SLASH_SPLITTER = Splitter.on('/'); private GroupingUtils() { } + /** + * Common string splitter. Given a string representation of a grouping's name, it creates a prefix/name + * pair and returns it. + * + * @param groupingString Grouping string reference + * @param module Module which we are processing + * @param line Module line which we are processing + * @return An array of two strings, first one is the module prefix, the second is the grouping name. + */ + private static String[] getPrefixAndName(final String groupingString, final ModuleBuilder module, final int line) { + final String[] ret = new String[2]; + + if (groupingString.indexOf(':') != -1) { + if (groupingString.indexOf('/') != -1) { + throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); + } + + final Iterator split = COLON_SPLITTER.split(groupingString).iterator(); + ret[0] = split.next(); + ret[1] = split.next(); + if (split.hasNext()) { + throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); + } + } else { + ret[0] = module.getPrefix(); + ret[1] = groupingString; + } + + return ret; + } + /** * Search given modules for grouping by name defined in uses node. * @@ -43,25 +80,12 @@ public final class GroupingUtils { final Map> modules, final ModuleBuilder module) { final int line = usesBuilder.getLine(); - final String groupingString = usesBuilder.getGroupingPathAsString(); - String groupingPrefix; - String groupingName; - - if (groupingString.contains(":")) { - String[] splitted = groupingString.split(":"); - if (splitted.length != 2 || groupingString.contains("/")) { - throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); - } - groupingPrefix = splitted[0]; - groupingName = splitted[1]; - } else { - groupingPrefix = module.getPrefix(); - groupingName = groupingString; - } - - ModuleBuilder dependentModule; + final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line); + final String groupingPrefix = split[0]; + final String groupingName = split[1]; + final ModuleBuilder dependentModule; - if(groupingPrefix == null) { + if (groupingPrefix == null) { dependentModule = module; } else if (groupingPrefix.equals(module.getPrefix())) { dependentModule = module; @@ -117,24 +141,9 @@ public final class GroupingUtils { public static GroupingDefinition getTargetGroupingFromContext(final UsesNodeBuilder usesBuilder, final ModuleBuilder module, final SchemaContext context) { final int line = usesBuilder.getLine(); - String groupingString = usesBuilder.getGroupingPathAsString(); - String groupingPrefix; - String groupingName; - - if (groupingString.contains(":")) { - String[] splitted = groupingString.split(":"); - if (splitted.length != 2 || groupingString.contains("/")) { - throw new YangParseException(module.getName(), line, "Invalid name of target grouping"); - } - groupingPrefix = splitted[0]; - groupingName = splitted[1]; - } else { - groupingPrefix = module.getPrefix(); - groupingName = groupingString; - } - - Module dependentModule = BuilderUtils.findModuleFromContext(context, module, groupingPrefix, line); - return findGroupingDefinition(dependentModule.getGroupings(), groupingName); + final String[] split = getPrefixAndName(usesBuilder.getGroupingPathAsString(), module, line); + Module dependentModule = BuilderUtils.findModuleFromContext(context, module, split[0], line); + return findGroupingDefinition(dependentModule.getGroupings(), split[1]); } /** @@ -184,9 +193,8 @@ public final class GroupingUtils { for (RefineBuilder refine : usesNode.getRefines()) { String refineTargetPath = refine.getTargetPathString(); - String[] splitted = refineTargetPath.split("/"); Builder currentNode = usesNode.getParent(); - for (String pathElement : splitted) { + for (String pathElement : SLASH_SPLITTER.split(refineTargetPath)) { if (currentNode instanceof DataNodeContainerBuilder) { currentNode = ((DataNodeContainerBuilder) currentNode).getDataChildByName(pathElement); } else if (currentNode instanceof ChoiceBuilder) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/BasicValidations.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/BasicValidations.java index b78fb04652..0cdf493e75 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/BasicValidations.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/BasicValidations.java @@ -9,13 +9,15 @@ package org.opendaylight.yangtools.yang.parser.impl; import static java.lang.String.format; +import com.google.common.base.Splitter; import com.google.common.collect.Sets; + import java.text.ParseException; import java.util.Date; -import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; + import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext; @@ -28,6 +30,9 @@ import org.opendaylight.yangtools.yang.parser.util.YangValidationException; final class BasicValidations { static final String SUPPORTED_YANG_VERSION = "1"; + private static final Splitter SLASH_SPLITTER = Splitter.on('/').omitEmptyStrings(); + private static final Pattern identifierPattern = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*"); + private static final Pattern prefixedIdentifierPattern = Pattern.compile("(.+):(.+)"); /** * It isn't desirable to create instance of this class. @@ -99,8 +104,6 @@ final class BasicValidations { } } - private static final Pattern identifierPattern = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*"); - static void checkIdentifier(final ParseTree statement) { checkIdentifierInternal(statement, ValidationUtil.getName(statement)); } @@ -121,8 +124,6 @@ final class BasicValidations { } } - private static final Pattern prefixedIdentifierPattern = Pattern.compile("(.+):(.+)"); - static void checkPrefixedIdentifier(final ParseTree statement) { checkPrefixedIdentifierInternal(statement, ValidationUtil.getName(statement)); } @@ -149,10 +150,7 @@ final class BasicValidations { String id = ValidationUtil.getName(statement); try { - for (String oneOfId : id.split("/")) { - if (oneOfId.isEmpty()) { - continue; - } + for (String oneOfId : SLASH_SPLITTER.split(id)) { checkPrefixedIdentifierInternal(statement, oneOfId); } } catch (YangValidationException e) { @@ -166,7 +164,7 @@ final class BasicValidations { } private static void checkPresentChildOfTypeInternal(final ParseTree parent, final Set> expectedChildType, - final MessageProvider message, final boolean atMostOne) { + final MessageProvider message, final boolean atMostOne) { if (!checkPresentChildOfTypeSafe(parent, expectedChildType, atMostOne)) { String str = atMostOne ? "(Expected exactly one statement) " + message.getMessage() : message.getMessage(); ValidationUtil.ex(str); @@ -217,10 +215,9 @@ final class BasicValidations { @Override public String getMessage() { StringBuilder childTypes = new StringBuilder(); - String orStr = " OR "; for (Class type : expectedChildTypes) { childTypes.append(ValidationUtil.getSimpleStatementName(type)); - childTypes.append(orStr); + childTypes.append(" OR "); } String message = ValidationUtil.f("Missing %s statement in %s:%s", childTypes.toString(), ValidationUtil.getSimpleStatementName(parent.getClass()), ValidationUtil.getName(parent)); @@ -241,7 +238,7 @@ final class BasicValidations { } private static boolean checkPresentChildOfTypeSafe(final ParseTree parent, final Set> expectedChildType, - final boolean atMostOne) { + final boolean atMostOne) { int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType); @@ -249,19 +246,19 @@ final class BasicValidations { } private static boolean checkPresentChildOfTypeSafe(final ParseTree parent, final Class expectedChildType, - final boolean atMostOne) { + final boolean atMostOne) { int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType); return atMostOne ? foundChildrenOfType == 1 : foundChildrenOfType != 0; } - static List getAndCheckUniqueKeys(final ParseTree ctx) { + static Iterable getAndCheckUniqueKeys(final ParseTree ctx) { String key = ValidationUtil.getName(ctx); ParseTree parent = ctx.getParent(); String rootParentName = ValidationUtil.getRootParentName(ctx); - List keyList = ValidationUtil.listKeysFromId(key); + Iterable keyList = ValidationUtil.listKeysFromId(key); Set duplicates = ValidationUtil.getDuplicates(keyList); if (duplicates.size() != 0) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ValidationUtil.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ValidationUtil.java index ad99fb95df..431e55ea6c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ValidationUtil.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ValidationUtil.java @@ -7,11 +7,11 @@ */ package org.opendaylight.yangtools.yang.parser.impl; -import java.util.Arrays; -import java.util.Collection; +import com.google.common.base.Splitter; + import java.util.HashSet; -import java.util.List; import java.util.Set; + import org.antlr.v4.runtime.tree.ParseTree; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_stmtContext; @@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.parser.util.YangValidationException; * Validation utilities */ final class ValidationUtil { + private static final Splitter SPACE_SPLITTER = Splitter.on(' '); /** * It isn't desirable to create instance of this class @@ -28,11 +29,11 @@ final class ValidationUtil { private ValidationUtil() { } - static void ex(String message) { + static void ex(final String message) { throw new YangValidationException(message); } - static Set getDuplicates(Collection keyList) { + static Set getDuplicates(final Iterable keyList) { Set all = new HashSet<>(); Set duplicates = new HashSet<>(); @@ -44,16 +45,16 @@ final class ValidationUtil { return duplicates; } - static List listKeysFromId(String keys) { - return Arrays.asList(keys.split(" ")); + static Iterable listKeysFromId(final String keys) { + return SPACE_SPLITTER.split(keys); } - static String getRootParentName(ParseTree ctx) { + static String getRootParentName(final ParseTree ctx) { ParseTree root = getRootParent(ctx); return ValidationUtil.getName(root); } - private static ParseTree getRootParent(ParseTree ctx) { + private static ParseTree getRootParent(final ParseTree ctx) { ParseTree root = ctx; while (root.getParent() != null) { if (root.getClass().equals(Module_stmtContext.class) || root.getClass().equals(Submodule_stmtContext.class)) { @@ -64,18 +65,18 @@ final class ValidationUtil { return root; } - static String getName(ParseTree child) { + static String getName(final ParseTree child) { return ParserListenerUtils.stringFromNode(child); } - static String f(String base, Object... args) { + static String f(final String base, final Object... args) { return String.format(base, args); } /** * Get simple name from statement class e.g. Module from Module_stmt_context */ - static String getSimpleStatementName(Class typeOfStatement) { + static String getSimpleStatementName(final Class typeOfStatement) { String className = typeOfStatement.getSimpleName(); int lastIndexOf = className.indexOf('$'); @@ -85,7 +86,7 @@ final class ValidationUtil { return className.substring(0, index).replace('_', '-'); } - static int countPresentChildrenOfType(ParseTree parent, Set> expectedChildTypes) { + static int countPresentChildrenOfType(final ParseTree parent, final Set> expectedChildTypes) { int foundChildrenOfType = 0; for (Class type : expectedChildTypes) { @@ -94,7 +95,7 @@ final class ValidationUtil { return foundChildrenOfType; } - static int countPresentChildrenOfType(ParseTree parent, Class expectedChildType) { + static int countPresentChildrenOfType(final ParseTree parent, final Class expectedChildType) { int foundChildrenOfType = 0; for (int i = 0; i < parent.getChildCount(); i++) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java index aefd0ba1b9..cea011edcb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java @@ -27,6 +27,7 @@ import static org.opendaylight.yangtools.yang.parser.builder.impl.TypeUtils.reso import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; import com.google.common.collect.HashBiMap; import com.google.common.io.ByteSource; @@ -39,6 +40,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -104,16 +106,14 @@ import org.slf4j.LoggerFactory; @Immutable public final class YangParserImpl implements YangContextParser { private static final Logger LOG = LoggerFactory.getLogger(YangParserImpl.class); - private static final String FAIL_DEVIATION_TARGET = "Failed to find deviation target."; + private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final YangParserImpl INSTANCE = new YangParserImpl(); public static YangParserImpl getInstance() { return INSTANCE; } - - @Override @Deprecated public Set parseYangModels(final File yangFile, final File directory) { @@ -1084,7 +1084,7 @@ public final class YangParserImpl implements YangContextParser { ModuleBuilder targetModule; String prefix = qname.getPrefix(); - if (prefix == null || prefix.equals("")) { + if (prefix == null || prefix.isEmpty()) { targetModule = module; } else { targetModule = findModuleFromBuilders(modules, module, qname.getPrefix(), line); @@ -1186,14 +1186,15 @@ public final class YangParserImpl implements YangContextParser { if (baseIdentityName != null) { IdentitySchemaNodeBuilder result = null; - if (baseIdentityName.contains(":")) { - String[] splittedBase = baseIdentityName.split(":"); - if (splittedBase.length > 2) { + if (baseIdentityName.indexOf(':') != -1) { + final Iterator split = COLON_SPLITTER.split(baseIdentityName).iterator(); + final String prefix = split.next(); + final String name = split.next(); + if (split.hasNext()) { throw new YangParseException(module.getName(), line, "Failed to parse identityref base: " + baseIdentityName); } - String prefix = splittedBase[0]; - String name = splittedBase[1]; + ModuleBuilder dependentModule = findTargetModule(prefix, module, modules, context, line); if (dependentModule != null) { result = BuilderUtils.findIdentity(dependentModule.getAddedIdentities(), name); diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java index bd532bdf13..49fd845515 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java @@ -24,14 +24,19 @@ import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.pa import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.parseYinValue; import static org.opendaylight.yangtools.yang.parser.impl.ParserListenerUtils.stringFromNode; +import com.google.common.base.Splitter; import com.google.common.base.Strings; +import com.google.common.collect.Iterables; + import java.net.URI; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Iterator; import java.util.List; import java.util.Stack; + import org.antlr.v4.runtime.tree.ParseTree; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser; import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Argument_stmtContext; @@ -97,17 +102,17 @@ import org.slf4j.LoggerFactory; public final class YangParserListenerImpl extends YangParserBaseListener { private static final Logger LOGGER = LoggerFactory.getLogger(YangParserListenerImpl.class); + private static final Splitter COLON_SPLITTER = Splitter.on(':'); private static final String AUGMENT_STR = "augment"; + private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + private final Stack> actualPath = new Stack<>(); private final String sourcePath; private ModuleBuilder moduleBuilder; private String moduleName; private URI namespace; private String yangModelPrefix; private Date revision = new Date(0L); - - private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - private final Stack> actualPath = new Stack<>(); private int augmentOrder; private void addNodeToPath(final QName name) { @@ -125,7 +130,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void enterModule_stmt(final YangParser.Module_stmtContext ctx) { moduleName = stringFromNode(ctx); - LOGGER.trace("entering module " + moduleName); + LOGGER.trace("entering module {}", moduleName); enterLog("module", moduleName, 0); actualPath.push(new Stack()); @@ -157,7 +162,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { @Override public void enterSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) { moduleName = stringFromNode(ctx); - LOGGER.trace("entering submodule " + moduleName); + LOGGER.trace("entering submodule {}", moduleName); enterLog("submodule", moduleName, 0); actualPath.push(new Stack()); @@ -181,12 +186,14 @@ public final class YangParserListenerImpl extends YangParserBaseListener { moduleBuilder.setReference(reference); } - @Override public void exitSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) { + @Override + public void exitSubmodule_stmt(final YangParser.Submodule_stmtContext ctx) { exitLog("submodule"); actualPath.pop(); } - @Override public void enterBelongs_to_stmt(final YangParser.Belongs_to_stmtContext ctx) { + @Override + public void enterBelongs_to_stmt(final YangParser.Belongs_to_stmtContext ctx) { moduleBuilder.setBelongsTo(stringFromNode(ctx)); } @@ -439,25 +446,25 @@ public final class YangParserListenerImpl extends YangParserBaseListener { } else { QName qname; switch (typeName) { - case "union": - qname = BaseTypes.constructQName("union"); - addNodeToPath(qname); - UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision); - Builder parent = moduleBuilder.getActualNode(); - unionBuilder.setParent(parent); - moduleBuilder.enterNode(unionBuilder); - break; - case "identityref": - qname = BaseTypes.constructQName("identityref"); - addNodeToPath(qname); - SchemaPath path = createActualSchemaPath(actualPath.peek()); - moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody)); - break; - default: - type = parseTypeWithBody(typeName, typeBody, actualPath.peek(), namespace, revision, - yangModelPrefix, moduleBuilder.getActualNode()); - moduleBuilder.setType(type); - addNodeToPath(type.getQName()); + case "union": + qname = BaseTypes.constructQName("union"); + addNodeToPath(qname); + UnionTypeBuilder unionBuilder = moduleBuilder.addUnionType(line, namespace, revision); + Builder parent = moduleBuilder.getActualNode(); + unionBuilder.setParent(parent); + moduleBuilder.enterNode(unionBuilder); + break; + case "identityref": + qname = BaseTypes.constructQName("identityref"); + addNodeToPath(qname); + SchemaPath path = createActualSchemaPath(actualPath.peek()); + moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody)); + break; + default: + type = parseTypeWithBody(typeName, typeBody, actualPath.peek(), namespace, revision, + yangModelPrefix, moduleBuilder.getActualNode()); + moduleBuilder.setType(type); + addNodeToPath(type.getQName()); } } } else { @@ -472,11 +479,11 @@ public final class YangParserListenerImpl extends YangParserBaseListener { } private QName parseQName(final String typeName) { - QName typeQName; - if (typeName.contains(":")) { - String[] splittedName = typeName.split(":"); - String prefix = splittedName[0]; - String name = splittedName[1]; + final QName typeQName; + if (typeName.indexOf(':') != -1) { + final Iterator split = COLON_SPLITTER.split(typeName).iterator(); + final String prefix = split.next(); + final String name = split.next(); if (prefix.equals(yangModelPrefix)) { typeQName = new QName(namespace, revision, prefix, name); } else { @@ -1046,30 +1053,32 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String nodeParameter = stringFromNode(ctx); enterLog("unknown-node", nodeParameter, line); - QName nodeType; final String nodeTypeStr = ctx.getChild(0).getText(); - final String[] splittedElement = nodeTypeStr.split(":"); - if (splittedElement.length == 1) { - nodeType = new QName(namespace, revision, yangModelPrefix, splittedElement[0]); + final Iterator splittedElement = COLON_SPLITTER.split(nodeTypeStr).iterator(); + final String e0 = splittedElement.next(); + final QName nodeType; + if (splittedElement.hasNext()) { + nodeType = new QName(namespace, revision, e0, splittedElement.next()); } else { - nodeType = new QName(namespace, revision, splittedElement[0], splittedElement[1]); + nodeType = new QName(namespace, revision, yangModelPrefix, e0); } QName qname; try { if (!Strings.isNullOrEmpty(nodeParameter)) { - String[] splittedName = nodeParameter.split(":"); - if (splittedName.length == 2) { - qname = new QName(null, null, splittedName[0], splittedName[1]); + final Iterable splittedName = COLON_SPLITTER.split(nodeParameter); + final Iterator it = splittedName.iterator(); + + if (Iterables.size(splittedName) == 2) { + qname = new QName(null, null, it.next(), it.next()); } else { - qname = new QName(namespace, revision, yangModelPrefix, splittedName[0]); + qname = new QName(namespace, revision, yangModelPrefix, it.next()); } } else { qname = nodeType; } } catch (IllegalArgumentException e) { qname = nodeType; - } addNodeToPath(qname); SchemaPath path = createActualSchemaPath(actualPath.peek()); -- 2.36.6