/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.util.pattern;

import org.springframework.lang.Nullable;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.pattern.PathPattern.MatchingContext;

Common supertype for the Ast nodes created to represent a path pattern.
Author:Andy Clement
Since:5.0
/** * Common supertype for the Ast nodes created to represent a path pattern. * * @author Andy Clement * @since 5.0 */
abstract class PathElement { // Score related protected static final int WILDCARD_WEIGHT = 100; protected static final int CAPTURE_VARIABLE_WEIGHT = 1; protected static final MultiValueMap<String,String> NO_PARAMETERS = new LinkedMultiValueMap<>(); // Position in the pattern where this path element starts protected final int pos; // The separator used in this path pattern protected final char separator; // The next path element in the chain @Nullable protected PathElement next; // The previous path element in the chain @Nullable protected PathElement prev;
Create a new path element.
Params:
  • pos – the position where this path element starts in the pattern data
  • separator – the separator in use in the path pattern
/** * Create a new path element. * @param pos the position where this path element starts in the pattern data * @param separator the separator in use in the path pattern */
PathElement(int pos, char separator) { this.pos = pos; this.separator = separator; }
Attempt to match this path element.
Params:
  • candidatePos – the current position within the candidate path
  • matchingContext – encapsulates context for the match including the candidate
Returns:true if it matches, otherwise false
/** * Attempt to match this path element. * @param candidatePos the current position within the candidate path * @param matchingContext encapsulates context for the match including the candidate * @return {@code true} if it matches, otherwise {@code false} */
public abstract boolean matches(int candidatePos, MatchingContext matchingContext);
Return the length of the path element where captures are considered to be one character long.
Returns:the normalized length
/** * Return the length of the path element where captures are considered to be one character long. * @return the normalized length */
public abstract int getNormalizedLength(); public abstract char[] getChars();
Return the number of variables captured by the path element.
/** * Return the number of variables captured by the path element. */
public int getCaptureCount() { return 0; }
Return the number of wildcard elements (*, ?) in the path element.
/** * Return the number of wildcard elements (*, ?) in the path element. */
public int getWildcardCount() { return 0; }
Return the score for this PathElement, combined score is used to compare parsed patterns.
/** * Return the score for this PathElement, combined score is used to compare parsed patterns. */
public int getScore() { return 0; }
Return if the there are no more PathElements in the pattern.
Returns:true if the there are no more elements
/** * Return if the there are no more PathElements in the pattern. * @return {@code true} if the there are no more elements */
protected final boolean isNoMorePattern() { return this.next == null; } }