Eliminate use of String.split() 76/8676/2
authorRobert Varga <rovarga@cisco.com>
Fri, 4 Jul 2014 12:57:10 +0000 (14:57 +0200)
committerRobert Varga <rovarga@cisco.com>
Fri, 4 Jul 2014 13:51:18 +0000 (15:51 +0200)
Another round of optimizations, centered about not instantiating
implicit pattern matchers, but rather using Splitters.

Change-Id: I9ebba19fd9f211e7fa55e9bb55e35ae5e2a7b379
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/GroupingUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/BasicValidations.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/ValidationUtil.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangParserListenerImpl.java

index 2442d47b75eda5da1757538bffd88238690dd6f6..59689e16aaafade4b1ae42c5fd7021479629c6be 100644 (file)
@@ -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<String> 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<String, TreeMap<Date, ModuleBuilder>> 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) {
index b78fb046526674a8f0e09c1f374aec4ba2a10c33..0cdf493e75614c17666404b1059362ae66b85da1 100644 (file)
@@ -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<Class<? extends ParseTree>> 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<? extends ParseTree> 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<Class<? extends ParseTree>> 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<? extends ParseTree> expectedChildType,
-                                                       final boolean atMostOne) {
+            final boolean atMostOne) {
 
         int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType);
 
         return atMostOne ? foundChildrenOfType == 1 : foundChildrenOfType != 0;
     }
 
-    static List<String> getAndCheckUniqueKeys(final ParseTree ctx) {
+    static Iterable<String> getAndCheckUniqueKeys(final ParseTree ctx) {
         String key = ValidationUtil.getName(ctx);
         ParseTree parent = ctx.getParent();
         String rootParentName = ValidationUtil.getRootParentName(ctx);
 
-        List<String> keyList = ValidationUtil.listKeysFromId(key);
+        Iterable<String> keyList = ValidationUtil.listKeysFromId(key);
         Set<String> duplicates = ValidationUtil.getDuplicates(keyList);
 
         if (duplicates.size() != 0) {
index ad99fb95df85b0a5110366776e40a00b4d8bb98d..431e55ea6c43f9b63ffa8474598e8f212233df5b 100644 (file)
@@ -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<String> getDuplicates(Collection<String> keyList) {
+    static Set<String> getDuplicates(final Iterable<String> keyList) {
         Set<String> all = new HashSet<>();
         Set<String> duplicates = new HashSet<>();
 
@@ -44,16 +45,16 @@ final class ValidationUtil {
         return duplicates;
     }
 
-    static List<String> listKeysFromId(String keys) {
-        return Arrays.asList(keys.split(" "));
+    static Iterable<String> 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<? extends ParseTree> typeOfStatement) {
+    static String getSimpleStatementName(final Class<? extends ParseTree> 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<Class<? extends ParseTree>> expectedChildTypes) {
+    static int countPresentChildrenOfType(final ParseTree parent, final Set<Class<? extends ParseTree>> expectedChildTypes) {
         int foundChildrenOfType = 0;
 
         for (Class<? extends ParseTree> type : expectedChildTypes) {
@@ -94,7 +95,7 @@ final class ValidationUtil {
         return foundChildrenOfType;
     }
 
-    static int countPresentChildrenOfType(ParseTree parent, Class<? extends ParseTree> expectedChildType) {
+    static int countPresentChildrenOfType(final ParseTree parent, final Class<? extends ParseTree> expectedChildType) {
         int foundChildrenOfType = 0;
 
         for (int i = 0; i < parent.getChildCount(); i++) {
index aefd0ba1b93525ec19b20d0da6918eeeda1ba2c0..cea011edcbd4652a155d15b8185ad1d457e637a8 100644 (file)
@@ -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<Module> 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<String> 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);
index bd532bdf13038bb6a8363eda6a2480863fcb8378..49fd845515c20130e64e26a08032e6b29cf425fd 100644 (file)
@@ -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<Stack<QName>> 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<Stack<QName>> 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<QName>());
 
@@ -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<QName>());
 
@@ -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<String> 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<String> 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<String> splittedName = COLON_SPLITTER.split(nodeParameter);
+                final Iterator<String> 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());