Skip to content

Commit

Permalink
Merge pull request quarkusio#39362 from aloubyansky/3.2.11-backports-1
Browse files Browse the repository at this point in the history
3.2.11 backports batch 1
  • Loading branch information
rsvoboda authored Mar 12, 2024
2 parents 7e6732b + fc714b3 commit b7705e1
Show file tree
Hide file tree
Showing 25 changed files with 812 additions and 29 deletions.
4 changes: 2 additions & 2 deletions bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
<smallrye-graphql.version>2.2.3</smallrye-graphql.version>
<smallrye-opentracing.version>3.0.3</smallrye-opentracing.version>
<smallrye-fault-tolerance.version>6.2.6</smallrye-fault-tolerance.version>
<smallrye-jwt.version>4.3.0</smallrye-jwt.version>
<smallrye-jwt.version>4.4.0</smallrye-jwt.version>
<smallrye-context-propagation.version>2.1.0</smallrye-context-propagation.version>
<smallrye-reactive-streams-operators.version>1.0.13</smallrye-reactive-streams-operators.version>
<smallrye-reactive-types-converter.version>3.0.1</smallrye-reactive-types-converter.version>
Expand Down Expand Up @@ -199,7 +199,7 @@
<scram-client.version>2.1</scram-client.version>
<picocli.version>4.7.4</picocli.version>
<google-cloud-functions.version>1.1.0</google-cloud-functions.version>
<commons-compress.version>1.25.0</commons-compress.version>
<commons-compress.version>1.26.0</commons-compress.version>
<commons-text.version>1.10.0</commons-text.version>
<gson.version>2.10.1</gson.version>
<log4j2-jboss-logmanager.version>1.1.1.Final</log4j2-jboss-logmanager.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
import io.quarkus.deployment.builditem.SslNativeConfigBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.maven.dependency.ArtifactKey;
Expand Down Expand Up @@ -410,4 +411,16 @@ void adaptOpenTelemetryJdbcInstrumentationForNative(BuildProducer<RemovedResourc
Set.of("io/opentelemetry/instrumentation.jdbc/internal/JdbcSingletons")));
}
}

@BuildStep
void registerRowSetSupport(
BuildProducer<NativeImageResourceBundleBuildItem> resourceBundleProducer,
BuildProducer<NativeImageResourceBuildItem> nativeResourceProducer,
BuildProducer<ReflectiveClassBuildItem> reflectiveClassProducer) {
resourceBundleProducer.produce(new NativeImageResourceBundleBuildItem("com.sun.rowset.RowSetResourceBundle"));
nativeResourceProducer.produce(new NativeImageResourceBuildItem("javax/sql/rowset/rowset.properties"));
reflectiveClassProducer.produce(ReflectiveClassBuildItem.builder(
"com.sun.rowset.providers.RIOptimisticProvider",
"com.sun.rowset.providers.RIXMLProvider").build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import io.dekorate.project.Project;
import io.dekorate.project.ScmInfo;
import io.dekorate.utils.Annotations;
import io.dekorate.utils.Git;
import io.dekorate.utils.Labels;
import io.dekorate.utils.Strings;
import io.fabric8.kubernetes.api.model.ContainerBuilder;
Expand Down Expand Up @@ -908,7 +909,7 @@ private static List<DecoratorBuildItem> createAnnotationDecorators(Optional<Proj
if (vcsUrl != null) {
result.add(new DecoratorBuildItem(target,
new AddAnnotationDecorator(name,
new Annotation(QUARKUS_ANNOTATIONS_VCS_URL, vcsUrl, new String[0]))));
new Annotation(QUARKUS_ANNOTATIONS_VCS_URL, Git.sanitizeRemoteUrl(vcsUrl), new String[0]))));
}

});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,20 @@
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.container.CompletionCallback;
import jakarta.ws.rs.container.ConnectionCallback;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;

import org.jboss.resteasy.reactive.common.providers.serialisers.AbstractJsonMessageBodyReader;
import org.jboss.resteasy.reactive.server.jackson.JacksonBasicMessageBodyReader;
import org.jboss.resteasy.reactive.server.jaxrs.HttpHeadersImpl;
import org.jboss.resteasy.reactive.server.spi.ContentType;
import org.jboss.resteasy.reactive.server.spi.ResteasyReactiveResourceInfo;
import org.jboss.resteasy.reactive.server.spi.ServerHttpResponse;
Expand Down Expand Up @@ -266,6 +269,11 @@ public ResteasyReactiveResourceInfo getResteasyReactiveResourceInfo() {
return null;
}

@Override
public HttpHeaders getRequestHeaders() {
return new HttpHeadersImpl(Collections.emptyList());
}

@Override
public void abortWith(Response response) {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.quarkus.resteasy.reactive.server.deployment;

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

import io.quarkus.builder.item.MultiBuildItem;

public final class BuiltInReaderOverrideBuildItem extends MultiBuildItem {

private final String readerClassName;
private final String overrideClassName;

public BuiltInReaderOverrideBuildItem(String readerClassName, String overrideClassName) {
this.readerClassName = readerClassName;
this.overrideClassName = overrideClassName;
}

public String getReaderClassName() {
return readerClassName;
}

public String getOverrideClassName() {
return overrideClassName;
}

public static Map<String, String> toMap(List<BuiltInReaderOverrideBuildItem> items) {
if (items.isEmpty()) {
return Collections.emptyMap();
}
Map<String, String> result = new HashMap<>();
for (BuiltInReaderOverrideBuildItem item : items) {
String previousOverride = result.put(item.getReaderClassName(), item.getOverrideClassName());
if (previousOverride != null) {
throw new IllegalStateException(
"Providing multiple BuiltInReaderOverrideBuildItem for the same readerClassName is not supported");
}
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -109,6 +110,7 @@
import org.jboss.resteasy.reactive.server.processor.scanning.ResponseHeaderMethodScanner;
import org.jboss.resteasy.reactive.server.processor.scanning.ResponseStatusMethodScanner;
import org.jboss.resteasy.reactive.server.processor.util.ResteasyReactiveServerDotNames;
import org.jboss.resteasy.reactive.server.providers.serialisers.ServerFileBodyHandler;
import org.jboss.resteasy.reactive.server.spi.RuntimeConfiguration;
import org.jboss.resteasy.reactive.server.spi.ServerRestHandler;
import org.jboss.resteasy.reactive.server.vertx.serializers.ServerMutinyAsyncFileMessageBodyWriter;
Expand Down Expand Up @@ -165,6 +167,8 @@
import io.quarkus.resteasy.reactive.common.deployment.ServerDefaultProducesHandlerBuildItem;
import io.quarkus.resteasy.reactive.common.runtime.ResteasyReactiveConfig;
import io.quarkus.resteasy.reactive.server.EndpointDisabled;
import io.quarkus.resteasy.reactive.server.runtime.QuarkusServerFileBodyHandler;
import io.quarkus.resteasy.reactive.server.runtime.QuarkusServerPathBodyHandler;
import io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveInitialiser;
import io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRecorder;
import io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRuntimeRecorder;
Expand Down Expand Up @@ -998,6 +1002,16 @@ private static String determineHandledGenericTypeOfProviderInterface(Class<?> pr
}
}

@BuildStep
public void fileHandling(BuildProducer<BuiltInReaderOverrideBuildItem> overrideProducer,
BuildProducer<MessageBodyReaderBuildItem> readerProducer) {
overrideProducer.produce(new BuiltInReaderOverrideBuildItem(ServerFileBodyHandler.class.getName(),
QuarkusServerFileBodyHandler.class.getName()));
readerProducer.produce(
new MessageBodyReaderBuildItem(QuarkusServerPathBodyHandler.class.getName(), Path.class.getName(), List.of(
MediaType.WILDCARD), RuntimeType.SERVER, true, Priorities.USER));
}

@BuildStep
@Record(value = ExecutionTime.STATIC_INIT, useIdentityComparisonForParameters = false)
public void serverSerializers(ResteasyReactiveRecorder recorder,
Expand All @@ -1007,6 +1021,7 @@ public void serverSerializers(ResteasyReactiveRecorder recorder,
List<MessageBodyWriterBuildItem> additionalMessageBodyWriters,
List<MessageBodyReaderOverrideBuildItem> messageBodyReaderOverrideBuildItems,
List<MessageBodyWriterOverrideBuildItem> messageBodyWriterOverrideBuildItems,
List<BuiltInReaderOverrideBuildItem> builtInReaderOverrideBuildItems,
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
BuildProducer<ServerSerialisersBuildItem> serverSerializersProducer) {

Expand All @@ -1024,11 +1039,16 @@ public void serverSerializers(ResteasyReactiveRecorder recorder,
reflectiveClass.produce(ReflectiveClassBuildItem.builder(builtinWriter.writerClass.getName())
.build());
}
Map<String, String> builtInReaderOverrides = BuiltInReaderOverrideBuildItem.toMap(builtInReaderOverrideBuildItems);
for (Serialisers.BuiltinReader builtinReader : ServerSerialisers.BUILTIN_READERS) {
registerReader(recorder, serialisers, builtinReader.entityClass.getName(), builtinReader.readerClass.getName(),
String effectiveReaderClassName = builtinReader.readerClass.getName();
if (builtInReaderOverrides.containsKey(effectiveReaderClassName)) {
effectiveReaderClassName = builtInReaderOverrides.get(effectiveReaderClassName);
}
registerReader(recorder, serialisers, builtinReader.entityClass.getName(), effectiveReaderClassName,
beanContainerBuildItem.getValue(),
builtinReader.mediaType, builtinReader.constraint);
reflectiveClass.produce(ReflectiveClassBuildItem.builder(builtinReader.readerClass.getName())
reflectiveClass.produce(ReflectiveClassBuildItem.builder(effectiveReaderClassName)
.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import static org.awaitility.Awaitility.await;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.util.concurrent.Callable;
Expand Down Expand Up @@ -40,4 +42,8 @@ public Boolean call() {
}
});
}

protected String fileSizeAsStr(File file) throws IOException {
return "" + Files.readAllBytes(file.toPath()).length;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package io.quarkus.resteasy.reactive.server.test.multipart;

import static org.hamcrest.CoreMatchers.equalTo;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.function.Supplier;

import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class FileInputWithDeleteTest extends AbstractMultipartTest {

private static final java.nio.file.Path uploadDir = Paths.get("file-uploads");

@RegisterExtension
static QuarkusUnitTest test = new QuarkusUnitTest()
.setArchiveProducer(new Supplier<>() {
@Override
public JavaArchive get() {
return ShrinkWrap.create(JavaArchive.class)
.addClasses(Resource.class)
.addAsResource(new StringAsset(
"quarkus.http.body.uploads-directory="
+ uploadDir.toString() + "\n"),
"application.properties");
}

});

private final File HTML_FILE = new File("./src/test/resources/test.html");
private final File HTML_FILE2 = new File("./src/test/resources/test2.html");

@Test
public void test() throws IOException {
RestAssured.given()
.contentType("application/octet-stream")
.body(HTML_FILE)
.when()
.post("/test")
.then()
.statusCode(200)
.body(equalTo(fileSizeAsStr(HTML_FILE)));

awaitUploadDirectoryToEmpty(uploadDir);

RestAssured.given()
.contentType("application/octet-stream")
.body(HTML_FILE2)
.when()
.post("/test")
.then()
.statusCode(200)
.body(equalTo(fileSizeAsStr(HTML_FILE2)));

awaitUploadDirectoryToEmpty(uploadDir);
}

@Path("test")
public static class Resource {

@POST
@Consumes("application/octet-stream")
public long size(File file) throws IOException {
return Files.size(file.toPath());
}
}
}
Loading

0 comments on commit b7705e1

Please sign in to comment.