Skip to content

Commit

Permalink
Support nested context paths.
Browse files Browse the repository at this point in the history
  • Loading branch information
chickenchickenlove committed Jul 30, 2024
1 parent e2b298d commit 1ca6d2f
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
import static com.linecorp.armeria.server.ServerBuilder.decorate;
import static java.util.Objects.requireNonNull;

import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.RouteDecoratingService;
import com.linecorp.armeria.internal.server.RouteUtil;
import com.linecorp.armeria.internal.server.annotation.AnnotatedServiceExtensions;
Expand All @@ -40,16 +42,33 @@ abstract class AbstractContextPathServicesBuilder<SELF extends AbstractContextPa
private final T parent;
private final VirtualHostBuilder virtualHostBuilder;

@Nullable
private SELF previousNode;


AbstractContextPathServicesBuilder(T parent, VirtualHostBuilder virtualHostBuilder,
Set<String> contextPaths) {
this(parent, virtualHostBuilder, contextPaths, ImmutableSet.of(), null);
}

AbstractContextPathServicesBuilder(T parent,
VirtualHostBuilder virtualHostBuilder,
Set<String> contextPaths,
Set<String> previousContextPaths,
@Nullable SELF previousNode) {
checkArgument(!contextPaths.isEmpty(), "At least one context path is required");
for (String contextPath: contextPaths) {
RouteUtil.ensureAbsolutePath(contextPath, "contextPath");
}

final Set<String> mergedContextPaths = previousContextPaths.isEmpty() ?
contextPaths :
mergeContextPaths(previousContextPaths, contextPaths);

this.parent = parent;
this.contextPaths = ImmutableSet.copyOf(contextPaths);
this.contextPaths = ImmutableSet.copyOf(mergedContextPaths);
this.virtualHostBuilder = virtualHostBuilder;
this.previousNode = previousNode;
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -406,7 +425,33 @@ public T and() {
return parent;
}

public abstract SELF contextPath(String... contextPaths);

final Set<String> contextPaths() {
return contextPaths;
}

T parent() {
return parent;
}

VirtualHostBuilder virtualHostBuilder() {
return virtualHostBuilder;
}

@Nullable
public SELF before() {
return previousNode;
}

private Set<String> mergeContextPaths(Set<String> previousContextPaths, Set<String> contextPaths) {
final Set<String> compositedPaths = new HashSet<>();
for (String previousPath : previousContextPaths) {
for (String contextPath : contextPaths) {
compositedPaths.add(previousPath + contextPath);
}
}
return compositedPaths;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,17 @@

package com.linecorp.armeria.server;

import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;

import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;

import javax.naming.Context;

import com.google.common.collect.ImmutableSet;

import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction;
import com.linecorp.armeria.server.annotation.RequestConverterFunction;
Expand All @@ -46,6 +51,24 @@ public final class ContextPathServicesBuilder
super(parent, virtualHostBuilder, contextPaths);
}

ContextPathServicesBuilder(ServerBuilder parent,
VirtualHostBuilder virtualHostBuilder,
Set<String> contextPaths,
Set<String> previousContextPaths,
ContextPathServicesBuilder contextPathServicesBuilder) {
super(parent, virtualHostBuilder, contextPaths, previousContextPaths, contextPathServicesBuilder);
}

@Override
public ContextPathServicesBuilder contextPath(String... contextPaths) {
final ImmutableSet<String> currentContextPaths = ImmutableSet.copyOf(requireNonNull(contextPaths, "contextPaths"));
return new ContextPathServicesBuilder(parent(),
virtualHostBuilder(),
currentContextPaths,
contextPaths(),
this);
}

/**
* Configures an {@link HttpService} under the context path with the {@code customizer}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import java.util.function.Consumer;
import java.util.function.Function;

import com.google.common.collect.ImmutableSet;

import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction;
import com.linecorp.armeria.server.annotation.RequestConverterFunction;
Expand All @@ -47,6 +49,23 @@ public final class VirtualHostContextPathServicesBuilder
super(parent, virtualHostBuilder, contextPaths);
}

VirtualHostContextPathServicesBuilder(VirtualHostBuilder parent, VirtualHostBuilder virtualHostBuilder,
Set<String> contextPaths,
Set<String> previousContextPaths,
VirtualHostContextPathServicesBuilder virtualHostContextPathServicesBuilder) {
super(parent, virtualHostBuilder, contextPaths, previousContextPaths, virtualHostContextPathServicesBuilder);
}

@Override
public VirtualHostContextPathServicesBuilder contextPath(String... contextPaths) {
final ImmutableSet<String> currentContextPaths = ImmutableSet.copyOf(requireNonNull(contextPaths, "contextPaths"));
return new VirtualHostContextPathServicesBuilder(parent(),
virtualHostBuilder(),
currentContextPaths,
contextPaths(),
this);
}

/**
* Configures an {@link HttpService} under the context path with the {@code customizer}.
*/
Expand Down

0 comments on commit 1ca6d2f

Please sign in to comment.