static PathContainer createFromUrlPath(String path) { if (path.equals("")) { return EMPTY_PATH; } String separator = "/"; Separator separatorElement = separator.equals(SEPARATOR.value()) ? SEPARATOR : () -> separator; List<Element> elements = new ArrayList<>(); int begin; if (path.length() > 0 && path.startsWith(separator)) { begin = separator.length(); elements.add(separatorElement); } else { begin = 0; } while (begin < path.length()) { int end = path.indexOf(separator, begin); String segment = (end != -1 ? path.substring(begin, end) : path.substring(begin)); if (!segment.equals("")) { elements.add(parsePathSegment(segment)); } if (end == -1) { break; } elements.add(separatorElement); begin = end + separator.length(); } return new DefaultPathContainer(path, elements); }
/** * Parse the path value into a sequence of {@link Separator Separator} and * {@link PathSegment PathSegment} elements. * @param path the encoded, raw URL path value to parse * @return the parsed path */ static PathContainer parsePath(String path) { return DefaultPathContainer.createFromUrlPath(path); }
private static MultiValueMap<String, String> parsePathParams(String input, Charset charset) { MultiValueMap<String, String> result = new LinkedMultiValueMap<>(); int begin = 1; while (begin < input.length()) { int end = input.indexOf(';', begin); String param = (end != -1 ? input.substring(begin, end) : input.substring(begin)); parsePathParamValues(param, charset, result); if (end == -1) { break; } begin = end + 1; } return result; }
/** * Extract a sub-path from the given start offset (inclusive) into the * element list and to the end offset (exclusive). * @param startIndex the start element index (inclusive) * @param endIndex the end element index (exclusive) * @return the sub-path */ default PathContainer subPath(int startIndex, int endIndex) { return DefaultPathContainer.subPath(this, startIndex, endIndex); }
private static PathSegment parsePathSegment(String segment) { Charset charset = StandardCharsets.UTF_8; int index = segment.indexOf(';'); if (index == -1) { String valueToMatch = StringUtils.uriDecode(segment, charset); return new DefaultPathSegment(segment, valueToMatch, EMPTY_MAP); } else { String valueToMatch = StringUtils.uriDecode(segment.substring(0, index), charset); String pathParameterContent = segment.substring(index); MultiValueMap<String, String> parameters = parsePathParams(pathParameterContent, charset); return new DefaultPathSegment(segment, valueToMatch, parameters); } }
static PathContainer subPath(PathContainer container, int fromIndex, int toIndex) { List<Element> elements = container.elements(); if (fromIndex == 0 && toIndex == elements.size()) { return container; } if (fromIndex == toIndex) { return EMPTY_PATH; } Assert.isTrue(fromIndex >= 0 && fromIndex < elements.size(), () -> "Invalid fromIndex: " + fromIndex); Assert.isTrue(toIndex >= 0 && toIndex <= elements.size(), () -> "Invalid toIndex: " + toIndex); Assert.isTrue(fromIndex < toIndex, () -> "fromIndex: " + fromIndex + " should be < toIndex " + toIndex); List<Element> subList = elements.subList(fromIndex, toIndex); String path = subList.stream().map(Element::value).collect(Collectors.joining("")); return new DefaultPathContainer(path, subList); }
@Override public String toString() { return value(); }
/** * Extract a sub-path from the given start offset (inclusive) into the * element list and to the end offset (exclusive). * @param startIndex the start element index (inclusive) * @param endIndex the end element index (exclusive) * @return the sub-path */ default PathContainer subPath(int startIndex, int endIndex) { return DefaultPathContainer.subPath(this, startIndex, endIndex); }
private static PathSegment parsePathSegment(String segment) { Charset charset = StandardCharsets.UTF_8; int index = segment.indexOf(';'); if (index == -1) { String valueToMatch = StringUtils.uriDecode(segment, charset); return new DefaultPathSegment(segment, valueToMatch, EMPTY_MAP); } else { String valueToMatch = StringUtils.uriDecode(segment.substring(0, index), charset); String pathParameterContent = segment.substring(index); MultiValueMap<String, String> parameters = parsePathParams(pathParameterContent, charset); return new DefaultPathSegment(segment, valueToMatch, parameters); } }
static PathContainer subPath(PathContainer container, int fromIndex, int toIndex) { List<Element> elements = container.elements(); if (fromIndex == 0 && toIndex == elements.size()) { return container; } if (fromIndex == toIndex) { return EMPTY_PATH; } Assert.isTrue(fromIndex >= 0 && fromIndex < elements.size(), () -> "Invalid fromIndex: " + fromIndex); Assert.isTrue(toIndex >= 0 && toIndex <= elements.size(), () -> "Invalid toIndex: " + toIndex); Assert.isTrue(fromIndex < toIndex, () -> "fromIndex: " + fromIndex + " should be < toIndex " + toIndex); List<Element> subList = elements.subList(fromIndex, toIndex); String path = subList.stream().map(Element::value).collect(Collectors.joining("")); return new DefaultPathContainer(path, subList); }
@Override public String toString() { return value(); }
static PathContainer createFromUrlPath(String path) { if (path.equals("")) { return EMPTY_PATH; } String separator = "/"; Separator separatorElement = separator.equals(SEPARATOR.value()) ? SEPARATOR : () -> separator; List<Element> elements = new ArrayList<>(); int begin; if (path.length() > 0 && path.startsWith(separator)) { begin = separator.length(); elements.add(separatorElement); } else { begin = 0; } while (begin < path.length()) { int end = path.indexOf(separator, begin); String segment = (end != -1 ? path.substring(begin, end) : path.substring(begin)); if (!segment.equals("")) { elements.add(parsePathSegment(segment)); } if (end == -1) { break; } elements.add(separatorElement); begin = end + separator.length(); } return new DefaultPathContainer(path, elements); }
/** * Parse the path value into a sequence of {@link Separator Separator} and * {@link PathSegment PathSegment} elements. * @param path the encoded, raw URL path value to parse * @return the parsed path */ static PathContainer parsePath(String path) { return DefaultPathContainer.createFromUrlPath(path); }
/** * Extract a sub-path from the given start offset (inclusive) into the * element list and to the end offset (exclusive). * @param startIndex the start element index (inclusive) * @param endIndex the end element index (exclusive) * @return the sub-path */ default PathContainer subPath(int startIndex, int endIndex) { return DefaultPathContainer.subPath(this, startIndex, endIndex); }
private static MultiValueMap<String, String> parsePathParams(String input, Charset charset) { MultiValueMap<String, String> result = new LinkedMultiValueMap<>(); int begin = 1; while (begin < input.length()) { int end = input.indexOf(';', begin); String param = (end != -1 ? input.substring(begin, end) : input.substring(begin)); parsePathParamValues(param, charset, result); if (end == -1) { break; } begin = end + 1; } return result; }
private static PathSegment parsePathSegment(String segment) { Charset charset = StandardCharsets.UTF_8; int index = segment.indexOf(';'); if (index == -1) { String valueToMatch = StringUtils.uriDecode(segment, charset); return new DefaultPathSegment(segment, valueToMatch, EMPTY_MAP); } else { String valueToMatch = StringUtils.uriDecode(segment.substring(0, index), charset); String pathParameterContent = segment.substring(index); MultiValueMap<String, String> parameters = parsePathParams(pathParameterContent, charset); return new DefaultPathSegment(segment, valueToMatch, parameters); } }
static PathContainer subPath(PathContainer container, int fromIndex, int toIndex) { List<Element> elements = container.elements(); if (fromIndex == 0 && toIndex == elements.size()) { return container; } if (fromIndex == toIndex) { return EMPTY_PATH; } Assert.isTrue(fromIndex >= 0 && fromIndex < elements.size(), () -> "Invalid fromIndex: " + fromIndex); Assert.isTrue(toIndex >= 0 && toIndex <= elements.size(), () -> "Invalid toIndex: " + toIndex); Assert.isTrue(fromIndex < toIndex, () -> "fromIndex: " + fromIndex + " should be < toIndex " + toIndex); List<Element> subList = elements.subList(fromIndex, toIndex); String path = subList.stream().map(Element::value).collect(Collectors.joining("")); return new DefaultPathContainer(path, subList); }
@Override public String toString() { return value(); }
static PathContainer createFromUrlPath(String path) { if (path.equals("")) { return EMPTY_PATH; } String separator = "/"; Separator separatorElement = separator.equals(SEPARATOR.value()) ? SEPARATOR : () -> separator; List<Element> elements = new ArrayList<>(); int begin; if (path.length() > 0 && path.startsWith(separator)) { begin = separator.length(); elements.add(separatorElement); } else { begin = 0; } while (begin < path.length()) { int end = path.indexOf(separator, begin); String segment = (end != -1 ? path.substring(begin, end) : path.substring(begin)); if (!segment.equals("")) { elements.add(parsePathSegment(segment)); } if (end == -1) { break; } elements.add(separatorElement); begin = end + separator.length(); } return new DefaultPathContainer(path, elements); }
/** * Parse the path value into a sequence of {@link Separator Separator} and * {@link PathSegment PathSegment} elements. * @param path the encoded, raw URL path value to parse * @return the parsed path */ static PathContainer parsePath(String path) { return DefaultPathContainer.createFromUrlPath(path); }