package org.basex.http.restxq; import org.basex.http.*; import org.basex.query.QueryException; import org.basex.query.value.item.QNm; import org.basex.util.InputInfo; import java.util.List; import java.util.Map; /** * This class represents the path of a RESTXQ function. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ final class RestXqPath implements Comparable<RestXqPath> { /** Path. */ private final String path; /** Path matcher. */ private final RestXqPathMatcher matcher; /** * Constructor. * @param path path * @param info input info * @throws QueryException query exception */ RestXqPath(final String path, final InputInfo info) throws QueryException { this.path = path; matcher = RestXqPathMatcher.parse(path, info); } /** * Checks if the path matches the HTTP request. * @param conn HTTP connection * @return result of check */ boolean matches(final HTTPConnection conn) { return matcher.matches(conn.path()); } /** * Returns the names of the template variables. * @return list of qualified variable names */ List<QNm> vars() { return matcher.vars; } /** * Gets the variable values for the given HTTP context path. * @param conn HTTP connection * @return map with variable values */ Map<QNm, String> values(final HTTPConnection conn) { return matcher.values(conn.path()); } /** * Checks if the specified path segment is a template. * @param s offset of segment * @return result of check */ private boolean isTemplate(final int s) { return matcher.varsPos.testBit(s); } @Override public int compareTo(final RestXqPath rxs) { final int ms = matcher.segments; final int d = ms - rxs.matcher.segments; if(d != 0) return d; for(int s = 0; s < ms; s++) { final boolean wc1 = isTemplate(s), wc2 = rxs.isTemplate(s); if(wc1 != wc2) return wc1 ? 1 : -1; } return 0; } @Override public String toString() { return path; } }