Skip to content

Commit

Permalink
index.html (welcome page) now dynamic
Browse files Browse the repository at this point in the history
Signed-off-by: Phillip Kruger <phillip.kruger@gmail.com>
  • Loading branch information
phillip-kruger committed Mar 12, 2024
1 parent efa1570 commit 5219229
Show file tree
Hide file tree
Showing 66 changed files with 1,878 additions and 1,719 deletions.
269 changes: 139 additions & 130 deletions core/runtime/src/main/java/io/quarkus/runtime/TemplateHtmlBuilder.java

Large diffs are not rendered by default.

217 changes: 217 additions & 0 deletions core/runtime/src/main/resources/META-INF/template-html-builder.css

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.quarkus.vertx.web.deployment;

import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
import static io.quarkus.vertx.web.ReactiveRoutes.APPLICATION_JSON;
import static io.quarkus.vertx.web.ReactiveRoutes.EVENT_STREAM;
import static io.quarkus.vertx.web.ReactiveRoutes.JSON_STREAM;
Expand Down Expand Up @@ -30,7 +29,6 @@
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import jakarta.annotation.security.DenyAll;
import jakarta.annotation.security.RolesAllowed;
Expand Down Expand Up @@ -67,7 +65,6 @@
import io.quarkus.deployment.Capability;
import io.quarkus.deployment.Feature;
import io.quarkus.deployment.GeneratedClassGizmoAdaptor;
import io.quarkus.deployment.IsDevelopment;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
Expand All @@ -94,16 +91,12 @@
import io.quarkus.gizmo.WhileLoop;
import io.quarkus.hibernate.validator.spi.BeanValidationAnnotationsBuildItem;
import io.quarkus.runtime.LaunchMode;
import io.quarkus.runtime.TemplateHtmlBuilder;
import io.quarkus.runtime.util.HashUtil;
import io.quarkus.security.Authenticated;
import io.quarkus.security.PermissionsAllowed;
import io.quarkus.vertx.http.deployment.FilterBuildItem;
import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem;
import io.quarkus.vertx.http.deployment.RequireBodyHandlerBuildItem;
import io.quarkus.vertx.http.deployment.RouteBuildItem;
import io.quarkus.vertx.http.deployment.VertxWebRouterBuildItem;
import io.quarkus.vertx.http.deployment.devmode.NotFoundPageDisplayableEndpointBuildItem;
import io.quarkus.vertx.http.deployment.devmode.RouteDescriptionBuildItem;
import io.quarkus.vertx.http.runtime.HandlerType;
import io.quarkus.vertx.http.runtime.HttpBuildTimeConfig;
Expand All @@ -117,7 +110,6 @@
import io.quarkus.vertx.web.runtime.RoutingExchangeImpl;
import io.quarkus.vertx.web.runtime.UniFailureCallback;
import io.quarkus.vertx.web.runtime.VertxWebRecorder;
import io.quarkus.vertx.web.runtime.devmode.ResourceNotFoundRecorder;
import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import io.vertx.core.Handler;
Expand Down Expand Up @@ -510,23 +502,6 @@ public boolean test(String name) {
detectConflictingRoutes(matchers);
}

@BuildStep(onlyIf = IsDevelopment.class)
@Record(RUNTIME_INIT)
void routeNotFound(Capabilities capabilities, ResourceNotFoundRecorder recorder, VertxWebRouterBuildItem router,
List<RouteDescriptionBuildItem> descriptions,
HttpRootPathBuildItem httpRoot,
List<NotFoundPageDisplayableEndpointBuildItem> additionalEndpoints) {
if (capabilities.isMissing(Capability.RESTEASY)) {
// Register a special error handler if JAX-RS not available
recorder.registerNotFoundHandler(router.getHttpRouter(), httpRoot.getRootPath(),
descriptions.stream().map(RouteDescriptionBuildItem::getDescription).collect(Collectors.toList()),
additionalEndpoints.stream()
.map(s -> s.isAbsolutePath() ? s.getEndpoint()
: TemplateHtmlBuilder.adjustRoot(httpRoot.getRootPath(), s.getEndpoint()))
.collect(Collectors.toList()));
}
}

@BuildStep
AutoAddScopeBuildItem autoAddScope() {
return AutoAddScopeBuildItem.builder()
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.resteasy.deployment;

import java.util.Map;

import io.quarkus.builder.item.SimpleBuildItem;
import io.quarkus.resteasy.runtime.NonJaxRsClassMappings;

/**
* A build item that holds Non jax-rs classes
*/
public final class NonJaxRsClassBuildItem extends SimpleBuildItem {

public final Map<String, NonJaxRsClassMappings> nonJaxRsPaths;

public NonJaxRsClassBuildItem(Map<String, NonJaxRsClassMappings> nonJaxRsPaths) {
this.nonJaxRsPaths = nonJaxRsPaths;
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,19 @@
package io.quarkus.resteasy.deployment;

import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.deployment.Capabilities;
import io.quarkus.deployment.Capability;
import io.quarkus.deployment.IsDevelopment;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
import io.quarkus.resteasy.common.spi.ResteasyJaxrsProviderBuildItem;
import io.quarkus.resteasy.runtime.AuthenticationCompletionExceptionMapper;
import io.quarkus.resteasy.runtime.AuthenticationFailedExceptionMapper;
import io.quarkus.resteasy.runtime.AuthenticationRedirectExceptionMapper;
import io.quarkus.resteasy.runtime.CompositeExceptionMapper;
import io.quarkus.resteasy.runtime.EagerSecurityFilter;
import io.quarkus.resteasy.runtime.ExceptionMapperRecorder;
import io.quarkus.resteasy.runtime.ForbiddenExceptionMapper;
import io.quarkus.resteasy.runtime.JaxRsPermissionChecker;
import io.quarkus.resteasy.runtime.JaxRsSecurityConfig;
import io.quarkus.resteasy.runtime.NotFoundExceptionMapper;
import io.quarkus.resteasy.runtime.SecurityContextFilter;
import io.quarkus.resteasy.runtime.StandardSecurityCheckInterceptor;
import io.quarkus.resteasy.runtime.UnauthorizedExceptionMapper;
Expand All @@ -34,11 +22,6 @@
import io.quarkus.resteasy.runtime.vertx.JsonObjectReader;
import io.quarkus.resteasy.runtime.vertx.JsonObjectWriter;
import io.quarkus.security.spi.DefaultSecurityCheckBuildItem;
import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem;
import io.quarkus.vertx.http.deployment.devmode.NotFoundPageDisplayableEndpointBuildItem;
import io.quarkus.vertx.http.deployment.devmode.RouteDescriptionBuildItem;
import io.quarkus.vertx.http.runtime.devmode.AdditionalRouteDescription;
import io.quarkus.vertx.http.runtime.devmode.RouteDescription;

public class ResteasyBuiltinsProcessor {

Expand Down Expand Up @@ -92,50 +75,4 @@ void vertxProviders(BuildProducer<ResteasyJaxrsProviderBuildItem> providers) {
providers.produce(new ResteasyJaxrsProviderBuildItem(JsonObjectReader.class.getName()));
providers.produce(new ResteasyJaxrsProviderBuildItem(JsonObjectWriter.class.getName()));
}

@Record(STATIC_INIT)
@BuildStep(onlyIf = IsDevelopment.class)
void setupExceptionMapper(BuildProducer<ResteasyJaxrsProviderBuildItem> providers, HttpRootPathBuildItem httpRoot,
ExceptionMapperRecorder recorder) {
providers.produce(new ResteasyJaxrsProviderBuildItem(NotFoundExceptionMapper.class.getName()));
recorder.setHttpRoot(httpRoot.getRootPath());
}

@Record(STATIC_INIT)
@BuildStep(onlyIf = IsDevelopment.class)
void addStaticResourcesExceptionMapper(ApplicationArchivesBuildItem applicationArchivesBuildItem,
ExceptionMapperRecorder recorder) {
recorder.setStaticResourceRoots(applicationArchivesBuildItem.getAllApplicationArchives().stream()
.map(i -> i.apply(t -> {
var p = t.getPath(META_INF_RESOURCES);
return p == null ? null : p.toAbsolutePath().toString();
}))
.filter(Objects::nonNull)
.collect(Collectors.toSet()));
}

@Record(STATIC_INIT)
@BuildStep(onlyIf = IsDevelopment.class)
void addAdditionalEndpointsExceptionMapper(List<NotFoundPageDisplayableEndpointBuildItem> displayableEndpoints,
ExceptionMapperRecorder recorder, HttpRootPathBuildItem httpRoot) {
List<AdditionalRouteDescription> endpoints = displayableEndpoints
.stream()
.map(displayableAdditionalBuildItem -> new AdditionalRouteDescription(
displayableAdditionalBuildItem.getEndpoint(httpRoot), displayableAdditionalBuildItem.getDescription()))
.sorted()
.collect(Collectors.toList());

recorder.setAdditionalEndpoints(endpoints);
}

@Record(STATIC_INIT)
@BuildStep(onlyIf = IsDevelopment.class)
void addReactiveRoutesExceptionMapper(List<RouteDescriptionBuildItem> routeDescriptions,
ExceptionMapperRecorder recorder, HttpRootPathBuildItem httpRoot) {
List<RouteDescription> reactiveRoutes = new ArrayList<>();
for (RouteDescriptionBuildItem description : routeDescriptions) {
reactiveRoutes.add(description.getDescription());
}
recorder.setReactiveRoutes(reactiveRoutes);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package io.quarkus.resteasy.deployment;

import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT;

import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.stream.Collectors;

import jakarta.servlet.DispatcherType;
import jakarta.ws.rs.core.Application;
Expand All @@ -17,14 +14,11 @@
import io.quarkus.deployment.Capabilities;
import io.quarkus.deployment.Capability;
import io.quarkus.deployment.Feature;
import io.quarkus.deployment.IsDevelopment;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.resteasy.common.deployment.ResteasyInjectionReadyBuildItem;
import io.quarkus.resteasy.runtime.ExceptionMapperRecorder;
import io.quarkus.resteasy.runtime.ResteasyFilter;
import io.quarkus.resteasy.runtime.ResteasyServlet;
import io.quarkus.resteasy.server.common.deployment.ResteasyServerConfigBuildItem;
Expand Down Expand Up @@ -123,13 +117,6 @@ public void build(
}
}

@BuildStep(onlyIf = IsDevelopment.class)
@Record(STATIC_INIT)
void addServletsToExceptionMapper(List<ServletBuildItem> servlets, ExceptionMapperRecorder recorder) {
recorder.setServlets(servlets.stream().filter(s -> !JAX_RS_SERVLET_NAME.equals(s.getName()))
.collect(Collectors.toMap(s -> s.getName(), s -> s.getMappings())));
}

private String getMappingPath(String path) {
String mappingPath;
if (path.endsWith("/*")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT;
import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT;

import java.util.Collections;
import java.util.Map;
import java.util.Optional;

import jakarta.ws.rs.ext.ExceptionMapper;
Expand All @@ -28,6 +30,7 @@
import io.quarkus.resteasy.runtime.AuthenticationCompletionExceptionMapper;
import io.quarkus.resteasy.runtime.AuthenticationFailedExceptionMapper;
import io.quarkus.resteasy.runtime.AuthenticationRedirectExceptionMapper;
import io.quarkus.resteasy.runtime.NonJaxRsClassMappings;
import io.quarkus.resteasy.runtime.ResteasyVertxConfig;
import io.quarkus.resteasy.runtime.standalone.ResteasyStandaloneRecorder;
import io.quarkus.resteasy.server.common.deployment.ResteasyDeploymentBuildItem;
Expand Down Expand Up @@ -94,6 +97,7 @@ public void boot(ShutdownContextBuildItem shutdown,
HttpBuildTimeConfig vertxConfig,
ResteasyStandaloneBuildItem standalone,
Optional<RequireVirtualHttpBuildItem> requireVirtual,
Optional<NonJaxRsClassBuildItem> nonJaxRsClassBuildItem,
ExecutorBuildItem executorBuildItem,
ResteasyVertxConfig resteasyVertxConfig,
HttpBuildTimeConfig httpBuildTimeConfig) throws Exception {
Expand All @@ -105,8 +109,12 @@ public void boot(ShutdownContextBuildItem shutdown,

// Handler used for both the default and non-default deployment path (specified as application path or resteasyConfig.path)
// Routes use the order VertxHttpRecorder.DEFAULT_ROUTE_ORDER + 1 to ensure the default route is called before the resteasy one
Map<String, NonJaxRsClassMappings> nonJaxRsClassNameToMethodPaths = Collections.emptyMap();
if (nonJaxRsClassBuildItem.isPresent()) {
nonJaxRsClassNameToMethodPaths = nonJaxRsClassBuildItem.get().nonJaxRsPaths;
}
Handler<RoutingContext> handler = recorder.vertxRequestHandler(vertx.getVertx(),
executorBuildItem.getExecutorProxy(), resteasyVertxConfig, httpBuildTimeConfig);
executorBuildItem.getExecutorProxy(), nonJaxRsClassNameToMethodPaths, resteasyVertxConfig, httpBuildTimeConfig);

final boolean noCustomAuthCompletionExMapper;
final boolean noCustomAuthFailureExMapper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void testHtmlResourceNotFound() {
.then()
.statusCode(404)
.contentType(ContentType.HTML)
.body(containsString("\"/abc/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<h1 class=\"container\">404 - Resource Not Found</h1>"));
.body(containsString("/abc/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<div class=\"callout\">404 - Resource Not Found</div>"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void testHtmlResourceNotFound() {
.then()
.statusCode(404)
.contentType(ContentType.HTML)
.body(containsString("\"/abc/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<h1 class=\"container\">404 - Resource Not Found</h1>"));
.body(containsString("/abc/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<div class=\"callout\">404 - Resource Not Found</div>"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ public void testHtmlResourceNotFound() {
.then()
.statusCode(404)
.contentType(ContentType.HTML)
.body(containsString("\"/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<h1 class=\"container\">404 - Resource Not Found</h1>"));
.body(containsString("/index.html")) // check that index.html is displayed
.body(Matchers.containsString("<div class=\"callout\">404 - Resource Not Found</div>"));
}

@Test
Expand Down
Loading

0 comments on commit 5219229

Please sign in to comment.