Skip to content

Commit

Permalink
Merge branch '5.2.x' into 5.3.x
Browse files Browse the repository at this point in the history
  • Loading branch information
sdelamo committed Apr 19, 2024
2 parents 8760df9 + 60073f6 commit f26af2a
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 23 deletions.
39 changes: 21 additions & 18 deletions test-suite/src/test/java/io/micronaut/views/ModelAndViewTest.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,3 @@
/*
* Copyright 2017-2021 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.views;

import io.micronaut.context.BeanContext;
Expand All @@ -26,23 +11,28 @@
import io.micronaut.http.HttpStatus;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.client.BlockingHttpClient;
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.http.client.exceptions.HttpClientResponseException;
import io.micronaut.runtime.ApplicationConfiguration;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import io.micronaut.views.ModelAndView;
import io.micronaut.views.View;
import io.micronaut.views.model.ConfigViewModelProcessor;
import io.micronaut.views.model.FruitsController;
import io.micronaut.views.model.ViewModelProcessor;
import io.micronaut.views.turbo.TurboStream;
import io.micronaut.views.turbo.TurboStreamAction;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

@Property(name = "spec.name", value = "ModelAndViewSpec")
@Property(name = "micronaut.views.soy.enabled", value = StringUtils.FALSE)
Expand Down Expand Up @@ -180,6 +170,11 @@ void viewModelProcessorsWorkWithControllersReturningPOJOs() {

//and:
assertTrue(html.contains("<h1>config: test</h1>"));

//when:
request = HttpRequest.GET("/turboStreamBuilderWithProcessor").accept(TurboMediaType.TURBO_STREAM);
html = client.retrieve(request, String.class);
assertTrue(html.contains("<h1>config: test</h1>"));
}

@Requires(property = "spec.name", value = "ModelAndViewSpec")
Expand All @@ -190,6 +185,14 @@ static class ViewModelProcessorController {
public Fruit pojoProcessor() {
return new Fruit("orange", "orange");
}

@Produces(TurboMediaType.TURBO_STREAM)
@Get("/turboStreamBuilderWithProcessor")
public TurboStream.Builder turboStreamBuilder() {
return TurboStream.builder()
.action(TurboStreamAction.REPLACE)
.template("fruits-processor", new Fruit("orange", "orange"));
}
}

@Introspected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,16 @@
package io.micronaut.views.turbo;

import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.NextMajorVersion;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.io.Writable;
import io.micronaut.http.HttpRequest;
import io.micronaut.views.ModelAndView;
import io.micronaut.views.ViewsModelDecorator;
import io.micronaut.views.ViewsRendererLocator;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;

import java.util.Optional;
Expand All @@ -36,9 +40,30 @@
public class DefaultTurboStreamRenderer implements TurboStreamRenderer {

protected final ViewsRendererLocator viewsRendererLocator;
@Nullable
@NextMajorVersion("remove the nullability annotation")
private final ViewsModelDecorator viewsModelDecorator;

public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator) {
/**
*
* @param viewsRendererLocator ViewRendererLocator
* @param viewsModelDecorator Views Model Decorator
*/
@Inject
public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator,
ViewsModelDecorator viewsModelDecorator) {
this.viewsRendererLocator = viewsRendererLocator;
this.viewsModelDecorator = viewsModelDecorator;
}

/**
*
* @param viewsRendererLocator View Renderer Locator
* @deprecated Use {@link #DefaultTurboStreamRenderer(ViewsRendererLocator, ViewsModelDecorator)} instead.
*/
@Deprecated(since = "5.2.1", forRemoval = true)
public DefaultTurboStreamRenderer(ViewsRendererLocator viewsRendererLocator) {
this(viewsRendererLocator, null);
}

@Override
Expand All @@ -48,8 +73,13 @@ public Optional<Writable> render(@NonNull TurboStream.Builder builder,
return builder.getTemplateView()
.map(viewName -> {
Object model = builder.getTemplateModel().orElse(null);
return viewsRendererLocator.resolveViewsRenderer(viewName, TurboMediaType.TURBO_STREAM, model)
.flatMap(renderer -> builder.template(renderer.render(viewName, model, request))
ModelAndView<Object> modelAndView = new ModelAndView<>(viewName, model);
if (request != null && viewsModelDecorator != null) {
viewsModelDecorator.decorate(request, modelAndView);
}
Object decoratedModel = modelAndView.getModel().orElse(null);
return viewsRendererLocator.resolveViewsRenderer(viewName, TurboMediaType.TURBO_STREAM, decoratedModel)
.flatMap(renderer -> builder.template(renderer.render(viewName, decoratedModel, request))
.build()
.render());
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.body.MessageBodyWriter;
import io.micronaut.http.codec.CodecException;
import io.micronaut.http.context.ServerRequestContext;
import io.micronaut.views.exceptions.ViewRenderingException;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Singleton;
Expand Down Expand Up @@ -54,7 +55,7 @@ public void writeTo(@NonNull Argument<TurboStream.Builder> type,
@NonNull MutableHeaders outgoingHeaders,
@NonNull OutputStream outputStream) throws CodecException {
outgoingHeaders.set(HttpHeaders.CONTENT_TYPE, TurboMediaType.TURBO_STREAM);
turboStreamRenderer.render(turboStreamBuilder, null)
turboStreamRenderer.render(turboStreamBuilder, ServerRequestContext.currentRequest().orElse(null))
.ifPresent(writable -> {
try {
writable.writeTo(outputStream);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.micronaut.http.annotation.Produces;
import io.micronaut.http.body.MessageBodyWriter;
import io.micronaut.http.codec.CodecException;
import io.micronaut.http.context.ServerRequestContext;
import io.micronaut.views.exceptions.ViewRenderingException;
import io.micronaut.views.turbo.http.TurboMediaType;
import jakarta.inject.Singleton;
Expand Down Expand Up @@ -56,7 +57,7 @@ public void writeTo(@NonNull Argument<List<TurboStream.Builder>> type,
@NonNull OutputStream outputStream) throws CodecException {
outgoingHeaders.set(HttpHeaders.CONTENT_TYPE, TurboMediaType.TURBO_STREAM);
for (TurboStream.Builder builder : turboStreamBuilders) {
turboStreamRenderer.render(builder, null)
turboStreamRenderer.render(builder, ServerRequestContext.currentRequest().orElse(null))
.ifPresent(writable -> {
try {
writable.writeTo(outputStream);
Expand Down

0 comments on commit f26af2a

Please sign in to comment.