Skip to content

Commit

Permalink
Improved PathSpec handling for servletName & pathInfo (#7947)
Browse files Browse the repository at this point in the history
* Introduce MatchedResource
* Introduce MatchedPath
* Improved group matching with optimized Tries
* Deprecate old APIs
* Introduced final preMatchedPath when possible

Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
Co-authored-by: Greg Wilkins <gregw@webtide.com>
  • Loading branch information
joakime and gregw committed Jun 7, 2022
1 parent 208b150 commit 5b4d1dd
Show file tree
Hide file tree
Showing 21 changed files with 1,041 additions and 355 deletions.
Expand Up @@ -36,7 +36,12 @@ public int compareTo(PathSpec other)
return diff;

// Path Spec Name (alphabetical)
return getDeclaration().compareTo(other.getDeclaration());
diff = getDeclaration().compareTo(other.getDeclaration());
if (diff != 0)
return diff;

// Path Implementation
return getClass().getName().compareTo(other.getClass().getName());
}

@Override
Expand All @@ -55,7 +60,7 @@ public final boolean equals(Object obj)
@Override
public final int hashCode()
{
return Objects.hash(getDeclaration());
return Objects.hash(getGroup().ordinal(), getSpecLength(), getDeclaration(), getClass().getName());
}

@Override
Expand Down
@@ -0,0 +1,81 @@
//
// ========================================================================
// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//

package org.eclipse.jetty.http.pathmap;

public interface MatchedPath
{
MatchedPath EMPTY = new MatchedPath()
{
@Override
public String getPathMatch()
{
return null;
}

@Override
public String getPathInfo()
{
return null;
}

@Override
public String toString()
{
return MatchedPath.class.getSimpleName() + ".EMPTY";
}
};

static MatchedPath from(String pathMatch, String pathInfo)
{
return new MatchedPath()
{
@Override
public String getPathMatch()
{
return pathMatch;
}

@Override
public String getPathInfo()
{
return pathInfo;
}

@Override
public String toString()
{
return MatchedPath.class.getSimpleName() + "[pathMatch=" + pathMatch + ", pathInfo=" + pathInfo + "]";
}
};
}

/**
* Return the portion of the path that matches a path spec.
*
* @return the path name portion of the match.
*/
String getPathMatch();

/**
* Return the portion of the path that is after the path spec.
*
* @return the path info portion of the match, or null if there is no portion after the {@link #getPathMatch()}
*/
String getPathInfo();
}
@@ -0,0 +1,76 @@
//
// ========================================================================
// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//

package org.eclipse.jetty.http.pathmap;

import java.util.Map;

/**
* The match details when using {@link PathMappings#getMatched(String)}, used to minimize return to the PathSpec or PathMappings for subsequent details
* that are now provided by the {@link MatchedPath} instance.
*
* @param <E> the type of resource (IncludeExclude uses boolean, WebSocket uses endpoint/endpoint config, servlet uses ServletHolder, etc)
*/
public class MatchedResource<E>
{
private final E resource;
private final PathSpec pathSpec;
private final MatchedPath matchedPath;

public MatchedResource(E resource, PathSpec pathSpec, MatchedPath matchedPath)
{
this.resource = resource;
this.pathSpec = pathSpec;
this.matchedPath = matchedPath;
}

public static <E> MatchedResource<E> of(Map.Entry<PathSpec, E> mapping, MatchedPath matchedPath)
{
return new MatchedResource<>(mapping.getValue(), mapping.getKey(), matchedPath);
}

public PathSpec getPathSpec()
{
return this.pathSpec;
}

public E getResource()
{
return this.resource;
}

/**
* Return the portion of the path that matches a path spec.
*
* @return the path name portion of the match.
*/
public String getPathMatch()
{
return matchedPath.getPathMatch();
}

/**
* Return the portion of the path that is after the path spec.
*
* @return the path info portion of the match, or null if there is no portion after the {@link #getPathMatch()}
*/
public String getPathInfo()
{
return matchedPath.getPathInfo();
}
}

0 comments on commit 5b4d1dd

Please sign in to comment.