Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@ We can add EmbedHTTP to your project using Maven or Gradle.
<dependency>
<groupId>net.uiqui</groupId>
<artifactId>embedhttp</artifactId>
<version>0.5.4</version>
<version>0.5.5</version>
</dependency>
```

#### Gradle
```groovy
implementation 'net.uiqui:embedhttp:0.5.4'
implementation 'net.uiqui:embedhttp:0.5.5'
```


Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GROUP=net.uiqui
POM_ARTIFACT_ID=embedhttp
VERSION_NAME=0.5.4
VERSION_NAME=0.5.5

POM_NAME=EmbedHTTP
POM_DESCRIPTION=A lightweight, dependency-free HTTP server for embedding in projects.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.uiqui.embedhttp.routing;

public class InvalidRouteException extends RuntimeException {
public InvalidRouteException(String message) {
super(message);
}
}
31 changes: 0 additions & 31 deletions src/main/java/net/uiqui/embedhttp/routing/PathPatternCompiler.java

This file was deleted.

162 changes: 162 additions & 0 deletions src/main/java/net/uiqui/embedhttp/routing/PathSegment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
package net.uiqui.embedhttp.routing;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract sealed class PathSegment {
protected static final String MATCH_ALL = "*";

protected final PathSegment parent;
private final Map<String, PathSegment> children = new HashMap<>();
protected Route route;

protected PathSegment(PathSegment parent, Route route) {
this.parent = parent;
this.route = route;
}

public int getChildCount() {
return children.size();
}

public PathSegment findChild(String segment, boolean ignoreMachAll) {
var child = children.get(segment);
if (child != null) {
return child;
}

if (ignoreMachAll) {
return null;
}

return findParameterChild();
}

public PathSegment findParameterChild() {
return children.get(MATCH_ALL);
}

public boolean hasRoute() {
return route != null;
}

public Route getRoute() {
return route;
}

public PathSegment registerParameterChild(String pathParameter, Route route) {
return registerChild(MATCH_ALL, new Parameter(this, pathParameter, route));
}

public PathSegment registerStaticChild(String pathSegment, Route route) {
return registerChild(pathSegment, new Static(this, pathSegment, route));
}

private PathSegment registerChild(String segmentKey, PathSegment child) {
if (children.containsKey(segmentKey)) {
throw new InvalidRouteException("Path segment '" + segmentKey + "' already exists at '" + this + "'.");
}

children.put(segmentKey, child);
return child;
}

public List<Route> getAllRoutes() {
var routes = new ArrayList<Route>();

if (hasRoute()) {
routes.add(getRoute());
}

for (PathSegment child : children.values()) {
routes.addAll(child.getAllRoutes());
}

return routes;
}

public List<String> getTreePaths() {
var paths = new ArrayList<String>();
var buffer = new StringBuilder();

buffer.append(this);

if (hasRoute()) {
buffer.append("+");
}

paths.add(buffer.toString());

for (PathSegment child : children.values()) {
paths.addAll(child.getTreePaths());
}

return paths;
}

static final class Root extends PathSegment {
public Root() {
super(null, null);
}

@Override
public String toString() {
return "/";
}

public void setRoute(Route route) {
if (hasRoute()) {
throw new InvalidRouteException("Path segment '/' already has a handler.");
}

this.route = route;
}
}

static final class Parameter extends PathSegment {
private final String parameterName;

private Parameter(PathSegment parent, String parameterName, Route handler) {
super(parent, handler);
this.parameterName = parameterName;
}

public String getParameterName() {
return parameterName;
}

@Override
public String toString() {
var parentPath = parent.toString();

if (!parentPath.endsWith("/")) {
parentPath += "/";
}

return parentPath + ":" + parameterName;
}
}

static final class Static extends PathSegment {
private final String pathSegment;

private Static(PathSegment parent, String pathSegment, Route handler) {
super(parent, handler);
this.pathSegment = pathSegment;
}

@Override
public String toString() {
var parentPath = parent.toString();

if (!parentPath.endsWith("/")) {
parentPath += "/";
}

return parentPath + pathSegment;
}
}
}
7 changes: 0 additions & 7 deletions src/main/java/net/uiqui/embedhttp/routing/Route.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,15 @@
import net.uiqui.embedhttp.api.HttpRequestHandler;

import java.util.Objects;
import java.util.regex.Pattern;

public class Route {
private final HttpMethod method;
private final String pathPattern;
private final Pattern pathRegexPattern;
private final HttpRequestHandler handler;

public Route(HttpMethod method, String pathPattern, HttpRequestHandler handler) {
this.method = method;
this.pathPattern = pathPattern;
this.pathRegexPattern = PathPatternCompiler.compile(pathPattern);
this.handler = handler;
}

Expand All @@ -27,10 +24,6 @@ public String getPathPattern() {
return pathPattern;
}

public Pattern getPathRegexPattern() {
return pathRegexPattern;
}

public HttpRequestHandler getHandler() {
return handler;
}
Expand Down
Loading