import org.checkerframework.checker.regex.qual.Regex;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
private static final BigDecimal YANG_MAX_NUM = BigDecimal.valueOf(Double.MAX_VALUE);
private ArgumentUtils() {
- throw new UnsupportedOperationException();
+ // Hidden on purpose
}
public static int compareNumbers(final Number n1, final Number n2) {
}
}
- public static RevisionAwareXPath parseXPath(final StmtContext<?, ?, ?> ctx, final String path) {
- return XPathSupport.parseXPath(ctx, path);
- }
-
public static boolean isAbsoluteXPath(final String path) {
return PATH_ABS.matcher(path).matches();
}
- @SuppressWarnings("checkstyle:illegalCatch")
+ public static Absolute parseAbsoluteSchemaNodeIdentifier(final StmtContext<?, ?, ?> ctx, final String str) {
+ // FIXME: this does accept check for a leading slash
+ return Absolute.of(parseNodeIdentifiers(ctx, str));
+ }
+
+ public static Descendant parseDescendantSchemaNodeIdentifier(final StmtContext<?, ?, ?> ctx, final String str) {
+ // FIXME: this does accept a leading slash
+ return Descendant.of(parseNodeIdentifiers(ctx, str));
+ }
+
public static SchemaNodeIdentifier nodeIdentifierFromPath(final StmtContext<?, ?, ?> ctx, final String path) {
+ final List<QName> qnames = parseNodeIdentifiers(ctx, path);
+ return PATH_ABS.matcher(path).matches() ? Absolute.of(qnames) : Descendant.of(qnames);
+ }
+
+ @SuppressWarnings("checkstyle:illegalCatch")
+ private static List<QName> parseNodeIdentifiers(final StmtContext<?, ?, ?> ctx, final String path) {
// FIXME: is the path trimming really necessary??
- final List<QName> qNames = new ArrayList<>();
+ final List<QName> qnames = new ArrayList<>();
for (final String nodeName : SLASH_SPLITTER.split(trimSingleLastSlashFromXPath(path))) {
try {
- qNames.add(StmtContextUtils.parseNodeIdentifier(ctx, nodeName));
+ qnames.add(StmtContextUtils.parseNodeIdentifier(ctx, nodeName));
} catch (final RuntimeException e) {
throw new SourceException(ctx.getStatementSourceReference(), e,
"Failed to parse node '%s' in path '%s'", nodeName, path);
}
}
- return SchemaNodeIdentifier.create(qNames, PATH_ABS.matcher(path).matches());
+ if (qnames.isEmpty()) {
+ throw new SourceException("Schema node identifier must not be empty", ctx.getStatementSourceReference());
+ }
+ return qnames;
}
private static String trimSingleLastSlashFromXPath(final String path) {