Skip to content

Commit

Permalink
Update HttpRules API to not have method with vararg with generics
Browse files Browse the repository at this point in the history
- Update HttpService interface to not be a Supplier<HttpService> to remove ambiguity

- Replace `register(Supplier<? extends HttpService>... service)` with register(HttpService... service)`
- Overload it with 5 variants to accept up to 5 suppliers of services (@SafeVarags is not usable on interfaces)
- Add `register(List<HttpService> services)` for more than 5 services

- Replace `register(String pathPattern, Supplier<? extends HttpService>... service)` with register(String pathPattern, HttpService... service)`
- Overload it with 5 variants to accept up to 5 suppliers of services (@SafeVarags is not usable on interfaces)
- Add `register(String pathPattern, List<HttpService> services)` for more than 5 services

Fixes helidon-io#7656
  • Loading branch information
romain-grecourt committed Sep 28, 2023
1 parent 3d4796d commit e1d941c
Show file tree
Hide file tree
Showing 7 changed files with 293 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,105 @@ private enum RoutingResult {
*/
public interface Builder extends HttpRules, io.helidon.common.Builder<Builder, HttpRouting> {
@Override
Builder register(Supplier<? extends HttpService>... service);
Builder register(HttpService... service);

@Override
Builder register(String path, Supplier<? extends HttpService>... service);
default Builder register(Supplier<? extends HttpService> service) {
HttpRules.super.register(service);
return this;
}

@Override
default Builder register(Supplier<? extends HttpService> service1, Supplier<? extends HttpService> service2) {
HttpRules.super.register(service1, service2);
return this;
}

@Override
default Builder register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3) {
HttpRules.super.register(service1, service2, service3);
return this;
}

@Override
default Builder register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4) {
HttpRules.super.register(service1, service2, service3, service4);
return this;
}

@Override
default Builder register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4,
Supplier<? extends HttpService> service5) {
HttpRules.super.register(service1, service2, service3, service4, service5);
return this;
}

@Override
default Builder register(List<Supplier<? extends HttpService>> services) {
HttpRules.super.register(services);
return this;
}

@Override
Builder register(String path, HttpService... service);

@Override
default Builder register(String pathPattern, Supplier<? extends HttpService> service) {
HttpRules.super.register(pathPattern, service);
return this;
}

@Override
default Builder register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2) {
HttpRules.super.register(pathPattern, service1, service2);
return this;
}

@Override
default Builder register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3) {
HttpRules.super.register(pathPattern, service1, service2, service3);
return this;
}

@Override
default Builder register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4) {
HttpRules.super.register(pathPattern, service1, service2, service3, service4);
return this;
}

@Override
default Builder register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4,
Supplier<? extends HttpService> service5) {
HttpRules.super.register(pathPattern, service1, service2, service3, service4, service5);
return this;
}

@Override
default Builder register(String pathPattern, List<Supplier<? extends HttpService>> services) {
HttpRules.super.register(pathPattern, services);
return this;
}

@Override
Builder route(HttpRoute route);
Expand Down Expand Up @@ -438,13 +533,13 @@ public HttpRouting build() {
}

@Override
public Builder register(Supplier<? extends HttpService>... service) {
public Builder register(HttpService... service) {
mainRouting.service(service);
return this;
}

@Override
public Builder register(String path, Supplier<? extends HttpService>... service) {
public Builder register(String path, HttpService... service) {
mainRouting.service(path, service);
return this;
}
Expand Down Expand Up @@ -620,13 +715,13 @@ public HttpRouting build() {
}

@Override
public Builder register(Supplier<? extends HttpService>... service) {
public Builder register(HttpService... service) {
rootRules.register(service);
return this;
}

@Override
public Builder register(String pathPattern, Supplier<? extends HttpService>... service) {
public Builder register(String pathPattern, HttpService... service) {
rootRules.register(pathPattern, service);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

import io.helidon.common.Weighted;

Expand All @@ -42,14 +41,14 @@ void filter(Filter filter) {
}

<T extends Throwable> void error(Class<T> exceptionClass, ErrorHandler<? super T> handler) {
this.registrations.add(new ErrorReg<T>(exceptionClass, handler));
this.registrations.add(new ErrorReg<>(exceptionClass, handler));
}

void service(Supplier<? extends HttpService>... services) {
void service(HttpService... services) {
this.registrations.add(new ServiceReg(services));
}

void service(String path, Supplier<? extends HttpService>... services) {
void service(String path, HttpService... services) {
this.registrations.add(new ServicePathReg(path, services));
}

Expand Down Expand Up @@ -78,14 +77,14 @@ public void register(HttpRouting.Builder routing) {
}
}

private record ServiceReg(Supplier<? extends HttpService>[] services) implements Registration {
private record ServiceReg(HttpService[] services) implements Registration {
@Override
public void register(HttpRouting.Builder routing) {
routing.register(services);
}
}

private record ServicePathReg(String path, Supplier<? extends HttpService>[] services) implements Registration {
private record ServicePathReg(String path, HttpService[] services) implements Registration {
@Override
public void register(HttpRouting.Builder routing) {
routing.register(path, services);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package io.helidon.webserver.http;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
Expand All @@ -36,7 +37,96 @@ public interface HttpRules {
* @param service service to register
* @return updated rules
*/
HttpRules register(Supplier<? extends HttpService>... service);
HttpRules register(HttpService... service);

/**
* Register a service on the current path.
*
* @param service service to register
* @return updated rules
*/
default HttpRules register(Supplier<? extends HttpService> service) {
return register(service.get());
}

/**
* Register two services on the current path.
*
* @param service1 first service to register
* @param service2 second service to register
* @return updated rules
*/
default HttpRules register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2) {
return register(service1.get(), service2.get());
}

/**
* Register three services on the current path.
*
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @return updated rules
*/
default HttpRules register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3) {
return register(service1.get(), service2.get(), service3.get());
}

/**
* Register four services on the current path.
*
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @param service4 fourth service to register
* @return updated rules
*/
default HttpRules register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4) {
return register(service1.get(), service2.get(), service3.get(), service4.get());
}

/**
* Register five services on the current path.
*
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @param service4 fourth service to register
* @param service5 fifth service to register
* @return updated rules
*/
default HttpRules register(Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4,
Supplier<? extends HttpService> service5) {
return register(service1.get(), service2.get(), service3.get(), service4.get(), service5.get());
}

/**
* Register services on the current path.
*
* @param services services to register
* @return updated rules
*/
default HttpRules register(List<Supplier<? extends HttpService>> services) {
return register(services.stream().map(Supplier::get).toArray(HttpService[]::new));
}

/**
* Register a service on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param service service to register
* @return updated rules
*/
HttpRules register(String pathPattern, HttpService... service);

/**
* Register a service on sub-path of the current path.
Expand All @@ -45,7 +135,88 @@ public interface HttpRules {
* @param service service to register
* @return updated rules
*/
HttpRules register(String pathPattern, Supplier<? extends HttpService>... service);
default HttpRules register(String pathPattern, Supplier<? extends HttpService> service) {
return register(pathPattern, service.get());
}

/**
* Register two services on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param service1 first service to register
* @param service2 second service to register
* @return updated rules
*/
default HttpRules register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2) {
return register(pathPattern, service1.get(), service2.get());
}

/**
* Register three services on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @return updated rules
*/
default HttpRules register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3) {
return register(pathPattern, service1.get(), service2.get(), service3.get());
}

/**
* Register four services on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @param service4 fourth service to register
* @return updated rules
*/
default HttpRules register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4) {
return register(pathPattern, service1.get(), service2.get(), service3.get(), service4.get());
}

/**
* Register five services on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param service1 first service to register
* @param service2 second service to register
* @param service3 third service to register
* @param service4 fourth service to register
* @param service5 fifth service to register
* @return updated rules
*/
default HttpRules register(String pathPattern,
Supplier<? extends HttpService> service1,
Supplier<? extends HttpService> service2,
Supplier<? extends HttpService> service3,
Supplier<? extends HttpService> service4,
Supplier<? extends HttpService> service5) {
return register(pathPattern, service1.get(), service2.get(), service3.get(), service4.get(), service5.get());
}

/**
* Register services on sub-path of the current path.
*
* @param pathPattern URI path pattern
* @param services services to register
* @return updated rules
*/
default HttpRules register(String pathPattern, List<Supplier<? extends HttpService>> services) {
return register(pathPattern, services.stream().map(Supplier::get).toArray(HttpService[]::new));
}

/**
* Add a route. This allows also protocol version specific routing.
Expand Down
Loading

0 comments on commit e1d941c

Please sign in to comment.