Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix codestarts compatibility with older CLI #39467

Merged
merged 2 commits into from
Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{#include readme-header /}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{#include index-entry path=resource.path/}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# We need this for compat with older CLI versions
name: resteasy-reactive-codestart
ref: resteasy-reactive
type: code
tags: extension-codestart
metadata:
title: REST
description: Easily start your REST Web Services
related-guide-section: https://quarkus.io/guides/getting-started-reactive#reactive-jax-rs-resources
language:
base:
data:
resource:
class-name: GreetingResource
path: "/hello"
response: "Hello from Quarkus REST"
dependencies:
- io.quarkus:quarkus-rest
test-dependencies:
- io.rest-assured:rest-assured
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("{resource.path}")
public class {resource.class-name} {

@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "{resource.response}";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.acme;

import io.quarkus.test.junit.QuarkusIntegrationTest;

@QuarkusIntegrationTest
class {resource.class-name}IT extends {resource.class-name}Test {
// Execute the same tests but in packaged mode.
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.acme;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
class {resource.class-name}Test {
@Test
void testHelloEndpoint() {
given()
.when().get("{resource.path}")
.then()
.statusCode(200)
.body(is("{resource.response}"));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.acme

import jakarta.ws.rs.GET
import jakarta.ws.rs.Path
import jakarta.ws.rs.Produces
import jakarta.ws.rs.core.MediaType

@Path("{resource.path}")
class {resource.class-name} {

@GET
@Produces(MediaType.TEXT_PLAIN)
fun hello() = "{resource.response}"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.acme

import io.quarkus.test.junit.QuarkusIntegrationTest

@QuarkusIntegrationTest
class {resource.class-name}IT : {resource.class-name}Test()
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.acme

import io.quarkus.test.junit.QuarkusTest
import io.restassured.RestAssured.given
import org.hamcrest.CoreMatchers.`is`
import org.junit.jupiter.api.Test

@QuarkusTest
class {resource.class-name}Test {

@Test
fun testHelloEndpoint() {
given()
.`when`().get("{resource.path}")
.then()
.statusCode(200)
.body(`is`("{resource.response}"))
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.acme

import jakarta.ws.rs.\{GET, Path, Produces}
import jakarta.ws.rs.core.MediaType

@Path("{resource.path}")
class {resource.class-name} {

@GET
@Produces(Array[String](MediaType.TEXT_PLAIN))
def hello() = "{resource.response}"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.acme

import io.quarkus.test.junit.QuarkusIntegrationTest

@QuarkusIntegrationTest
class {resource.class-name}IT extends {resource.class-name}Test
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.acme

import io.quarkus.test.junit.QuarkusTest
import io.restassured.RestAssured.given
import org.hamcrest.CoreMatchers.`is`
import org.junit.jupiter.api.Test

@QuarkusTest
class {resource.class-name}Test {

@Test
def testHelloEndpoint() = {
given()
.`when`().get("{resource.path}")
.then()
.statusCode(200)
.body(`is`("{resource.response}"))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import io.quarkus.platform.descriptor.loader.json.ResourceLoader;
import io.quarkus.registry.catalog.Extension;
import io.quarkus.registry.catalog.ExtensionCatalog;
import io.smallrye.common.version.VersionScheme;

public final class QuarkusCodestartCatalog extends GenericCodestartCatalog<QuarkusCodestartProjectInput> {

Expand Down Expand Up @@ -138,13 +137,17 @@ protected Collection<Codestart> select(QuarkusCodestartProjectInput projectInput
.filter(c -> !isExample(c) || projectInput.getExample() == null || c.matches(projectInput.getExample()))
.collect(Collectors.toCollection(ArrayList::new));

// include default codestarts depending on the versions and the extensions being chosen or not
Optional<String> selectedDefaultCodeStart = getSelectedDefaultCodeStart(projectInput);
// include default codestart depending on the versions and the extensions being chosen or not
Optional<String> selectedDefaultCodeStart = Optional.ofNullable(projectInput.getDefaultCodestart());

// if there is no extension selected or only language extensions, we should add the default code start
// this has been settled in https://github.com/quarkusio/quarkus/pull/39467
final boolean shouldAddDefaultCodeStart = projectInput.getExtensions().isEmpty() ||
(projectInput.getExtensions().size() == 1
&& isLanguageExtension(projectInput.getExtensions().iterator().next()));
if (projectInput.getAppContent().contains(CODE)
&& selectedDefaultCodeStart.isPresent()
&& projectCodestarts.stream()
.noneMatch(c -> c.getType() == CodestartType.CODE && !c.getSpec().isPreselected())) {
&& shouldAddDefaultCodeStart) {
final Codestart defaultCodestart = codestarts.stream()
.filter(c -> c.matches(selectedDefaultCodeStart.get()))
.findFirst().orElseThrow(() -> new CodestartStructureException(
Expand Down Expand Up @@ -178,36 +181,6 @@ protected Collection<Codestart> select(QuarkusCodestartProjectInput projectInput
return projectCodestarts;
}

private Optional<String> getSelectedDefaultCodeStart(QuarkusCodestartProjectInput projectInput) {
// This is very hackyish, we need a better data structure to do better
Optional<ArtifactCoords> quarkusBom = projectInput.getBoms().stream()
.map(ArtifactCoords::fromString)
.filter(b -> isCoreBom(b) || isPlatformBom(b) || isUniverseBom(b))
.findFirst();

String bomVersion = null;

if (quarkusBom.isPresent()) {
bomVersion = quarkusBom.get().getVersion();
}

if (bomVersion == null || VersionScheme.MAVEN.compare(bomVersion, "2.8") >= 0) {
if (projectInput.getExtensions().isEmpty() ||
(projectInput.getExtensions().size() == 1
&& isLanguageExtension(projectInput.getExtensions().iterator().next()))) {
var defaultCodestart = projectInput.getDefaultCodestart();
if (defaultCodestart == null) {
defaultCodestart = QuarkusCodestartCatalog.ExtensionCodestart.REST.key();
}
return Optional.of(defaultCodestart);
}

return Optional.empty();
}

return Optional.of(ExtensionCodestart.RESTEASY.key());
}

private boolean isCoreBom(ArtifactCoords artifactCoords) {
return IO_QUARKUS_GROUP_ID.equals(artifactCoords.getGroupId()) && QUARKUS_BOM.equals(artifactCoords.getArtifactId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ private void checkMinimumJavaVersion(String javaVersionString, List<Extension> e
}

private static String getDefaultCodestart(ExtensionCatalog catalog) {
// Recent versions of the catalog have a default-codestart in the project metadata (2.10+)
var map = catalog.getMetadata();
if (map != null && !map.isEmpty()) {
var projectMetadata = map.get("project");
Expand All @@ -264,6 +265,7 @@ private static String getDefaultCodestart(ExtensionCatalog catalog) {
}
}
}
return null;
// Let's use resteasy-reactive for older versions
return "resteasy-reactive";
}
}
Loading