--- /dev/null
+/*
+ * Copyright (c) 2019 Pantheon Technologies, s.r.o. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.xpath.impl;
+
+import javax.xml.xpath.XPathExpressionException;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.AbstractQName;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.QualifiedQName;
+import org.opendaylight.yangtools.yang.common.UnqualifiedQName;
+import org.opendaylight.yangtools.yang.common.YangNamespaceContext;
+import org.opendaylight.yangtools.yang.xpath.api.YangLiteralExpr;
+import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr;
+import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr.Resolved;
+import org.opendaylight.yangtools.yang.xpath.api.YangQNameExpr.Unresolved;
+
+/**
+ * Various simplistic utilities shared across classes.
+ */
+final class Utils {
+ private Utils() {
+
+ }
+
+ static Unresolved interpretAsQName(final YangLiteralExpr expr) throws XPathExpressionException {
+ final String text = expr.getLiteral();
+ final int colon = text.indexOf(':');
+
+ final AbstractQName qname;
+ try {
+ qname = colon != -1 ? QualifiedQName.of(text.substring(0, colon), text.substring(colon + 1))
+ : UnqualifiedQName.of(text);
+ } catch (IllegalArgumentException e) {
+ throw wrapException(e, "Cannot interpret %s as a QName", expr);
+ }
+
+ return YangQNameExpr.of(qname.intern());
+ }
+
+ static YangQNameExpr interpretAsQName(final YangNamespaceContext namespaceContext, final YangLiteralExpr expr)
+ throws XPathExpressionException {
+ final String text = expr.getLiteral();
+ final int colon = text.indexOf(':');
+ try {
+ if (colon == -1) {
+ return YangQNameExpr.of(UnqualifiedQName.of(text).intern());
+ }
+
+ return YangQNameExpr.of(namespaceContext.createQName(text.substring(0, colon), text.substring(colon + 1)));
+ } catch (IllegalArgumentException e) {
+ throw wrapException(e, "Cannot interpret %s as a QName", expr);
+ }
+ }
+
+ static Resolved interpretAsQName(final YangNamespaceContext namespaceContext,
+ final QNameModule defaultNamespace, final YangLiteralExpr expr) throws XPathExpressionException {
+ final String text = expr.getLiteral();
+ final int colon = text.indexOf(':');
+ final QName qname;
+
+ try {
+ qname = colon == -1 ? QName.create(defaultNamespace, text).intern()
+ : namespaceContext.createQName(text.substring(0, colon), text.substring(colon + 1));
+ } catch (IllegalArgumentException e) {
+ throw wrapException(e, "Cannot interpret %s as a QName", expr);
+ }
+
+ return YangQNameExpr.of(qname);
+ }
+
+ static XPathExpressionException wrapException(final @Nullable Throwable cause, final String format,
+ final Object... args) {
+ final XPathExpressionException ret = new XPathExpressionException(String.format(format, args));
+ ret.initCause(cause);
+ return ret;
+ }
+}