muttakin2301/ccr_train_1000 huggingface dataset:
Code review comment: how should I go about adding it to the internal suite?

Code before review:
public void testKafkaIOExternalRoundtripWithMetadataAndNullKeysAndValues() {
List<byte[]> nullList = new ArrayList<>();
nullList.add(null);
writePipeline
.apply(Create.of(nullList))
.apply(
ParDo.of(
new DoFn<byte[], KV<byte[], byte[]>>() {
@ProcessElement
public void processElement(
@Element byte[] element, OutputReceiver<KV<byte[], byte[]>> receiver) {
receiver.output(KV.of(element, element));
}
}))
.apply(
KafkaIO.<byte[], byte[]>write()
.withBootstrapServers(options.getKafkaBootstrapServerAddresses())
.withTopic(options.getKafkaTopic())
.withKeySerializer(ByteArraySerializer.class)
.withValueSerializer(ByteArraySerializer.class));
PipelineResult writeResult = writePipeline.run();
writeResult.waitUntilFinish();
readPipeline.apply(
KafkaIO.<byte[], byte[]>read()
.withBootstrapServers(options.getKafkaBootstrapServerAddresses())
.withTopic(options.getKafkaTopic())
.withKeyDeserializerAndCoder(
ByteArrayDeserializer.class, NullableCoder.of(ByteArrayCoder.of()))
.withValueDeserializerAndCoder(
ByteArrayDeserializer.class, NullableCoder.of(ByteArrayCoder.of()))
.externalWithMetadata());
PipelineResult readResult = readPipeline.run();
readResult.waitUntilFinish();
}

Line under review: readResult.waitUntilFinish();

Code after addressing the review:
public void testKafkaIOExternalRoundtripWithMetadataAndNullKeysAndValues() {
List<byte[]> nullList = new ArrayList<>();
nullList.add(null);
writePipeline
.apply(Create.of(nullList))
.apply(
ParDo.of(
new DoFn<byte[], KV<byte[], byte[]>>() {
@ProcessElement
public void processElement(
@Element byte[] element, OutputReceiver<KV<byte[], byte[]>> receiver) {
receiver.output(KV.of(element, element));
}
}))
.apply(
KafkaIO.<byte[], byte[]>write()
.withBootstrapServers(options.getKafkaBootstrapServerAddresses())
.withTopic(options.getKafkaTopic())
.withKeySerializer(ByteArraySerializer.class)
.withValueSerializer(ByteArraySerializer.class));
PipelineResult writeResult = writePipeline.run();
writeResult.waitUntilFinish();
PCollection<Row> rows =
readPipeline.apply(
KafkaIO.<byte[], byte[]>read()
.withBootstrapServers(options.getKafkaBootstrapServerAddresses())
.withTopic(options.getKafkaTopic())
.withKeyDeserializerAndCoder(
ByteArrayDeserializer.class, NullableCoder.of(ByteArrayCoder.of()))
.withValueDeserializerAndCoder(
ByteArrayDeserializer.class, NullableCoder.of(ByteArrayCoder.of()))
.externalWithMetadata());
PAssert.thatSingleton(rows)
.satisfies(
actualRow -> {
assertNull(actualRow.getString("key"));
assertNull(actualRow.getString("value"));
return null;
});
PipelineResult readResult = readPipeline.run();
readResult.waitUntilFinish();
}
Code review comment: Could we avoid the lambda?

Code before review:
public Object getReference(Bean<?> bean, Type beanType, CreationalContext<?> ctx) {
Objects.requireNonNull(bean, () -> "Managed Bean [" + beanType + "] is null");
Objects.requireNonNull(ctx, "CreationalContext is null");
if (bean instanceof InjectableBean && ctx instanceof CreationalContextImpl) {
return ArcContainerImpl.instance().beanInstanceHandle((InjectableBean) bean, (CreationalContextImpl) ctx).get();
}
throw new IllegalArgumentException(
"Arguments must be instances of " + InjectableBean.class + " and " + CreationalContextImpl.class + ": \nbean: " + bean + "\nctx: " + ctx);
}

Line under review: Objects.requireNonNull(bean, () -> "Managed Bean [" + beanType + "] is null");

Code after addressing the review:
public Object getReference(Bean<?> bean, Type beanType, CreationalContext<?> ctx) {
if (bean == null) {
throw new NullPointerException("Managed Bean [" + beanType + "] is null");
}
Objects.requireNonNull(ctx, "CreationalContext is null");
if (bean instanceof InjectableBean && ctx instanceof CreationalContextImpl) {
return ArcContainerImpl.instance().beanInstanceHandle((InjectableBean) bean, (CreationalContextImpl) ctx).get();
}
throw new IllegalArgumentException(
"Arguments must be instances of " + InjectableBean.class + " and " + CreationalContextImpl.class + ": \nbean: " + bean + "\nctx: " + ctx);
}
Code review comment: Because of possible encoding issues, the `URI(scheme,host,path,fragment)` constructor should be used instead.  Just give `null` for `host` and `fragment`.

Code before review:
private ProtectionDomain createDefaultProtectionDomain(Path applicationClasspath) {
URL url = null;
if (applicationClasspath != null) {
try {
URI uri = new URI("file:
url = uri.toURL();
} catch (URISyntaxException | MalformedURLException e) {
log.error("URL codeSource location for path " + applicationClasspath + " could not be created.");
}
}
CodeSource codesource = new CodeSource(url, (Certificate[]) null);
ProtectionDomain protectionDomain = new ProtectionDomain(codesource, null, this, null);
return protectionDomain;
}

Line under review: URI uri = new URI("file:

Code after addressing the review:
private ProtectionDomain createDefaultProtectionDomain(Path applicationClasspath) {
URL url = null;
if (applicationClasspath != null) {
try {
URI uri = new URI("file", null, applicationClasspath.toString(), null);
url = uri.toURL();
} catch (URISyntaxException | MalformedURLException e) {
log.error("URL codeSource location for path " + applicationClasspath + " could not be created.");
}
}
CodeSource codesource = new CodeSource(url, (Certificate[]) null);
ProtectionDomain protectionDomain = new ProtectionDomain(codesource, null, this, null);
return protectionDomain;
}
Code review comment: (Note that I might be missing something, I'm exhausted :))

Code before review:
private static String buildConnectionString(RedisConfiguration config, URI host, String clientName) {
final String address = host.toString();
if (address.contains(":
return address;
}
LOGGER.warnf(
"The configuration property quarkus.redis%s.hosts is using the deprecated way of setting up the Redis connection. "
+ "Visit https:
isDefault(clientName) ? "" : "." + clientName);
boolean ssl = false;
if (config.ssl.isPresent()) {
ssl = config.ssl.get();
logDeprecationWarning(clientName, "ssl");
}
final StringBuilder builder = ssl ? new StringBuilder("rediss:
if (config.password.isPresent()) {
builder.append(config.password.get());
builder.append('@');
logDeprecationWarning(clientName, "password");
}
builder.append(host.getHost());
builder.append(':');
builder.append(host.getPort());
builder.append('/');
if (config.database.isPresent()) {
builder.append(config.database.getAsInt());
logDeprecationWarning(clientName, "database");
}
return builder.toString();
}

Line under review: return address;

Code after addressing the review:
private static String buildConnectionString(RedisConfiguration config, URI host, String clientName) {
final String address = host.toString();
if (address.contains(":
return address;
}
LOGGER.warnf(
"The configuration property quarkus.redis%s.hosts is using the deprecated way of setting up the Redis connection. "
+ "Visit https:
isDefault(clientName) ? "" : "." + clientName);
boolean ssl = false;
if (config.ssl.isPresent()) {
ssl = config.ssl.get();
logDeprecationWarning(clientName, "ssl");
}
final StringBuilder builder = ssl ? new StringBuilder("rediss:
if (config.password.isPresent()) {
builder.append(config.password.get());
builder.append('@');
logDeprecationWarning(clientName, "password");
}
builder.append(host.getHost());
builder.append(':');
builder.append(host.getPort());
builder.append('/');
if (config.database.isPresent()) {
builder.append(config.database.getAsInt());
logDeprecationWarning(clientName, "database");
}
return builder.toString();
}
Code review comment: I changed it to what you suggested, anyway

Code before review:
private InMemoryJobService createJobService() throws IOException {
GrpcFnServer<BeamFileSystemArtifactStagingService> artifactStagingService =
createArtifactStagingService();
JobInvoker invoker = createJobInvoker();
return InMemoryJobService.create(
artifactStagingService.getApiServiceDescriptor(),
(String session) -> {
try {
return BeamFileSystemArtifactStagingService.generateStagingSessionToken(
session, configuration.artifactStagingPath);
} catch (Exception exn) {
throw new RuntimeException(exn);
}
},
configuration.cleanArtifactsPerJob ?
(String stagingSessionToken) ->
artifactStagingService.getService().removeArtifacts(stagingSessionToken)
: null,
invoker);
}

Line under review: : null,

Code after addressing the review:
private InMemoryJobService createJobService() throws IOException {
artifactStagingServer = createArtifactStagingService();
JobInvoker invoker = createJobInvoker();
return InMemoryJobService.create(
artifactStagingServer.getApiServiceDescriptor(),
(String session) -> {
try {
return BeamFileSystemArtifactStagingService.generateStagingSessionToken(
session, configuration.artifactStagingPath);
} catch (Exception exn) {
throw new RuntimeException(exn);
}
},
(String stagingSessionToken) -> {
if (configuration.cleanArtifactsPerJob) {
artifactStagingServer.getService().removeArtifacts(stagingSessionToken);
}
},
invoker);
}
Code review comment: It cannot be null, always set

Code before review:
public void testMappingUpdateStructRowToDataChangeRecord() {
final DataChangeRecord dataChangeRecord =
new DataChangeRecord(
"partitionToken",
Timestamp.ofTimeSecondsAndNanos(10L, 20),
"serverTransactionId",
true,
"1",
"tableName",
Arrays.asList(
new ColumnType("column1", new TypeCode("type1"), true, 1L),
new ColumnType("column2", new TypeCode("type2"), false, 2L)),
Collections.singletonList(
new Mod(
"{\"column1\": \"value1\"}",
"{\"column2\": \"oldValue2\"}",
"{\"column2\": \"newValue2\"}")),
ModType.UPDATE,
ValueCaptureType.OLD_AND_NEW_VALUES,
10L,
2L,
"transactionTag",
true,
null);
final Struct stringFieldsStruct = recordsToStructWithStrings(dataChangeRecord);
final Struct jsonFieldsStruct = recordsToStructWithJson(dataChangeRecord);
assertEquals(
Collections.singletonList(dataChangeRecord),
mapper.toChangeStreamRecords(partition, stringFieldsStruct, resultSetMetadata));
assertEquals(
Collections.singletonList(dataChangeRecord),
mapper.toChangeStreamRecords(partition, jsonFieldsStruct, resultSetMetadata));
}

Line under review: "transactionTag",

Code after addressing the review:
public void testMappingUpdateStructRowToDataChangeRecord() {
final DataChangeRecord dataChangeRecord =
new DataChangeRecord(
"partitionToken",
Timestamp.ofTimeSecondsAndNanos(10L, 20),
"serverTransactionId",
true,
"1",
"tableName",
Arrays.asList(
new ColumnType("column1", new TypeCode("type1"), true, 1L),
new ColumnType("column2", new TypeCode("type2"), false, 2L)),
Collections.singletonList(
new Mod(
"{\"column1\": \"value1\"}",
"{\"column2\": \"oldValue2\"}",
"{\"column2\": \"newValue2\"}")),
ModType.UPDATE,
ValueCaptureType.OLD_AND_NEW_VALUES,
10L,
2L,
"transactionTag",
true,
null);
final Struct stringFieldsStruct = recordsToStructWithStrings(dataChangeRecord);
final Struct jsonFieldsStruct = recordsToStructWithJson(dataChangeRecord);
assertEquals(
Collections.singletonList(dataChangeRecord),
mapper.toChangeStreamRecords(partition, stringFieldsStruct, resultSetMetadata));
assertEquals(
Collections.singletonList(dataChangeRecord),
mapper.toChangeStreamRecords(partition, jsonFieldsStruct, resultSetMetadata));
}
Code review comment: Shall we move `"responseTimeThreshold"` to a `private static final String` variable defined in this class.

Code before review:
public static int getCompletionResponseTimeThreshold() {
return Integer.parseInt(System.getProperty("responseTimeThreshold")) / 2;
}

Line under review: return Integer.parseInt(System.getProperty("responseTimeThreshold")) / 2;

Code after addressing the review:
public static int getCompletionResponseTimeThreshold() {
return Integer.parseInt(System.getProperty(RES_TIME_THRESHOLD_SYSTEM_PROPERTY)) / 2;
}
Code review comment: nit:I think the pattern is to have a `static BeamSqlEnv.builder()` method that would call a protected constructor on the builder

Code before review:
public static BeamSqlEnv withTableProvider(TableProvider tableProvider) {
return BeamSqlEnvBuilder.builder(tableProvider).build();
}

Line under review: return BeamSqlEnvBuilder.builder(tableProvider).build();

Code after addressing the review:
public static BeamSqlEnv withTableProvider(TableProvider tableProvider) {
return builder().setInitializeTableProvider(tableProvider).build();
}
Code review comment: WHAT? 🫨 😄 is it some Panache-AI figuring out the query for the user? 😏😄  nice, thanks, I'll keep it in mind for the future 👍🏻 

Code before review:
public void runSomeTests42416() {
try {
Fruit.find("where name = ?1", "apple").singleResult();
} catch (jakarta.persistence.NonUniqueResultException e) {
}
try {
Fruit.find("where name = ?1", "not-a-fruit").singleResult();
} catch (jakarta.persistence.NoResultException e) {
}
try {
Fruit.find("where name = ?1", "apple").singleResultOptional();
} catch (jakarta.persistence.NonUniqueResultException e) {
}
}

Line under review: Fruit.find("where name = ?1", "apple").singleResult();

Code after addressing the review:
public void runSomeTests42416() {
try {
Fruit.find("where name = ?1", "apple").singleResult();
} catch (jakarta.persistence.NonUniqueResultException e) {
}
try {
Fruit.find("where name = ?1", "not-a-fruit").singleResult();
} catch (jakarta.persistence.NoResultException e) {
}
try {
Fruit.find("where name = ?1", "apple").singleResultOptional();
} catch (jakarta.persistence.NonUniqueResultException e) {
}
}
Code review comment: Can we call `AADJwtBearerTokenAuthenticationConverter(String authoritiesClaimName, String authorityPrefix)` in this method?

Code before review:
public AADJwtBearerTokenAuthenticationConverter() {
super();
principalClaimName = DEFAULT_PRINCIPAL_CLAIM_NAME;
}

Line under review: principalClaimName = DEFAULT_PRINCIPAL_CLAIM_NAME;

Code after addressing the review:
public AADJwtBearerTokenAuthenticationConverter() {
this(DEFAULT_PRINCIPAL_CLAIM_NAME, DEFAULT_CLAIM_TO_AUTHORITY_PREFIX_MAP);
}
Code review comment: Could you use one check of CoreUtil.isNullOrEmpty() here?

Code before review:
public AzureKeyCredential update(String key) {
Objects.requireNonNull(key);
if (key.isEmpty()) {
throw logger.logExceptionAsError(new IllegalArgumentException("'key' cannot be empty."));
}
this.key = key;
return this;
}

Line under review: if (key.isEmpty()) {

Code after addressing the review:
public AzureKeyCredential update(String key) {
Objects.requireNonNull(key, "'key' cannot be null.");
if (key.isEmpty()) {
throw logger.logExceptionAsError(new IllegalArgumentException("'key' cannot be empty."));
}
this.key = key;
return this;
}
Code review comment: ```suggestion             switch (binaryPredicate.getOp()) { ```

Code before review:
boolean filterResult(String columnName, Comparable element, HashMap<String, Expr> filter) throws AnalysisException {
if (filter == null) {
return true;
}
Expr subExpr = filter.get(columnName.toLowerCase());
if (subExpr == null) {
return true;
}
BinaryPredicate binaryPredicate = (BinaryPredicate) subExpr;
if (subExpr.getChild(1) instanceof StringLiteral && binaryPredicate.getOp() == BinaryPredicate.Operator.EQ) {
LOG.info("SubExpr value " + ((StringLiteral) subExpr.getChild(1)).getValue() + ", real value " + element);
return ((StringLiteral) subExpr.getChild(1)).getValue().equals(element);
}
if (subExpr.getChild(1) instanceof DateLiteral) {
Long leftVal = (new DateLiteral((String) element, Type.DATETIME)).getLongValue();
Long rightVal = ((DateLiteral) subExpr.getChild(1)).getLongValue();
LOG.info("Left value " + leftVal + ", right value " + rightVal);
switch( binaryPredicate.getOp()) {
case EQ:
case EQ_FOR_NULL:
return leftVal == rightVal;
case GE:
return leftVal >= rightVal;
case GT:
return leftVal > rightVal;
case LE:
return leftVal <= rightVal;
case LT:
return leftVal < rightVal;
case NE:
return leftVal != rightVal;
default:
Preconditions.checkState(false, "No defined binary operator.");
}
}
return true;
}

Line under review: switch( binaryPredicate.getOp()) {

Code after addressing the review:
boolean filterResult(String columnName, Comparable element, HashMap<String, Expr> filter) throws AnalysisException {
if (filter == null) {
return true;
}
Expr subExpr = filter.get(columnName.toLowerCase());
if (subExpr == null) {
return true;
}
BinaryPredicate binaryPredicate = (BinaryPredicate) subExpr;
if (subExpr.getChild(1) instanceof StringLiteral && binaryPredicate.getOp() == BinaryPredicate.Operator.EQ) {
return ((StringLiteral) subExpr.getChild(1)).getValue().equals(element);
}
if (subExpr.getChild(1) instanceof DateLiteral) {
Long leftVal = (new DateLiteral((String) element, Type.DATETIME)).getLongValue();
Long rightVal = ((DateLiteral) subExpr.getChild(1)).getLongValue();
switch (binaryPredicate.getOp()) {
case EQ:
case EQ_FOR_NULL:
return leftVal == rightVal;
case GE:
return leftVal >= rightVal;
case GT:
return leftVal > rightVal;
case LE:
return leftVal <= rightVal;
case LT:
return leftVal < rightVal;
case NE:
return leftVal != rightVal;
default:
Preconditions.checkState(false, "No defined binary operator.");
}
}
return true;
}
Code review comment: If the vert.x blocking thread pool size is set, by "use it" do you mean create a new EQE instance? Otherwise, I'm not sure how we can have the vert.x thread pool config override the overall quarkus thread pool config in _core_?  Right now all three pools in Vert.x use the same factory, so there's no way to separate out the regular blocking pool executor factory and shared executor pool, from the file operations one.

Code before review:
public ExecutorService createExecutor(ThreadFactory threadFactory, Integer concurrency, Integer maxConcurrency) {
final EnhancedQueueExecutor.Builder builder = new EnhancedQueueExecutor.Builder()
.setRegisterMBean(false)
.setHandoffExecutor(JBossExecutors.rejectingExecutor())
.setThreadFactory(JBossExecutors.resettingThreadFactory(threadFactory));
final int cpus = ProcessorInfo.availableProcessors();
builder.setCorePoolSize(concurrency);
builder.setMaximumPoolSize(maxConcurrency != null ? maxConcurrency : Math.max(8 * cpus, 200));
if (conf != null) {
if (conf.queueSize.isPresent()) {
if (conf.queueSize.getAsInt() < 0) {
builder.setMaximumQueueSize(Integer.MAX_VALUE);
} else {
builder.setMaximumQueueSize(conf.queueSize.getAsInt());
}
}
builder.setGrowthResistance(conf.growthResistance);
builder.setKeepAliveTime(conf.keepAliveTime);
}
final EnhancedQueueExecutor eqe = builder.build();
eqe.prestartAllCoreThreads();
return eqe;
}

Line under review: }

Code after addressing the review:
public ExecutorService createExecutor(ThreadFactory threadFactory, Integer concurrency, Integer maxConcurrency) {
if (executorCount.incrementAndGet() == 1) {
if (launchMode != LaunchMode.DEVELOPMENT) {
if (sharedExecutor == null) {
log.warn("Shared executor not set. Unshared executor will be created for blocking work");
sharedExecutor = internalCreateExecutor(threadFactory, concurrency, maxConcurrency);
}
return sharedExecutor;
}
}
return internalCreateExecutor(threadFactory, concurrency, maxConcurrency);
}
Code review comment: The most risky bug in this code is: Modification of `refBasePartitionsToRefreshMap` parameter inside the method does not affect the actual member variable due to reassignment rather than modification.  You can modify the code like this: ```java     public void setRefBasePartitionsToRefreshMap(Map<String, Set<String>> refBasePartitionsToRefreshMap) {         this.refBasePartitionsToRefreshMap = trimHashMap(refBasePartitionsToRefreshMap);     } ```

Code before review:
public void setNextPartitionEnd(String nextPartitionEnd) {
this.nextPartitionEnd = nextPartitionEnd;
}

Line under review: this.nextPartitionEnd = nextPartitionEnd;

Code after addressing the review:
public void setNextPartitionEnd(String nextPartitionEnd) {
this.nextPartitionEnd = nextPartitionEnd;
}
Code review comment: this would be ignoring ./gradlew / gradle wrapper

Code before review:
public static void executeGradle(File projectDirectory, CommandInvocation invocation, String buildTarget) {
String gradleExecutable = findExecutable("gradle");
if (gradleExecutable == null) {
invocation.println("unable to find the gradle executable, is it in your path?");
} else {
gradleExecutable += File.separator + "bin" + File.separator + "gradle";
try {
Process process = new ProcessBuilder()
.command(gradleExecutable, buildTarget)
.directory(projectDirectory)
.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
invocation.println(line);
}
int exit = process.waitFor();
if (exit != 0)
invocation.println("Build failed.");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}

Line under review: if (gradleExecutable == null) {

Code after addressing the review:
public static void executeGradle(File projectDirectory, CommandInvocation invocation, String buildTarget)
throws InterruptedException {
String gradleExecutable = findExecutable("gradle");
if (gradleExecutable == null) {
invocation.println("unable to find the gradle executable, is it in your path?");
} else {
gradleExecutable += File.separator + "bin" + File.separator + "gradle";
try {
Process process = new ProcessBuilder()
.command(gradleExecutable, buildTarget)
.directory(projectDirectory)
.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
invocation.println(line);
}
int exit = process.waitFor();
if (exit != 0)
invocation.println("Build failed.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Code review comment: Should it be `Joiner.on("\n\t")`? Does the `%n` work at all in this context? Perhaps add a small test?

Code before review:
public String getMessage() {
String reasonsStr = Joiner.on(String.format("%n  ")).join(reasons);
return String.format("%s is not deterministic because:%n  %s", coder, reasonsStr);
}

Line under review: String reasonsStr = Joiner.on(String.format("%n  ")).join(reasons);

Code after addressing the review:
public String getMessage() {
String reasonsStr = Joiner.on("\n\t").join(reasons);
return coder + " is not deterministic because:\n\t" + reasonsStr;
}
Code review comment: Should `actions` be forced to be non-null? How do the callers into this method handle a `null` return?

Code before review:
private JobManifestTasks getJobManifestTasks(TextAnalyticsActions actions) {
if (actions == null) {
return null;
}
final JobManifestTasks jobManifestTasks = new JobManifestTasks();
if (actions.getRecognizeEntitiesActions() != null) {
jobManifestTasks.setEntityRecognitionTasks(toEntitiesTask(actions));
}
if (actions.getRecognizePiiEntitiesActions() != null) {
jobManifestTasks.setEntityRecognitionPiiTasks(toPiiTask(actions));
}
if (actions.getExtractKeyPhrasesActions() != null) {
jobManifestTasks.setKeyPhraseExtractionTasks(toKeyPhrasesTask(actions));
}
if (actions.getRecognizeLinkedEntitiesActions() != null) {
jobManifestTasks.setEntityLinkingTasks(toEntityLinkingTask(actions));
}
if (actions.getAnalyzeSentimentActions() != null) {
jobManifestTasks.setSentimentAnalysisTasks(toSentimentAnalysisTask(actions));
}
if (actions.getExtractSummaryActions() != null) {
jobManifestTasks.setExtractiveSummarizationTasks(toExtractiveSummarizationTask(actions));
}
return jobManifestTasks;
}

Line under review: if (actions == null) {

Code after addressing the review:
private JobManifestTasks getJobManifestTasks(TextAnalyticsActions actions) {
if (actions == null) {
return null;
}
final JobManifestTasks jobManifestTasks = new JobManifestTasks();
if (actions.getRecognizeEntitiesActions() != null) {
jobManifestTasks.setEntityRecognitionTasks(toEntitiesTask(actions));
}
if (actions.getRecognizePiiEntitiesActions() != null) {
jobManifestTasks.setEntityRecognitionPiiTasks(toPiiTask(actions));
}
if (actions.getExtractKeyPhrasesActions() != null) {
jobManifestTasks.setKeyPhraseExtractionTasks(toKeyPhrasesTask(actions));
}
if (actions.getRecognizeLinkedEntitiesActions() != null) {
jobManifestTasks.setEntityLinkingTasks(toEntityLinkingTask(actions));
}
if (actions.getAnalyzeSentimentActions() != null) {
jobManifestTasks.setSentimentAnalysisTasks(toSentimentAnalysisTask(actions));
}
if (actions.getExtractSummaryActions() != null) {
jobManifestTasks.setExtractiveSummarizationTasks(toExtractiveSummarizationTask(actions));
}
return jobManifestTasks;
}
Code review comment: We need to call close here exactly because it flushes data (in this case it could flush buffered data into the list). Compare with Kryo's `Output`.  Flushing the list on `close` would be an odd behavior that breaks with the expectations that we have from `java.io.StringWriter`, `ByteArrayOutputStream`, etc.

Code before review:
static List<StreamElement> popCompleted(StreamElementQueue<Integer> queue) {
final List<StreamElement> completed = new ArrayList<>();
TimestampedCollector<Integer> collector = new TimestampedCollector<>(new CollectorOutput<>(completed));
while (queue.hasCompletedElements()) {
queue.emitCompletedElement(collector);
}
collector.close();
return completed;
}

Line under review: collector.close();

Code after addressing the review:
static List<StreamElement> popCompleted(StreamElementQueue<Integer> queue) {
final List<StreamElement> completed = new ArrayList<>();
TimestampedCollector<Integer> collector = new TimestampedCollector<>(new CollectorOutput<>(completed));
while (queue.hasCompletedElements()) {
queue.emitCompletedElement(collector);
}
collector.close();
return completed;
}
Code review comment: randomUUID cannot be created this way. The random data need to be recorded in the test record.  Use `ResourceManagerUtil.randomUuid`.

Code before review:
public void canCreateAndUpdateVirtualMachineWithUserData() {
String userDataForCreate = new String(Base64.getEncoder().encode(
UUID.randomUUID().toString().toUpperCase(Locale.ROOT).getBytes(StandardCharsets.UTF_8)));
String userDataForUpdate = new String(Base64.getEncoder().encode(
UUID.randomUUID().toString().toUpperCase(Locale.ROOT).getBytes(StandardCharsets.UTF_8)));
VirtualMachine vm = computeManager
.virtualMachines()
.define(vmName)
.withRegion(region)
.withNewResourceGroup(rgName)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withoutPrimaryPublicIPAddress()
.withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER)
.withAdminUsername("Foo12")
.withAdminPassword(password())
.withNewDataDisk(127)
.withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4"))
.withUserData(userDataForCreate)
.create();
vm.update().withUserData(userDataForUpdate).apply();
}

Line under review: UUID.randomUUID().toString().toUpperCase(Locale.ROOT).getBytes(StandardCharsets.UTF_8)));

Code after addressing the review:
public void canCreateAndUpdateVirtualMachineWithUserData() {
String userDataForCreate = "N0ZBN0MxRkYtMkNCMC00RUM3LUE1RDctMDY2MUI0RTdDNzY4";
String userDataForUpdate = "Njc5MDI3MUItQ0RGRC00RjdELUI5NTEtMTA4QjA2RTNGNDRE";
VirtualMachine vm = computeManager
.virtualMachines()
.define(vmName)
.withRegion(region)
.withNewResourceGroup(rgName)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withoutPrimaryPublicIPAddress()
.withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2019_DATACENTER_GEN2)
.withAdminUsername("Foo12")
.withAdminPassword(password())
.withNewDataDisk(127)
.withSize(VirtualMachineSizeTypes.fromString("Standard_D2a_v4"))
.withUserData(userDataForCreate)
.create();
Response<VirtualMachineInner> response = computeManager.serviceClient().getVirtualMachines()
.getByResourceGroupWithResponse(rgName, vmName, InstanceViewTypes.USER_DATA, Context.NONE);
Assertions.assertEquals(userDataForCreate, response.getValue().userData());
vm.update().withUserData(userDataForUpdate).apply();
response = computeManager.serviceClient().getVirtualMachines()
.getByResourceGroupWithResponse(rgName, vmName, InstanceViewTypes.USER_DATA, Context.NONE);
Assertions.assertEquals(userDataForUpdate, response.getValue().userData());
}
Code review comment: What a pain in the butt. Gradle, Maven, and Eclipse all conspire to hide this when using a newer JDK. TIL!

Code before review:
private void createBuildFile() throws IOException {
Path buildFile = projectDir.resolve("build.gradle");
try (InputStream is = getClass().getResourceAsStream("/TaskDependenciesFunctionalTest.gradle")) {
String txt = new String(is.readAllBytes());
Files.writeString(buildFile, txt);
}
}

Line under review: String txt = new String(is.readAllBytes());

Code after addressing the review:
private void createBuildFile() throws IOException {
Path buildFile = projectDir.resolve("build.gradle");
try (InputStream is = getClass().getResourceAsStream("/TaskDependenciesFunctionalTest.gradle");
BufferedInputStream bis = new BufferedInputStream(is)) {
Files.copy(bis, buildFile);
}
}
Code review comment: ```suggestion                 .log(() -> "Request redirection is not enabled for this HTTP method."); ```

Code before review:
private boolean isAllowedRedirectMethod(HttpMethod httpMethod) {
if (allowedRedirectHttpMethods.contains(httpMethod)) {
return true;
} else {
LOGGER.atError()
.addKeyValue(LoggingKeys.HTTP_METHOD_KEY, httpMethod)
.log(() -> "Request was redirected from an invalid redirect allowed method.");
return false;
}
}

Line under review: .log(() -> "Request was redirected from an invalid redirect allowed method.");

Code after addressing the review:
private boolean isAllowedRedirectMethod(HttpMethod httpMethod) {
if (allowedRedirectHttpMethods.contains(httpMethod)) {
return true;
} else {
LOGGER.atError()
.addKeyValue(LoggingKeys.HTTP_METHOD_KEY, httpMethod)
.log(() -> "Request redirection is not enabled for this HTTP method.");
return false;
}
}
Code review comment: `DecodeContext` record the output dict by map `operatorDecodeInfo<Operator, DecodeInfo>`, and TopN equals&hash is error that find other TopN node when rewrite low-cardinality

Code before review:
public int hashCode() {
return Objects.hash(super.hashCode(), orderSpec, offset, sortPhase, topNType, isSplit, isEnforced);
}

Line under review: return Objects.hash(super.hashCode(), orderSpec, offset, sortPhase, topNType, isSplit, isEnforced);

Code after addressing the review:
public int hashCode() {
return Objects.hash(super.hashCode(), orderSpec, offset, sortPhase, topNType, isSplit, isEnforced);
}
Code review comment: Shall we limit catch to NullPointerException?

Code before review:
public void testE2ETrafficMaxLaneFlow() throws Exception {
this.options.setBigQuerySchema(FormatMaxesFn.getSchema());
this.options.setProject(this.projectId);
this.options.setBigQueryDataset(this.outputDatasetId);
this.options.setBigQueryTable(this.outputTable);
TrafficMaxLaneFlow.runTrafficMaxLaneFlow(this.options);
FluentBackoff backoffFactory =
FluentBackoff.DEFAULT.withMaxRetries(4).withInitialBackoff(Duration.standardSeconds(1L));
Sleeper sleeper = Sleeper.DEFAULT;
BackOff backoff = BackOffAdapter.toGcpBackOff(backoffFactory.backoff());
String res = "empty_result";
int attemptNum = 1;
do {
QueryResponse response =
this.bqClient.queryWithRetries(
String.format(
"SELECT count(*) as total FROM [%s:%s.%s]",
this.projectId, this.outputDatasetId, this.outputTable),
this.projectId);
try {
res = response.getRows().get(0).getF().get(0).getV().toString();
break;
} catch (Exception e) {
LOG.info("Failed to get data from BigQuery with {} attempt.", attemptNum);
attemptNum += 1;
}
} while (BackOffUtils.next(sleeper, backoff));
assertEquals("9763", res);
}

Line under review: } catch (Exception e) {

Code after addressing the review:
public void testE2ETrafficMaxLaneFlow() throws Exception {
this.options.setBigQuerySchema(FormatMaxesFn.getSchema());
this.options.setProject(this.projectId);
this.options.setBigQueryDataset(this.outputDatasetId);
this.options.setBigQueryTable(this.outputTable);
TrafficMaxLaneFlow.runTrafficMaxLaneFlow(this.options);
FluentBackoff backoffFactory =
FluentBackoff.DEFAULT.withMaxRetries(4).withInitialBackoff(Duration.standardSeconds(1L));
Sleeper sleeper = Sleeper.DEFAULT;
BackOff backoff = BackOffAdapter.toGcpBackOff(backoffFactory.backoff());
String res = "empty_result";
do {
QueryResponse response =
this.bqClient.queryWithRetries(
String.format(
"SELECT count(*) as total FROM [%s:%s.%s]",
this.projectId, this.outputDatasetId, this.outputTable),
this.projectId);
try {
res = response.getRows().get(0).getF().get(0).getV().toString();
break;
} catch (NullPointerException e) {
}
} while (BackOffUtils.next(sleeper, backoff));
assertEquals("9763", res);
}
Code review comment: For iceberg table, is `catalogTable.getStorageDescriptor()` is null ?

Code before review:
public static Table convertTable(com.amazonaws.services.glue.model.Table catalogTable, String dbname) {
Table hiveTable = new Table();
hiveTable.setDbName(dbname);
hiveTable.setTableName(catalogTable.getName());
Date createTime = catalogTable.getCreateTime();
hiveTable.setCreateTime(createTime == null ? 0 : (int) (createTime.getTime() / 1000));
hiveTable.setOwner(catalogTable.getOwner());
Date lastAccessedTime = catalogTable.getLastAccessTime();
hiveTable.setLastAccessTime(lastAccessedTime == null ? 0 : (int) (lastAccessedTime.getTime() / 1000));
hiveTable.setRetention(catalogTable.getRetention());
if (catalogTable.getParameters() == null || catalogTable.getParameters().get(TABLE_TYPE_PROP) == null ||
(!catalogTable.getParameters().get(TABLE_TYPE_PROP).equalsIgnoreCase(ICEBERG_TABLE_TYPE_VALUE))) {
hiveTable.setSd(convertStorageDescriptor(catalogTable.getStorageDescriptor()));
}
hiveTable.setPartitionKeys(convertFieldSchemaList(catalogTable.getPartitionKeys()));
Map<String, String> parameterMap = catalogTable.getParameters();
if (parameterMap == null) {
parameterMap = Maps.newHashMap();
}
hiveTable.setParameters(parameterMap);
hiveTable.setViewOriginalText(catalogTable.getViewOriginalText());
hiveTable.setViewExpandedText(catalogTable.getViewExpandedText());
hiveTable.setTableType(catalogTable.getTableType());
return hiveTable;
}

Line under review: if (catalogTable.getParameters() == null || catalogTable.getParameters().get(TABLE_TYPE_PROP) == null ||

Code after addressing the review:
public static Table convertTable(com.amazonaws.services.glue.model.Table catalogTable, String dbname) {
Table hiveTable = new Table();
hiveTable.setDbName(dbname);
hiveTable.setTableName(catalogTable.getName());
Date createTime = catalogTable.getCreateTime();
hiveTable.setCreateTime(createTime == null ? 0 : (int) (createTime.getTime() / 1000));
hiveTable.setOwner(catalogTable.getOwner());
Date lastAccessedTime = catalogTable.getLastAccessTime();
hiveTable.setLastAccessTime(lastAccessedTime == null ? 0 : (int) (lastAccessedTime.getTime() / 1000));
hiveTable.setRetention(catalogTable.getRetention());
if (!HiveTableValidator.isIcebergTable(catalogTable)) {
hiveTable.setSd(convertStorageDescriptor(catalogTable.getStorageDescriptor()));
}
hiveTable.setPartitionKeys(convertFieldSchemaList(catalogTable.getPartitionKeys()));
Map<String, String> parameterMap = catalogTable.getParameters();
if (parameterMap == null) {
parameterMap = Maps.newHashMap();
}
hiveTable.setParameters(parameterMap);
hiveTable.setViewOriginalText(catalogTable.getViewOriginalText());
hiveTable.setViewExpandedText(catalogTable.getViewExpandedText());
hiveTable.setTableType(catalogTable.getTableType());
return hiveTable;
}
Code review comment: Correct, this is to limit the scope as suggested in https://github.com/oracle/graal/issues/7105#issue-1833493484. Alternatively we could just pass `-H:+UnlockExperimentalVMOptions` as the first option and allow any experimental option to be passed afterwards. It would make things simpler but would also allow people (both Quarkus users and devs) to use experimental options possibly without noticing.

Code before review:
private void addExperimentalVMOption(List<String> nativeImageArgs, String option) {
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_23_1_0) >= 0) {
nativeImageArgs.add("-H:+UnlockExperimentalVMOptions");
}
nativeImageArgs.add(option);
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_23_1_0) >= 0) {
nativeImageArgs.add("-H:-UnlockExperimentalVMOptions");
}
}

Line under review: }

Code after addressing the review:
private void addExperimentalVMOption(List<String> nativeImageArgs, String option) {
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_23_1_0) >= 0) {
nativeImageArgs.add("-H:+UnlockExperimentalVMOptions");
}
nativeImageArgs.add(option);
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_23_1_0) >= 0) {
nativeImageArgs.add("-H:-UnlockExperimentalVMOptions");
}
}
Code review comment: This code path is the same as the "bubble up" case, just with a different starting point: you could create a method out of it to make it easier to remember what it does - or changing it in a single place.     

Code before review:
private void accessingResource(final ClassLoadingResource resource) {
final ClassLoadingResource toEvict;
synchronized (this.currentlyBufferedResources) {
if (!postBootPhase) {
return;
}
if (currentlyBufferedResources[0] == resource) {
return;
}
for (int i = 1; i < currentlyBufferedResources.length; i++) {
final ClassLoadingResource currentI = currentlyBufferedResources[i];
if (currentI == resource || currentI == null) {
for (int j = i; j > 0; j--) {
currentlyBufferedResources[j] = currentlyBufferedResources[j - 1];
}
currentlyBufferedResources[0] = resource;
return;
}
}
toEvict = currentlyBufferedResources[currentlyBufferedResources.length - 1];
for (int j = currentlyBufferedResources.length - 1; j > 0; j--) {
currentlyBufferedResources[j] = currentlyBufferedResources[j - 1];
}
currentlyBufferedResources[0] = resource;
}
toEvict.resetInternalCaches();
}

Line under review: for (int j = currentlyBufferedResources.length - 1; j > 0; j--) {

Code after addressing the review:
private void accessingResource(final ClassLoadingResource resource) {
final ClassLoadingResource toEvict;
synchronized (this.currentlyBufferedResources) {
if (!postBootPhase) {
return;
}
if (currentlyBufferedResources[0] == resource) {
return;
}
for (int i = 1; i < currentlyBufferedResources.length; i++) {
final ClassLoadingResource currentI = currentlyBufferedResources[i];
if (currentI == resource || currentI == null) {
bubbleUpCachedResource(resource, i);
return;
}
}
toEvict = currentlyBufferedResources[currentlyBufferedResources.length - 1];
bubbleUpCachedResource(resource, currentlyBufferedResources.length - 1);
}
toEvict.resetInternalCaches();
}
Code review comment: Parser should use newline token(s) only to make parsing-decisions. It should not use these tokens when creating nodes. Newlines should come from the minutiae as before.

Code before review:
private STNode parseKeyValue() {
startContext(ParserRuleContext.KEY_VALUE_PAIR);
STNode identifier = parseKeys();
STNode equals = parseEquals();
STNode value = parseValue();
STNode newLines = parseNewLines();
endContext();
return STNodeFactory.createKeyValueNode(identifier, equals, value, newLines);
}

Line under review: STNode newLines = parseNewLines();

Code after addressing the review:
private STNode parseKeyValue() {
startContext(ParserRuleContext.KEY_VALUE_PAIR);
STNode identifier = parseKeys();
STNode equals = parseEquals();
STNode value = parseValue();
STNode newLine = parseNewlines();
if (newLine.hasDiagnostics()) {
value = SyntaxErrors.addSyntaxDiagnostics(value, newLine.diagnostics());
}
endContext();
return STNodeFactory.createKeyValueNode(identifier, equals, value);
}
Code review comment: Ah, sure. I thought this was `float`, my mistake.

Code before review:
public Duration getTimeToLive() {
return Duration.ofSeconds(ttlSeconds.longValue());
}

Line under review: return Duration.ofSeconds(ttlSeconds.longValue());

Code after addressing the review:
public Duration getTimeToLive() {
return ttlSeconds == null ? null : Duration.ofSeconds(ttlSeconds.longValue());
}
Code review comment: What about removing the `else`? 

Code before review:
private MemorySize convertToMemorySize(Object o) {
if (o.getClass() == MemorySize.class) {
return (MemorySize) o;
} else {
return MemorySize.parse(o.toString());
}
}

Line under review: } else {

Code after addressing the review:
private MemorySize convertToMemorySize(Object o) {
if (o.getClass() == MemorySize.class) {
return (MemorySize) o;
}
return MemorySize.parse(o.toString());
}
Code review comment: Oh, my bad! I missed this! 

Code before review:
public void handle(RoutingContext event) {
HttpServerRequest request = event.request();
HttpServerResponse response = event.response();
String origin = request.getHeader(HttpHeaders.ORIGIN);
if (origin == null) {
corsFilter().handle(event);
} else {
if (origin.startsWith(HTTP_LOCAL_HOST) || origin.startsWith(HTTPS_LOCAL_HOST)) {
corsFilter().handle(event);
} else {
LOG.error("Only localhost origin is allowed");
response.end();
}
}
}

Line under review: corsFilter().handle(event);

Code after addressing the review:
public void handle(RoutingContext event) {
HttpServerRequest request = event.request();
HttpServerResponse response = event.response();
String origin = request.getHeader(HttpHeaders.ORIGIN);
if (origin == null) {
corsFilter().handle(event);
} else {
if (origin.startsWith(HTTP_LOCAL_HOST) || origin.startsWith(HTTPS_LOCAL_HOST)
|| origin.startsWith(HTTP_LOCAL_HOST_IP) || origin.startsWith(HTTPS_LOCAL_HOST_IP)) {
corsFilter().handle(event);
} else {
LOG.errorf("Only localhost origin is allowed, but Origin header value is: %s", origin);
response.setStatusCode(403);
response.setStatusMessage("CORS Rejected - Invalid origin");
response.end();
}
}
}
Code review comment: Is it an exact exception that we expect?

Code before review:
public void testRetries() throws Throwable {
thrown.expect(IOException.class);
thrown.expectMessage("Error writing to SNS");
thrown.expectMessage("No more attempts allowed");
final PublishRequest request1 = createSampleMessage("my message that will not be published");
final TupleTag<PublishResult> results = new TupleTag<>();
final AmazonSNS amazonSnsErrors = getAmazonSnsMockErrors();
p.apply(Create.of(request1))
.apply(
SnsIO.write()
.withTopicName(topicName)
.withRetryConfiguration(
SnsIO.RetryConfiguration.create(4, standardSeconds(10), millis(1)))
.withAWSClientsProvider(new Provider(amazonSnsErrors))
.withResultOutputTag(results));
try {
p.run();
} catch (final Pipeline.PipelineExecutionException e) {
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 1));
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 2));
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 3));
throw e.getCause();
}
}

Line under review: thrown.expect(IOException.class);

Code after addressing the review:
public void testRetries() throws Throwable {
thrown.expect(IOException.class);
thrown.expectMessage("Error writing to SNS");
thrown.expectMessage("No more attempts allowed");
final PublishRequest request1 = createSampleMessage("my message that will not be published");
final TupleTag<PublishResult> results = new TupleTag<>();
final AmazonSNS amazonSnsErrors = getAmazonSnsMockErrors();
p.apply(Create.of(request1))
.apply(
SnsIO.write()
.withTopicName(topicName)
.withRetryConfiguration(
SnsIO.RetryConfiguration.create(4, standardSeconds(10), millis(1)))
.withAWSClientsProvider(new Provider(amazonSnsErrors))
.withResultOutputTag(results));
try {
p.run();
} catch (final Pipeline.PipelineExecutionException e) {
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 1));
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 2));
snsWriterFnLogs.verifyWarn(String.format(SnsIO.Write.SnsWriterFn.RETRY_ATTEMPT_LOG, 3));
throw e.getCause();
}
}
Code review comment: 😞 we should make it one shared code path.

Code before review:
public LockedApplication storeWithUpdatedConfig(LockedApplication application, ApplicationPackage applicationPackage) {
applicationPackageValidator.validate(application.get(), applicationPackage, clock.instant());
application = application.with(applicationPackage.deploymentSpec());
application = application.with(applicationPackage.validationOverrides());
var existingInstances = application.get().instances().keySet();
var declaredInstances = applicationPackage.deploymentSpec().instanceNames();
for (var name : declaredInstances)
if ( ! existingInstances.contains(name))
application = withNewInstance(application, application.get().id().instance(name));
for (InstanceName name : existingInstances) {
application = withoutDeletedDeployments(application, name);
}
for (InstanceName instance : declaredInstances)
if (applicationPackage.deploymentSpec().requireInstance(instance).concerns(Environment.prod))
application = controller.routing().assignRotations(application, instance);
controller.jobController().deploymentStatus(application.get());
for (var name : existingInstances)
if ( ! declaredInstances.contains(name))
controller.notificationsDb().removeNotifications(NotificationSource.from(application.get().id().instance(name)));
store(application);
return application;
}

Line under review: controller.notificationsDb().removeNotifications(NotificationSource.from(application.get().id().instance(name)));

Code after addressing the review:
public LockedApplication storeWithUpdatedConfig(LockedApplication application, ApplicationPackage applicationPackage) {
applicationPackageValidator.validate(application.get(), applicationPackage, clock.instant());
application = application.with(applicationPackage.deploymentSpec());
application = application.with(applicationPackage.validationOverrides());
var existingInstances = application.get().instances().keySet();
var declaredInstances = applicationPackage.deploymentSpec().instanceNames();
for (var name : declaredInstances)
if ( ! existingInstances.contains(name))
application = withNewInstance(application, application.get().id().instance(name));
for (InstanceName name : existingInstances) {
application = withoutDeletedDeployments(application, name);
}
for (InstanceName instance : declaredInstances)
if (applicationPackage.deploymentSpec().requireInstance(instance).concerns(Environment.prod))
application = controller.routing().assignRotations(application, instance);
controller.jobController().deploymentStatus(application.get());
for (var name : existingInstances)
if ( ! declaredInstances.contains(name))
controller.notificationsDb().removeNotifications(NotificationSource.from(application.get().id().instance(name)));
store(application);
return application;
}
Code review comment: Lets keep the naming convention, qwc-extension-page, so `qwc-smallrye-reactive-messaging-channels`

Code before review:
CardPageBuildItem create() {
CardPageBuildItem card = new CardPageBuildItem("SmallRye Reactive Messaging");
card.addPage(Page.webComponentPageBuilder()
.title("Channels")
.componentLink("smallrye-reactive-messaging-component.js")
.icon("font-awesome-solid:diagram-project"));
return card;
}

Line under review: .componentLink("smallrye-reactive-messaging-component.js")

Code after addressing the review:
CardPageBuildItem create() {
CardPageBuildItem card = new CardPageBuildItem("SmallRye Reactive Messaging");
card.addPage(Page.webComponentPageBuilder()
.title("Channels")
.componentLink("qwc-smallrye-reactive-messaging-channels.js")
.icon("font-awesome-solid:diagram-project"));
return card;
}
Code review comment: This is unrelated to the changes, but it was a leftover 

Code before review:
private void testJsonMulti(String path) {
Client client = ClientBuilder.newBuilder().register(new JacksonBasicMessageBodyReader(new ObjectMapper())).build();
WebTarget target = client.target(uri.toString() + path);
Multi<Message> multi = target.request().rx(MultiInvoker.class).get(Message.class);
List<Message> list = multi.collect().asList().await().atMost(Duration.ofSeconds(30));
assertThat(list).extracting("name").containsExactly("hello", "stef");
}

Line under review: WebTarget target = client.target(uri.toString() + path);

Code after addressing the review:
private void testJsonMulti(String path) {
Client client = ClientBuilder.newBuilder().register(new JacksonBasicMessageBodyReader(new ObjectMapper())).build();
WebTarget target = client.target(uri.toString() + path);
Multi<Message> multi = target.request().rx(MultiInvoker.class).get(Message.class);
List<Message> list = multi.collect().asList().await().atMost(Duration.ofSeconds(30));
assertThat(list).extracting("name").containsExactly("hello", "stef");
}