diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 7933e4d8aee66..1e3c506902bf1 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -52,7 +52,7 @@ 1.0.13 2.7.0 2.27.0 - 3.20.0 + 3.21.0 1.1.2 1.2.1 1.3.5 @@ -83,7 +83,7 @@ 22.2.0 ${graal-sdk.version} 1.1.1.Final - 2.13.4 + 2.13.4.20221013 1.0.0.Final 3.12.0 1.15 @@ -150,7 +150,7 @@ 1.4.2 1.7.20 1.6.4 - 1.4.0 + 1.4.1 5.12.4 2.11.3 3.2.0 @@ -187,6 +187,7 @@ 4.6.3 1.0.4 1.21 + 1.10.0 2.9.1 1.1.1.Final 2.19.0 @@ -3126,6 +3127,11 @@ commons-lang3 ${commons-lang3.version} + + org.apache.commons + commons-text + ${commons-text.version} + commons-codec commons-codec diff --git a/core/deployment/src/main/java/io/quarkus/deployment/CodeGenerator.java b/core/deployment/src/main/java/io/quarkus/deployment/CodeGenerator.java index ef90eeee63e2b..b93c2a21ab98f 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/CodeGenerator.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/CodeGenerator.java @@ -7,10 +7,16 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.ServiceLoader; import java.util.function.Consumer; +import org.eclipse.microprofile.config.Config; + +import io.quarkus.bootstrap.classloading.ClassPathElement; +import io.quarkus.bootstrap.classloading.FilteredClassPathElement; +import io.quarkus.bootstrap.classloading.QuarkusClassLoader; import io.quarkus.bootstrap.model.ApplicationModel; import io.quarkus.bootstrap.prebuild.CodeGenException; import io.quarkus.deployment.codegen.CodeGenData; @@ -19,8 +25,11 @@ import io.quarkus.paths.PathCollection; import io.quarkus.runtime.LaunchMode; import io.quarkus.runtime.configuration.ConfigUtils; +import io.smallrye.config.KeyMap; +import io.smallrye.config.KeyMapBackedConfigSource; +import io.smallrye.config.NameIterator; import io.smallrye.config.PropertiesConfigSource; -import io.smallrye.config.SmallRyeConfig; +import io.smallrye.config.SmallRyeConfigBuilder; import io.smallrye.config.SysPropConfigSource; /** @@ -28,16 +37,23 @@ */ public class CodeGenerator { + private static final String MP_CONFIG_SPI_CONFIG_SOURCE_PROVIDER = "META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider"; + // used by Gradle and Maven - public static void initAndRun(ClassLoader classLoader, + public static void initAndRun(QuarkusClassLoader classLoader, PathCollection sourceParentDirs, Path generatedSourcesDir, Path buildDir, Consumer sourceRegistrar, ApplicationModel appModel, Properties properties, String launchMode, boolean test) throws CodeGenException { final List generators = init(classLoader, sourceParentDirs, generatedSourcesDir, buildDir, sourceRegistrar); + if (generators.isEmpty()) { + return; + } + final LaunchMode mode = LaunchMode.valueOf(launchMode); + final Config config = getConfig(appModel, mode, properties, classLoader); for (CodeGenData generator : generators) { generator.setRedirectIO(true); - trigger(classLoader, generator, appModel, properties, LaunchMode.valueOf(launchMode), test); + trigger(classLoader, generator, appModel, config, test); } } @@ -51,7 +67,7 @@ private static List init(ClassLoader deploymentClassLoader, if (codeGenProviders.isEmpty()) { return List.of(); } - List result = new ArrayList<>(); + final List result = new ArrayList<>(codeGenProviders.size()); for (CodeGenProvider provider : codeGenProviders) { Path outputDir = codeGenOutDir(generatedSourcesDir, provider, sourceRegistrar); for (Path sourceParentDir : sourceParentDirs) { @@ -144,23 +160,9 @@ private static T callWithClassloader(ClassLoader deploymentClassLoader, Code public static boolean trigger(ClassLoader deploymentClassLoader, CodeGenData data, ApplicationModel appModel, - Properties properties, - LaunchMode launchMode, + Config config, boolean test) throws CodeGenException { return callWithClassloader(deploymentClassLoader, () -> { - - final PropertiesConfigSource pcs = new PropertiesConfigSource(properties, "Build system"); - final SysPropConfigSource spcs = new SysPropConfigSource(); - - // Discovered Config classes may cause issues here, because this goal runs before compile - final SmallRyeConfig config = ConfigUtils.configBuilder(false, false, launchMode) - .setAddDiscoveredSources(false) - .setAddDiscoveredInterceptors(false) - .setAddDiscoveredConverters(false) - .withProfile(launchMode.getDefaultProfile()) - .withSources(pcs, spcs) - .build(); - CodeGenProvider provider = data.provider; return provider.shouldRun(data.sourceDir, config) && provider.trigger( @@ -169,6 +171,47 @@ public static boolean trigger(ClassLoader deploymentClassLoader, }); } + public static Config getConfig(ApplicationModel appModel, LaunchMode launchMode, Properties buildSystemProps, + QuarkusClassLoader deploymentClassLoader) throws CodeGenException { + // Config instance that is returned by this method should be as close to the one built in the ExtensionLoader as possible + if (appModel.getAppArtifact().getContentTree() + .contains(MP_CONFIG_SPI_CONFIG_SOURCE_PROVIDER)) { + final List allElements = ((QuarkusClassLoader) deploymentClassLoader).getAllElements(false); + // we don't want to load config sources from the current module because they haven't been compiled yet + final QuarkusClassLoader.Builder configClBuilder = QuarkusClassLoader + .builder("CodeGenerator Config ClassLoader", QuarkusClassLoader.getSystemClassLoader(), false); + final Collection appRoots = appModel.getAppArtifact().getContentTree().getRoots(); + for (ClassPathElement e : allElements) { + if (appRoots.contains(e.getRoot())) { + configClBuilder.addElement(new FilteredClassPathElement(e, List.of(MP_CONFIG_SPI_CONFIG_SOURCE_PROVIDER))); + } else { + configClBuilder.addElement(e); + } + } + deploymentClassLoader = configClBuilder.build(); + } + final SmallRyeConfigBuilder builder = ConfigUtils.configBuilder(false, launchMode) + .forClassLoader(deploymentClassLoader); + final PropertiesConfigSource pcs = new PropertiesConfigSource(buildSystemProps, "Build system"); + final SysPropConfigSource spcs = new SysPropConfigSource(); + + final Map platformProperties = appModel.getPlatformProperties(); + if (platformProperties.isEmpty()) { + builder.withSources(pcs, spcs); + } else { + final KeyMap props = new KeyMap<>(platformProperties.size()); + for (Map.Entry prop : platformProperties.entrySet()) { + props.findOrAdd(new NameIterator(prop.getKey())).putRootValue(prop.getValue()); + } + final KeyMapBackedConfigSource platformConfigSource = new KeyMapBackedConfigSource("Quarkus platform", + // Our default value configuration source is using an ordinal of Integer.MIN_VALUE + // (see io.quarkus.deployment.configuration.DefaultValuesConfigurationSource) + Integer.MIN_VALUE + 1000, props); + builder.withSources(platformConfigSource, pcs, spcs); + } + return builder.build(); + } + private static Path codeGenOutDir(Path generatedSourcesDir, CodeGenProvider provider, Consumer sourceRegistrar) throws CodeGenException { diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/CodeGenWatcher.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/CodeGenWatcher.java index f20800cfd7a28..35c731d896f58 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/CodeGenWatcher.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/CodeGenWatcher.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Properties; +import org.eclipse.microprofile.config.Config; import org.jboss.logging.Logger; import io.quarkus.bootstrap.app.CuratedApplication; @@ -33,13 +34,15 @@ class CodeGenWatcher { final Collection watchers = new ArrayList<>(codeGens.size()); final Properties properties = new Properties(); properties.putAll(context.getBuildSystemProperties()); + final Config config = CodeGenerator.getConfig(curatedApplication.getApplicationModel(), LaunchMode.DEVELOPMENT, + properties, deploymentClassLoader); for (CodeGenData codeGen : codeGens) { watchers.add(new FSWatchUtil.Watcher(codeGen.sourceDir, codeGen.provider.inputExtension(), modifiedPaths -> { try { CodeGenerator.trigger(deploymentClassLoader, codeGen, - curatedApplication.getApplicationModel(), properties, LaunchMode.DEVELOPMENT, false); + curatedApplication.getApplicationModel(), config, false); } catch (Exception any) { log.warn("Code generation failed", any); } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/QuarkusDevModeLauncher.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/QuarkusDevModeLauncher.java index b219f7e4e6745..cb3f77ead5fe6 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/QuarkusDevModeLauncher.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/QuarkusDevModeLauncher.java @@ -494,6 +494,10 @@ public List args() { return args; } + public Boolean getDebugPortOk() { + return debugPortOk; + } + protected abstract boolean isDebugEnabled(); protected void debug(Object msg, Object... args) { diff --git a/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java b/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java index 4d2d7e01e923d..beffa21072587 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java @@ -350,6 +350,7 @@ public static boolean isSubclassOf(IndexView index, ClassInfo info, DotName pare return isSubclassOf(index, superClass, parentName); } + @Deprecated(forRemoval = true, since = "2.13.3.Final") @SuppressWarnings("incomplete-switch") public static String getBoxedTypeName(Type type) { switch (type.kind()) { diff --git a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusGenerateCode.java b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusGenerateCode.java index e0c1ed989c64e..c10b0b814a4e6 100644 --- a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusGenerateCode.java +++ b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusGenerateCode.java @@ -6,10 +6,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.function.Consumer; @@ -29,6 +27,7 @@ import io.quarkus.bootstrap.classloading.QuarkusClassLoader; import io.quarkus.bootstrap.model.ApplicationModel; import io.quarkus.deployment.CodeGenerator; +import io.quarkus.paths.PathCollection; import io.quarkus.paths.PathList; import io.quarkus.runtime.LaunchMode; @@ -125,14 +124,17 @@ public void prepareQuarkus() { QuarkusClassLoader deploymentClassLoader = appCreationContext.createDeploymentClassLoader(); Class codeGenerator = deploymentClassLoader.loadClass(CodeGenerator.class.getName()); - Optional initAndRun = Arrays.stream(codeGenerator.getMethods()) - .filter(m -> m.getName().equals(INIT_AND_RUN)) - .findAny(); - if (initAndRun.isEmpty()) { - throw new GradleException("Failed to find " + INIT_AND_RUN + " method in " + CodeGenerator.class.getName()); + Method initAndRun; + try { + initAndRun = codeGenerator.getMethod(INIT_AND_RUN, QuarkusClassLoader.class, PathCollection.class, + Path.class, Path.class, + Consumer.class, ApplicationModel.class, Properties.class, String.class, + boolean.class); + } catch (Exception e) { + throw new GradleException("Quarkus code generation phase has failed", e); } - initAndRun.get().invoke(null, deploymentClassLoader, + initAndRun.invoke(null, deploymentClassLoader, PathList.from(sourcesDirectories), paths.get(0), buildDir, diff --git a/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java index d8cc6638683b1..b40b0db709a35 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/DevMojo.java @@ -43,7 +43,6 @@ import org.apache.maven.execution.MavenSession; import org.apache.maven.model.BuildBase; import org.apache.maven.model.Dependency; -import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginExecution; import org.apache.maven.model.Profile; @@ -121,8 +120,6 @@ @Mojo(name = "dev", defaultPhase = LifecyclePhase.PREPARE_PACKAGE, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true) public class DevMojo extends AbstractMojo { - private static final String EXT_PROPERTIES_PATH = "META-INF/quarkus-extension.properties"; - private static final String KOTLIN_MAVEN_PLUGIN_GA = "org.jetbrains.kotlin:kotlin-maven-plugin"; /** @@ -441,7 +438,7 @@ public void execute() throws MojoFailureException, MojoExecutionException { try { triggerCompile(false, false); triggerCompile(true, false); - newRunner = new DevModeRunner(); + newRunner = new DevModeRunner(runner.launcher.getDebugPortOk()); } catch (Exception e) { getLog().info("Could not load changed pom.xml file, changes not applied", e); continue; @@ -892,7 +889,11 @@ private class DevModeRunner { private Process process; private DevModeRunner() throws Exception { - launcher = newLauncher(); + launcher = newLauncher(null); + } + + private DevModeRunner(Boolean debugPortOk) throws Exception { + launcher = newLauncher(debugPortOk); } Collection pomFiles() { @@ -946,7 +947,7 @@ void stop() throws InterruptedException { } } - private QuarkusDevModeLauncher newLauncher() throws Exception { + private QuarkusDevModeLauncher newLauncher(Boolean debugPortOk) throws Exception { String java = null; // See if a toolchain is configured if (toolchainManager != null) { @@ -965,6 +966,7 @@ private QuarkusDevModeLauncher newLauncher() throws Exception { .debug(debug) .debugHost(debugHost) .debugPort(debugPort) + .debugPortOk(debugPortOk) .deleteDevJar(deleteDevJar); setJvmArgs(builder); @@ -1081,11 +1083,7 @@ private QuarkusDevModeLauncher newLauncher() throws Exception { mvnConfig.setRepositorySystemSession(repoSession).setRepositorySystem(repoSystem); // there could be Maven extensions manipulating the project versions and models // the ones returned from the Maven API could be different from the original pom.xml files - final Map projectModels = new HashMap<>(session.getAllProjects().size()); - for (MavenProject mp : session.getAllProjects()) { - projectModels.put(mp.getBasedir().toPath(), mp.getOriginalModel()); - } - mvnConfig.setProjectModelProvider(projectModels::get); + mvnConfig.setProjectModelProvider(QuarkusBootstrapProvider.getProjectMap(session)::get); } final BootstrapMavenContext mvnCtx = new BootstrapMavenContext(mvnConfig); diff --git a/devtools/maven/src/main/java/io/quarkus/maven/GenerateCodeMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/GenerateCodeMojo.java index ac534f4f9756c..7d34a481f2dbc 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/GenerateCodeMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/GenerateCodeMojo.java @@ -72,7 +72,7 @@ void generateCode(PathCollection sourceParents, Thread.currentThread().setContextClassLoader(deploymentClassLoader); final Class codeGenerator = deploymentClassLoader.loadClass("io.quarkus.deployment.CodeGenerator"); - final Method initAndRun = codeGenerator.getMethod("initAndRun", ClassLoader.class, PathCollection.class, + final Method initAndRun = codeGenerator.getMethod("initAndRun", QuarkusClassLoader.class, PathCollection.class, Path.class, Path.class, Consumer.class, ApplicationModel.class, Properties.class, String.class, boolean.class); diff --git a/devtools/maven/src/main/java/io/quarkus/maven/GoOfflineMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/GoOfflineMojo.java index 474b228f56b45..2c82939b41f4b 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/GoOfflineMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/GoOfflineMojo.java @@ -102,6 +102,7 @@ private void resolveAppModel(final MavenArtifactResolver resolver, final Artifac private MavenArtifactResolver getResolver() throws MojoExecutionException { try { return MavenArtifactResolver.builder() + .setCurrentProject(project.getBasedir().toString()) .setRemoteRepositoryManager(remoteRepositoryManager) .setRemoteRepositories(repos) .setPreferPomsFromWorkspace(true) diff --git a/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java b/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java index f340b2048d46d..2c4e876d7e189 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java @@ -16,6 +16,7 @@ import java.util.concurrent.ExecutionException; import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Model; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; @@ -63,6 +64,16 @@ static ArtifactKey getProjectId(MavenProject project) { return ArtifactKey.ga(project.getGroupId(), project.getArtifactId()); } + static Map getProjectMap(MavenSession session) { + final List allProjects = session.getAllProjects(); + final Map projectModels = new HashMap<>(allProjects.size()); + for (MavenProject mp : allProjects) { + mp.getOriginalModel().setPomFile(mp.getFile()); + projectModels.put(mp.getBasedir().toPath(), mp.getOriginalModel()); + } + return projectModels; + } + public RepositorySystem repositorySystem() { return repoSystem; } @@ -143,11 +154,7 @@ private MavenArtifactResolver artifactResolver(QuarkusBootstrapMojo mojo, Launch .setRemoteRepositories(mojo.remoteRepositories()) .setRemoteRepositoryManager(remoteRepoManager); if (mode == LaunchMode.DEVELOPMENT || mode == LaunchMode.TEST || isWorkspaceDiscovery(mojo)) { - final Map projectModels = new HashMap<>(mojo.mavenSession().getAllProjects().size()); - for (MavenProject mp : mojo.mavenSession().getAllProjects()) { - projectModels.put(mp.getBasedir().toPath(), mp.getOriginalModel()); - } - builder.setWorkspaceDiscovery(true).setProjectModelProvider(projectModels::get); + builder.setWorkspaceDiscovery(true).setProjectModelProvider(getProjectMap(mojo.mavenSession())::get); } return builder.build(); } catch (BootstrapMavenException e) { diff --git a/docs/pom.xml b/docs/pom.xml index a4ed04f48560d..79b0da9db78a0 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -61,7 +61,6 @@ io.quarkus quarkus-devtools-registry-client - ${project.version} io.quarkus @@ -77,7 +76,6 @@ org.asciidoctor asciidoctorj - ${asciidoctorj.version} @@ -2791,6 +2789,37 @@ + + maven-resources-plugin + + + copy-resources + process-resources + + copy-resources + + + ${project.basedir}/target/asciidoc/sources + + + src/main/asciidoc + false + + **/_attributes.adoc + + + + src/main/asciidoc + true + + **/_attributes.adoc + + + + + + + org.codehaus.mojo exec-maven-plugin @@ -2863,7 +2892,7 @@ ${code-example-dir} ${project.basedir}/.. - ${project.basedir}/src/main/asciidoc + ${project.basedir}/target/asciidoc/sources ${env.MAVEN_CMD_LINE_ARGS} @@ -2880,7 +2909,7 @@ ${skipDocs} io.quarkus.docs.generation.YamlMetadataGenerator - ${project.basedir}/src/main/asciidoc + ${project.basedir}/target/asciidoc/sources ${project.basedir}/target @@ -2893,7 +2922,6 @@ org.asciidoctor asciidoctor-maven-plugin - ${asciidoctor-maven-plugin.version} ${skipDocs} true @@ -2902,7 +2930,7 @@ WARN - src/main/asciidoc + target/asciidoc/sources true ${project.basedir}/../target/asciidoc/generated @@ -2916,81 +2944,11 @@ true true - - ${project.version} - ${version.surefire.plugin} - ${graal-sdk.version-for-documentation} - ${graal-sdk.version-for-documentation}-java11 - ${mandrel.version-for-documentation} - ${mandrel.version-for-documentation}-java11 - ${rest-assured.version} - ${proposed-maven-version} - ${gradle-wrapper.version} - ${elasticsearch.image} - ${logstash.image} - ${kibana.image} - ${keycloak.docker.image} - - ${jandex-maven-plugin.version} - ${jandex-gradle-plugin.version} - ${kotlin.version} - - ${grpc.version} - ${protoc.version} - ${elasticsearch-server.version} - ${gcf-invoker.version} - - - ${quarkus-home-url} - - https://github.com/quarkusio - - - - ${quarkus-home-url}/getting-started - ${quarkus-home-url}/documentation/extension-authors-guide - ${quarkus-home-url}/live-coding - - - https://quarkusio.zulipchat.com/# - quarkus-dev+subscribe@googlegroups.com - https://groups.google.com/d/forum/quarkus-dev - - - - ${quarkus-base-url} - - ${quarkus-base-url}.git - - ${quarkus-base-url}/archive/main.zip - - ${quarkus-base-url}/blob/main - - ${quarkus-base-url}/tree/main - - ${quarkus-base-url}/issues - https://github.com/quarkusio/quarkus-images/tree - - - - ${quickstarts-base-url} - - ${quickstarts-base-url}.git - - ${quickstarts-base-url}/archive/main.zip - - ${quickstarts-base-url}/blob/main - - ${quickstarts-base-url}/tree/main - - - https://quarkiverse.github.io/quarkiverse-docs/quarkus-amazon-services/dev/index.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-config-extensions/dev/consul.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-hibernate-search-extras/dev/index.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-neo4j/dev/index.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/index.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/vault-datasource.html - https://quarkiverse.github.io/quarkiverse-docs/quarkus-micrometer-registry/dev/ + diff --git a/docs/src/main/asciidoc/0-glossary.adoc b/docs/src/main/asciidoc/0-glossary.adoc deleted file mode 100644 index 259e309503e0c..0000000000000 --- a/docs/src/main/asciidoc/0-glossary.adoc +++ /dev/null @@ -1,18 +0,0 @@ -= Glossary - -include::./attributes.adoc[] - -This is a collection of preferred term in the documentation and website. -Please stay within these terms for consistency. - -* Live coding:: for our `quarkus:dev` capability -* GraalVM native image:: preferred term for the VM creating native executable. No space. -* Substrate VM:: non-preferred. Exclude. -* Native Executable:: the executable that is compiled to native 1s and 0s -* Docker image:: for the actual `Dockerfile` definition and when the tool chain is involved -* Container:: when we discuss Quarkus running in... containers -* Supersonic Subatomic Java:: our tagline -* Kubernetes Native Java:: our preferred tagline to say that we rock for containers -* Developer Joy:: for everything going from live reload to the opinionated layer to a single config file -* Unify Imperative and Reactive:: imperative and reactive. 'Nuff said. -* Best of breed frameworks and standards:: when we explain our stack diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index eff30d2cb0865..fd2112ac06476 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -1,5 +1,5 @@ = README: Quarkus documentation -include::attributes.adoc[] +include::_attributes.adoc[] Quarkus documentation uses asciidoc syntax. @@ -10,3 +10,20 @@ For more information on contributing to Quarkus docs, see: - xref:doc-contribute-docs-howto.adoc[How to contribute documentation] - xref:doc-concepts.adoc[Quarkus documentation concepts] - xref:doc-reference.adoc[Quarkus documentation reference] + +== Glossary + +This is a collection of preferred term in the documentation and website. +Please stay within these terms for consistency. + +* Live coding:: for our `quarkus:dev` capability +* GraalVM native image:: preferred term for the VM creating native executable. No space. +* Substrate VM:: non-preferred. Exclude. +* Native Executable:: the executable that is compiled to native 1s and 0s +* Docker image:: for the actual `Dockerfile` definition and when the tool chain is involved +* Container:: when we discuss Quarkus running in... containers +* Supersonic Subatomic Java:: our tagline +* Kubernetes Native Java:: our preferred tagline to say that we rock for containers +* Developer Joy:: for everything going from live reload to the opinionated layer to a single config file +* Unify Imperative and Reactive:: imperative and reactive. 'Nuff said. +* Best of breed frameworks and standards:: when we explain our stack diff --git a/docs/src/main/asciidoc/attributes.adoc b/docs/src/main/asciidoc/_attributes-local.adoc similarity index 81% rename from docs/src/main/asciidoc/attributes.adoc rename to docs/src/main/asciidoc/_attributes-local.adoc index efa26032c201f..0f530d6c0e4ae 100644 --- a/docs/src/main/asciidoc/attributes.adoc +++ b/docs/src/main/asciidoc/_attributes-local.adoc @@ -7,5 +7,7 @@ :code-examples: ../../../../target/asciidoc/examples :doc-guides: ./ :doc-examples: ./_examples +:generated-dir: ../../../../target/asciidoc/generated :imagesdir: ./images -:includes: ./includes +:includes: ./_includes +:toc: preamble diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc new file mode 100644 index 0000000000000..eb2731f47aa63 --- /dev/null +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -0,0 +1,52 @@ +:project-name: Quarkus +:quarkus-version: ${project.version} + +:maven-version: ${proposed-maven-version} +:graalvm-version: ${graal-sdk.version-for-documentation} +:graalvm-flavor: ${graal-sdk.version-for-documentation}-java11 +:mandrel-version: ${mandrel.version-for-documentation} +:mandrel-flavor: ${mandrel.version-for-documentation}-java11 +:surefire-version: ${version.surefire.plugin} +:gradle-version: ${gradle-wrapper.version} +:elasticsearch-version: ${elasticsearch-server.version} +:elasticsearch-image: ${elasticsearch.image} +:logstash-image: ${logstash.image} +:kibana-image: ${kibana.image} +:keycloak-docker-image: ${keycloak.docker.image} +:jandex-version: ${jandex.version} +:jandex-gradle-plugin.version: ${jandex-gradle-plugin.version} +:kotlin-version: ${kotlin.version} +:grpc-version: ${grpc.version} +:protoc-version: ${protoc.version} +:gcf-invoker-version: ${gcf-invoker.version} + +:quarkus-home-url: ${quarkus-home-url} +:quarkus-org-url: https://github.com/quarkusio +:quarkus-site-getting-started: /get-started +:quarkus-writing-extensions-guide: /guides/writing-extensions +:quarkus-site-publications: /publications +:quarkus-base-url: ${quarkus-base-url} +:quarkus-clone-url: ${quarkus-base-url}.git +:quarkus-archive-url: ${quarkus-base-url}/archive/main.zip +:quarkus-blob-url: ${quarkus-base-url}/blob/main +:quarkus-tree-url: ${quarkus-base-url}/tree/main +:quarkus-issues-url: ${quarkus-base-url}/issues +:quarkus-images-url: https://github.com/quarkusio/quarkus-images/tree +:quarkus-chat-url: https://quarkusio.zulipchat.com +:quarkus-mailing-list-subscription-email: quarkus-dev+subscribe@googlegroups.com +:quarkus-mailing-list-index: https://groups.google.com/d/forum/quarkus-dev +:quickstarts-base-url: ${quickstarts-base-url} +:quickstarts-clone-url: ${quickstarts-base-url}.git +:quickstarts-archive-url: ${quickstarts-base-url}/archive/main.zip +:quickstarts-blob-url: ${quickstarts-base-url}/blob/main +:quickstarts-tree-url: ${quickstarts-base-url}/tree/main + +:amazon-services-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-amazon-services/dev/index.html +:config-consul-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-config-extensions/dev/consul.html +:hibernate-search-orm-elasticsearch-aws-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-hibernate-search-extras/dev/index.html +:neo4j-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-neo4j/dev/index.html +:vault-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/index.html +:vault-datasource-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-vault/dev/vault-datasource.html +:micrometer-registry-guide: https://quarkiverse.github.io/quarkiverse-docs/quarkus-micrometer-registry/dev/index.html + +include::_attributes-local.adoc[] diff --git a/docs/src/main/asciidoc/_examples/attributes.adoc b/docs/src/main/asciidoc/_examples/_attributes.adoc similarity index 100% rename from docs/src/main/asciidoc/_examples/attributes.adoc rename to docs/src/main/asciidoc/_examples/_attributes.adoc diff --git a/docs/src/main/asciidoc/includes/compile-quarkus-quickly.adoc b/docs/src/main/asciidoc/_includes/compile-quarkus-quickly.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/compile-quarkus-quickly.adoc rename to docs/src/main/asciidoc/_includes/compile-quarkus-quickly.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/build-native-container-parameters.adoc b/docs/src/main/asciidoc/_includes/devtools/build-native-container-parameters.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/build-native-container-parameters.adoc rename to docs/src/main/asciidoc/_includes/devtools/build-native-container-parameters.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/build-native-container.adoc b/docs/src/main/asciidoc/_includes/devtools/build-native-container.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/build-native-container.adoc rename to docs/src/main/asciidoc/_includes/devtools/build-native-container.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/build-native.adoc b/docs/src/main/asciidoc/_includes/devtools/build-native.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/build-native.adoc rename to docs/src/main/asciidoc/_includes/devtools/build-native.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/build.adoc b/docs/src/main/asciidoc/_includes/devtools/build.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/build.adoc rename to docs/src/main/asciidoc/_includes/devtools/build.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/create-app.adoc b/docs/src/main/asciidoc/_includes/devtools/create-app.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/create-app.adoc rename to docs/src/main/asciidoc/_includes/devtools/create-app.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/create-cli.adoc b/docs/src/main/asciidoc/_includes/devtools/create-cli.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/create-cli.adoc rename to docs/src/main/asciidoc/_includes/devtools/create-cli.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/dev-parameters.adoc b/docs/src/main/asciidoc/_includes/devtools/dev-parameters.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/dev-parameters.adoc rename to docs/src/main/asciidoc/_includes/devtools/dev-parameters.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/dev.adoc b/docs/src/main/asciidoc/_includes/devtools/dev.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/dev.adoc rename to docs/src/main/asciidoc/_includes/devtools/dev.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/extension-add.adoc b/docs/src/main/asciidoc/_includes/devtools/extension-add.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/extension-add.adoc rename to docs/src/main/asciidoc/_includes/devtools/extension-add.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/extension-list.adoc b/docs/src/main/asciidoc/_includes/devtools/extension-list.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/extension-list.adoc rename to docs/src/main/asciidoc/_includes/devtools/extension-list.adoc diff --git a/docs/src/main/asciidoc/includes/devtools/test.adoc b/docs/src/main/asciidoc/_includes/devtools/test.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/devtools/test.adoc rename to docs/src/main/asciidoc/_includes/devtools/test.adoc diff --git a/docs/src/main/asciidoc/duration-format-note.adoc b/docs/src/main/asciidoc/_includes/duration-format-note.adoc similarity index 100% rename from docs/src/main/asciidoc/duration-format-note.adoc rename to docs/src/main/asciidoc/_includes/duration-format-note.adoc diff --git a/docs/src/main/asciidoc/includes/extension-status.adoc b/docs/src/main/asciidoc/_includes/extension-status.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/extension-status.adoc rename to docs/src/main/asciidoc/_includes/extension-status.adoc diff --git a/docs/src/main/asciidoc/kogito-dev-services-build-time-config.adoc b/docs/src/main/asciidoc/_includes/kogito-dev-services-build-time-config.adoc similarity index 100% rename from docs/src/main/asciidoc/kogito-dev-services-build-time-config.adoc rename to docs/src/main/asciidoc/_includes/kogito-dev-services-build-time-config.adoc diff --git a/docs/src/main/asciidoc/platform-include.adoc b/docs/src/main/asciidoc/_includes/platform-include.adoc similarity index 100% rename from docs/src/main/asciidoc/platform-include.adoc rename to docs/src/main/asciidoc/_includes/platform-include.adoc diff --git a/docs/src/main/asciidoc/includes/prerequisites.adoc b/docs/src/main/asciidoc/_includes/prerequisites.adoc similarity index 100% rename from docs/src/main/asciidoc/includes/prerequisites.adoc rename to docs/src/main/asciidoc/_includes/prerequisites.adoc diff --git a/docs/src/main/asciidoc/quarkus-blaze-persistence.adoc b/docs/src/main/asciidoc/_includes/quarkus-blaze-persistence.adoc similarity index 100% rename from docs/src/main/asciidoc/quarkus-blaze-persistence.adoc rename to docs/src/main/asciidoc/_includes/quarkus-blaze-persistence.adoc diff --git a/docs/src/main/asciidoc/smallrye-kafka-incoming.adoc b/docs/src/main/asciidoc/_includes/smallrye-kafka-incoming.adoc similarity index 100% rename from docs/src/main/asciidoc/smallrye-kafka-incoming.adoc rename to docs/src/main/asciidoc/_includes/smallrye-kafka-incoming.adoc diff --git a/docs/src/main/asciidoc/smallrye-kafka-outgoing.adoc b/docs/src/main/asciidoc/_includes/smallrye-kafka-outgoing.adoc similarity index 100% rename from docs/src/main/asciidoc/smallrye-kafka-outgoing.adoc rename to docs/src/main/asciidoc/_includes/smallrye-kafka-outgoing.adoc diff --git a/docs/src/main/asciidoc/_templates/attributes.adoc b/docs/src/main/asciidoc/_templates/_attributes.adoc similarity index 100% rename from docs/src/main/asciidoc/_templates/attributes.adoc rename to docs/src/main/asciidoc/_templates/_attributes.adoc diff --git a/docs/src/main/asciidoc/_templates/template-concepts.adoc b/docs/src/main/asciidoc/_templates/template-concepts.adoc index 786bfc891ff58..d55462cce798e 100644 --- a/docs/src/main/asciidoc/_templates/template-concepts.adoc +++ b/docs/src/main/asciidoc/_templates/template-concepts.adoc @@ -9,7 +9,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc TODO: If this is a concept related to an experimental or tech-preview extension, uncomment the following and set the appropriate status (otherwise delete) :extension-status: preview //// -include::attributes.adoc[] +include::_attributes.adoc[] A short introduction that summarizes or frames the concept. This summary should help a reader determine whether or not this document is what they want to read. diff --git a/docs/src/main/asciidoc/_templates/template-howto.adoc b/docs/src/main/asciidoc/_templates/template-howto.adoc index a4aa0e3b2d0ed..f0cdfeaf7f3b6 100644 --- a/docs/src/main/asciidoc/_templates/template-howto.adoc +++ b/docs/src/main/asciidoc/_templates/template-howto.adoc @@ -12,7 +12,7 @@ TODO: Title should have an implied "How to.." in front. See TODO: If this is a reference for an experimental or tech-preview extension, uncomment the following and set the appropriate status (otherwise delete) :extension-status: preview //// -include::attributes.adoc[] +include::_attributes.adoc[] How-to guides are goal-oriented, and should help the reader accomplish a task (where there may be forks in the path). diff --git a/docs/src/main/asciidoc/_templates/template-reference.adoc b/docs/src/main/asciidoc/_templates/template-reference.adoc index ffa6bb2af364c..c1774c9fb48ba 100644 --- a/docs/src/main/asciidoc/_templates/template-reference.adoc +++ b/docs/src/main/asciidoc/_templates/template-reference.adoc @@ -9,7 +9,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc TODO: If this is a reference for an experimental or tech-preview extension, uncomment the following and set the appropriate status (otherwise delete) :extension-status: preview //// -include::attributes.adoc[] +include::_attributes.adoc[] A short introduction that describes the content of this reference. This summary should help a reader determine if this document is likely to contain the information they are looking for. diff --git a/docs/src/main/asciidoc/_templates/template-tutorial.adoc b/docs/src/main/asciidoc/_templates/template-tutorial.adoc index d89f08a481d08..e71c3cedc5974 100644 --- a/docs/src/main/asciidoc/_templates/template-tutorial.adoc +++ b/docs/src/main/asciidoc/_templates/template-tutorial.adoc @@ -9,7 +9,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc TODO: If this is a tutorial for an experimental or tech-preview extension, uncomment the following and set the appropriate status (otherwise delete) :extension-status: preview //// -include::attributes.adoc[] +include::_attributes.adoc[] Describe what the learner will accomplish (examples: build, create, construct, deploy; not: “you will learn...”). This short summary should help a reader determine if they want to engage with the content. diff --git a/docs/src/main/asciidoc/all-builditems.adoc b/docs/src/main/asciidoc/all-builditems.adoc index 0b1a4dcdfb136..37d6431639e6c 100644 --- a/docs/src/main/asciidoc/all-builditems.adoc +++ b/docs/src/main/asciidoc/all-builditems.adoc @@ -6,9 +6,10 @@ This guide is maintained in the main Quarkus repository and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// -include::./attributes.adoc[] - = Build Items +include::_attributes.adoc[] +:categories: writing-extensions +:summary: Explore all the BuildItems you can consume/produce in your extensions. Here you can find a list of Build Items and the extension that provides them: diff --git a/docs/src/main/asciidoc/all-config.adoc b/docs/src/main/asciidoc/all-config.adoc index b3230ceff0548..4a97e523641ae 100644 --- a/docs/src/main/asciidoc/all-config.adoc +++ b/docs/src/main/asciidoc/all-config.adoc @@ -7,7 +7,8 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = All configuration options - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: List all the configuration properties per extensions include::{generated-dir}/config/quarkus-all-config.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/amazon-credentials.adoc b/docs/src/main/asciidoc/amazon-credentials.adoc deleted file mode 100644 index 409f9fbdec505..0000000000000 --- a/docs/src/main/asciidoc/amazon-credentials.adoc +++ /dev/null @@ -1,5 +0,0 @@ -* Java System Properties - `aws.accessKeyId` and `aws.secretAccessKey` -* Environment Variables - `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` -* Credential profiles file at the default location (`~/.aws/credentials`) shared by all AWS SDKs and the AWS CLI -* Credentials delivered through the Amazon ECS if the `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` environment variable is set and the security manager has permission to access the variable, -* Instance profile credentials delivered through the Amazon EC2 metadata service \ No newline at end of file diff --git a/docs/src/main/asciidoc/amazon-lambda-http.adoc b/docs/src/main/asciidoc/amazon-lambda-http.adoc index 209e9ab96b90f..54eabe4e09d98 100644 --- a/docs/src/main/asciidoc/amazon-lambda-http.adoc +++ b/docs/src/main/asciidoc/amazon-lambda-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Amazon Lambda with RESTEasy Reactive, Undertow, or Reactive Routes :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how you can deploy Vert.x Web, Servlet, or RESTEasy microservices as an Amazon Lambda. :devtools-no-gradle: With Quarkus you can deploy your favorite Java HTTP frameworks as Amazon Lambda's using either the https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html[AWS Gateway HTTP API] diff --git a/docs/src/main/asciidoc/amazon-lambda.adoc b/docs/src/main/asciidoc/amazon-lambda.adoc index 16658c64044c5..9ff4f289e4ac8 100644 --- a/docs/src/main/asciidoc/amazon-lambda.adoc +++ b/docs/src/main/asciidoc/amazon-lambda.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Amazon Lambda - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how you can deploy Quarkus-based Amazon Lambdas. The `quarkus-amazon-lambda` extension allows you to use Quarkus to build your AWS Lambdas. Your lambdas can use injection annotations from CDI or Spring and other Quarkus facilities as you need them. diff --git a/docs/src/main/asciidoc/amqp-dev-services.adoc b/docs/src/main/asciidoc/amqp-dev-services.adoc index 72c11b83be283..87a025a5797bd 100644 --- a/docs/src/main/asciidoc/amqp-dev-services.adoc +++ b/docs/src/main/asciidoc/amqp-dev-services.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for AMQP - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: Start AMQP automatically in dev and test modes. Dev Services for AMQP automatically starts an AMQP 1.0 broker in dev mode and when running tests. So, you don't have to start a broker manually. diff --git a/docs/src/main/asciidoc/amqp-reference.adoc b/docs/src/main/asciidoc/amqp-reference.adoc index e2b3a75791717..5e2c683308667 100644 --- a/docs/src/main/asciidoc/amqp-reference.adoc +++ b/docs/src/main/asciidoc/amqp-reference.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Reactive Messaging AMQP 1.0 Connector Reference Documentation -include::./attributes.adoc[] +include::_attributes.adoc[] This guide is the companion from the xref:amqp.adoc[Getting Started with AMQP 1.0]. It explains in more details the configuration and usage of the AMQP connector for reactive messaging. diff --git a/docs/src/main/asciidoc/amqp.adoc b/docs/src/main/asciidoc/amqp.adoc index 1e7491628b64e..99cce7e9d1bdb 100644 --- a/docs/src/main/asciidoc/amqp.adoc +++ b/docs/src/main/asciidoc/amqp.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Getting Started to SmallRye Reactive Messaging with AMQP 1.0 - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: This guide demonstrates how your Quarkus application can utilize SmallRye Reactive Messaging to interact with AMQP. This guide demonstrates how your Quarkus application can utilize SmallRye Reactive Messaging to interact with AMQP 1.0. diff --git a/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc b/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc index 622eb57274586..cc6020d803a17 100644 --- a/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc +++ b/docs/src/main/asciidoc/apicurio-registry-dev-services.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Apicurio Registry - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: Start Apicurio Registry automatically in dev and test modes. If an extension for schema registry, such as `quarkus-apicurio-registry-avro` or `quarkus-confluent-registry-avro`, is present, Dev Services for Apicurio Registry automatically starts an Apicurio Registry instance in dev mode and when running tests. Also, all Kafka channels in SmallRye Reactive Messaging are automatically configured to use this registry. diff --git a/docs/src/main/asciidoc/azure-functions-http.adoc b/docs/src/main/asciidoc/azure-functions-http.adoc index d6973466c4a92..e289cbd98b8ca 100644 --- a/docs/src/main/asciidoc/azure-functions-http.adoc +++ b/docs/src/main/asciidoc/azure-functions-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Azure Functions (Serverless) with RESTEasy Reactive, Undertow, or Reactive Routes :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how you can deploy Vert.x Web, Servlet, or RESTEasy microservices as an Azure Function. The `quarkus-azure-functions-http` extension allows you to write microservices with RESTEasy Reactive (JAX-RS), Undertow (servlet), Reactive Routes, or xref:funqy-http.adoc[Funqy HTTP] and make these microservices deployable to the Azure Functions runtime. diff --git a/docs/src/main/asciidoc/blaze-persistence.adoc b/docs/src/main/asciidoc/blaze-persistence.adoc index 9477bee95fa07..0c6cc49bfe0bb 100644 --- a/docs/src/main/asciidoc/blaze-persistence.adoc +++ b/docs/src/main/asciidoc/blaze-persistence.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Blaze-Persistence - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide explains how to use Blaze-Persistence to simplify your data and DTO layers. :config-file: application.properties Blaze-Persistence offers a fluent query builder API on top of JPA with a deep Hibernate ORM integration that enables the @@ -16,7 +17,7 @@ queries which are then transformed to optimized queries that only fetch the data The same DTO definitions can further be used for applying database updates, leading to a great reduction in boilerplate code and removing the need for object mapping tools. -include::./platform-include.adoc[] +include::{includes}/platform-include.adoc[] == Setting up and configuring Blaze-Persistence @@ -222,7 +223,7 @@ When no property is set, the Blaze-Persistence defaults apply. The configuration properties listed here allow you to override such defaults, and customize and tune various aspects. -include::quarkus-blaze-persistence.adoc[opts=optional, leveloffset=+2] +include::{includes}/quarkus-blaze-persistence.adoc[opts=optional, leveloffset=+2] Apart from these configuration options, further configuration and customization can be applied by observing a `CriteriaBuilderConfiguration` or `EntityViewConfiguration` events and applying customizations on these objects. The various customization use cases can be found in the link:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#quarkus-customization[Quarkus section of the entity-view documentation]. diff --git a/docs/src/main/asciidoc/building-my-first-extension.adoc b/docs/src/main/asciidoc/building-my-first-extension.adoc index 9829ffc162cf1..fa8790d26b174 100644 --- a/docs/src/main/asciidoc/building-my-first-extension.adoc +++ b/docs/src/main/asciidoc/building-my-first-extension.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Building my first extension - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: writing-extensions +:summary: Learn step by step how to build a simple extension. Quarkus extensions enhance your application just as projects dependencies do. The role of the extensions is to leverage Quarkus paradigms to integrate seamlessly a library into Quarkus architecture - e.g. do more things at build time. diff --git a/docs/src/main/asciidoc/building-native-image.adoc b/docs/src/main/asciidoc/building-native-image.adoc index bac69389b51dc..9ef4d63b524ec 100644 --- a/docs/src/main/asciidoc/building-native-image.adoc +++ b/docs/src/main/asciidoc/building-native-image.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Building a Native Executable - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: getting-started +:summary: Build native executables with GraalVM or Mandrel. This guide covers: diff --git a/docs/src/main/asciidoc/cache.adoc b/docs/src/main/asciidoc/cache.adoc index b28fa56723e63..b1dc8081d4508 100644 --- a/docs/src/main/asciidoc/cache.adoc +++ b/docs/src/main/asciidoc/cache.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Application Data Caching :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide explains how to cache expensive method calls of your CDI beans using simple annotations. In this guide, you will learn how to enable application data caching in any CDI managed bean of your Quarkus application. diff --git a/docs/src/main/asciidoc/camel.adoc b/docs/src/main/asciidoc/camel.adoc index 25de8d023dea6..23342f625f202 100644 --- a/docs/src/main/asciidoc/camel.adoc +++ b/docs/src/main/asciidoc/camel.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Apache Camel on Quarkus - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: integration +:summary: This guide covers the systems integration with Apache Camel https://camel.apache.org/[Apache Camel] is the Swiss knife of integrating heterogeneous systems with more than a decade of history and a lively community of users and developers. diff --git a/docs/src/main/asciidoc/capabilities.adoc b/docs/src/main/asciidoc/capabilities.adoc index 78f48a9b8b8c4..d98bef7068689 100644 --- a/docs/src/main/asciidoc/capabilities.adoc +++ b/docs/src/main/asciidoc/capabilities.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Extension Capabilities - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: writing-extensions +:summary: How capabilities are implemented and used in Quarkus. Quarkus extensions may provide certain capabilities and require certain capabilities to be provided by other extensions in an application to function properly. diff --git a/docs/src/main/asciidoc/cassandra.adoc b/docs/src/main/asciidoc/cassandra.adoc index af1fa26831642..9fe0090191a37 100644 --- a/docs/src/main/asciidoc/cassandra.adoc +++ b/docs/src/main/asciidoc/cassandra.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the Cassandra Client - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use the Apache Cassandra NoSQL database in Quarkus. Apache Cassandra® is a free and open-source, distributed, wide column store, NoSQL database management system designed to handle large amounts of data across many commodity servers, providing @@ -13,7 +14,7 @@ high availability with no single point of failure. In this guide, we will see how you can get your REST services to use a Cassandra database. -include::./platform-include.adoc[] +include::{includes}/platform-include.adoc[] == Prerequisites diff --git a/docs/src/main/asciidoc/cdi-integration.adoc b/docs/src/main/asciidoc/cdi-integration.adoc index 73cfe4d4fa845..8be356cfb891f 100644 --- a/docs/src/main/asciidoc/cdi-integration.adoc +++ b/docs/src/main/asciidoc/cdi-integration.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = CDI Integration Guide - -include::./attributes.adoc[] +:categories: writing-extensions +:summary: Learn how to integrate your extension with Quarkus' CDI container. +include::_attributes.adoc[] :numbered: :toc: :toclevels: 2 diff --git a/docs/src/main/asciidoc/cdi-reference.adoc b/docs/src/main/asciidoc/cdi-reference.adoc index b98af78afd3b7..ed815f0691f39 100644 --- a/docs/src/main/asciidoc/cdi-reference.adoc +++ b/docs/src/main/asciidoc/cdi-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Contexts and Dependency Injection - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: Go more in depth into the Quarkus implementation of CDI. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/cdi.adoc b/docs/src/main/asciidoc/cdi.adoc index 3b088a2716031..15e3ba315fe78 100644 --- a/docs/src/main/asciidoc/cdi.adoc +++ b/docs/src/main/asciidoc/cdi.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Introduction to Contexts and Dependency Injection - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: Quarkus DI solution is based on the [Contexts and Dependency Injection for Java 2.0](https://docs.jboss.org/cdi/spec/2.0/cdi-spec) specification. This guide explains the basics of CDI. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/centralized-log-management.adoc b/docs/src/main/asciidoc/centralized-log-management.adoc index 157b87a1eaeb6..d274aa94355fd 100644 --- a/docs/src/main/asciidoc/centralized-log-management.adoc +++ b/docs/src/main/asciidoc/centralized-log-management.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Centralized log management (Graylog, Logstash, Fluentd) - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide explains how to centralize your logs with Logstash or Fluentd using the Graylog Extended Log Format (GELF). This guide explains how you can send your logs to a centralized log management system like Graylog, Logstash (inside the Elastic Stack or ELK - Elasticsearch, Logstash, Kibana) or Fluentd (inside EFK - Elasticsearch, Fluentd, Kibana). diff --git a/docs/src/main/asciidoc/class-loading-reference.adoc b/docs/src/main/asciidoc/class-loading-reference.adoc index 7a8d552976f9a..9bbe01b02a6d9 100644 --- a/docs/src/main/asciidoc/class-loading-reference.adoc +++ b/docs/src/main/asciidoc/class-loading-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Class Loading Reference - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: architecture +:summary: Learn more about Quarkus class loading infrastructure. This document explains the Quarkus class loading architecture. It is intended for extension authors and advanced users who want to understand exactly how Quarkus works. diff --git a/docs/src/main/asciidoc/cli-tooling.adoc b/docs/src/main/asciidoc/cli-tooling.adoc index 1ee99347e4167..6cd609cfc89df 100644 --- a/docs/src/main/asciidoc/cli-tooling.adoc +++ b/docs/src/main/asciidoc/cli-tooling.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Building Quarkus apps with Quarkus Command Line Interface (CLI) :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: tooling +:summary: Use the Quarkus CLI to create, build, run, and manage extensions for Quarkus projects. The `quarkus` command lets you create projects, manage extensions and do essential build and dev commands using the underlying project build tool. diff --git a/docs/src/main/asciidoc/command-mode-reference.adoc b/docs/src/main/asciidoc/command-mode-reference.adoc index 89f0013fe373e..73f2cbd46a499 100644 --- a/docs/src/main/asciidoc/command-mode-reference.adoc +++ b/docs/src/main/asciidoc/command-mode-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Command Mode Applications - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core, command-line +:summary: This reference guide explains how to develop command line applications with Quarkus. This reference covers how to write applications that run and then exit. diff --git a/docs/src/main/asciidoc/conditional-extension-dependencies.adoc b/docs/src/main/asciidoc/conditional-extension-dependencies.adoc index 2fe24402dba75..db3bbfad4c4e5 100644 --- a/docs/src/main/asciidoc/conditional-extension-dependencies.adoc +++ b/docs/src/main/asciidoc/conditional-extension-dependencies.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Conditional Extension Dependencies - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: writing-extensions +:summary: Trigger the inclusion on additional extensions based on certain conditions. Quarkus extension dependencies are usually configured in the same way as any other project dependencies in the project's build file, e.g. the Maven `pom.xml` or the Gradle build scripts. However, there are dependency types that aren't yet supported out-of-the-box by Maven and Gradle. What we refer here to as "conditional dependencies" is one example. diff --git a/docs/src/main/asciidoc/config-extending-support.adoc b/docs/src/main/asciidoc/config-extending-support.adoc index f1c843711f51d..8a5428acd504b 100644 --- a/docs/src/main/asciidoc/config-extending-support.adoc +++ b/docs/src/main/asciidoc/config-extending-support.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Extending Configuration Support - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: Extend and customize the Configuration. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/config-mappings.adoc b/docs/src/main/asciidoc/config-mappings.adoc index a9aef63710068..2fc05f451bcee 100644 --- a/docs/src/main/asciidoc/config-mappings.adoc +++ b/docs/src/main/asciidoc/config-mappings.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Mapping configuration to objects - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: Group multiple configuration properties into an object. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/config-reference.adoc b/docs/src/main/asciidoc/config-reference.adoc index d9c2319373319..a22a94d363fda 100644 --- a/docs/src/main/asciidoc/config-reference.adoc +++ b/docs/src/main/asciidoc/config-reference.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Configuration Reference Guide - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: Learn more about how to configure your Quarkus applications. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/config-yaml.adoc b/docs/src/main/asciidoc/config-yaml.adoc index 5c95de026ee70..d2f46b965fd30 100644 --- a/docs/src/main/asciidoc/config-yaml.adoc +++ b/docs/src/main/asciidoc/config-yaml.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = YAML Configuration - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: YAML as a Configuration Source. :toc: https://en.wikipedia.org/wiki/YAML[YAML] is a very popular format. Kubernetes relies heavily on the YAML format to diff --git a/docs/src/main/asciidoc/config.adoc b/docs/src/main/asciidoc/config.adoc index cb617c0347b3a..bace61c263a95 100644 --- a/docs/src/main/asciidoc/config.adoc +++ b/docs/src/main/asciidoc/config.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Configuring Your Application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: Hardcoded values in your code is a no go (even if we all did it at some point ;-)). In this guide, we learn how to configure your application. IMPORTANT: The content of this guide and been revised and split into additional topics. Please check the <> section. diff --git a/docs/src/main/asciidoc/container-image.adoc b/docs/src/main/asciidoc/container-image.adoc index b523e13686810..4cedf318a0d6c 100644 --- a/docs/src/main/asciidoc/container-image.adoc +++ b/docs/src/main/asciidoc/container-image.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Container Images - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: Learn how to build and push container images with Jib, S2I or Docker as part of the Quarkus build. Quarkus provides extensions for building (and pushing) container images. Currently, it supports: diff --git a/docs/src/main/asciidoc/context-propagation.adoc b/docs/src/main/asciidoc/context-propagation.adoc index 5a41c4acfc54d..49160acd57ebc 100644 --- a/docs/src/main/asciidoc/context-propagation.adoc +++ b/docs/src/main/asciidoc/context-propagation.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Context Propagation in Quarkus - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: Learn more about how you can pass contextual information with SmallRye Context Propagation. Traditional blocking code uses link:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ThreadLocal.html[`ThreadLocal`] variables to store contextual objects in order to avoid diff --git a/docs/src/main/asciidoc/continuous-testing.adoc b/docs/src/main/asciidoc/continuous-testing.adoc index fffc68709a456..820224edd2267 100644 --- a/docs/src/main/asciidoc/continuous-testing.adoc +++ b/docs/src/main/asciidoc/continuous-testing.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Continuous Testing - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: Get early test feedback with Continuous Testing. :toc: macro :toclevels: 4 :doctype: book diff --git a/docs/src/main/asciidoc/credentials-provider.adoc b/docs/src/main/asciidoc/credentials-provider.adoc index 7137bf6520d16..e37d833d8f304 100644 --- a/docs/src/main/asciidoc/credentials-provider.adoc +++ b/docs/src/main/asciidoc/credentials-provider.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using a Credentials Provider - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guides explains how to use the Vault credentials provider or implement your own custom one. :extension-status: preview Interacting with a datastore typically implies first connecting using credentials. diff --git a/docs/src/main/asciidoc/databases-dev-services.adoc b/docs/src/main/asciidoc/databases-dev-services.adoc index 9176c8d326a08..b2d6eb1cef735 100644 --- a/docs/src/main/asciidoc/databases-dev-services.adoc +++ b/docs/src/main/asciidoc/databases-dev-services.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Databases -include::./attributes.adoc[] +include::_attributes.adoc[] When testing or running in dev mode Quarkus can provide you with a zero-config database out of the box, a feature we refer to as Dev Services. Depending on your database type you may need Docker installed in order to use this feature. diff --git a/docs/src/main/asciidoc/datasource.adoc b/docs/src/main/asciidoc/datasource.adoc index 711db50cfd6e4..3a92279a27440 100644 --- a/docs/src/main/asciidoc/datasource.adoc +++ b/docs/src/main/asciidoc/datasource.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Datasources - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: With Quarkus, you can easily configure a datasource, or several if need be. Many projects that use data require connections to a relational database. diff --git a/docs/src/main/asciidoc/deploying-to-azure-cloud.adoc b/docs/src/main/asciidoc/deploying-to-azure-cloud.adoc index d21c335ca64b9..e8f3f585bff04 100644 --- a/docs/src/main/asciidoc/deploying-to-azure-cloud.adoc +++ b/docs/src/main/asciidoc/deploying-to-azure-cloud.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Deploying to Microsoft Azure Cloud - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how to deploy a Quarkus application to Microsoft Azure Cloud. This guide covers: diff --git a/docs/src/main/asciidoc/deploying-to-google-cloud.adoc b/docs/src/main/asciidoc/deploying-to-google-cloud.adoc index 3135e952502ef..1a1417fc45841 100644 --- a/docs/src/main/asciidoc/deploying-to-google-cloud.adoc +++ b/docs/src/main/asciidoc/deploying-to-google-cloud.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Deploying to Google Cloud Platform (GCP) - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how to deploy a Quarkus application to Google Cloud. This guide covers: diff --git a/docs/src/main/asciidoc/deploying-to-heroku.adoc b/docs/src/main/asciidoc/deploying-to-heroku.adoc index f4f157b610240..d28be4ea8101f 100644 --- a/docs/src/main/asciidoc/deploying-to-heroku.adoc +++ b/docs/src/main/asciidoc/deploying-to-heroku.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Deploying to Heroku -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: Deploy your Quarkus applications on Heroku. In this guide you will learn how to deploy a Quarkus based web application as a web-dyno to Heroku. diff --git a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc index c92d25fe88144..06ad88d779995 100644 --- a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc +++ b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Kubernetes extension - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide covers how to deploy a native application on Kubernetes. Quarkus offers the ability to automatically generate Kubernetes resources based on sane defaults and user-supplied configuration using https://github.com/dekorateio/dekorate/[dekorate]. It currently supports generating resources for vanilla <<#kubernetes,Kubernetes>>, <<#openshift,OpenShift>> and <<#knative,Knative>>. diff --git a/docs/src/main/asciidoc/deploying-to-openshift.adoc b/docs/src/main/asciidoc/deploying-to-openshift.adoc index ec1b061392423..6ea9a89a95485 100644 --- a/docs/src/main/asciidoc/deploying-to-openshift.adoc +++ b/docs/src/main/asciidoc/deploying-to-openshift.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Deploying on OpenShift - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide covers how to deploy a native application on OpenShift. This guide covers generating and deploying OpenShift resources based on sane default and user supplied configuration. diff --git a/docs/src/main/asciidoc/dev-mode-differences.adoc b/docs/src/main/asciidoc/dev-mode-differences.adoc index a1b479f08134b..056598d83c02c 100644 --- a/docs/src/main/asciidoc/dev-mode-differences.adoc +++ b/docs/src/main/asciidoc/dev-mode-differences.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = How dev mode differs from a production application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: architecture +:summary: How dev mode differs from a production application This document explains how the dev mode in Quarkus differs from a production application. diff --git a/docs/src/main/asciidoc/dev-services.adoc b/docs/src/main/asciidoc/dev-services.adoc index 2a19404aaa061..eb8282f56dbcf 100644 --- a/docs/src/main/asciidoc/dev-services.adoc +++ b/docs/src/main/asciidoc/dev-services.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services Overview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: A list of all extensions that support Dev Services and their configuration options. Quarkus supports the automatic provisioning of unconfigured services in development and test mode. We refer to this capability as Dev Services. From a developer's perspective this means that if you include an extension and don't configure it then @@ -78,7 +79,7 @@ include::{generated-dir}/config/quarkus-keycloak-devservices-keycloak-keycloak-b The Kogito Dev Service will be enabled when either `kogito-quarkus` or `kogito-quarkus-processes` extension is present in your application. More information can be found at the xref:kogito-dev-services.adoc[Kogito Dev Services Guide]. -include::kogito-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{includes}/kogito-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] == MongoDB diff --git a/docs/src/main/asciidoc/dev-ui.adoc b/docs/src/main/asciidoc/dev-ui.adoc index 9751ef4ffec3c..bcfe42cafe046 100644 --- a/docs/src/main/asciidoc/dev-ui.adoc +++ b/docs/src/main/asciidoc/dev-ui.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev UI - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: writing-extensions +:summary: Learn how to get your extension contribute features to the Dev UI. This guide covers the Quarkus Dev UI for xref:building-my-first-extension.adoc[extension authors]. diff --git a/docs/src/main/asciidoc/doc-concepts.adoc b/docs/src/main/asciidoc/doc-concepts.adoc index 898c4787e0d3b..339a93d347919 100644 --- a/docs/src/main/asciidoc/doc-concepts.adoc +++ b/docs/src/main/asciidoc/doc-concepts.adoc @@ -5,8 +5,8 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// [id="concepts-quarkus-documentation"] = Quarkus documentation concepts -include::attributes.adoc[] -:keywords: contributing, docs +include::_attributes.adoc[] +:categories: contributing :fn-diataxis: footnote:diataxis[Procida, D. Diátaxis documentation framework. https://diataxis.fr/] Overview of concepts underlying the structure and composition of Quarkus docs. diff --git a/docs/src/main/asciidoc/doc-contribute-docs-howto.adoc b/docs/src/main/asciidoc/doc-contribute-docs-howto.adoc index 446372be51d2c..ad93106f4a153 100644 --- a/docs/src/main/asciidoc/doc-contribute-docs-howto.adoc +++ b/docs/src/main/asciidoc/doc-contribute-docs-howto.adoc @@ -5,11 +5,10 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// [id="howto-contribute-docs"] = How to contribute documentation -include::attributes.adoc[] -:toc: preamble +include::_attributes.adoc[] +:categories: contributing :asciidoc: https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/ -:keywords: contributing, docs -:quarkus-docs: https://github.com/quarkusio/quarkus/tree/main/docs +:quarkus-docs: {quarkus-base-url}/tree/main/docs :fn-diataxis: footnote:diataxis[Procida, D. Diátaxis documentation framework. https://diataxis.fr/] Outline the recommended steps for making successful contributions to Quarkus documentation. diff --git a/docs/src/main/asciidoc/doc-create-tutorial.adoc b/docs/src/main/asciidoc/doc-create-tutorial.adoc index 8004519d0795c..b37f07692b654 100644 --- a/docs/src/main/asciidoc/doc-create-tutorial.adoc +++ b/docs/src/main/asciidoc/doc-create-tutorial.adoc @@ -5,7 +5,8 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// [id="tutorial-doc-create-tutorial"] = Creating a tutorial -include::attributes.adoc[] +include::_attributes.adoc[] +:categories: contributing Create a new tutorial that guides users through creating, running, and testing a Quarkus application that uses annotations from an imaginary extension. @@ -41,7 +42,7 @@ Copy `docs/src/main/diataxis/_templates/template-tutorial.adoc` from the Quarkus [id="tutorial-acme-serve-http-requests"] // <1> = Serve Http requests using the Acme extension // <2> :extension-status: experimental // <3> -include::attributes.adoc[] // <4> +include::_attributes.adoc[] // <4> ---- <1> Specify a unique id for the section in lower-kebab-case. diff --git a/docs/src/main/asciidoc/doc-reference.adoc b/docs/src/main/asciidoc/doc-reference.adoc index ff1813f268cfa..a7b08b3c6ac97 100644 --- a/docs/src/main/asciidoc/doc-reference.adoc +++ b/docs/src/main/asciidoc/doc-reference.adoc @@ -5,8 +5,8 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// [id="reference-doc-quarkus-documentation"] = About Quarkus documentation -include::attributes.adoc[] -:toc: preamble +include::_attributes.adoc[] +:categories: contributing A detailed reference for the structure and composition of Quarkus documentation. @@ -134,7 +134,7 @@ For example, this document has the following in its header: ---- [id="reference-doc-quarkus-documentation"] = Quarkus documentation reference -\include::attributes.adoc[] +\include::_attributes.adoc[] :toc: preamble ---- @@ -278,7 +278,6 @@ The complete list of externalized variables for use is given in the following ta |Property Name|Value|Description |\{quarkus-version}|{quarkus-version}|The current version of the project. |\{quarkus-home-url}|{quarkus-home-url}| The location of the project home page. -|\{quarkus-site-getting-started}|{quarkus-site-getting-started}| The location of the getting started page. |\{quarkus-org-url}|{quarkus-org-url}| The location of the project GitHub organization. |\{quarkus-base-url}|{quarkus-base-url}| Quarkus GitHub URL common base prefix. diff --git a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc index a9edd106ffa10..773c7f4754c29 100644 --- a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc +++ b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Elasticsearch -include::./attributes.adoc[] +include::_attributes.adoc[] If any Elasticsearch-related extension is present (e.g. `quarkus-elasticsearch-rest-client` or `quarkus-hibernate-search-orm-elasticsearch`), Dev Services for Elasticsearch automatically starts an Elasticsearch server in dev mode and when running tests. diff --git a/docs/src/main/asciidoc/elasticsearch.adoc b/docs/src/main/asciidoc/elasticsearch.adoc index fd4633ed611f4..45c9f8a840644 100644 --- a/docs/src/main/asciidoc/elasticsearch.adoc +++ b/docs/src/main/asciidoc/elasticsearch.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Connecting to an Elasticsearch cluster -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use an Elasticsearch cluster using the low level or high level REST clients. Elasticsearch is a well known full text search engine and NoSQL datastore. diff --git a/docs/src/main/asciidoc/extension-codestart.adoc b/docs/src/main/asciidoc/extension-codestart.adoc index 108912f1223f4..a5e9c573e4a85 100644 --- a/docs/src/main/asciidoc/extension-codestart.adoc +++ b/docs/src/main/asciidoc/extension-codestart.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Extension codestart -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: writing-extensions +:summary: Provide users with initial code for extensions when generating Quarkus applications on code.quarkus.io and all the Quarkus tooling. This guide explains how to create and configure a Codestart for an extension. This guide explains how to create and configure a Quarkus Codestart for an extension. diff --git a/docs/src/main/asciidoc/extension-metadata.adoc b/docs/src/main/asciidoc/extension-metadata.adoc index e817b842f04db..7eb5432a720f2 100644 --- a/docs/src/main/asciidoc/extension-metadata.adoc +++ b/docs/src/main/asciidoc/extension-metadata.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension Metadata -include::./attributes.adoc[] +include::_attributes.adoc[] Quarkus extensions are distributed as Maven JAR artifacts that application and other libraries may depend on. When a Quarkus application project is built, tested or edited using the Quarkus dev tools, Quarkus extension JAR artifacts will be identified on the application classpath by the presence of the Quarkus extension metadata files in them. This document describes the purpose of each Quarkus extension metadata file and its content. diff --git a/docs/src/main/asciidoc/extension-registry-user.adoc b/docs/src/main/asciidoc/extension-registry-user.adoc index bbbb3e39e11f7..6768fa06b2218 100644 --- a/docs/src/main/asciidoc/extension-registry-user.adoc +++ b/docs/src/main/asciidoc/extension-registry-user.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension Registry - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: architecture +:summary: Learn more about the notion of extension registry and how you can use your own. The Quarkus dev tools, such as the https://quarkus.io/guides/cli-tooling[Quarkus CLI], the https://quarkus.io/guides/maven-tooling[Maven] and the https://quarkus.io/guides/gradle-tooling[Gradle] plugins, or https://code.quarkus.io[code.quarkus.io] can be used to list and search the Quarkus ecosystem for extensions that match a certain criteria. That includes the https://quarkus.io/guides/platform[Quarkus platform] extensions and various other extensions contributed by the community, many of which are hosted on the https://github.com/quarkiverse[Quarkiverse Hub]. diff --git a/docs/src/main/asciidoc/faq.adoc b/docs/src/main/asciidoc/faq.adoc deleted file mode 100644 index a7c9bbe4fe4d4..0000000000000 --- a/docs/src/main/asciidoc/faq.adoc +++ /dev/null @@ -1,29 +0,0 @@ -= Frequently Asked Questions - -include::./attributes.adoc[] - -:toc: macro -:toclevels: 4 -:doctype: book -:icons: font -:docinfo1: - -:numbered: -:sectnums: -:sectnumlevels: 4 - -== Native compilation - -Native executable fails on macOS with `error: unknown type name 'uint8_t'`:: -Your macOS has the wrong `*.h` files compared to the OS and no gcc compilation will work. -This can happen when you migrate from versions of the OS. -See https://stackoverflow.com/questions/48029309/cannot-compile-any-c-programs-error-unknown-type-name-uint8-t -+ -The solution is to - -* `sudo mv /usr/local/include /usr/local/include.old` -* Reinstall XCode for good measure -* (optional?) `brew install llvm` -* generally reinstall your brew dependencies with native compilation - -The executable should work now. diff --git a/docs/src/main/asciidoc/flyway.adoc b/docs/src/main/asciidoc/flyway.adoc index 1f28f56ac0f6e..e908197220b09 100644 --- a/docs/src/main/asciidoc/flyway.adoc +++ b/docs/src/main/asciidoc/flyway.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Flyway - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use the Flyway extension to manage your schema migrations. :migrations-path: src/main/resources/db/migration :config-file: application.properties diff --git a/docs/src/main/asciidoc/funqy-amazon-lambda-http.adoc b/docs/src/main/asciidoc/funqy-amazon-lambda-http.adoc index 7814efdc073b0..374492621c7cc 100644 --- a/docs/src/main/asciidoc/funqy-amazon-lambda-http.adoc +++ b/docs/src/main/asciidoc/funqy-amazon-lambda-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy HTTP Binding with Amazon Lambda  :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Amazon Lambda HTTP binding. If you want to allow HTTP clients to invoke on your Funqy functions on AWS Lambda, Quarkus allows you to expose multiple Funqy functions through HTTP deployed as one AWS Lambda. This approach does add overhead over the diff --git a/docs/src/main/asciidoc/funqy-amazon-lambda.adoc b/docs/src/main/asciidoc/funqy-amazon-lambda.adoc index 0f725ba9ac9e3..72e89b0ad7288 100644 --- a/docs/src/main/asciidoc/funqy-amazon-lambda.adoc +++ b/docs/src/main/asciidoc/funqy-amazon-lambda.adoc @@ -6,8 +6,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Funqy Amazon Lambda Binding :extension-status: preview :devtools-no-gradle: - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Amazon Lambda binding. The guide walks through quickstart code to show you how you can deploy Funqy functions to Amazon Lambda. diff --git a/docs/src/main/asciidoc/funqy-azure-functions-http.adoc b/docs/src/main/asciidoc/funqy-azure-functions-http.adoc index 3d888d302e754..8f56fe28d4f45 100644 --- a/docs/src/main/asciidoc/funqy-azure-functions-http.adoc +++ b/docs/src/main/asciidoc/funqy-azure-functions-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy HTTP Binding with Azure Functions :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Azure Functions HTTP binding. You can use xref:funqy-http.adoc[Funqy HTTP] on Azure Functions. This allows you to invoke on multiple Funqy functions using HTTP deployed as one Azure Function. diff --git a/docs/src/main/asciidoc/funqy-gcp-functions-http.adoc b/docs/src/main/asciidoc/funqy-gcp-functions-http.adoc index 4384cad7944a7..271fe0da0d828 100644 --- a/docs/src/main/asciidoc/funqy-gcp-functions-http.adoc +++ b/docs/src/main/asciidoc/funqy-gcp-functions-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy HTTP Binding with Google Cloud Functions :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Google Cloud Platform Functions HTTP binding. If you want to allow HTTP clients to invoke your Funqy functions on Google Cloud Functions, Quarkus allows you to expose multiple Funqy functions through HTTP deployed as one Google Cloud Function. This approach does add overhead over the diff --git a/docs/src/main/asciidoc/funqy-gcp-functions.adoc b/docs/src/main/asciidoc/funqy-gcp-functions.adoc index da5ca176738fe..61bd9b13b508a 100644 --- a/docs/src/main/asciidoc/funqy-gcp-functions.adoc +++ b/docs/src/main/asciidoc/funqy-gcp-functions.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy Google Cloud Functions :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Google Cloud Platform Functions binding. The guide walks through quickstart code to show you how you can deploy Funqy functions to Google Cloud Functions. diff --git a/docs/src/main/asciidoc/funqy-http.adoc b/docs/src/main/asciidoc/funqy-http.adoc index 6bb43c5fb2c9f..059a3ec491da7 100644 --- a/docs/src/main/asciidoc/funqy-http.adoc +++ b/docs/src/main/asciidoc/funqy-http.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy HTTP Binding (Standalone) - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's HTTP binding. :extension-status: preview The guide walks through quickstart code to show you how you can deploy Funqy as a diff --git a/docs/src/main/asciidoc/funqy-knative-events.adoc b/docs/src/main/asciidoc/funqy-knative-events.adoc index f6eaca00d640f..ff2022e39b891 100644 --- a/docs/src/main/asciidoc/funqy-knative-events.adoc +++ b/docs/src/main/asciidoc/funqy-knative-events.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy Knative Events Binding - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains Funqy's Knative Events binding. :extension-status: preview :devtools-no-gradle: diff --git a/docs/src/main/asciidoc/funqy.adoc b/docs/src/main/asciidoc/funqy.adoc index b08b44f45d178..4e7403c59abd2 100644 --- a/docs/src/main/asciidoc/funqy.adoc +++ b/docs/src/main/asciidoc/funqy.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Funqy - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains basics of the Funqy framework, a simple portable cross-provider cloud function API. :extension-status: preview Quarkus Funqy is part of Quarkus's serverless strategy and aims to provide a portable Java API to write functions diff --git a/docs/src/main/asciidoc/gcp-functions-http.adoc b/docs/src/main/asciidoc/gcp-functions-http.adoc index ee3595b18a10a..fa7fb80c220d9 100644 --- a/docs/src/main/asciidoc/gcp-functions-http.adoc +++ b/docs/src/main/asciidoc/gcp-functions-http.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Google Cloud Functions (Serverless) with RESTEasy Reactive, Undertow, or Reactive Routes :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how you can deploy Vert.x Web, Servlet, or RESTEasy microservices as a Google Cloud Function. The `quarkus-google-cloud-functions-http` extension allows you to write microservices with RESTEasy Reactive (JAX-RS), Undertow (Servlet), Reactive Routes, or xref:funqy-http.adoc[Funqy HTTP], and make these microservices deployable to the Google Cloud Functions runtime. diff --git a/docs/src/main/asciidoc/gcp-functions.adoc b/docs/src/main/asciidoc/gcp-functions.adoc index 2b0142064d9af..293536ce2ee08 100644 --- a/docs/src/main/asciidoc/gcp-functions.adoc +++ b/docs/src/main/asciidoc/gcp-functions.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Google Cloud Functions (Serverless) :extension-status: preview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide explains how you can deploy Quarkus-based Google Cloud Functions. The `quarkus-google-cloud-functions` extension allows you to use Quarkus to build your Google Cloud Functions. Your functions can use injection annotations from CDI or Spring and other Quarkus facilities as you need them. diff --git a/docs/src/main/asciidoc/getting-started-reactive.adoc b/docs/src/main/asciidoc/getting-started-reactive.adoc index a51041763108a..fead1e41e8c1f 100644 --- a/docs/src/main/asciidoc/getting-started-reactive.adoc +++ b/docs/src/main/asciidoc/getting-started-reactive.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Getting Started With Reactive - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: getting-started +:summary: Learn more about developing reactive applications with Quarkus. _Reactive_ is a set of principles to build robust, efficient, and concurrent applications and systems. These principles let you handle more load than traditional approaches while using the resources (CPU and memory) more efficiently while also reacting to failures gracefully. diff --git a/docs/src/main/asciidoc/getting-started-testing.adoc b/docs/src/main/asciidoc/getting-started-testing.adoc index 7ff32dbab0240..25f113351d51e 100644 --- a/docs/src/main/asciidoc/getting-started-testing.adoc +++ b/docs/src/main/asciidoc/getting-started-testing.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Testing Your Application - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: core +:summary: This guide covers testing in JVM mode, native mode, and injection of resources into tests :toc: macro :toclevels: 4 :doctype: book diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/src/main/asciidoc/getting-started.adoc index 6d05272557a14..57b17b3954466 100644 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/src/main/asciidoc/getting-started.adoc @@ -4,20 +4,18 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Creating Your First Application - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: getting-started +:summary: Discover how to create your first Quarkus application. :toc: macro :toclevels: 4 :doctype: book :icons: font :docinfo1: - :numbered: :sectnums: :sectnumlevels: 4 - Learn how to create a Hello World Quarkus app. This guide covers: diff --git a/docs/src/main/asciidoc/gradle-config.adoc b/docs/src/main/asciidoc/gradle-config.adoc deleted file mode 100644 index 198d686357209..0000000000000 --- a/docs/src/main/asciidoc/gradle-config.adoc +++ /dev/null @@ -1,49 +0,0 @@ -//// -This guide is maintained in the main Quarkus repository -and pull requests should be submitted there: -https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc -//// -= Gradle Plugin Repositories - -include::./attributes.adoc[] - -// tag::repositories[] -The Quarkus Gradle plugin is published to the https://plugins.gradle.org/plugin/io.quarkus[Gradle Plugin Portal]. - -To use it, add the following to your `build.gradle` file: - -[source, groovy, subs=attributes+] ----- -plugins { - id 'java' - id 'io.quarkus' -} ----- - -You also need to add the following at the top of your `settings.gradle` file: -[source, groovy, subs=attributes+] ----- -pluginManagement { - repositories { - mavenCentral() - gradlePluginPortal() - } - plugins { - id 'io.quarkus' version "${quarkusPluginVersion}" - } -} ----- - -NOTE:: the `plugins{}` method in `settings.gradle` is not supported in Gradle 5.x. In this case make sure to explicitly declare the plugin version in the `build.gradle` file like the example below: - -[source, groovy, subs=attributes+] ----- -plugins { - id 'java' - id 'io.quarkus' version '{quarkus-version}' -} ----- - - - -// end::repositories[] diff --git a/docs/src/main/asciidoc/gradle-tooling.adoc b/docs/src/main/asciidoc/gradle-tooling.adoc index c77b76b9edc00..460efe9b9585a 100644 --- a/docs/src/main/asciidoc/gradle-tooling.adoc +++ b/docs/src/main/asciidoc/gradle-tooling.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Building Quarkus apps with Gradle - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: tooling +:summary: This guide covers: Gradle configuration, creating a new project, dealing with extensions, development mode, debugging, import in your IDE, building a native image, and build a container friendly executable :devtools-no-maven: [[project-creation]] diff --git a/docs/src/main/asciidoc/grpc-getting-started.adoc b/docs/src/main/asciidoc/grpc-getting-started.adoc index a1ec29a3c515f..d34b40f80046f 100644 --- a/docs/src/main/asciidoc/grpc-getting-started.adoc +++ b/docs/src/main/asciidoc/grpc-getting-started.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Getting Started with gRPC - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: serialization +:summary: This guide explains how to start using gRPC in your Quarkus application. This page explains how to start using gRPC in your Quarkus application. While this page describes how to configure it with Maven, it is also possible to use Gradle. diff --git a/docs/src/main/asciidoc/grpc-service-consumption.adoc b/docs/src/main/asciidoc/grpc-service-consumption.adoc index 2936a0dfc5307..c75026a7dbecb 100644 --- a/docs/src/main/asciidoc/grpc-service-consumption.adoc +++ b/docs/src/main/asciidoc/grpc-service-consumption.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Consuming a gRPC Service - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: serialization +:summary: This guide explains how to consume gRPC services in your Quarkus application. gRPC clients can be injected in your application code. diff --git a/docs/src/main/asciidoc/grpc-service-implementation.adoc b/docs/src/main/asciidoc/grpc-service-implementation.adoc index 82ec98d1aebd1..1f2561e8f5423 100644 --- a/docs/src/main/asciidoc/grpc-service-implementation.adoc +++ b/docs/src/main/asciidoc/grpc-service-implementation.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Implementing a gRPC Service - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: serialization +:summary: This guide explains how to implement gRPC services in your Quarkus application. gRPC service implementations exposed as CDI beans are automatically registered and served by quarkus-grpc. diff --git a/docs/src/main/asciidoc/grpc.adoc b/docs/src/main/asciidoc/grpc.adoc index fb4ecc50281cf..2a1ff09344364 100644 --- a/docs/src/main/asciidoc/grpc.adoc +++ b/docs/src/main/asciidoc/grpc.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = gRPC - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: serialization +:summary: Entry point for everything gRPC. https://grpc.io/[gRPC] is a high-performance RPC framework. It can efficiently connect services implemented using various languages and frameworks. diff --git a/docs/src/main/asciidoc/hibernate-orm-panache-kotlin.adoc b/docs/src/main/asciidoc/hibernate-orm-panache-kotlin.adoc index 2faf13d54cb13..d1f109e6f0e62 100644 --- a/docs/src/main/asciidoc/hibernate-orm-panache-kotlin.adoc +++ b/docs/src/main/asciidoc/hibernate-orm-panache-kotlin.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Simplified Hibernate ORM with Panache and Kotlin - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data, alt-languages +:summary: This explains the specifics of using Hibernate ORM with Panache in a Kotlin project. :config-file: application.properties Hibernate ORM is the de facto standard JPA implementation and is well-known in the Java ecosystem. Hibernate ORM with Panache offers a diff --git a/docs/src/main/asciidoc/hibernate-orm-panache.adoc b/docs/src/main/asciidoc/hibernate-orm-panache.adoc index 5008778c42402..c98ff073ae388 100644 --- a/docs/src/main/asciidoc/hibernate-orm-panache.adoc +++ b/docs/src/main/asciidoc/hibernate-orm-panache.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Simplified Hibernate ORM with Panache - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Hibernate ORM is the de facto JPA implementation and offers you the full breadth of an Object Relational Mapper. It makes complex mappings possible, but it does not make simple and common mappings trivial. Panache focuses on making your entities trivial and fun to write. :config-file: application.properties Hibernate ORM is the de facto JPA implementation and offers you the full breadth of an Object Relational Mapper. diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index 04d4853c9619b..bf9d195ac9379 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Hibernate ORM and JPA - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Hibernate ORM is the de facto JPA implementation and offers you the full breath of an Object Relational Mapper. It works beautifully in Quarkus. :config-file: application.properties :orm-doc-url-prefix: https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html @@ -658,7 +659,7 @@ quarkus.hibernate-orm.cache."org.acme.MyEntity".memory.object-count=1000 ==== -include::duration-format-note.adoc[] +include::{includes}/duration-format-note.adoc[] === Limitations of Caching diff --git a/docs/src/main/asciidoc/hibernate-reactive-panache.adoc b/docs/src/main/asciidoc/hibernate-reactive-panache.adoc index d9baf896d6cee..849ad0b8d768c 100644 --- a/docs/src/main/asciidoc/hibernate-reactive-panache.adoc +++ b/docs/src/main/asciidoc/hibernate-reactive-panache.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Simplified Hibernate Reactive with Panache - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Simplified reactive ORM layer based on Hibernate Reactive. :config-file: application.properties link:https://hibernate.org/reactive/[Hibernate Reactive] is the only reactive JPA implementation and offers you the full diff --git a/docs/src/main/asciidoc/hibernate-reactive.adoc b/docs/src/main/asciidoc/hibernate-reactive.adoc index 71e2ba09573f9..744a298b0014c 100644 --- a/docs/src/main/asciidoc/hibernate-reactive.adoc +++ b/docs/src/main/asciidoc/hibernate-reactive.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Hibernate Reactive -include::./attributes.adoc[] +include::_attributes.adoc[] :config-file: application.properties :reactive-doc-url-prefix: https://hibernate.org/reactive/documentation/1.1/reference/html_single/#getting-started diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc index f762133986557..0b1406948fadb 100644 --- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc @@ -5,7 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Hibernate Search guide :hibernate-search-doc-prefix: https://docs.jboss.org/hibernate/search/6.1/reference/en-US/html_single/ -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Hibernate Search allows you to index your entities in an Elasticsearch cluster and easily offer full text search in all your Hibernate ORM-based applications. You have a Hibernate ORM-based application? You want to provide a full-featured full-text search to your users? You're at the right place. diff --git a/docs/src/main/asciidoc/http-reference.adoc b/docs/src/main/asciidoc/http-reference.adoc index 3633a29e46301..a5dbe8861abeb 100644 --- a/docs/src/main/asciidoc/http-reference.adoc +++ b/docs/src/main/asciidoc/http-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = HTTP Reference - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: Learn more about configuring Quarkus' Vert.x based HTTP layer - and Undertow if you are using servlets. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/ide-tooling.adoc b/docs/src/main/asciidoc/ide-tooling.adoc index bb76302fd80cb..6ab775495c930 100644 --- a/docs/src/main/asciidoc/ide-tooling.adoc +++ b/docs/src/main/asciidoc/ide-tooling.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Tools in your favorite IDE - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: getting-started +:summary: Learn more about Quarkus integrations in IDEs. The following IDEs have support for the community developed Quarkus Tools: diff --git a/docs/src/main/asciidoc/infinispan-client.adoc b/docs/src/main/asciidoc/infinispan-client.adoc index 3a01a42383fb2..ac4844c252a47 100644 --- a/docs/src/main/asciidoc/infinispan-client.adoc +++ b/docs/src/main/asciidoc/infinispan-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Infinispan Client - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Infinispan is an in memory data grid that allows running in a server outside of application processes. This extension provides functionality to allow the client that can connect to said server when running in Quarkus. Infinispan is a distributed, in-memory key/value store that provides Quarkus applications with a highly configurable and independently scalable data layer. diff --git a/docs/src/main/asciidoc/jms.adoc b/docs/src/main/asciidoc/jms.adoc index 51f8e37aa95e8..5d7f27d8b99a5 100644 --- a/docs/src/main/asciidoc/jms.adoc +++ b/docs/src/main/asciidoc/jms.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using JMS -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: This guide demonstrates how your Quarkus application can use JMS messaging with AMQP 1.0 using Apache Qpid JMS, or using Apache ActiveMQ Artemis JMS. :extension-status: preview diff --git a/docs/src/main/asciidoc/jreleaser.adoc b/docs/src/main/asciidoc/jreleaser.adoc index 619a99df6ded5..677dca385ec75 100644 --- a/docs/src/main/asciidoc/jreleaser.adoc +++ b/docs/src/main/asciidoc/jreleaser.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Packaging And Releasing With JReleaser -include::./attributes.adoc[] +include::_attributes.adoc[] :jreleaser-version: 0.9.1 :numbered: diff --git a/docs/src/main/asciidoc/kafka-dev-services.adoc b/docs/src/main/asciidoc/kafka-dev-services.adoc index a56f2c4df94d9..30588ba1e1381 100644 --- a/docs/src/main/asciidoc/kafka-dev-services.adoc +++ b/docs/src/main/asciidoc/kafka-dev-services.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Kafka - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: Start Apache Kafka automatically in dev and test modes. If any Kafka-related extension is present (e.g. `quarkus-smallrye-reactive-messaging-kafka`), Dev Services for Kafka automatically starts a Kafka broker in dev mode and when running tests. So, you don't have to start a broker manually. diff --git a/docs/src/main/asciidoc/kafka-reactive-getting-started.adoc b/docs/src/main/asciidoc/kafka-reactive-getting-started.adoc index 04a5f04f11c66..6e6e2a09e466c 100644 --- a/docs/src/main/asciidoc/kafka-reactive-getting-started.adoc +++ b/docs/src/main/asciidoc/kafka-reactive-getting-started.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Getting Started to SmallRye Reactive Messaging with Apache Kafka - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: This guide demonstrates how your Quarkus application can utilize SmallRye Reactive Messaging to interact with Apache Kafka. This guide demonstrates how your Quarkus application can utilize SmallRye Reactive Messaging to interact with Apache Kafka. diff --git a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc index 8c06be867948b..55cfc9ac560c9 100644 --- a/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc +++ b/docs/src/main/asciidoc/kafka-schema-registry-avro.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Apache Kafka with Schema Registry and Avro - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: Use Apache Kafka, Avro serialized records, and connect to a schema registry. This guide shows how your Quarkus application can use Apache Kafka, https://avro.apache.org/docs/current/[Avro] serialized records, and connect to a schema registry (such as the https://docs.confluent.io/platform/current/schema-registry/index.html[Confluent Schema Registry] or https://www.apicur.io/registry/[Apicurio Registry]). diff --git a/docs/src/main/asciidoc/kafka-streams.adoc b/docs/src/main/asciidoc/kafka-streams.adoc index 870d8b65a97cf..ab71139788325 100644 --- a/docs/src/main/asciidoc/kafka-streams.adoc +++ b/docs/src/main/asciidoc/kafka-streams.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Apache Kafka Streams - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: This guide demonstrates how your Quarkus application can utilize the Apache Kafka Streams API to implement stream processing applications based on Apache Kafka. This guide demonstrates how your Quarkus application can utilize the Apache Kafka Streams API to implement stream processing applications based on Apache Kafka. diff --git a/docs/src/main/asciidoc/kafka.adoc b/docs/src/main/asciidoc/kafka.adoc index a8281d1280a9a..2b8a4a39aa0bb 100644 --- a/docs/src/main/asciidoc/kafka.adoc +++ b/docs/src/main/asciidoc/kafka.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Apache Kafka Reference Guide - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: messaging +:summary: This reference guide provides an in-depth look on Apache Kafka and Smallrye Reactive Messaging framework. :numbered: :sectnums: :sectnumlevels: 4 @@ -2066,7 +2066,7 @@ The consumer `client.id` is configured according to the number of clients to cre - If a `client.id` is not provided, it is generated as `kafka-consumer-[channel][-index]`. -include::smallrye-kafka-incoming.adoc[] +include::{includes}/smallrye-kafka-incoming.adoc[] === Outgoing channel configuration (writing to Kafka) @@ -2101,7 +2101,7 @@ If not set, `key.serializer` is set to `org.apache.kafka.common.serialization.St If not set, producer `client.id` is generated as `kafka-producer-[channel]`. -include::smallrye-kafka-outgoing.adoc[] +include::{includes}/smallrye-kafka-outgoing.adoc[] [[kafka-configuration-resolution]] === Kafka Configuration Resolution diff --git a/docs/src/main/asciidoc/kogito-dev-services.adoc b/docs/src/main/asciidoc/kogito-dev-services.adoc index 361286d8cce52..5217e77f32419 100644 --- a/docs/src/main/asciidoc/kogito-dev-services.adoc +++ b/docs/src/main/asciidoc/kogito-dev-services.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Kogito -include::./attributes.adoc[] +include::_attributes.adoc[] If any Kogito process-related extension is present (e.g. `kogito-quarkus` or `kogito-quarkus-processes`), Dev Services for Kogito automatically starts a Data Index in dev mode. So, you don't have to start it manually or have any other service set-up manually. diff --git a/docs/src/main/asciidoc/kogito-dmn.adoc b/docs/src/main/asciidoc/kogito-dmn.adoc index 0d72590f1c06b..0cf85879c1085 100644 --- a/docs/src/main/asciidoc/kogito-dmn.adoc +++ b/docs/src/main/asciidoc/kogito-dmn.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Kogito DMN support to add decision automation capabilities to an application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: business-automation +:summary: Use Kogito to add business automation and power it up with DMN decision support. This guide demonstrates how your Quarkus application can use Kogito to add business automation and power it up with DMN decision support. diff --git a/docs/src/main/asciidoc/kogito-drl.adoc b/docs/src/main/asciidoc/kogito-drl.adoc index 586d25890ad94..f9b1628f4da18 100644 --- a/docs/src/main/asciidoc/kogito-drl.adoc +++ b/docs/src/main/asciidoc/kogito-drl.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Kogito to add rule engine capabilities to an application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: business-automation +:summary: Use Kogito to add DRL files with rules. This guide demonstrates how your Quarkus application can use Kogito to add DRL files with rules. diff --git a/docs/src/main/asciidoc/kogito-pmml.adoc b/docs/src/main/asciidoc/kogito-pmml.adoc index d74cfaac85eaa..e408aec994b87 100644 --- a/docs/src/main/asciidoc/kogito-pmml.adoc +++ b/docs/src/main/asciidoc/kogito-pmml.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Kogito to add prediction capabilities to an application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: business-automation +:summary: Use Kogito to add business automation to power it up with predictions. This guide demonstrates how your Quarkus application can use Kogito to add business automation to power it up with predictions. diff --git a/docs/src/main/asciidoc/kogito.adoc b/docs/src/main/asciidoc/kogito.adoc index 0fc365377d658..2b5ea56935012 100644 --- a/docs/src/main/asciidoc/kogito.adoc +++ b/docs/src/main/asciidoc/kogito.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Kogito to add business automation capabilities to an application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: business-automation +:summary: This guide demonstrates how your Quarkus application can use Kogito to add business automation to power it up with business processes and rules. This guide demonstrates how your Quarkus application can use Kogito to add business automation to power it up with business processes and rules. diff --git a/docs/src/main/asciidoc/kotlin.adoc b/docs/src/main/asciidoc/kotlin.adoc index 1a5331b6b4fbd..6a1fa52982194 100644 --- a/docs/src/main/asciidoc/kotlin.adoc +++ b/docs/src/main/asciidoc/kotlin.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Kotlin - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: alt-languages +:summary: This guide explains how to use Kotlin. https://kotlinlang.org/[Kotlin] is a very popular programming language that targets the JVM (amongst other environments). Kotlin has experienced a surge in popularity the last few years making it the most popular JVM language, except for Java of course. diff --git a/docs/src/main/asciidoc/kubernetes-client.adoc b/docs/src/main/asciidoc/kubernetes-client.adoc index d2d5efe604636..f803bd55e2248 100644 --- a/docs/src/main/asciidoc/kubernetes-client.adoc +++ b/docs/src/main/asciidoc/kubernetes-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Kubernetes Client - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: This guide demonstrates how to use the Fabric8 Kubernetes client to interact with your Kubernetes cluster. Quarkus includes the `kubernetes-client` extension which enables the use of the https://github.com/fabric8io/kubernetes-client[Fabric8 Kubernetes Client] diff --git a/docs/src/main/asciidoc/kubernetes-config.adoc b/docs/src/main/asciidoc/kubernetes-config.adoc index 87fab5ccdc40d..b824b17d4e48b 100644 --- a/docs/src/main/asciidoc/kubernetes-config.adoc +++ b/docs/src/main/asciidoc/kubernetes-config.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Kubernetes Config - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: cloud +:summary: Use ConfigMaps as a configuration source for your Quarkus applications. Quarkus includes the `kubernetes-config` extension which allows developers to use Kubernetes https://cloud.google.com/kubernetes-engine/docs/concepts/configmap[ConfigMaps] and https://cloud.google.com/kubernetes-engine/docs/concepts/secret[Secrets] as a configuration source, without having to mount them into the https://kubernetes.io/docs/concepts/workloads/pods/pod/[Pod] running the Quarkus application or make any other modifications to their Kubernetes `Deployment` (or OpenShift `DeploymentConfig`). diff --git a/docs/src/main/asciidoc/lifecycle.adoc b/docs/src/main/asciidoc/lifecycle.adoc index 7b9510199e0ce..b30f503c0833a 100644 --- a/docs/src/main/asciidoc/lifecycle.adoc +++ b/docs/src/main/asciidoc/lifecycle.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Application Initialization and Termination - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: You often need to execute custom actions when the application starts and clean up everything when the application stops. This guide explains how to be notified when an application stops or starts. You often need to execute custom actions when the application starts and clean up everything when the application stops. This guide explains how to: diff --git a/docs/src/main/asciidoc/liquibase-mongodb.adoc b/docs/src/main/asciidoc/liquibase-mongodb.adoc index 6c426827f780f..7dfe6fe30378f 100644 --- a/docs/src/main/asciidoc/liquibase-mongodb.adoc +++ b/docs/src/main/asciidoc/liquibase-mongodb.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Liquibase MongoDB -include::./attributes.adoc[] +include::_attributes.adoc[] :change-log: src/main/resources/db/changeLog.xml :config-file: application.properties diff --git a/docs/src/main/asciidoc/liquibase.adoc b/docs/src/main/asciidoc/liquibase.adoc index d7119945791ce..166b6129b13b0 100644 --- a/docs/src/main/asciidoc/liquibase.adoc +++ b/docs/src/main/asciidoc/liquibase.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Liquibase - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use the Liquibase extension to manage your schema migrations. :change-log: src/main/resources/db/changeLog.xml :config-file: application.properties diff --git a/docs/src/main/asciidoc/logging.adoc b/docs/src/main/asciidoc/logging.adoc index 3a5cb4a1cec3f..911fc1ad52e47 100644 --- a/docs/src/main/asciidoc/logging.adoc +++ b/docs/src/main/asciidoc/logging.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Configuring Logging - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: This guide explains logging and how to configure it. This guide explains logging and how to configure it. diff --git a/docs/src/main/asciidoc/lra.adoc b/docs/src/main/asciidoc/lra.adoc index 14d113ca33581..fb584080fe4e5 100644 --- a/docs/src/main/asciidoc/lra.adoc +++ b/docs/src/main/asciidoc/lra.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Narayana LRA Participant Support - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guides covers the usage of LRA to coordinate activities across services. == Introduction diff --git a/docs/src/main/asciidoc/mailer-reference.adoc b/docs/src/main/asciidoc/mailer-reference.adoc index 2aa9e6342d6f6..5c42fb80e0557 100644 --- a/docs/src/main/asciidoc/mailer-reference.adoc +++ b/docs/src/main/asciidoc/mailer-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Mailer Reference Guide - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: This reference guide explains in more details the configuration and usage of the Quarkus Mailer. This guide is the companion from the xref:mailer.adoc[Mailer Getting Started Guide]. It explains in more details the configuration and usage of the Quarkus Mailer. diff --git a/docs/src/main/asciidoc/mailer.adoc b/docs/src/main/asciidoc/mailer.adoc index e85271a91c4fa..50247bed360f7 100644 --- a/docs/src/main/asciidoc/mailer.adoc +++ b/docs/src/main/asciidoc/mailer.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Sending emails using SMTP - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: Learn more about how you can send email from a Quarkus application with our reactive email client. This guide demonstrates how your Quarkus application can send emails using an SMTP server. This is a getting started guide. diff --git a/docs/src/main/asciidoc/maven-tooling.adoc b/docs/src/main/asciidoc/maven-tooling.adoc index c0e4da989f6ba..96f6becb61547 100644 --- a/docs/src/main/asciidoc/maven-tooling.adoc +++ b/docs/src/main/asciidoc/maven-tooling.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Building applications with Maven - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: tooling +:summary: This guide covers: Maven configuration, creating a new project, dealing with extensions, development mode, debugging, import in your IDE, building a native image, and build a container friendly executable :devtools-no-gradle: [[project-creation]] diff --git a/docs/src/main/asciidoc/micrometer.adoc b/docs/src/main/asciidoc/micrometer.adoc index 17da56696fc67..b8fefe6a3e7d5 100644 --- a/docs/src/main/asciidoc/micrometer.adoc +++ b/docs/src/main/asciidoc/micrometer.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Micrometer Metrics - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide demonstrates how your Quarkus application can collect metrics using the Micrometer extension. This guide demonstrates how your Quarkus application can utilize the Micrometer metrics library for runtime and application metrics. diff --git a/docs/src/main/asciidoc/mongodb-panache-kotlin.adoc b/docs/src/main/asciidoc/mongodb-panache-kotlin.adoc index c96c289788d9b..7a28074d3724e 100644 --- a/docs/src/main/asciidoc/mongodb-panache-kotlin.adoc +++ b/docs/src/main/asciidoc/mongodb-panache-kotlin.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Simplified MongoDB with Panache and Kotlin - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data, alt-languages +:summary: This guide covers the usage of MongoDB using active records and repositories in a Kotlin project. :config-file: application.properties MongoDB is a well known NoSQL Database that is widely used. MongoDB with Panache offers a diff --git a/docs/src/main/asciidoc/mongodb-panache.adoc b/docs/src/main/asciidoc/mongodb-panache.adoc index 1f62b79f0f368..6e27b79152d45 100644 --- a/docs/src/main/asciidoc/mongodb-panache.adoc +++ b/docs/src/main/asciidoc/mongodb-panache.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Simplified MongoDB with Panache - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers the usage of MongoDB using active records and repositories. :config-file: application.properties :mongodb-doc-root-url: https://www.mongodb.com/docs/drivers/java/sync/current diff --git a/docs/src/main/asciidoc/mongodb.adoc b/docs/src/main/asciidoc/mongodb.adoc index 579a60418fbbd..d7d278dca2807 100644 --- a/docs/src/main/asciidoc/mongodb.adoc +++ b/docs/src/main/asciidoc/mongodb.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the MongoDB Client -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use MongoDB in Quarkus. MongoDB is a well known NoSQL Database that is widely used. diff --git a/docs/src/main/asciidoc/mutiny-primer.adoc b/docs/src/main/asciidoc/mutiny-primer.adoc index 4b7ecb8aa5a62..a6517d9e22275 100644 --- a/docs/src/main/asciidoc/mutiny-primer.adoc +++ b/docs/src/main/asciidoc/mutiny-primer.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Mutiny - Async for bare mortal -include::./attributes.adoc[] +include::_attributes.adoc[] https://smallrye.io/smallrye-mutiny[Mutiny] is an intuitive, reactive programming library. It is the primary model to write reactive applications with Quarkus. diff --git a/docs/src/main/asciidoc/native-and-ssl.adoc b/docs/src/main/asciidoc/native-and-ssl.adoc index da303ad9d6f5f..7b126d560f2f0 100644 --- a/docs/src/main/asciidoc/native-and-ssl.adoc +++ b/docs/src/main/asciidoc/native-and-ssl.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using SSL With Native Executables - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core +:summary: In this guide, we will discuss how you can get your native images to support SSL, as native images don't support it out of the box. :devtools-no-gradle: We are quickly moving to an SSL-everywhere world so being able to use SSL is crucial. diff --git a/docs/src/main/asciidoc/native-reference.adoc b/docs/src/main/asciidoc/native-reference.adoc index 72420aeb59a47..12c11f5c1dec4 100644 --- a/docs/src/main/asciidoc/native-reference.adoc +++ b/docs/src/main/asciidoc/native-reference.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Native Reference Guide -include::./attributes.adoc[] +include::_attributes.adoc[] This guide is a companion to the xref:building-native-image.adoc[Building a Native Executable], diff --git a/docs/src/main/asciidoc/openapi-swaggerui.adoc b/docs/src/main/asciidoc/openapi-swaggerui.adoc index cb07612948f58..f2558a4d3fdb3 100644 --- a/docs/src/main/asciidoc/openapi-swaggerui.adoc +++ b/docs/src/main/asciidoc/openapi-swaggerui.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenAPI and Swagger UI - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to use the OpenAPI extension to generate an OpenAPI descriptor and get a Swagger UI frontend to test your REST endpoints. This guide explains how your Quarkus application can expose its API description through an OpenAPI specification and how you can test it via a user-friendly UI named Swagger UI. diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index 2960c3ca14913..e66ab4dfee667 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenTelemetry - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide explains how your Quarkus application can utilize OpenTelemetry to provide distributed tracing for interactive web applications. This guide explains how your Quarkus application can utilize https://opentelemetry.io/[OpenTelemetry] to provide distributed tracing for interactive web applications. diff --git a/docs/src/main/asciidoc/opentracing.adoc b/docs/src/main/asciidoc/opentracing.adoc index 2905ffb25afc2..17a488c4d15b3 100644 --- a/docs/src/main/asciidoc/opentracing.adoc +++ b/docs/src/main/asciidoc/opentracing.adoc @@ -5,8 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenTracing :extension-status: deprecated - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide explains how your Quarkus application can utilize OpenTracing to provide distributed tracing for interactive web applications. This guide explains how your Quarkus application can utilize OpenTracing to provide distributed tracing for interactive web applications. diff --git a/docs/src/main/asciidoc/optaplanner.adoc b/docs/src/main/asciidoc/optaplanner.adoc index dd16950334624..abac11775db43 100644 --- a/docs/src/main/asciidoc/optaplanner.adoc +++ b/docs/src/main/asciidoc/optaplanner.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = OptaPlanner - Using AI to optimize a schedule with OptaPlanner - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: business-automation +:summary: This guide walks you through the process of creating a Quarkus application with OptaPlanner's constraint solving Artificial Intelligence (AI). :config-file: application.properties This guide walks you through the process of creating a Quarkus application diff --git a/docs/src/main/asciidoc/performance-measure.adoc b/docs/src/main/asciidoc/performance-measure.adoc index ece6c2d33db6f..cd261ce68ef95 100644 --- a/docs/src/main/asciidoc/performance-measure.adoc +++ b/docs/src/main/asciidoc/performance-measure.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Measuring Performance - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: This guide explains how to best measure the footprint of a Quarkus application. This guide covers: diff --git a/docs/src/main/asciidoc/picocli.adoc b/docs/src/main/asciidoc/picocli.adoc index ff25483cd4d7f..bd4c109888fd4 100644 --- a/docs/src/main/asciidoc/picocli.adoc +++ b/docs/src/main/asciidoc/picocli.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Command Mode with Picocli - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: command-line +:summary: Simplify command line applications creation with the Picocli extension. https://picocli.info/[Picocli] is an open source tool for creating rich command line applications. diff --git a/docs/src/main/asciidoc/platform.adoc b/docs/src/main/asciidoc/platform.adoc index 4451a70e81c33..65df86088d0a2 100644 --- a/docs/src/main/asciidoc/platform.adoc +++ b/docs/src/main/asciidoc/platform.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Platform - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: architecture +:summary: Learn more about what we call a Platform in the Quarkus world. The Quarkus extension ecosystem consists of the Quarkus extensions developed and maintained by the community, including the Quarkus core development team. While the Quarkus ecosystem (sometimes also referred to as the "Quarkus universe") includes all the Quarkus extensions ever developed, there is also a concept of a Quarkus platform. diff --git a/docs/src/main/asciidoc/podman.adoc b/docs/src/main/asciidoc/podman.adoc index eb0dd433fff02..0c265075dede5 100644 --- a/docs/src/main/asciidoc/podman.adoc +++ b/docs/src/main/asciidoc/podman.adoc @@ -4,6 +4,7 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Podman with Quarkus +include::_attributes.adoc[] https://podman.io/[Podman] is a daemonless and rootless container engine for developing, managing, and running OCI Containers on your Linux system or other OS. If you're using Podman with Quarkus, some one-off setup is needed, but once it's done, you can take advantage of all the Quarkus features. diff --git a/docs/src/main/asciidoc/quarkus-intro.adoc b/docs/src/main/asciidoc/quarkus-intro.adoc deleted file mode 100644 index 01505454c23b9..0000000000000 --- a/docs/src/main/asciidoc/quarkus-intro.adoc +++ /dev/null @@ -1,79 +0,0 @@ -= What is Quarkus - -include::./attributes.adoc[] -:toc: macro -:toclevels: 4 -:doctype: book -:icons: font -:docinfo1: - -:numbered: -:sectnums: -:sectnumlevels: 4 - -// tag::intro[] - -[quote] --- -Quarkus is a Cloud Native, Container First framework for writing Java applications. --- - -Container First:: -Minimal footprint Java applications optimized for running in containers -Cloud Native:: -Embraces 12 factor architecture in environments like Kubernetes -Unify imperative and reactive:: -Brings under one programming model non-blocking and imperative styles of development -Standards-based:: -Based on the standards and the libraries you love and use (RESTEasy Reactive, Hibernate, Netty, Eclipse Vert.x, Apache Camel...) -Microservice First:: -Brings lightning fast startup time to Java applications -Extreme productivity:: -Instant hot code replacement: don't allow build, deploy, boot delays disrupt your flow -Developer Joy:: -Development-centric experience without compromises to bring your amazing applications to life in no time - -All under one framework. - -// end::intro[] - -== Scratch pad - - -Quarkus believes in developer Joy. - - -It unifies imperative and reactive. -It is a Microservice first toolkit. - -Standards based -Quarkus brings all the standards and frameworks you love and use: RESTEasy Reactive, Hibernate, Netty, vert.x, Camel...) - -Imperative and Reactive - -* ahead-of-time native binary (executable binary) -* Cloud Native -* Java -* modular -* Substrate VM native - -Seamlessly build container optimal - -Container affinity - -Container optimal - -* low memory -* low startup time -* ahead of time optimal - -Unifying Imperative and Reactive under one framework. - -Usability -* easy to use -* productive environment -* hot reload - -Standards based - - diff --git a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc index 249c48287672c..aadebc85ea9e6 100644 --- a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc +++ b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc @@ -8,7 +8,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc The Quarkus Maven Plugin builds the Quarkus applications, and provides helpers to launch dev mode or build native executables. For more information about how to use the Quarkus Maven Plugin, please refer to the xref:maven-tooling.adoc[Maven Tooling guide]. -include::./attributes.adoc[] +include::_attributes.adoc[] == Discover Maven goals diff --git a/docs/src/main/asciidoc/quarkus-reactive-architecture.adoc b/docs/src/main/asciidoc/quarkus-reactive-architecture.adoc index b5e19ce25e21c..27e2b760e25fd 100644 --- a/docs/src/main/asciidoc/quarkus-reactive-architecture.adoc +++ b/docs/src/main/asciidoc/quarkus-reactive-architecture.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Reactive Architecture - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: architecture +:summary: Learn more about Quarkus reactive architecture. Quarkus is reactive. It's even more than this: Quarkus unifies reactive and imperative programming. diff --git a/docs/src/main/asciidoc/quarkus-runtime-base-image.adoc b/docs/src/main/asciidoc/quarkus-runtime-base-image.adoc index 7516166b8d77e..fb6872af60199 100644 --- a/docs/src/main/asciidoc/quarkus-runtime-base-image.adoc +++ b/docs/src/main/asciidoc/quarkus-runtime-base-image.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Base Runtime Image -include::./attributes.adoc[] +include::_attributes.adoc[] To ease the containerization of native executables, Quarkus provides a base image providing the requirements to run these executables. The `quarkus-micro-image:1.0` image is: diff --git a/docs/src/main/asciidoc/quartz.adoc b/docs/src/main/asciidoc/quartz.adoc index 27be001e45640..0cb5dc145c3b0 100644 --- a/docs/src/main/asciidoc/quartz.adoc +++ b/docs/src/main/asciidoc/quartz.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Scheduling Periodic Tasks with Quartz - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: You need clustering support for your scheduled tasks? This guide explains how to use the Quartz extension for that. :extension-status: preview Modern applications often need to run specific tasks periodically. diff --git a/docs/src/main/asciidoc/qute-reference.adoc b/docs/src/main/asciidoc/qute-reference.adoc index 6a50ddec75fe8..e43049f536e08 100644 --- a/docs/src/main/asciidoc/qute-reference.adoc +++ b/docs/src/main/asciidoc/qute-reference.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Qute Reference Guide - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: miscellaneous +:summary: Learn everything you need to know about the Qute template engine. :numbered: :sectnums: :sectnumlevels: 4 @@ -522,6 +522,8 @@ If a part of an expression resolves to a `CompletionStage`, the resolution conti For example, if there is an expression `{foo.size}` and `foo` resolves to `CompletionStage>` then `size` is resolved against the completed result, i.e. `List`. If a part of an expression resolves to a `Uni`, a `CompletionStage` is first created from `Uni` using `Uni#subscribeAsCompletionStage()` and then evaluated as described above. +IMPORTANT: Note that each `Uni#subscribeAsCompletionStage()` results in a new subscription. You might need to configure memoization of the `Uni` item or failure before it's used as template data, i.e. `myUni.memoize().indefinitely()`. + It can happen that a `CompletionStage` never completes or a `Uni` emits no item/failure. In this case, the rendering methods (such as `TemplateInstance#render()` and `TemplateInstance#createUni()`) fail after a specific timeout. The timeout can be specified as a template instance `timeout` attribute. diff --git a/docs/src/main/asciidoc/qute.adoc b/docs/src/main/asciidoc/qute.adoc index b3d32086fbf5b..a4d8be410882e 100644 --- a/docs/src/main/asciidoc/qute.adoc +++ b/docs/src/main/asciidoc/qute.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Qute Templating Engine - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: Learn more about how you can use templating in your applications with the Qute template engine. Qute is a templating engine designed specifically to meet the Quarkus needs. The usage of reflection is minimized to reduce the size of native images. diff --git a/docs/src/main/asciidoc/rabbitmq-dev-services.adoc b/docs/src/main/asciidoc/rabbitmq-dev-services.adoc index 953f8bc5980b8..bbcdef597b99a 100644 --- a/docs/src/main/asciidoc/rabbitmq-dev-services.adoc +++ b/docs/src/main/asciidoc/rabbitmq-dev-services.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for RabbitMQ -include::./attributes.adoc[] +include::_attributes.adoc[] Dev Services for RabbitMQ automatically starts a RabbitMQ broker in dev mode and when running tests. So, you don't have to start a broker manually. diff --git a/docs/src/main/asciidoc/rabbitmq-reference.adoc b/docs/src/main/asciidoc/rabbitmq-reference.adoc index 2b512b7064004..52a7fdb5e32d4 100644 --- a/docs/src/main/asciidoc/rabbitmq-reference.adoc +++ b/docs/src/main/asciidoc/rabbitmq-reference.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Reactive Messaging RabbitMQ Connector Reference Documentation -include::./attributes.adoc[] +include::_attributes.adoc[] This guide is the companion from the xref:rabbitmq.adoc[Getting Started with RabbitMQ]. It explains in more details the configuration and usage of the RabbitMQ connector for reactive messaging. diff --git a/docs/src/main/asciidoc/rabbitmq.adoc b/docs/src/main/asciidoc/rabbitmq.adoc index 477b874aa6f6c..9307e0c72ad52 100644 --- a/docs/src/main/asciidoc/rabbitmq.adoc +++ b/docs/src/main/asciidoc/rabbitmq.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Getting Started to SmallRye Reactive Messaging with RabbitMQ :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] This guide demonstrates how your Quarkus application can utilize SmallRye Reactive Messaging to interact with RabbitMQ. diff --git a/docs/src/main/asciidoc/reactive-event-bus.adoc b/docs/src/main/asciidoc/reactive-event-bus.adoc index 3b8f5f9101539..7c2da2420748a 100644 --- a/docs/src/main/asciidoc/reactive-event-bus.adoc +++ b/docs/src/main/asciidoc/reactive-event-bus.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the event bus - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: messaging +:summary: This guide explains how different beans can interact using the event bus. Quarkus allows different beans to interact using asynchronous events, thus promoting loose-coupling. The messages are sent to _virtual addresses_. diff --git a/docs/src/main/asciidoc/reactive-routes.adoc b/docs/src/main/asciidoc/reactive-routes.adoc index c0aea6fe5d580..04a39e0a3856a 100644 --- a/docs/src/main/asciidoc/reactive-routes.adoc +++ b/docs/src/main/asciidoc/reactive-routes.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Reactive Routes - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide demonstrates how to use reactive routes. Reactive routes propose an alternative approach to implement HTTP endpoints where you declare and chain _routes_. This approach became very popular in the JavaScript world, with frameworks like Express.Js or Hapi. diff --git a/docs/src/main/asciidoc/reactive-sql-clients.adoc b/docs/src/main/asciidoc/reactive-sql-clients.adoc index 13d422e44c050..92583127f3f65 100644 --- a/docs/src/main/asciidoc/reactive-sql-clients.adoc +++ b/docs/src/main/asciidoc/reactive-sql-clients.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Reactive SQL Clients - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use the Reactive SQL Clients in Quarkus. :config-file: application.properties The Reactive SQL Clients have a straightforward API focusing on scalability and low-overhead. diff --git a/docs/src/main/asciidoc/reaugmentation.adoc b/docs/src/main/asciidoc/reaugmentation.adoc index 000b9fdb824c5..d95d0bee6b687 100644 --- a/docs/src/main/asciidoc/reaugmentation.adoc +++ b/docs/src/main/asciidoc/reaugmentation.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Re-augment a Quarkus Application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: tooling +:summary: Use mutable jars to rebuild your application with different build time configurations. == What is augmentation? diff --git a/docs/src/main/asciidoc/redis-dev-services.adoc b/docs/src/main/asciidoc/redis-dev-services.adoc index 18022f226a980..802dca7253276 100644 --- a/docs/src/main/asciidoc/redis-dev-services.adoc +++ b/docs/src/main/asciidoc/redis-dev-services.adoc @@ -4,9 +4,10 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services for Redis - :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Start Redis automatically in dev and test modes. Quarkus supports a feature called Dev Services that allows you to create various datasources without any config. What that means practically, is that if you have docker running and have not configured `quarkus.redis.hosts`, diff --git a/docs/src/main/asciidoc/redis-reference.adoc b/docs/src/main/asciidoc/redis-reference.adoc index 5976003d40733..111c80a336edd 100644 --- a/docs/src/main/asciidoc/redis-reference.adoc +++ b/docs/src/main/asciidoc/redis-reference.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Redis Extension Reference Guide :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] :numbered: :sectnums: @@ -299,7 +299,7 @@ public class MyRedisService { } public Person get(String field) { - commands.hget(MY_KEY, field); // <4> + return commands.hget(MY_KEY, field); // <4> } } ---- diff --git a/docs/src/main/asciidoc/redis.adoc b/docs/src/main/asciidoc/redis.adoc index 57a2e59c3372f..1916e4cc31d83 100644 --- a/docs/src/main/asciidoc/redis.adoc +++ b/docs/src/main/asciidoc/redis.adoc @@ -5,7 +5,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the Redis Client :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guide covers how to use a Redis datastore in Quarkus. This guide demonstrates how your Quarkus application can connect to a Redis server using the Redis Client extension. diff --git a/docs/src/main/asciidoc/rest-client-multipart.adoc b/docs/src/main/asciidoc/rest-client-multipart.adoc index db71e5e017b7e..bd13bb7bc0698 100644 --- a/docs/src/main/asciidoc/rest-client-multipart.adoc +++ b/docs/src/main/asciidoc/rest-client-multipart.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the REST Client with Multipart - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to use the RESTEasy REST Client to send multipart REST requests, typically to upload documents. [WARNING] ==== diff --git a/docs/src/main/asciidoc/rest-client-reactive.adoc b/docs/src/main/asciidoc/rest-client-reactive.adoc index 8a0643ed9bb25..ecd65dcc1ca52 100644 --- a/docs/src/main/asciidoc/rest-client-reactive.adoc +++ b/docs/src/main/asciidoc/rest-client-reactive.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the REST Client Reactive - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to use the RESTEasy Reactive REST Client. This guide explains how to use the REST Client Reactive in order to interact with REST APIs. REST Client Reactive is the REST Client implementation compatible with RESTEasy Reactive. diff --git a/docs/src/main/asciidoc/rest-client.adoc b/docs/src/main/asciidoc/rest-client.adoc index 9326bd4746804..4e51d0674663a 100644 --- a/docs/src/main/asciidoc/rest-client.adoc +++ b/docs/src/main/asciidoc/rest-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using the REST Client - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to use the RESTEasy REST Client in order to interact with REST APIs (JSON and other) with very little effort. [WARNING] ==== diff --git a/docs/src/main/asciidoc/rest-data-panache.adoc b/docs/src/main/asciidoc/rest-data-panache.adoc index dbb39fc014365..2f10580f48693 100644 --- a/docs/src/main/asciidoc/rest-data-panache.adoc +++ b/docs/src/main/asciidoc/rest-data-panache.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Generating JAX-RS resources with Panache - -include::./attributes.adoc[] -:extension-status: experimental +include::_attributes.adoc[] +:categories: web +:summary: Hibernate ORM REST Data with Panache simplifies the creation of CRUD applications based on JAX-RS and Hibernate ORM. A lot of web applications are monotonous CRUD applications with REST APIs that are tedious to write. To streamline this task, REST Data with Panache extension can generate the basic CRUD endpoints for your entities and repositories. @@ -14,8 +14,6 @@ To streamline this task, REST Data with Panache extension can generate the basic While this extension is still experimental and provides a limited feature set, we hope to get an early feedback for it. Currently, this extension supports Hibernate ORM and MongoDB with Panache and can generate CRUD resources that work with `application/json` and `application/hal+json` content. -include::{includes}/extension-status.adoc[] - == Setting up REST Data with Panache Quarkus provides the following extensions to set up REST Data with Panache. Please, check out the next compatibility table to use the right one according to the technology you're using: diff --git a/docs/src/main/asciidoc/rest-json.adoc b/docs/src/main/asciidoc/rest-json.adoc index b9de4c432d490..1fce2982196c6 100644 --- a/docs/src/main/asciidoc/rest-json.adoc +++ b/docs/src/main/asciidoc/rest-json.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Writing JSON REST Services - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web, serialization +:summary: JSON is now the lingua franca between microservices. In this guide, we see how you can get your REST services to consume and produce JSON payloads. JSON is now the _lingua franca_ between microservices. diff --git a/docs/src/main/asciidoc/resteasy-reactive-migration.adoc b/docs/src/main/asciidoc/resteasy-reactive-migration.adoc index 74e7778bd7935..f4e6674e015a9 100644 --- a/docs/src/main/asciidoc/resteasy-reactive-migration.adoc +++ b/docs/src/main/asciidoc/resteasy-reactive-migration.adoc @@ -4,6 +4,7 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Migrating to RESTEasy Reactive +include::_attributes.adoc[] Migrating from RESTEasy Classic to RESTEasy Reactive is straightforward in most cases, however there are a few cases that require some attention. This document provides a list of issues users attempting the migration should be aware of. diff --git a/docs/src/main/asciidoc/resteasy-reactive.adoc b/docs/src/main/asciidoc/resteasy-reactive.adoc index 963d5b5af9209..2280368ece3a6 100644 --- a/docs/src/main/asciidoc/resteasy-reactive.adoc +++ b/docs/src/main/asciidoc/resteasy-reactive.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Writing REST Services with RESTEasy Reactive - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: Discover how to develop highly scalable reactive REST services with JAX-RS and RESTEasy Reactive. :jaxrsapi: https://javadoc.io/doc/javax.ws.rs/javax.ws.rs-api/2.1.1 :jaxrsspec: /specs/jaxrs/2.1/index.html :jdkapi: https://docs.oracle.com/en/java/javase/11/docs/api/java.base diff --git a/docs/src/main/asciidoc/resteasy.adoc b/docs/src/main/asciidoc/resteasy.adoc index 361293e81b8f6..9e6a936527aa0 100644 --- a/docs/src/main/asciidoc/resteasy.adoc +++ b/docs/src/main/asciidoc/resteasy.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = RESTEasy Classic -include::./attributes.adoc[] +include::_attributes.adoc[] [WARNING] ==== diff --git a/docs/src/main/asciidoc/scheduler-reference.adoc b/docs/src/main/asciidoc/scheduler-reference.adoc index e70bfe2cc2a12..79ea30780ee81 100644 --- a/docs/src/main/asciidoc/scheduler-reference.adoc +++ b/docs/src/main/asciidoc/scheduler-reference.adoc @@ -4,9 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Scheduler Reference Guide - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: miscellaneous +:summary: Learn more about the Scheduler extension. :numbered: :sectnums: :sectnumlevels: 4 diff --git a/docs/src/main/asciidoc/scheduler.adoc b/docs/src/main/asciidoc/scheduler.adoc index 41e4cdd4341ff..bf9cb8b4526eb 100644 --- a/docs/src/main/asciidoc/scheduler.adoc +++ b/docs/src/main/asciidoc/scheduler.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Scheduling Periodic Tasks - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: Modern applications often need to run specific tasks periodically. In this guide, you learn how to schedule periodic tasks. Modern applications often need to run specific tasks periodically. In this guide, you learn how to schedule periodic tasks. diff --git a/docs/src/main/asciidoc/scripting.adoc b/docs/src/main/asciidoc/scripting.adoc index 4515e1ec34de1..923157b4cb038 100644 --- a/docs/src/main/asciidoc/scripting.adoc +++ b/docs/src/main/asciidoc/scripting.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Scripting with Quarkus -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: command-line +:summary: Easy Quarkus-based scripting with jbang. :extension-status: preview Quarkus provides integration with https://jbang.dev[jbang] which allows you to write Java scripts/applications requiring no Maven nor Gradle to get running. diff --git a/docs/src/main/asciidoc/security-authorization.adoc b/docs/src/main/asciidoc/security-authorization.adoc index 9a8c980cdda7d..0d91d3b6902ab 100644 --- a/docs/src/main/asciidoc/security-authorization.adoc +++ b/docs/src/main/asciidoc/security-authorization.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Authorization of Web Endpoints -include::./attributes.adoc[] +include::_attributes.adoc[] Quarkus has an integrated pluggable web security layer. If security is enabled all HTTP requests will have a permission check performed to make sure they are allowed to continue. diff --git a/docs/src/main/asciidoc/security-basic-auth-concept.adoc b/docs/src/main/asciidoc/security-basic-auth-concept.adoc index a7ce5c9c2993d..940a415b62d0e 100644 --- a/docs/src/main/asciidoc/security-basic-auth-concept.adoc +++ b/docs/src/main/asciidoc/security-basic-auth-concept.adoc @@ -1,5 +1,6 @@ [id="security-basic-auth-concept"] = Basic Authentication +include::_attributes.adoc[] HTTP Basic Authentication is one of the least resource-demanding techniques that enforce access controls to the Web resources. It uses fields in the HTTP header and does not require HTTP cookies, session identifiers, or login pages. diff --git a/docs/src/main/asciidoc/security-built-in-authentication.adoc b/docs/src/main/asciidoc/security-built-in-authentication.adoc index ef311c393d366..ab606a8e0334f 100644 --- a/docs/src/main/asciidoc/security-built-in-authentication.adoc +++ b/docs/src/main/asciidoc/security-built-in-authentication.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Built-In Authentication Support -include::./attributes.adoc[] +include::_attributes.adoc[] The following section describes the Quarkus built-in authentication mechanisms for HTTP based FORM, BASIC, and Mutual TLS authentication. Proactive authentication is also described. diff --git a/docs/src/main/asciidoc/security-csrf-prevention.adoc b/docs/src/main/asciidoc/security-csrf-prevention.adoc index e877219bf1b54..bd08be5ce3d7c 100644 --- a/docs/src/main/asciidoc/security-csrf-prevention.adoc +++ b/docs/src/main/asciidoc/security-csrf-prevention.adoc @@ -5,11 +5,11 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Cross-Site Request Forgery Prevention -include::./attributes.adoc[] +include::_attributes.adoc[] https://owasp.org/www-community/attacks/csrf[Cross-Site Request Forgery (CSRF)] is an attack that forces an end user to execute unwanted actions on a web application in which they are currently authenticated. -Quarkus Security provides a CSRF prevention feature which consists of a xref:resteasy-reactive.adoc[RESTEasy Reactive] server filter which creates and verifies CSRF tokens and an HTML form parameter provider which supports the xref:qute-reference.adoc#injecting-beans-directly-in-templates[injection of CSRF tokens in Qute templates]. +Quarkus Security provides a CSRF prevention feature which consists of a xref:resteasy-reactive.adoc[RESTEasy Reactive] server filter which creates and verifies CSRF tokens in 'application/x-www-form-urlencoded' and 'multipart/form-data' forms and a Qute HTML form parameter provider which supports the xref:qute-reference.adoc#injecting-beans-directly-in-templates[injection of CSRF tokens in Qute templates]. == Creating the Project @@ -123,7 +123,7 @@ quarkus.csrf-reactive.form-field-name=csrftoken quarkus.csrf-reactive.cookie-name=csrftoken ---- -Note that the CSRF filter has to read the input stream in order to verify the token and then re-create the stream for the application code to read it as well. The filter performs this work on an event loop thread so for small form payloads, such as the one shown in the example above, it will have negligible performance side-effects. However if you deal with large form payloads then it is recommended to compare the CSRF form field and cookie values in the application code: +Note that the CSRF filter has to read and cache the input stream in order to verify the token. However if you prefer you can compare the CSRF form field and cookie values in the application code: [source,java] ---- diff --git a/docs/src/main/asciidoc/security-customization.adoc b/docs/src/main/asciidoc/security-customization.adoc index 456090e604ee2..ef21c09d80b6f 100644 --- a/docs/src/main/asciidoc/security-customization.adoc +++ b/docs/src/main/asciidoc/security-customization.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Security Tips and Tricks -include::./attributes.adoc[] +include::_attributes.adoc[] == Quarkus Security Dependency diff --git a/docs/src/main/asciidoc/security-enabling-basic-auth-howto.adoc b/docs/src/main/asciidoc/security-enabling-basic-auth-howto.adoc index 5d0e200cd0b29..10dbc74fb50b4 100644 --- a/docs/src/main/asciidoc/security-enabling-basic-auth-howto.adoc +++ b/docs/src/main/asciidoc/security-enabling-basic-auth-howto.adoc @@ -1,5 +1,6 @@ [id="security-enabling-basic-auth-howto"] = Enable HTTP Basic authentication +include::_attributes.adoc[] Enable the HTTP Basic authentication for your Quarkus project and allow users to authenticate with a username and password. diff --git a/docs/src/main/asciidoc/security-enabling-basic-auth-tutorial.adoc b/docs/src/main/asciidoc/security-enabling-basic-auth-tutorial.adoc index 8429f0a645400..93f86bc2fe192 100644 --- a/docs/src/main/asciidoc/security-enabling-basic-auth-tutorial.adoc +++ b/docs/src/main/asciidoc/security-enabling-basic-auth-tutorial.adoc @@ -1,5 +1,6 @@ [id="security-enabling-basic-auth-tutorial"] = Enable Basic Authentication +include::_attributes.adoc[] Enable the Basic Authentication for your Quarkus project and allow users to authenticate with a username and password. diff --git a/docs/src/main/asciidoc/security-getting-started.adoc b/docs/src/main/asciidoc/security-getting-started.adoc index 14488c1bd9d0e..cd80c68c78a65 100644 --- a/docs/src/main/asciidoc/security-getting-started.adoc +++ b/docs/src/main/asciidoc/security-getting-started.adoc @@ -4,7 +4,7 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Secure a Quarkus application with Basic authentication -include::./attributes.adoc[] +include::_attributes.adoc[] Secure your Quarkus application endpoints by combining xref:security-built-in-authentication.adoc#basic-auth[Quarkus built-in basic HTTP authentication] with the JPA identity provider to enable role-based access control (RBAC). The JPA `IdentityProvider` creates a `SecurityIdentity` instance, which is used during user authentication to verify and authorize access requests making your Quarkus application secure. diff --git a/docs/src/main/asciidoc/security-jdbc.adoc b/docs/src/main/asciidoc/security-jdbc.adoc index a7948980548bf..25091a1a6ab7e 100644 --- a/docs/src/main/asciidoc/security-jdbc.adoc +++ b/docs/src/main/asciidoc/security-jdbc.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Security with JDBC - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your Quarkus application can use a database to store your user identities. This guide demonstrates how your Quarkus application can use a database to store your user identities. diff --git a/docs/src/main/asciidoc/security-jwt-build.adoc b/docs/src/main/asciidoc/security-jwt-build.adoc index ca9519d58fc58..dd4133e357026 100644 --- a/docs/src/main/asciidoc/security-jwt-build.adoc +++ b/docs/src/main/asciidoc/security-jwt-build.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Build, Sign and Encrypt JSON Web Tokens -include::./attributes.adoc[] +include::_attributes.adoc[] :toc: According to link:https://datatracker.ietf.org/doc/html/rfc7519[RFC7519], JSON Web Token (JWT) is a compact, URL-safe means of representing claims which are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code(MAC) and/or encrypted. diff --git a/docs/src/main/asciidoc/security-jwt.adoc b/docs/src/main/asciidoc/security-jwt.adoc index a0ee26cfbc182..a1b3d88efadeb 100644 --- a/docs/src/main/asciidoc/security-jwt.adoc +++ b/docs/src/main/asciidoc/security-jwt.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using JWT RBAC - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide explains how your application can utilize SmallRye JWT to provide secured access to the JAX-RS endpoints. :extension-name: SmallRye JWT :mp-jwt: MicroProfile JWT RBAC diff --git a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc index 09e5b20afb637..9557e239f8c7f 100644 --- a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc +++ b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Keycloak Admin Client -include::./attributes.adoc[] +include::_attributes.adoc[] The Quarkus Keycloak Admin Client and its reactive twin support Keycloak Admin Client which can be used to configure a running Keycloak server. diff --git a/docs/src/main/asciidoc/security-keycloak-authorization.adoc b/docs/src/main/asciidoc/security-keycloak-authorization.adoc index 0a28250b5deba..09d9aae5261a0 100644 --- a/docs/src/main/asciidoc/security-keycloak-authorization.adoc +++ b/docs/src/main/asciidoc/security-keycloak-authorization.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenID Connect (OIDC) and Keycloak to Centralize Authorization - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your Quarkus application can authorize access to protected resources using Keycloak Authorization Services. This guide demonstrates how your Quarkus application can authorize a bearer token access to protected resources using https://www.keycloak.org/docs/latest/authorization_services/index.html[Keycloak Authorization Services]. diff --git a/docs/src/main/asciidoc/security-ldap.adoc b/docs/src/main/asciidoc/security-ldap.adoc index 782620301fd0f..396c9ed44eba1 100644 --- a/docs/src/main/asciidoc/security-ldap.adoc +++ b/docs/src/main/asciidoc/security-ldap.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Security with an LDAP Realm - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your Quarkus application can use a LDAP directory to store your user identities. This guide demonstrates how your Quarkus application can use an LDAP server to authenticate and authorize your user identities. diff --git a/docs/src/main/asciidoc/security-oauth2.adoc b/docs/src/main/asciidoc/security-oauth2.adoc index db081834aa639..66fc2264ac2ce 100644 --- a/docs/src/main/asciidoc/security-oauth2.adoc +++ b/docs/src/main/asciidoc/security-oauth2.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OAuth2 RBAC - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide explains how your Quarkus application can utilize OAuth2 tokens to provide secured access to the JAX-RS endpoints. :extension-name: Elytron Security OAuth2 This guide explains how your Quarkus application can utilize OAuth2 tokens to provide secured access to the JAX-RS endpoints. diff --git a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc index a0b831a5fc234..c8b4e5d3ab4d0 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = OpenID Connect (OIDC) and OAuth2 Client and Filters Reference Guide -include::./attributes.adoc[] +include::_attributes.adoc[] :toc: This reference guide explains how to use: diff --git a/docs/src/main/asciidoc/security-openid-connect-client.adoc b/docs/src/main/asciidoc/security-openid-connect-client.adoc index 238d75d9ae6aa..18b369379282e 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = OpenID Connect Client and Token Propagation Quickstart - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide explains how to use OpenID Connect and OAuth2 Client and Filters to acquire, refresh and propagate access tokens. :toc: This quickstart demonstrates how to use `OpenID Connect Client Reactive Filter` to acquire and propagate access tokens as `HTTP Authorization Bearer` access tokens, alongside `OpenID Token Propagation Reactive Filter` which propagates the incoming `HTTP Authorization Bearer` access tokens. diff --git a/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc b/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc index 65051f176f6f1..324f1c126e3e6 100644 --- a/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-dev-services.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Dev Services and UI for OpenID Connect (OIDC) - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: Start Keycloak or other providers automatically in dev and test modes. This guide covers the Dev Services and UI for OpenID Connect (OIDC) Keycloak provider and explains how to support Dev Services and UI for other OpenID Connect providers. It also describes Dev UI for all OpenID Connect providers which have already been started before Quarkus is launched in a dev mode. diff --git a/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc b/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc index ff217bd31ba4b..1b99ad1d22eec 100644 --- a/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-multitenancy.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenID Connect (OIDC) Multi-Tenancy - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your OpenID Connect application can support multi-tenancy so that you can serve multiple tenants from a single application. :toc: This guide demonstrates how your OpenID Connect (OIDC) application can support multi-tenancy so that you can serve multiple tenants from a single application. Tenants can be distinct realms or security domains within the same OpenID Provider or even distinct OpenID Providers. diff --git a/docs/src/main/asciidoc/security-openid-connect-providers.adoc b/docs/src/main/asciidoc/security-openid-connect-providers.adoc index 047069e08920a..b6bf7fd57c3df 100644 --- a/docs/src/main/asciidoc/security-openid-connect-providers.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-providers.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Configuring Well-Known OpenID Connect Providers -include::./attributes.adoc[] +include::_attributes.adoc[] == Introduction diff --git a/docs/src/main/asciidoc/security-openid-connect-web-authentication.adoc b/docs/src/main/asciidoc/security-openid-connect-web-authentication.adoc index c15474e51f1ab..cc1436778512f 100644 --- a/docs/src/main/asciidoc/security-openid-connect-web-authentication.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-web-authentication.adoc @@ -4,7 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = OpenID Connect (OIDC) authorization code flow mechanism -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how to use the OpenID Connect Extension to protect your web application based on the Authorization Code Flow using Quarkus. :toc: The Quarkus OpenID Connect (OIDC) extension can protect application HTTP endpoints by using the OIDC Authorization Code Flow mechanism supported by OIDC-compliant authorization servers, such as https://www.keycloak.org[Keycloak]. diff --git a/docs/src/main/asciidoc/security-openid-connect.adoc b/docs/src/main/asciidoc/security-openid-connect.adoc index af0f39765b706..f9010e99c9852 100644 --- a/docs/src/main/asciidoc/security-openid-connect.adoc +++ b/docs/src/main/asciidoc/security-openid-connect.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using OpenID Connect (OIDC) to Protect Service Applications using Bearer Token Authorization - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your Quarkus application can use Keycloak to protect your JAX-RS applications using bearer token authorization, where these tokens are issued by a Keycloak server. :toc: You can use the Quarkus OpenID Connect (OIDC) extension to secure your JAX-RS applications using Bearer Token Authorization. diff --git a/docs/src/main/asciidoc/security-properties.adoc b/docs/src/main/asciidoc/security-properties.adoc index 8c0418027ae83..cf210935297be 100644 --- a/docs/src/main/asciidoc/security-properties.adoc +++ b/docs/src/main/asciidoc/security-properties.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Security with .properties File - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide demonstrates how your Quarkus application can use a .properties file to store your user identities. Quarkus provides support for properties file based authentication that is intended for development and testing purposes. It is not recommended that this be used in production as at present only diff --git a/docs/src/main/asciidoc/security-testing.adoc b/docs/src/main/asciidoc/security-testing.adoc index 35d59a157206c..18c9d44a5daef 100644 --- a/docs/src/main/asciidoc/security-testing.adoc +++ b/docs/src/main/asciidoc/security-testing.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Security Testing -include::./attributes.adoc[] +include::_attributes.adoc[] This document describes how to test Quarkus Security. diff --git a/docs/src/main/asciidoc/security-webauthn.adoc b/docs/src/main/asciidoc/security-webauthn.adoc index 5459432e98daf..b73edbc98da56 100644 --- a/docs/src/main/asciidoc/security-webauthn.adoc +++ b/docs/src/main/asciidoc/security-webauthn.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Using Security with WebAuthn :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] This guide demonstrates how your Quarkus application can use WebAuthn authentication instead of passwords. diff --git a/docs/src/main/asciidoc/security.adoc b/docs/src/main/asciidoc/security.adoc index 89ddb68c619e8..76f91057c4b9f 100644 --- a/docs/src/main/asciidoc/security.adoc +++ b/docs/src/main/asciidoc/security.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Security overview - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: security +:summary: This guide is the entry point for everything security in Quarkus. Quarkus Security is a framework that provides the architecture, multiple authentication and authorization mechanisms, and other tools for you to build secure and production-quality Java applications. diff --git a/docs/src/main/asciidoc/smallrye-fault-tolerance.adoc b/docs/src/main/asciidoc/smallrye-fault-tolerance.adoc index 8e99e2aa0ad14..89ac22f169bd5 100644 --- a/docs/src/main/asciidoc/smallrye-fault-tolerance.adoc +++ b/docs/src/main/asciidoc/smallrye-fault-tolerance.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = SmallRye Fault Tolerance - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web, observability +:summary: This guide demonstrates how your Quarkus application can utilize the SmallRye Fault Tolerance specification through the SmallRye Fault Tolerance extension. One of the challenges brought by the distributed nature of microservices is that communication with external systems is inherently unreliable. This increases demand on resiliency of applications. To simplify making more resilient diff --git a/docs/src/main/asciidoc/smallrye-graphql-client.adoc b/docs/src/main/asciidoc/smallrye-graphql-client.adoc index 2ce95bed0d273..6bafc2ea51b8f 100644 --- a/docs/src/main/asciidoc/smallrye-graphql-client.adoc +++ b/docs/src/main/asciidoc/smallrye-graphql-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = SmallRye GraphQL Client - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to leverage SmallRye GraphQL Client to consume GraphQL services. This guide demonstrates how your Quarkus application can use the GraphQL client library. The client is implemented by the https://github.com/smallrye/smallrye-graphql/[SmallRye GraphQL] project. diff --git a/docs/src/main/asciidoc/smallrye-graphql.adoc b/docs/src/main/asciidoc/smallrye-graphql.adoc index 832deb1dfbae2..729362c1e7d92 100644 --- a/docs/src/main/asciidoc/smallrye-graphql.adoc +++ b/docs/src/main/asciidoc/smallrye-graphql.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = SmallRye GraphQL - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how to leverage SmallRye GraphQL to implement GraphQL services. This guide demonstrates how your Quarkus application can use https://github.com/smallrye/smallrye-graphql/[SmallRye GraphQL], an implementation of the https://github.com/eclipse/microprofile-graphql/[MicroProfile GraphQL] specification. diff --git a/docs/src/main/asciidoc/smallrye-health.adoc b/docs/src/main/asciidoc/smallrye-health.adoc index 46d843dd79539..3c85c82dd6067 100644 --- a/docs/src/main/asciidoc/smallrye-health.adoc +++ b/docs/src/main/asciidoc/smallrye-health.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = SmallRye Health - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide demonstrates how your Quarkus application can utilize the SmallRye Health extension. This guide demonstrates how your Quarkus application can use https://github.com/smallrye/smallrye-health/[SmallRye Health] an implementation of the https://github.com/eclipse/microprofile-health/[MicroProfile Health] specification. diff --git a/docs/src/main/asciidoc/smallrye-metrics.adoc b/docs/src/main/asciidoc/smallrye-metrics.adoc index 9324e141fb783..442c69bf7b9c5 100644 --- a/docs/src/main/asciidoc/smallrye-metrics.adoc +++ b/docs/src/main/asciidoc/smallrye-metrics.adoc @@ -6,8 +6,9 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = SmallRye Metrics :extension-status: deprecated - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: observability +:summary: This guide demonstrates how your Quarkus application can utilize the SmallRye Metrics extension. The following guide demonstrates how a Quarkus application can use link:https://github.com/smallrye/smallrye-metrics/[SmallRye Metrics], an implementation of the link:https://github.com/eclipse/microprofile-metrics/[MicroProfile Metrics] specification. diff --git a/docs/src/main/asciidoc/software-transactional-memory.adoc b/docs/src/main/asciidoc/software-transactional-memory.adoc index cf4183514ceef..76da5aee902db 100644 --- a/docs/src/main/asciidoc/software-transactional-memory.adoc +++ b/docs/src/main/asciidoc/software-transactional-memory.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Software Transactional Memory in Quarkus - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: This guides covers the usage of Software Transactional Memory (STM). :extension-status: preview Software Transactional Memory (STM) has been around in research environments since the late diff --git a/docs/src/main/asciidoc/spring-boot-properties.adoc b/docs/src/main/asciidoc/spring-boot-properties.adoc index 6a7fbc0ab138b..a16883b97dde1 100644 --- a/docs/src/main/asciidoc/spring-boot-properties.adoc +++ b/docs/src/main/asciidoc/spring-boot-properties.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Accessing application properties with Spring Boot properties API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: Use Spring Boot's `@ConfigurationProperties` in place of MicroProfile Config annotations If you prefer to use Spring Boot `@ConfigurationProperties` annotated class to access application properties instead of a Quarkus native `@ConfigProperties` or a MicroProfile `@ConfigProperty` approach, you can do that with this extension. diff --git a/docs/src/main/asciidoc/spring-cache.adoc b/docs/src/main/asciidoc/spring-cache.adoc index 149220db0cb7d..05e7de56ae5c9 100644 --- a/docs/src/main/asciidoc/spring-cache.adoc +++ b/docs/src/main/asciidoc/spring-cache.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension for Spring Cache API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use the Cache extension for your application-level caching, Quarkus provides a compatibility layer for Spring Cache in the form of the spring-cache extension. While users are encouraged to use xref:cache.adoc[Quarkus annotations for caching], Quarkus nevertheless provides a compatibility layer for Spring Cache annotations in the form of the `spring-cache` extension. diff --git a/docs/src/main/asciidoc/spring-cloud-config-client.adoc b/docs/src/main/asciidoc/spring-cloud-config-client.adoc index bfc186dc9f906..12978d647ccec 100644 --- a/docs/src/main/asciidoc/spring-cloud-config-client.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config-client.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Reading properties from Spring Cloud Config Server - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: Quarkus provides a compatibility layer for Spring Cloud Config in the form of the spring-cloud-config-client extension. This guide explains how your Quarkus application can read configuration properties at runtime from the https://cloud.spring.io/spring-cloud-config[Spring Cloud Config Server]. diff --git a/docs/src/main/asciidoc/spring-data-jpa.adoc b/docs/src/main/asciidoc/spring-data-jpa.adoc index 9f9bd5728fbbf..66350c5c6578a 100644 --- a/docs/src/main/asciidoc/spring-data-jpa.adoc +++ b/docs/src/main/asciidoc/spring-data-jpa.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Extension for Spring Data API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use Hibernate ORM with Panache for your data layer, Quarkus provides a compatibility layer for Spring Data JPA in the form of the spring-data-jpa extension. While users are encouraged to use Hibernate ORM with Panache for Relational Database access, Quarkus provides a compatibility layer for Spring Data JPA repositories in the form of the `spring-data-jpa` extension. diff --git a/docs/src/main/asciidoc/spring-data-rest.adoc b/docs/src/main/asciidoc/spring-data-rest.adoc index cf304afd015a9..efabca09ab41c 100644 --- a/docs/src/main/asciidoc/spring-data-rest.adoc +++ b/docs/src/main/asciidoc/spring-data-rest.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Extension for Spring Data REST - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: Spring Data REST simplifies the creation of CRUD applications based on our Spring Data compatibility layer. :extension-status: preview While users are encouraged to use REST Data with Panache for the REST data access endpoints generation, diff --git a/docs/src/main/asciidoc/spring-di.adoc b/docs/src/main/asciidoc/spring-di.adoc index bfccce294f93d..1b2100e4aaab0 100644 --- a/docs/src/main/asciidoc/spring-di.adoc +++ b/docs/src/main/asciidoc/spring-di.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension for Spring DI API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use CDI annotations for injection, Quarkus provides a compatibility layer for Spring dependency injection in the form of the spring-di extension. While users are encouraged to use CDI annotations for injection, Quarkus provides a compatibility layer for Spring dependency injection in the form of the `spring-di` extension. diff --git a/docs/src/main/asciidoc/spring-scheduled.adoc b/docs/src/main/asciidoc/spring-scheduled.adoc index 033a2f7df40d8..e96aaf3123c4c 100644 --- a/docs/src/main/asciidoc/spring-scheduled.adoc +++ b/docs/src/main/asciidoc/spring-scheduled.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension for Spring Scheduling API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use the Scheduler or Quartz extensions to schedule tasks, Quarkus provides a compatibility layer for Spring Scheduled in the form of the spring-scheduled extension. While users are encouraged to use xref:scheduler.adoc#standard-scheduling[regular Quarkus scheduler], Quarkus provides a compatibility layer for Spring Scheduled in the form of the `spring-scheduled` extension. diff --git a/docs/src/main/asciidoc/spring-security.adoc b/docs/src/main/asciidoc/spring-security.adoc index 915d6530a9b15..4ecbc34b71066 100644 --- a/docs/src/main/asciidoc/spring-security.adoc +++ b/docs/src/main/asciidoc/spring-security.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension for Spring Security API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use the Quarkus security layer to secure your applications, Quarkus provides a compatibility layer for Spring Security in the form of the spring-security extension. While users are encouraged to use xref:security.adoc#standard-security-annotations[Java standard annotations for security authorizations], Quarkus provides a compatibility layer for Spring Security in the form of the `spring-security` extension. diff --git a/docs/src/main/asciidoc/spring-web.adoc b/docs/src/main/asciidoc/spring-web.adoc index 98d91559e84fc..ce6664f34b23a 100644 --- a/docs/src/main/asciidoc/spring-web.adoc +++ b/docs/src/main/asciidoc/spring-web.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Quarkus Extension for Spring Web API - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: compatibility +:summary: While you are encouraged to use JAX-RS annotations for defining REST endpoints, Quarkus provides a compatibility layer for Spring Web in the form of the spring-web extension. While users are encouraged to use JAX-RS annotation for defining REST endpoints, Quarkus provides a compatibility layer for Spring Web in the form of the `spring-web` extension. diff --git a/docs/src/main/asciidoc/stork-kubernetes.adoc b/docs/src/main/asciidoc/stork-kubernetes.adoc index 3308b363b6621..41a12b19cfdef 100644 --- a/docs/src/main/asciidoc/stork-kubernetes.adoc +++ b/docs/src/main/asciidoc/stork-kubernetes.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Using Stork with Kubernetes :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] This guide explains how to use Stork with Kubernetes for service discovery and load balancing. diff --git a/docs/src/main/asciidoc/stork-reference.adoc b/docs/src/main/asciidoc/stork-reference.adoc index 07f8f45f461a5..77a143ffd7288 100644 --- a/docs/src/main/asciidoc/stork-reference.adoc +++ b/docs/src/main/asciidoc/stork-reference.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Stork Reference Guide :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] This guide is the companion from the xref:stork.adoc[Stork Getting Started Guide]. It explains the configuration and usage of SmallRye Stork integration in Quarkus. diff --git a/docs/src/main/asciidoc/stork.adoc b/docs/src/main/asciidoc/stork.adoc index 9c5203af9fb1f..63cfbe7bf924e 100644 --- a/docs/src/main/asciidoc/stork.adoc +++ b/docs/src/main/asciidoc/stork.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Getting Started with SmallRye Stork :extension-status: preview -include::./attributes.adoc[] +include::_attributes.adoc[] The essence of distributed systems resides in the interaction between services. In modern architecture, you often have multiple instances of your service to share the load or improve the resilience by redundancy. diff --git a/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc b/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc index 8bac57346ef3e..57cc8b870a00e 100644 --- a/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc +++ b/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// [id="tutorial-micrometer"] = Collect metrics using Micrometer -include::./attributes.adoc[] +include::_attributes.adoc[] Create an application that uses the Micrometer metrics library to collect runtime, extension and application metrics and expose them as a Prometheus (OpenMetrics) endpoint. diff --git a/docs/src/main/asciidoc/tests-with-coverage.adoc b/docs/src/main/asciidoc/tests-with-coverage.adoc index 915ebb29606b0..d395f17a4522d 100644 --- a/docs/src/main/asciidoc/tests-with-coverage.adoc +++ b/docs/src/main/asciidoc/tests-with-coverage.adoc @@ -5,9 +5,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Measuring the coverage of your tests - -include::./attributes.adoc[] - +include::_attributes.adoc[] +:categories: tooling +:summary: This guide explains how to measure the test coverage of your Quarkus application. :toc: macro :toclevels: 4 :doctype: book diff --git a/docs/src/main/asciidoc/tooling.adoc b/docs/src/main/asciidoc/tooling.adoc index a5723afdb8929..7f6900e259f44 100644 --- a/docs/src/main/asciidoc/tooling.adoc +++ b/docs/src/main/asciidoc/tooling.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using our Tooling - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: getting-started +:summary: Explore the Quarkus developer toolchain which makes Quarkus development so fast and enjoyable. Quarkus comes with a toolchain enabling developers from live reload all the way down to deploying a Kubernetes application. In addition, there are plugins and extensions to all major IDEs. diff --git a/docs/src/main/asciidoc/transaction.adoc b/docs/src/main/asciidoc/transaction.adoc index 40628d9568bae..a86d9d1f03d9c 100644 --- a/docs/src/main/asciidoc/transaction.adoc +++ b/docs/src/main/asciidoc/transaction.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Transactions in Quarkus - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: data +:summary: Quarkus comes with a Transaction Manager and uses it to coordinate and expose transactions to your applications. Each extension dealing with persistence will integrate with it for you, and you will explicitly interact with transactions via CDI. This guide will walk you through all that. Quarkus comes with a Transaction Manager and uses it to coordinate and expose transactions to your applications. Each extension dealing with persistence will integrate with it for you. @@ -279,7 +280,7 @@ You cannot use `UserTransaction` in a method having a transaction started by a ` == Configuring the transaction timeout You can configure the default transaction timeout, the timeout that applies to all transactions managed by the transaction manager, via the property `quarkus.transaction-manager.default-transaction-timeout`, specified as a duration. -include::duration-format-note.adoc[] +include::{includes}/duration-format-note.adoc[] The default value is 60 seconds. diff --git a/docs/src/main/asciidoc/upx.adoc b/docs/src/main/asciidoc/upx.adoc index f46077dbcc54f..b973e0f6d959a 100644 --- a/docs/src/main/asciidoc/upx.adoc +++ b/docs/src/main/asciidoc/upx.adoc @@ -6,7 +6,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Compressing native executables using UPX -include::./attributes.adoc[] +include::_attributes.adoc[] https://upx.github.io/[Ultimate Packer for eXecutables (UPX)] is a compression tool reducing the size of executables. Quarkus can compress the produced native executable to reduce its size. diff --git a/docs/src/main/asciidoc/validation.adoc b/docs/src/main/asciidoc/validation.adoc index a9b27db888076..808b0e9ced178 100644 --- a/docs/src/main/asciidoc/validation.adoc +++ b/docs/src/main/asciidoc/validation.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Validation with Hibernate Validator - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web, data +:summary: This guide covers how to use Hibernate Validator/Bean Validation in your REST services. This guide covers how to use Hibernate Validator/Bean Validation for: diff --git a/docs/src/main/asciidoc/vertx-reference.adoc b/docs/src/main/asciidoc/vertx-reference.adoc index 337c5d266d65c..9f65e43ff7baf 100644 --- a/docs/src/main/asciidoc/vertx-reference.adoc +++ b/docs/src/main/asciidoc/vertx-reference.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Vert.x Reference Guide - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: This reference guide provides advanced details about the usage and the configuration of the Vert.x instance used by Quarkus. https://vertx.io[Vert.x] is a toolkit for building reactive applications. As described in the xref:quarkus-reactive-architecture.adoc[Quarkus Reactive Architecture], Quarkus uses Vert.x underneath. diff --git a/docs/src/main/asciidoc/vertx.adoc b/docs/src/main/asciidoc/vertx.adoc index f1804c09ee6c2..15a755f366e4b 100644 --- a/docs/src/main/asciidoc/vertx.adoc +++ b/docs/src/main/asciidoc/vertx.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using Eclipse Vert.x API from a Quarkus Application - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: miscellaneous +:summary: This guide explains how to use Vert.x in Quarkus to build reactive applications. https://vertx.io[Vert.x] is a toolkit for building reactive applications. As described in the xref:quarkus-reactive-architecture.adoc[Quarkus Reactive Architecture], Quarkus uses Vert.x underneath. diff --git a/docs/src/main/asciidoc/virtual-threads.adoc b/docs/src/main/asciidoc/virtual-threads.adoc index e55f24476308e..9e1197cd8e840 100644 --- a/docs/src/main/asciidoc/virtual-threads.adoc +++ b/docs/src/main/asciidoc/virtual-threads.adoc @@ -5,7 +5,7 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Writing simpler reactive REST services with Quarkus Virtual Thread support -include::./attributes.adoc[] +include::_attributes.adoc[] :resteasy-reactive-api: https://javadoc.io/doc/io.quarkus.resteasy.reactive/resteasy-reactive/{quarkus-version} :resteasy-reactive-common-api: https://javadoc.io/doc/io.quarkus.resteasy.reactive/resteasy-reactive-common/{quarkus-version} :runonvthread: https://javadoc.io/doc/io.smallrye.common/smallrye-common-annotation/latest/io/smallrye/common/annotation/RunOnVirtualThread.html diff --git a/docs/src/main/asciidoc/websockets.adoc b/docs/src/main/asciidoc/websockets.adoc index fdc7149acd516..9ac772c40a532 100644 --- a/docs/src/main/asciidoc/websockets.adoc +++ b/docs/src/main/asciidoc/websockets.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Using WebSockets - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: web +:summary: This guide explains how your Quarkus application can utilize web sockets to create interactive web applications. Because it’s the canonical web socket application, we are going to create a simple chat application. This guide explains how your Quarkus application can utilize web sockets to create interactive web applications. Because it's the _canonical_ web socket application, we are going to create a simple chat application. diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index 583f6a81c84c9..662198cdf24ae 100644 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -4,13 +4,14 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Writing Your Own Extension - +:categories: writing-extensions +:summary: Quarkus extensions optimize your applications by pushing as much work as possible to the build operation. This guide explains the rationale of Quarkus extensions and guides you through authoring your own extensions. :numbered: :sectnums: :sectnumlevels: 4 :toc: -include::./attributes.adoc[] +include::_attributes.adoc[] Quarkus extensions add a new developer focused behavior to the core offering, and consist of two distinct parts, buildtime augmentation and runtime container. The augmentation part is responsible for all metadata processing, such as reading annotations, XML descriptors etc. The output of this augmentation phase is recorded bytecode which is responsible for directly instantiating the relevant runtime services. diff --git a/docs/src/main/asciidoc/writing-native-applications-tips.adoc b/docs/src/main/asciidoc/writing-native-applications-tips.adoc index 6a083919f3465..997276d1cd413 100644 --- a/docs/src/main/asciidoc/writing-native-applications-tips.adoc +++ b/docs/src/main/asciidoc/writing-native-applications-tips.adoc @@ -4,8 +4,9 @@ and pull requests should be submitted there: https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc //// = Tips for writing native applications - -include::./attributes.adoc[] +include::_attributes.adoc[] +:categories: core, writing-extensions +:summary: This guide is a collection of tips to help you solve the problems you encounter when compiling applications to native executable. This guide contains various tips and tricks for getting around problems that might arise when attempting to run Java applications as native executables. diff --git a/docs/src/main/java/io/quarkus/docs/generation/YamlMetadataGenerator.java b/docs/src/main/java/io/quarkus/docs/generation/YamlMetadataGenerator.java index 9e772618de48c..feda17121bc1c 100644 --- a/docs/src/main/java/io/quarkus/docs/generation/YamlMetadataGenerator.java +++ b/docs/src/main/java/io/quarkus/docs/generation/YamlMetadataGenerator.java @@ -4,16 +4,20 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.TreeMap; import java.util.stream.Collectors; import java.util.stream.Stream; import org.asciidoctor.Asciidoctor; import org.asciidoctor.Options; +import org.asciidoctor.SafeMode; import org.asciidoctor.ast.Document; import org.asciidoctor.ast.StructuralNode; @@ -45,6 +49,67 @@ static Path docsDir() { return path.resolve("docs"); } + enum Category { + alt_languages("alt-languages", "Alternative languages"), + architecture("architecture", "Architecture"), + business_automation("business-automation", "Business Automation"), + cloud("cloud", "Cloud"), + command_line("command-line", "Command Line Applications"), + compatibility("compatibility", "Compatibility"), + contributing("contributing", "Contributing"), + core("core", "Core"), + data("data", "Data"), + getting_started("getting-started", "Getting Started"), + integration("integration", "Integration"), + messaging("messaging", "Messaging"), + miscellaneous("miscellaneous", "Miscellaneous"), + observability("observability", "Observability"), + reactive("reactive", "Reactive"), + security("security", "Security"), + serialization("serialization", "Serialization"), + tooling("tooling", "Tooling"), + web("web", "Web"), + writing_extensions("writing-extensions", "Writing Extensions"); + + final String id; + final String name; + + Category(String id, String name) { + this.id = id; + this.name = name; + } + + public static void addAll(Set set, Object source, Path path) { + if (source == null) { + return; + } + for (String c : source.toString().split("\\s*,\\s*")) { + try { + Category cat = Category.valueOf(c.toLowerCase().replace("-", "_")); + set.add(cat); + } catch (IllegalArgumentException ex) { + errors.record("unknown-category", path, "Unknown category: " + c); + } + } + } + } + + enum Type { + concepts("concepts", "Concepts"), + howto("howto", "How-To Guides"), + tutorial("tutorial", "Tutorial"), + reference("reference", "Reference"), + other("guide", "General Guides"); + + final String name; + final String id; + + Type(String id, String name) { + this.name = name; + this.id = id; + } + } + public static void main(String[] args) throws Exception { Path rootDir = args.length >= 1 ? Path.of(args[0]) @@ -61,7 +126,11 @@ public static void main(String[] args) throws Exception { return; } - Options options = Options.builder().build(); + Options options = Options.builder() + .docType("book") + .sourceDir(rootDir.toFile()) + .safe(SafeMode.UNSAFE) + .build(); Index index = new Index(); try (Asciidoctor asciidoctor = Asciidoctor.Factory.create()) { @@ -80,6 +149,7 @@ public static void main(String[] args) throws Exception { .filter(b -> "preamble".equals(b.getNodeName())) .findFirst(); + final String summaryString; if (preambleNode.isPresent()) { Optional content = preambleNode.get().getBlocks().stream() .filter(b -> "paragraph".equals(b.getContext())) @@ -87,35 +157,41 @@ public static void main(String[] args) throws Exception { .filter(s -> !s.contains("attributes.adoc")) .findFirst(); + summaryString = getSummary(summary, content); + if (content.isPresent()) { - index.add(new DocMetadata(title, path, getSummary(summary, content), categories, id)); + index.add(new DocMetadata(title, path, summaryString, categories, id)); } else { - System.err.format("%s (%s) does not have text in the preamble%n", path, title); errors.record("empty-preamble", path); - index.add(new DocMetadata(title, path, getSummary(summary, content), categories, id)); + index.add(new DocMetadata(title, path, summaryString, categories, id)); } } else { - System.err.format("[WARN] %s (%s) does not have a preamble%n", path, title); errors.record("missing-preamble", path); - index.add(new DocMetadata(title, path, getSummary(summary, Optional.empty()), categories, id)); + summaryString = getSummary(summary, Optional.empty()); + index.add(new DocMetadata(title, path, summaryString, categories, id)); + } + + long spaceCount = summaryString.chars().filter(c -> c == (int) ' ').count(); + if (spaceCount > 26) { + errors.record("summary-too-long", path); } }); } } ObjectMapper om = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)); - Map metadata = index.metadataByFile(); + Map> errorsByFile = errors.errorsByFile(metadata); + om.writeValue(targetDir.resolve("indexByType.yaml").toFile(), index); om.writeValue(targetDir.resolve("indexByFile.yaml").toFile(), metadata); - Map> errorsByFile = errors.errorsByFile(metadata); om.writeValue(targetDir.resolve("errorsByType.yaml").toFile(), errors); om.writeValue(targetDir.resolve("errorsByFile.yaml").toFile(), errorsByFile); } - static String getSummary(Object summary, Optional content) { - String result = (summary != null ? summary.toString() : content.orElse("")) + static String getSummary(Object summary, Optional preamble) { + String result = (summary != null ? summary.toString() : preamble.orElse("")) .trim() .replaceAll("\n", " ") // undo semantic line endings .replaceAll("\\s+", " ") // condense whitespace @@ -127,49 +203,47 @@ static String getSummary(Object summary, Optional content) { return result; } - enum Type { - concepts("Concepts", "concepts"), - howto("How-To Guides", "howto"), - getstarted("Getting Started", "getting-started"), - tutorial("Tutorial", "tutorial"), - reference("Reference", "reference"), - other("General Guides", "guide"); - - final String name; - final String id; + @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "errors") + static class Errors { + Map> errors = new HashMap<>(); + Map> messagesByFile = new HashMap<>(); - Type(String name, String id) { - this.name = name; - this.id = id; + void record(String errorKey, Path path) { + record(errorKey, path, null); } - } - @JsonTypeInfo(use = JsonTypeInfo.Id.NONE, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "errors") - static class Errors { - Map> errors = new HashMap<>(); + void record(String errorKey, Path path, String message) { + errors.computeIfAbsent(errorKey, k -> new HashSet<>()).add(path.getFileName().toString()); + if (message == null) { + message = getMessageforKey(errorKey); + } + messagesByFile.computeIfAbsent(path.toString(), k -> new ArrayList<>()).add(message); + } - public Map> getErrors() { - return errors; + private String getMessageforKey(String errorKey) { + switch (errorKey) { + case "empty-preamble": + return "Document preamble is empty."; + case "missing-preamble": + return "Document does not have a preamble."; + case "summary-too-long": + return "Document summary (either summary attribute or the preamble) is longer than 26 words."; + case "missing-id": + return "Document does not define an id."; + case "missing-categories": + return "Document does not specify associated categories"; + case "not-diataxis-type": + return "Document does not follow naming conventions (type not recognized)."; + } + return errorKey; } - void record(String key, Path path) { - errors.computeIfAbsent(key, k -> new ArrayList<>()).add(path.getFileName().toString()); + public Map> getErrors() { + return errors; } - Map> errorsByFile(Map metadata) { - Map> errorsByFile = errors.entrySet().stream() - .flatMap(e -> e.getValue().stream().map(v -> new String[] { v, e.getKey() })) - .collect(Collectors.groupingBy(s -> s[0], - TreeMap::new, - Collectors.mapping(s -> s[1], Collectors.toList()))); - - errorsByFile.entrySet().forEach(e -> { - DocMetadata dm = metadata.get(e.getKey()); - if (dm.type == Type.other) { - e.getValue().add("not-diataxis-type"); - } - }); - return errorsByFile; + Map> errorsByFile(Map metadata) { + return messagesByFile; } } @@ -224,7 +298,7 @@ static class DocMetadata { String title; String filename; String summary; - String categories; + Set categories = new HashSet<>(); String id; Type type; @@ -232,11 +306,11 @@ public DocMetadata(String title, Path path, String summary, Object categories, S this.id = id; this.title = title; this.filename = path.getFileName().toString(); - this.categories = categories == null ? "" : categories.toString(); this.summary = summary; + Category.addAll(this.categories, categories, path); - if (this.categories.contains("get-started")) { - this.type = Type.getstarted; + if (this.categories.contains(Category.getting_started)) { + this.type = Type.tutorial; } else if (filename.endsWith("-concepts.adoc")) { this.type = Type.concepts; } else if (filename.endsWith("-howto.adoc")) { @@ -247,15 +321,17 @@ public DocMetadata(String title, Path path, String summary, Object categories, S this.type = Type.reference; } else { this.type = Type.other; + errors.record("not-diataxis-type", path); } if (id == null) { errors.record("missing-id", path); } else if (type != Type.other && !id.startsWith(type.id)) { - System.err.format("[ERROR] %s id (%s) does not start with the correct prefix, should start with '%s-'%n", - filename, id, type.id); - errors.record("incorrect-id", path); + errors.record("incorrect-id", path, + String.format("The document id (%s) does not start with the correct prefix, should start with '%s-'%n", + id, type.id)); } + if (this.categories.isEmpty()) { errors.record("missing-categories", path); } @@ -277,8 +353,10 @@ public String getSummary() { return summary; } - public String getCategories() { - return categories; + public List getCategories() { + return categories.stream() + .map(x -> x.id) + .collect(Collectors.toList()); } public String getType() { diff --git a/docs/sync-web-site.sh b/docs/sync-web-site.sh index 429ee82a40917..94690c129d300 100755 --- a/docs/sync-web-site.sh +++ b/docs/sync-web-site.sh @@ -43,21 +43,21 @@ else TARGET_CONFIG=${TARGET_DIR}/_generated-config/${BRANCH} fi -echo "Copying from src/main/asciidoc/* to $TARGET_GUIDES" +echo "Copying from target/asciidoc/sources/* to $TARGET_GUIDES" rsync -vr --delete \ --exclude='**/*.html' \ --exclude='**/index.adoc' \ - --exclude='**/attributes.adoc' \ + --exclude='**/_attributes-local.adoc' \ --exclude='**/guides.md' \ --exclude='**/_templates' \ - src/main/asciidoc/* \ + target/asciidoc/sources/* \ $TARGET_GUIDES echo "\nCopying from ../target/asciidoc/generated/ to $TARGET_CONFIG" rsync -vr --delete \ --exclude='**/*.html' \ --exclude='**/index.adoc' \ - --exclude='**/attributes.adoc' \ + --exclude='**/_attributes.adoc' \ ../target/asciidoc/generated/ \ $TARGET_CONFIG diff --git a/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfReactiveConfig.java b/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfReactiveConfig.java index 4b1e7ca2d3d4b..c57b0452005d1 100644 --- a/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfReactiveConfig.java +++ b/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfReactiveConfig.java @@ -2,6 +2,7 @@ import java.time.Duration; import java.util.Optional; +import java.util.Set; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; @@ -51,11 +52,12 @@ public class CsrfReactiveConfig { public boolean cookieForceSecure; /** - * Create CSRF token only if the HTTP GET relative request path is the same as the one configured with this property. + * Create CSRF token only if the HTTP GET relative request path matches one of the paths configured with this property. + * Use a comma to separate multiple path values. * */ @ConfigItem - public Optional createTokenPath; + public Optional> createTokenPath; /** * The random CSRF token size in bytes. @@ -65,24 +67,24 @@ public class CsrfReactiveConfig { /** * Verify CSRF token in the CSRF filter. - * If this property is enabled then the input stream will be read by the CSRF filter to verify the token - * and recreated for the application code to read the data correctly. + * If this property is enabled then the input stream will be read and cached by the CSRF filter to verify the token. * - * Therefore, it is recommended to disable this property when dealing with the large form payloads and instead compare - * CSRF form and cookie parameters in the application code using JAX-RS {@linkplain FormParam} which refers to the + * If you prefer then you can disable this property and compare + * CSRF form and cookie parameters in the application code using JAX-RS javax.ws.rs.FormParam which refers to the * {@link #formFieldName} - * form property and {@linkplain CookieParam} which refers to the {@link CsrfReactiveConfig#cookieName} cookie. + * form property and javax.ws.rs.CookieParam which refers to the {@link CsrfReactiveConfig#cookieName} cookie. * * Note that even if the CSRF token verification in the CSRF filter is disabled, the filter will still perform checks to * ensure the token * is available, has the correct {@linkplain #tokenSize} in bytes and that the Content-Type HTTP header is - * 'application/x-www-form-urlencoded'. + * either 'application/x-www-form-urlencoded' or 'multipart/form-data'. */ @ConfigItem(defaultValue = "true") public boolean verifyToken; /** - * Require that only 'application/x-www-form-urlencoded' body is accepted for the token verification to proceed. + * Require that only 'application/x-www-form-urlencoded' or 'multipart/form-data' body is accepted for the token + * verification to proceed. * Disable this property for the CSRF filter to avoid verifying the token for POST requests with other content types. * This property is only effective if {@link #verifyToken} property is enabled. */ diff --git a/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfRequestResponseReactiveFilter.java b/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfRequestResponseReactiveFilter.java index 18437548da0e5..7eed885b8e13f 100644 --- a/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfRequestResponseReactiveFilter.java +++ b/extensions/csrf-reactive/runtime/src/main/java/io/quarkus/csrf/reactive/runtime/CsrfRequestResponseReactiveFilter.java @@ -1,11 +1,7 @@ package io.quarkus.csrf.reactive.runtime; -import java.io.ByteArrayInputStream; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.security.SecureRandom; import java.util.Base64; -import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; @@ -29,7 +25,6 @@ import io.vertx.core.http.impl.CookieImpl; import io.vertx.core.http.impl.ServerCookie; import io.vertx.ext.web.RoutingContext; -import io.vertx.mutiny.core.buffer.Buffer; public class CsrfRequestResponseReactiveFilter { private static final Logger LOG = Logger.getLogger(CsrfRequestResponseReactiveFilter.class); @@ -98,9 +93,8 @@ public Uni filter(ContainerRequestContext requestContext, RoutingConte } else if (config.verifyToken) { // unsafe HTTP method, token is required - if (!requestContext.getMediaType().getType().equals(MediaType.APPLICATION_FORM_URLENCODED_TYPE.getType()) - || !requestContext.getMediaType().getSubtype() - .equals(MediaType.APPLICATION_FORM_URLENCODED_TYPE.getSubtype())) { + if (!isMatchingMediaType(requestContext.getMediaType(), MediaType.APPLICATION_FORM_URLENCODED_TYPE) + && !isMatchingMediaType(requestContext.getMediaType(), MediaType.MULTIPART_FORM_DATA_TYPE)) { if (config.requireFormUrlEncoded) { LOG.debugf("Request has the wrong media type: %s", requestContext.getMediaType().toString()); return Uni.createFrom().item(badClientRequest()); @@ -135,7 +129,6 @@ public Uni apply(MultiMap form) { return Uni.createFrom().item(badClientRequest()); } else { routing.put(CSRF_TOKEN_VERIFIED, true); - requestContext.setEntityStream(new ByteArrayInputStream(encodeForm(form).getBytes())); } return Uni.createFrom().nullItem(); } @@ -148,6 +141,11 @@ public Uni apply(MultiMap form) { return null; } + private static boolean isMatchingMediaType(MediaType contentType, MediaType expectedType) { + return contentType.getType().equals(expectedType.getType()) + && contentType.getSubtype().equals(expectedType.getSubtype()); + } + private static Response badClientRequest() { return Response.status(400).build(); } @@ -197,7 +195,7 @@ private String getCookieToken(RoutingContext routing, CsrfReactiveConfig config) } private boolean isCsrfTokenRequired(RoutingContext routing, CsrfReactiveConfig config) { - return config.createTokenPath.isPresent() ? config.createTokenPath.get().equals(routing.request().path()) : true; + return config.createTokenPath.isPresent() ? config.createTokenPath.get().contains(routing.request().path()) : true; } private void createCookie(String csrfToken, RoutingContext routing, CsrfReactiveConfig config) { @@ -239,24 +237,4 @@ public void handle(Void event) { }); } - private static Buffer encodeForm(MultiMap form) { - Buffer buffer = Buffer.buffer(); - for (Map.Entry entry : form) { - if (buffer.length() != 0) { - buffer.appendByte((byte) '&'); - } - buffer.appendString(entry.getKey()); - buffer.appendByte((byte) '='); - buffer.appendString(urlEncode(entry.getValue())); - } - return buffer; - } - - private static String urlEncode(String value) { - try { - return URLEncoder.encode(value, StandardCharsets.UTF_8.name()); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } } diff --git a/extensions/flyway/deployment/src/test/java/io/quarkus/flyway/test/FlywayExtensionRepairAtStartTest.java b/extensions/flyway/deployment/src/test/java/io/quarkus/flyway/test/FlywayExtensionRepairAtStartTest.java index 266ce887bf410..695d72326c2a4 100644 --- a/extensions/flyway/deployment/src/test/java/io/quarkus/flyway/test/FlywayExtensionRepairAtStartTest.java +++ b/extensions/flyway/deployment/src/test/java/io/quarkus/flyway/test/FlywayExtensionRepairAtStartTest.java @@ -26,7 +26,7 @@ public class FlywayExtensionRepairAtStartTest { .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) .addClass(FlywayResource.class) .addAsResource("db/migration/V1.0.0__Quarkus.sql") - .addAsResource("migrate-at-start-config.properties", "application.properties")) + .addAsResource("repair-at-start-config.properties", "application.properties")) .setLogRecordPredicate(r -> true) .setAllowFailedStart(true); diff --git a/extensions/flyway/deployment/src/test/resources/init-sql-config.properties b/extensions/flyway/deployment/src/test/resources/init-sql-config.properties index be8b0b8b64b2a..a59d04d5e3072 100644 --- a/extensions/flyway/deployment/src/test/resources/init-sql-config.properties +++ b/extensions/flyway/deployment/src/test/resources/init-sql-config.properties @@ -1,7 +1,7 @@ quarkus.datasource.db-kind=h2 quarkus.datasource.username=sa quarkus.datasource.password=sa -quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:test-quarkus-migrate-at-start;DB_CLOSE_DELAY=-1 +quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:init-sql-config;DB_CLOSE_DELAY=-1 # Flyway config properties quarkus.flyway.migrate-at-start=true diff --git a/extensions/flyway/deployment/src/test/resources/repair-at-start-config.properties b/extensions/flyway/deployment/src/test/resources/repair-at-start-config.properties new file mode 100644 index 0000000000000..564b875154758 --- /dev/null +++ b/extensions/flyway/deployment/src/test/resources/repair-at-start-config.properties @@ -0,0 +1,7 @@ +quarkus.datasource.db-kind=h2 +quarkus.datasource.username=sa +quarkus.datasource.password=sa +quarkus.datasource.jdbc.url=jdbc:h2:tcp://localhost/mem:test-quarkus-repair-at-start;DB_CLOSE_DELAY=-1 + +# Flyway config properties +quarkus.flyway.migrate-at-start=true diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java index 9c77e933e5b5d..3b9d8b956f323 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java @@ -1230,7 +1230,7 @@ private void enhanceEntities(final JpaModelBuildItem jpaModel, } } - private static Map> getModelClassesAndPackagesPerPersistenceUnits(HibernateOrmConfig hibernateOrmConfig, + public static Map> getModelClassesAndPackagesPerPersistenceUnits(HibernateOrmConfig hibernateOrmConfig, JpaModelBuildItem jpaModel, IndexView index, boolean enableDefaultPersistenceUnit) { Map> modelClassesAndPackagesPerPersistenceUnits = new HashMap<>(); diff --git a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java index 7743124459829..cb388fe109cb1 100644 --- a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java +++ b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java @@ -18,6 +18,7 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.Properties; +import java.util.Set; import java.util.stream.Collectors; import javax.persistence.SharedCacheMode; @@ -111,7 +112,7 @@ public void build(RecorderContext recorderContext, @BuildStep public void buildReactivePersistenceUnit( - HibernateOrmConfig hibernateOrmConfig, + HibernateOrmConfig hibernateOrmConfig, CombinedIndexBuildItem index, DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, List persistenceXmlDescriptors, ApplicationArchivesBuildItem applicationArchivesBuildItem, @@ -154,7 +155,7 @@ public void buildReactivePersistenceUnit( final String dbKind = dbKindOptional.get(); HibernateOrmConfigPersistenceUnit persistenceUnitConfig = hibernateOrmConfig.defaultPersistenceUnit; ParsedPersistenceXmlDescriptor reactivePU = generateReactivePersistenceUnit( - hibernateOrmConfig, persistenceUnitConfig, jpaModel, + hibernateOrmConfig, index, persistenceUnitConfig, jpaModel, dbKind, applicationArchivesBuildItem, launchMode.getLaunchMode(), systemProperties, nativeImageResources, hotDeploymentWatchedFiles, dbKindDialectBuildItems); @@ -202,8 +203,16 @@ PersistenceProviderSetUpBuildItem setUpPersistenceProviderAndWaitForVertxPool(Hi * - Any JDBC-only configuration settings are removed * - If we ever add any Reactive-only config settings, they can be set here */ + // TODO this whole method is really just a hack that duplicates + // io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor.handleHibernateORMWithNoPersistenceXml + // and customizes it for Hibernate Reactive. + // we should work on a way to merge the two methods while still having some behavior specific to + // HR/ORM, because it's likely the HR implementation is missing some features, + // and we've seen in the past that features we add to handleHibernateORMWithNoPersistenceXml + // tend not to be added here. + // See https://github.com/quarkusio/quarkus/issues/28629. private static ParsedPersistenceXmlDescriptor generateReactivePersistenceUnit( - HibernateOrmConfig hibernateOrmConfig, + HibernateOrmConfig hibernateOrmConfig, CombinedIndexBuildItem index, HibernateOrmConfigPersistenceUnit persistenceUnitConfig, JpaModelBuildItem jpaModel, String dbKind, @@ -230,7 +239,26 @@ private static ParsedPersistenceXmlDescriptor generateReactivePersistenceUnit( desc.setTransactionType(PersistenceUnitTransactionType.RESOURCE_LOCAL); desc.getProperties().setProperty(AvailableSettings.DIALECT, dialect); desc.setExcludeUnlistedClasses(true); - desc.addClasses(new ArrayList<>(jpaModel.getAllModelClassNames())); + + Map> modelClassesAndPackagesPerPersistencesUnits = HibernateOrmProcessor + .getModelClassesAndPackagesPerPersistenceUnits(hibernateOrmConfig, jpaModel, index.getIndex(), true); + Set nonDefaultPUWithModelClassesOrPackages = modelClassesAndPackagesPerPersistencesUnits.entrySet().stream() + .filter(e -> !PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME.equals(e.getKey()) && !e.getValue().isEmpty()) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + if (!nonDefaultPUWithModelClassesOrPackages.isEmpty()) { + // Not supported yet; see https://github.com/quarkusio/quarkus/issues/21110 + LOG.warnf("Entities are affected to non-default Hibernate Reactive persistence units %s." + + " Since Hibernate Reactive only works with the default persistence unit, those entities will be ignored.", + nonDefaultPUWithModelClassesOrPackages); + } + Set modelClassesAndPackages = modelClassesAndPackagesPerPersistencesUnits + .getOrDefault(PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME, Collections.emptySet()); + if (modelClassesAndPackages.isEmpty()) { + LOG.warnf("Could not find any entities affected to the Hibernate Reactive persistence unit."); + } else { + desc.addClasses(new ArrayList<>(modelClassesAndPackages)); + } // The storage engine has to be set as a system property. if (persistenceUnitConfig.dialect.storageEngine.isPresent()) { diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java new file mode 100644 index 0000000000000..7af087c248ea8 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java @@ -0,0 +1,74 @@ +package io.quarkus.hibernate.reactive.singlepersistenceunit; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.logging.Formatter; +import java.util.logging.Level; + +import javax.inject.Inject; + +import org.hibernate.reactive.mutiny.Mutiny; +import org.jboss.logmanager.formatters.PatternFormatter; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.excludedpackage.ExcludedEntity; +import io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.packageincludedthroughannotation.EntityIncludedThroughPackageAnnotation; +import io.quarkus.test.QuarkusUnitTest; +import io.quarkus.test.vertx.RunOnVertxContext; +import io.quarkus.test.vertx.UniAsserter; +import io.smallrye.mutiny.Uni; + +public class SinglePersistenceUnitPackageAnnotationTest { + + private static final Formatter LOG_FORMATTER = new PatternFormatter("%s"); + + @RegisterExtension + static QuarkusUnitTest runner = new QuarkusUnitTest() + .withApplicationRoot((jar) -> jar + .addPackage(EntityIncludedThroughPackageAnnotation.class.getPackage().getName()) + .addPackage(ExcludedEntity.class.getPackage().getName())) + .withConfigurationResource("application.properties") + // Expect a warning on startup + .setLogRecordPredicate( + record -> record.getMessage().contains("Could not find a suitable persistence unit for model classes")) + .assertLogRecords(records -> assertThat(records) + .as("Warnings on startup") + .hasSize(1) + .element(0).satisfies(record -> { + assertThat(record.getLevel()).isEqualTo(Level.WARNING); + assertThat(LOG_FORMATTER.formatMessage(record)) + .contains( + io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.excludedpackage.ExcludedEntity.class + .getName()); + })); + + @Inject + Mutiny.SessionFactory sessionFactory; + + @Test + @RunOnVertxContext + public void testIncluded(UniAsserter asserter) { + EntityIncludedThroughPackageAnnotation entity = new EntityIncludedThroughPackageAnnotation("default"); + asserter.assertThat( + () -> persist(entity).chain(() -> find(EntityIncludedThroughPackageAnnotation.class, entity.id)), + retrievedEntity -> assertThat(retrievedEntity.name).isEqualTo(entity.name)); + } + + @Test + @RunOnVertxContext + public void testExcluded(UniAsserter asserter) { + ExcludedEntity entity = new ExcludedEntity("gsmet"); + asserter.assertFailedWith(() -> persist(entity), t -> { + assertThat(t).hasMessageContaining("Unknown entity"); + }); + } + + private Uni persist(Object entity) { + return sessionFactory.withTransaction(s -> s.persist(entity)); + } + + private Uni find(Class entityClass, Object id) { + return sessionFactory.withSession(s -> s.find(entityClass, id)); + } +} diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java new file mode 100644 index 0000000000000..2592b675b1a13 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java @@ -0,0 +1,74 @@ +package io.quarkus.hibernate.reactive.singlepersistenceunit; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.logging.Formatter; +import java.util.logging.Level; + +import javax.inject.Inject; + +import org.hibernate.reactive.mutiny.Mutiny; +import org.jboss.logmanager.formatters.PatternFormatter; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.excludedpackage.ExcludedEntity; +import io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.packageincludedthroughconfig.EntityIncludedThroughPackageConfig; +import io.quarkus.test.QuarkusUnitTest; +import io.quarkus.test.vertx.RunOnVertxContext; +import io.quarkus.test.vertx.UniAsserter; +import io.smallrye.mutiny.Uni; + +public class SinglePersistenceUnitPackageConfigurationTest { + + private static final Formatter LOG_FORMATTER = new PatternFormatter("%s"); + + @RegisterExtension + static QuarkusUnitTest runner = new QuarkusUnitTest() + .withApplicationRoot((jar) -> jar + .addPackage(EntityIncludedThroughPackageConfig.class.getPackage().getName()) + .addPackage(ExcludedEntity.class.getPackage().getName())) + .withConfigurationResource("application.properties") + .overrideConfigKey("quarkus.hibernate-orm.packages", + EntityIncludedThroughPackageConfig.class.getPackage().getName()) + // Expect a warning on startup + .setLogRecordPredicate( + record -> record.getMessage().contains("Could not find a suitable persistence unit for model classes")) + .assertLogRecords(records -> assertThat(records) + .as("Warnings on startup") + .hasSize(1) + .element(0).satisfies(record -> { + assertThat(record.getLevel()).isEqualTo(Level.WARNING); + assertThat(LOG_FORMATTER.formatMessage(record)) + .contains(ExcludedEntity.class.getName()); + })); + + @Inject + Mutiny.SessionFactory sessionFactory; + + @Test + @RunOnVertxContext + public void testIncluded(UniAsserter asserter) { + EntityIncludedThroughPackageConfig entity = new EntityIncludedThroughPackageConfig("default"); + asserter.assertThat( + () -> persist(entity).chain(() -> find(EntityIncludedThroughPackageConfig.class, entity.id)), + retrievedEntity -> assertThat(retrievedEntity.name).isEqualTo(entity.name)); + } + + @Test + @RunOnVertxContext + public void testExcluded(UniAsserter asserter) { + ExcludedEntity entity = new ExcludedEntity("gsmet"); + asserter.assertFailedWith(() -> persist(entity), t -> { + assertThat(t).hasMessageContaining("Unknown entity"); + }); + } + + private Uni persist(Object entity) { + return sessionFactory.withTransaction(s -> s.persist(entity)); + } + + private Uni find(Class entityClass, Object id) { + return sessionFactory.withSession(s -> s.find(entityClass, id)); + } +} diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/excludedpackage/ExcludedEntity.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/excludedpackage/ExcludedEntity.java new file mode 100644 index 0000000000000..2fa155f6a19d7 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/excludedpackage/ExcludedEntity.java @@ -0,0 +1,24 @@ +package io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.excludedpackage; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class ExcludedEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "excludedSeq") + public long id; + + public String name; + + public ExcludedEntity() { + } + + public ExcludedEntity(String name) { + this.name = name; + } + +} diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/EntityIncludedThroughPackageAnnotation.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/EntityIncludedThroughPackageAnnotation.java new file mode 100644 index 0000000000000..7a1072d3cb749 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/EntityIncludedThroughPackageAnnotation.java @@ -0,0 +1,24 @@ +package io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.packageincludedthroughannotation; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class EntityIncludedThroughPackageAnnotation { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "includedSeq") + public long id; + + public String name; + + public EntityIncludedThroughPackageAnnotation() { + } + + public EntityIncludedThroughPackageAnnotation(String name) { + this.name = name; + } + +} diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/package-info.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/package-info.java new file mode 100644 index 0000000000000..38f11d327b774 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughannotation/package-info.java @@ -0,0 +1,4 @@ +@PersistenceUnit(PersistenceUnit.DEFAULT) +package io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.packageincludedthroughannotation; + +import io.quarkus.hibernate.orm.PersistenceUnit; \ No newline at end of file diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughconfig/EntityIncludedThroughPackageConfig.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughconfig/EntityIncludedThroughPackageConfig.java new file mode 100644 index 0000000000000..1be8671a89a49 --- /dev/null +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/entityassignment/packageincludedthroughconfig/EntityIncludedThroughPackageConfig.java @@ -0,0 +1,24 @@ +package io.quarkus.hibernate.reactive.singlepersistenceunit.entityassignment.packageincludedthroughconfig; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class EntityIncludedThroughPackageConfig { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "includedSeq") + public long id; + + public String name; + + public EntityIncludedThroughPackageConfig() { + } + + public EntityIncludedThroughPackageConfig(String name) { + this.name = name; + } + +} diff --git a/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsDisabledTest.java b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsDisabledTest.java new file mode 100644 index 0000000000000..96fd82f3c892d --- /dev/null +++ b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsDisabledTest.java @@ -0,0 +1,38 @@ +package io.quarkus.jackson.deployment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Duration; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.quarkus.test.QuarkusUnitTest; + +public class JacksonWriteDurationsAsTimestampsDisabledTest { + + @RegisterExtension + static final QuarkusUnitTest config = new QuarkusUnitTest() + .withConfigurationResource("application-write-durations-as-timestamps-disabled.properties"); + + @Inject + ObjectMapper objectMapper; + + @Test + public void testDurationWrittenAsIso8601() throws JsonProcessingException { + Pojo pojo = new Pojo(); + pojo.duration = Duration.ofMillis(65542516); + + assertThat(objectMapper.writeValueAsString(pojo)).isEqualTo("{\"duration\":\"PT18H12M22.516S\"}"); + } + + public static class Pojo { + + public Duration duration; + } +} diff --git a/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsEnabledTest.java b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsEnabledTest.java new file mode 100644 index 0000000000000..307144d6d2d98 --- /dev/null +++ b/extensions/jackson/deployment/src/test/java/io/quarkus/jackson/deployment/JacksonWriteDurationsAsTimestampsEnabledTest.java @@ -0,0 +1,38 @@ +package io.quarkus.jackson.deployment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.Duration; + +import javax.inject.Inject; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.quarkus.test.QuarkusUnitTest; + +public class JacksonWriteDurationsAsTimestampsEnabledTest { + + @RegisterExtension + static final QuarkusUnitTest config = new QuarkusUnitTest() + .withConfigurationResource("application-write-durations-as-timestamps-enabled.properties"); + + @Inject + ObjectMapper objectMapper; + + @Test + public void testDurationWrittenAsTimestamp() throws JsonProcessingException { + Pojo pojo = new Pojo(); + pojo.duration = Duration.ofMillis(65542516); + + assertThat(objectMapper.writeValueAsString(pojo)).isEqualTo("{\"duration\":65542.516000000}"); + } + + public static class Pojo { + + public Duration duration; + } +} diff --git a/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-disabled.properties b/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-disabled.properties new file mode 100644 index 0000000000000..ede59d3039c5f --- /dev/null +++ b/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-disabled.properties @@ -0,0 +1 @@ +quarkus.jackson.write-durations-as-timestamps=false \ No newline at end of file diff --git a/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-enabled.properties b/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-enabled.properties new file mode 100644 index 0000000000000..b9abe64c27b4a --- /dev/null +++ b/extensions/jackson/deployment/src/test/resources/application-write-durations-as-timestamps-enabled.properties @@ -0,0 +1 @@ +quarkus.jackson.write-durations-as-timestamps=true \ No newline at end of file diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java index ae314a9e9e025..0423f9a96924f 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/JacksonBuildTimeConfig.java @@ -29,10 +29,19 @@ public class JacksonBuildTimeConfig { /** * If enabled, Jackson will serialize dates as numeric value(s). + * When disabled, they are serialized in ISO 8601 format. */ @ConfigItem(defaultValue = "false") public boolean writeDatesAsTimestamps; + /** + * If enabled, Jackson will serialize durations as numeric value(s). + * When disabled, they are serialized in ISO 8601 format. + * This is enabled by default to match the default Jackson behavior. + */ + @ConfigItem(defaultValue = "true") + public boolean writeDurationsAsTimestamps; + /** * If enabled, Jackson will ignore case during Enum deserialization. */ diff --git a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ObjectMapperProducer.java b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ObjectMapperProducer.java index f71c3b89fa8f5..4cd547dfa73d4 100644 --- a/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ObjectMapperProducer.java +++ b/extensions/jackson/runtime/src/main/java/io/quarkus/jackson/runtime/ObjectMapperProducer.java @@ -41,6 +41,10 @@ public ObjectMapper objectMapper(@All List customizers, // this feature is enabled by default, so we disable it objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } + if (!jacksonBuildTimeConfig.writeDurationsAsTimestamps) { + // this feature is enabled by default, so we disable it + objectMapper.disable(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS); + } if (jacksonBuildTimeConfig.acceptCaseInsensitiveEnums) { objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS); } diff --git a/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/dns/MongoDnsClient.java b/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/dns/MongoDnsClient.java index e12c70dc854b9..d20705bedaec5 100644 --- a/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/dns/MongoDnsClient.java +++ b/extensions/mongodb-client/runtime/src/main/java/io/quarkus/mongodb/runtime/dns/MongoDnsClient.java @@ -8,6 +8,7 @@ import java.nio.file.Paths; import java.time.Duration; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -82,7 +83,7 @@ public class MongoDnsClient implements DnsClient { private static List nameServers() { Path conf = Paths.get("/etc/resolv.conf"); - List nameServers = null; + List nameServers = Collections.emptyList(); if (Files.exists(conf)) { try (Stream lines = Files.lines(conf)) { nameServers = lines @@ -91,7 +92,6 @@ private static List nameServers() { .collect(Collectors.toList()); } catch (IOException | ArrayIndexOutOfBoundsException e) { Logger.getLogger(MongoDnsClientProvider.class).info("Unable to read the /etc/resolv.conf file", e); - nameServers = new ArrayList<>(); } } return nameServers; diff --git a/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakDevServicesProcessor.java b/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakDevServicesProcessor.java index 34a1a4cb0918e..31f90109de255 100644 --- a/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakDevServicesProcessor.java +++ b/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakDevServicesProcessor.java @@ -181,17 +181,24 @@ public DevServicesResultBuildItem startKeycloakContainer( } capturedDevServicesConfiguration = currentDevServicesConfiguration; StartupLogCompressor compressor = new StartupLogCompressor( - (launchMode.isTest() ? "(test) " : "") + "KeyCloak Dev Services Starting:", + (launchMode.isTest() ? "(test) " : "") + "Keycloak Dev Services Starting:", consoleInstalledBuildItem, loggingSetupBuildItem); if (vertxInstance == null) { vertxInstance = Vertx.vertx(); } try { + List errors = new ArrayList<>(); + RunningDevService newDevService = startContainer(dockerStatusBuildItem, keycloakBuildItemBuildProducer, !devServicesSharedNetworkBuildItem.isEmpty(), - devServicesConfig.timeout); + devServicesConfig.timeout, + errors); if (newDevService == null) { - compressor.close(); + if (errors.isEmpty()) { + compressor.close(); + } else { + compressor.closeAndDumpCaptured(); + } return null; } @@ -227,10 +234,10 @@ public void run() { } capturedRealmFileLastModifiedDate = getRealmFileLastModifiedDate(capturedDevServicesConfiguration.realmPath); - if (devService == null) { - compressor.closeAndDumpCaptured(); - } else { + if (devService != null && errors.isEmpty()) { compressor.close(); + } else { + compressor.closeAndDumpCaptured(); } } catch (Throwable t) { compressor.closeAndDumpCaptured(); @@ -241,14 +248,14 @@ public void run() { return devService.toBuildItem(); } - private String startURL(String host, Integer port, boolean isKeyCloakX) { - return "http://" + host + ":" + port + (isKeyCloakX ? "" : "/auth"); + private String startURL(String host, Integer port, boolean isKeycloakX) { + return "http://" + host + ":" + port + (isKeycloakX ? "" : "/auth"); } private Map prepareConfiguration( BuildProducer keycloakBuildItemBuildProducer, String internalURL, String hostURL, RealmRepresentation realmRep, - boolean keycloakX) { + boolean keycloakX, List errors) { final String realmName = realmRep != null ? realmRep.getRealm() : getDefaultRealmName(); final String authServerInternalUrl = realmsURL(internalURL, realmName); @@ -266,9 +273,10 @@ private Map prepareConfiguration( try { String adminToken = getAdminToken(client, clientAuthServerBaseUrl); if (createDefaultRealm) { - createDefaultRealm(client, adminToken, clientAuthServerBaseUrl, users, oidcClientId, oidcClientSecret); + createDefaultRealm(client, adminToken, clientAuthServerBaseUrl, users, oidcClientId, oidcClientSecret, + errors); } else if (realmRep != null && keycloakX) { - createRealm(client, adminToken, clientAuthServerBaseUrl, realmRep); + createRealm(client, adminToken, clientAuthServerBaseUrl, realmRep, errors); } } finally { client.close(); @@ -300,7 +308,8 @@ private String getDefaultRealmName() { private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuildItem, BuildProducer keycloakBuildItemBuildProducer, - boolean useSharedNetwork, Optional timeout) { + boolean useSharedNetwork, Optional timeout, + List errors) { if (!capturedDevServicesConfiguration.enabled) { // explicitly disabled LOG.debug("Not starting Dev Services for Keycloak as it has been disabled in the config"); @@ -342,7 +351,8 @@ private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuild capturedDevServicesConfiguration.shared, capturedDevServicesConfiguration.javaOpts, capturedDevServicesConfiguration.startCommand, - capturedDevServicesConfiguration.showLogs); + capturedDevServicesConfiguration.showLogs, + errors); timeout.ifPresent(oidcContainer::withStartupTimeout); oidcContainer.start(); @@ -356,7 +366,8 @@ private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuild Map configs = prepareConfiguration(keycloakBuildItemBuildProducer, internalUrl, hostUrl, oidcContainer.realmRep, - oidcContainer.keycloakX); + oidcContainer.keycloakX, + errors); return new RunningDevService(KEYCLOAK_CONTAINER_NAME, oidcContainer.getContainerId(), oidcContainer::close, configs); }; @@ -366,7 +377,7 @@ private RunningDevService startContainer(DockerStatusBuildItem dockerStatusBuild // TODO: this probably needs to be addressed Map configs = prepareConfiguration(keycloakBuildItemBuildProducer, getSharedContainerUrl(containerAddress), - getSharedContainerUrl(containerAddress), null, false); + getSharedContainerUrl(containerAddress), null, false, errors); return new RunningDevService(KEYCLOAK_CONTAINER_NAME, containerAddress.getId(), null, configs); }) .orElseGet(defaultKeycloakContainerSupplier); @@ -395,10 +406,12 @@ private static class QuarkusOidcContainer extends GenericContainer startCommand; private final boolean showLogs; + private final List errors; public QuarkusOidcContainer(DockerImageName dockerImageName, OptionalInt fixedExposedPort, boolean useSharedNetwork, Optional realmPath, String containerLabelValue, - boolean sharedContainer, Optional javaOpts, Optional startCommand, boolean showLogs) { + boolean sharedContainer, Optional javaOpts, Optional startCommand, boolean showLogs, + List errors) { super(dockerImageName); this.useSharedNetwork = useSharedNetwork; @@ -418,6 +431,7 @@ public QuarkusOidcContainer(DockerImageName dockerImageName, OptionalInt fixedEx this.fixedExposedPort = fixedExposedPort; this.startCommand = startCommand; this.showLogs = showLogs; + this.errors = errors; super.setWaitStrategy(Wait.forLogMessage(".*Keycloak.*started.*", 1)); } @@ -468,7 +482,7 @@ protected void configure() { if (realmPath.isPresent()) { URL realmPathUrl = null; if ((realmPathUrl = Thread.currentThread().getContextClassLoader().getResource(realmPath.get())) != null) { - realmRep = readRealmFile(realmPathUrl, realmPath.get()); + realmRep = readRealmFile(realmPathUrl, realmPath.get(), errors); if (!keycloakX) { withClasspathResourceMapping(realmPath.get(), KEYCLOAK_DOCKER_REALM_PATH, BindMode.READ_ONLY); } @@ -478,9 +492,11 @@ protected void configure() { if (!keycloakX) { withFileSystemBind(realmPath.get(), KEYCLOAK_DOCKER_REALM_PATH, BindMode.READ_ONLY); } - realmRep = readRealmFile(filePath.toUri(), realmPath.get()); + realmRep = readRealmFile(filePath.toUri(), realmPath.get(), errors); } else { - LOG.debugf("Realm %s resource is not available", realmPath.get()); + errors.add(String.format("Realm %s resource is not available", realmPath.get())); + + LOG.errorf("Realm %s resource is not available", realmPath.get()); } } @@ -507,21 +523,23 @@ private Integer findRandomPort() { } } - private RealmRepresentation readRealmFile(URI uri, String realmPath) { + private RealmRepresentation readRealmFile(URI uri, String realmPath, List errors) { try { - return readRealmFile(uri.toURL(), realmPath); + return readRealmFile(uri.toURL(), realmPath, errors); } catch (MalformedURLException ex) { // Will not happen as this method is called only when it is confirmed the file exists throw new RuntimeException(ex); } } - private RealmRepresentation readRealmFile(URL url, String realmPath) { + private RealmRepresentation readRealmFile(URL url, String realmPath, List errors) { try { try (InputStream is = url.openStream()) { return JsonSerialization.readValue(is, RealmRepresentation.class); } } catch (IOException ex) { + errors.add(String.format("Realm %s resource can not be opened: %s", realmPath, ex.getMessage())); + LOG.errorf("Realm %s resource can not be opened: %s", realmPath, ex.getMessage()); } return null; @@ -578,7 +596,8 @@ private FileTime getRealmFileLastModifiedDate(Optional realm) { private void createDefaultRealm(WebClient client, String token, String keycloakUrl, Map users, String oidcClientId, - String oidcClientSecret) { + String oidcClientSecret, + List errors) { RealmRepresentation realm = createDefaultRealmRep(); realm.getClients().add(createClient(oidcClientId, oidcClientSecret)); @@ -586,7 +605,7 @@ private void createDefaultRealm(WebClient client, String token, String keycloakU realm.getUsers().add(createUser(entry.getKey(), entry.getValue(), getUserRoles(entry.getKey()))); } - createRealm(client, token, keycloakUrl, realm); + createRealm(client, token, keycloakUrl, realm, errors); } private String getAdminToken(WebClient client, String keycloakUrl) { @@ -602,7 +621,8 @@ private String getAdminToken(WebClient client, String keycloakUrl) { return null; } - private void createRealm(WebClient client, String token, String keycloakUrl, RealmRepresentation realm) { + private void createRealm(WebClient client, String token, String keycloakUrl, RealmRepresentation realm, + List errors) { try { LOG.tracef("Creating the realm %s", realm.getRealm()); HttpResponse createRealmResponse = client.postAbs(keycloakUrl + "/admin/realms") @@ -612,6 +632,10 @@ private void createRealm(WebClient client, String token, String keycloakUrl, Rea .await().atMost(oidcConfig.devui.webClientTimeout); if (createRealmResponse.statusCode() > 299) { + errors.add(String.format("Realm %s can not be created %d - %s ", realm.getRealm(), + createRealmResponse.statusCode(), + createRealmResponse.statusMessage())); + LOG.errorf("Realm %s can not be created %d - %s ", realm.getRealm(), createRealmResponse.statusCode(), createRealmResponse.statusMessage()); } @@ -635,6 +659,8 @@ private void createRealm(WebClient client, String token, String keycloakUrl, Rea }); realmStatusCodeUni.await().atMost(Duration.ofSeconds(10)); } catch (Throwable t) { + errors.add(String.format("Realm %s can not be created: %s", realm.getRealm(), t.getMessage())); + LOG.errorf("Realm %s can not be created: %s", realm.getRealm(), t.getMessage()); } } diff --git a/extensions/panache/hibernate-orm-rest-data-panache/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/panache/hibernate-orm-rest-data-panache/runtime/src/main/resources/META-INF/quarkus-extension.yaml index 2f07493e20daf..1ee0efb318529 100644 --- a/extensions/panache/hibernate-orm-rest-data-panache/runtime/src/main/resources/META-INF/quarkus-extension.yaml +++ b/extensions/panache/hibernate-orm-rest-data-panache/runtime/src/main/resources/META-INF/quarkus-extension.yaml @@ -14,4 +14,4 @@ metadata: categories: - "data" - "web" - status: "experimental" \ No newline at end of file + status: "stable" diff --git a/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java b/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java index 2b3e1865c0e25..5c93d1a2c178b 100644 --- a/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java +++ b/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java @@ -84,7 +84,6 @@ import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; -import io.quarkus.deployment.util.JandexUtil; import io.quarkus.fs.util.ZipUtils; import io.quarkus.gizmo.ClassOutput; import io.quarkus.maven.dependency.Dependency; @@ -363,7 +362,7 @@ && isNotLocatedByCustomTemplateLocator(locatorPatternsBuildItem.getLocationPatte throw new TemplateException("Parameter names not recorded for " + classInfo.name() + ": compile the class with -parameters"); } - bindings.put(name, JandexUtil.getBoxedTypeName(type)); + bindings.put(name, getCheckedTemplateParameterTypeName(type)); parameterNames.add(name); } AnnotationValue requireTypeSafeExpressions = annotation.value(CHECKED_TEMPLATE_REQUIRE_TYPE_SAFE); @@ -515,7 +514,7 @@ public Optional getVariant() { String name = MessageBundleProcessor.getParameterName(method, it.previousIndex()); msgBundleTemplateIdToParamDecl .computeIfAbsent(messageBundleMethod.getTemplateId(), s -> new HashMap<>()) - .put(name, new MethodParameterDeclaration(JandexUtil.getBoxedTypeName(paramType), name)); + .put(name, new MethodParameterDeclaration(getCheckedTemplateParameterTypeName(paramType), name)); } } @@ -530,7 +529,7 @@ public void beforeParsing(ParserHelper parserHelper) { // Set the bindings for globals first so that type-safe templates can override them for (TemplateGlobalBuildItem global : globals) { parserHelper.addParameter(global.getName(), - JandexUtil.getBoxedTypeName(global.getVariableType()).toString()); + getCheckedTemplateParameterTypeName(global.getVariableType()).toString()); } addMethodParamsToParserHelper(parserHelper, pathToPathWithoutSuffix.get(templateId), @@ -584,6 +583,43 @@ public void beforeParsing(ParserHelper parserHelper) { return new TemplatesAnalysisBuildItem(analysis); } + @SuppressWarnings("incomplete-switch") + private static String getCheckedTemplateParameterTypeName(Type type) { + switch (type.kind()) { + case PARAMETERIZED_TYPE: + return getCheckedTemplateParameterParameterizedTypeName((ParameterizedType) type); + case ARRAY: + // in the case of an array, we get back to using Type#toString() + // otherwise, we end up with java.lang.[I] for int[] + return type.toString(); + } + return type.name().toString(); + } + + private static String getCheckedTemplateParameterParameterizedTypeName(ParameterizedType parameterizedType) { + StringBuilder builder = new StringBuilder(); + + if (parameterizedType.owner() != null) { + builder.append(parameterizedType.owner().name()); + builder.append('.'); + builder.append(parameterizedType.name().local()); + } else { + builder.append(parameterizedType.name()); + } + + List arguments = parameterizedType.arguments(); + if (arguments.size() > 0) { + builder.append('<'); + builder.append(getCheckedTemplateParameterTypeName(arguments.get(0))); + for (int i = 1; i < arguments.size(); i++) { + builder.append(", ").append(getCheckedTemplateParameterTypeName(arguments.get(i))); + } + builder.append('>'); + } + + return builder.toString(); + } + private List mergeParamDeclarations(List parameterDeclarations, Map paramNameToDeclaration) { if (paramNameToDeclaration != null) { diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/main/java/io/quarkus/resteasy/reactive/jaxb/deployment/ResteasyReactiveJaxbProcessor.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/main/java/io/quarkus/resteasy/reactive/jaxb/deployment/ResteasyReactiveJaxbProcessor.java index 086822d660b7e..0e723c783f3b3 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/main/java/io/quarkus/resteasy/reactive/jaxb/deployment/ResteasyReactiveJaxbProcessor.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/main/java/io/quarkus/resteasy/reactive/jaxb/deployment/ResteasyReactiveJaxbProcessor.java @@ -39,6 +39,8 @@ public class ResteasyReactiveJaxbProcessor { + private static final List XML_TYPES = List.of(MediaType.APPLICATION_XML, MediaType.TEXT_XML); + @BuildStep void feature(BuildProducer feature) { feature.produce(new FeatureBuildItem(Feature.RESTEASY_REACTIVE_JAXB)); @@ -56,10 +58,10 @@ void additionalProviders(BuildProducer additionalBean, additionalReaders .produce(new MessageBodyReaderBuildItem(ServerJaxbMessageBodyReader.class.getName(), Object.class.getName(), - List.of(MediaType.APPLICATION_XML, MediaType.TEXT_XML), RuntimeType.SERVER, true, Priorities.USER)); + XML_TYPES, RuntimeType.SERVER, true, Priorities.USER)); additionalWriters .produce(new MessageBodyWriterBuildItem(ServerJaxbMessageBodyWriter.class.getName(), Object.class.getName(), - List.of(MediaType.APPLICATION_XML, MediaType.TEXT_XML), RuntimeType.SERVER, true, Priorities.USER)); + XML_TYPES, RuntimeType.SERVER, true, Priorities.USER)); } @BuildStep @@ -87,11 +89,17 @@ void registerClassesToBeBound(ResteasyReactiveResourceMethodEntriesBuildItem res } // If consumes "application/xml" or "multipart/form-data", we register all the classes of the parameters - if (consumesXml(resourceInfo) || consumesMultipart(resourceInfo)) { + boolean consumesXml = consumesXml(resourceInfo); + boolean consumesMultipart = consumesMultipart(resourceInfo); + if (consumesXml || consumesMultipart) { for (Type parameter : methodInfo.parameterTypes()) { ClassInfo effectiveParameter = getEffectiveClassInfo(parameter, indexView); if (effectiveParameter != null) { - classesInfo.add(effectiveParameter); + if (consumesXml) { + classesInfo.add(effectiveParameter); + } else if (consumesMultipart) { + classesInfo.addAll(getEffectivePartsUsingXml(effectiveParameter, indexView)); + } } } } @@ -112,18 +120,26 @@ void setupJaxbContextConfigForValidator(Capabilities capabilities, private List getEffectivePartsUsingXml(ClassInfo returnType, IndexView indexView) { List classInfos = new ArrayList<>(); for (FieldInfo field : returnType.fields()) { - AnnotationInstance partTypeInstance = field.annotation(ResteasyReactiveDotNames.PART_TYPE_NAME); - if (partTypeInstance != null) { - AnnotationValue partTypeValue = partTypeInstance.value(); - if (partTypeValue != null && MediaType.APPLICATION_XML.equals(partTypeValue.asString())) { - classInfos.add(getEffectiveClassInfo(field.type(), indexView)); - } + if (isPartTypeXml(field)) { + classInfos.add(getEffectiveClassInfo(field.type(), indexView)); } } return classInfos; } + private boolean isPartTypeXml(FieldInfo field) { + AnnotationInstance partType = field.annotation(ResteasyReactiveDotNames.PART_TYPE_NAME); + if (partType != null) { + AnnotationValue partTypeValue = partType.value(); + if (containsMediaType(new String[] { partTypeValue.asString() }, XML_TYPES)) { + return true; + } + } + + return false; + } + private ClassInfo getEffectiveClassInfo(Type type, IndexView indexView) { if (type.kind() == Type.Kind.VOID || type.kind() == Type.Kind.PRIMITIVE) { return null; @@ -158,26 +174,28 @@ private ClassInfo getEffectiveClassInfo(Type type, IndexView indexView) { } private boolean consumesXml(ResourceMethod resourceInfo) { - return containsMediaType(resourceInfo.getConsumes(), MediaType.APPLICATION_XML); + return containsMediaType(resourceInfo.getConsumes(), XML_TYPES); } private boolean consumesMultipart(ResourceMethod resourceInfo) { - return containsMediaType(resourceInfo.getConsumes(), MediaType.MULTIPART_FORM_DATA); + return containsMediaType(resourceInfo.getConsumes(), List.of(MediaType.MULTIPART_FORM_DATA)); } private boolean producesXml(ResourceMethod resourceInfo) { - return containsMediaType(resourceInfo.getProduces(), MediaType.APPLICATION_XML); + return containsMediaType(resourceInfo.getProduces(), XML_TYPES); } private boolean producesMultipart(ResourceMethod resourceInfo) { - return containsMediaType(resourceInfo.getProduces(), MediaType.MULTIPART_FORM_DATA); + return containsMediaType(resourceInfo.getProduces(), List.of(MediaType.MULTIPART_FORM_DATA)); } - private boolean containsMediaType(String[] types, String mediaType) { + private boolean containsMediaType(String[] types, List mediaTypes) { if (types != null) { for (String type : types) { - if (type.toLowerCase(Locale.ROOT).contains(mediaType)) { - return true; + for (String mediaType : mediaTypes) { + if (type.toLowerCase(Locale.ROOT).contains(mediaType)) { + return true; + } } } } diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/java/io/quarkus/resteasy/reactive/jaxb/deployment/test/MultipartTest.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/java/io/quarkus/resteasy/reactive/jaxb/deployment/test/MultipartTest.java index 9fe9a051645de..0be6a017e31a1 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/java/io/quarkus/resteasy/reactive/jaxb/deployment/test/MultipartTest.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/java/io/quarkus/resteasy/reactive/jaxb/deployment/test/MultipartTest.java @@ -2,7 +2,12 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + import javax.ws.rs.Consumes; +import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -12,6 +17,7 @@ import org.jboss.resteasy.reactive.MultipartForm; import org.jboss.resteasy.reactive.PartType; import org.jboss.resteasy.reactive.RestForm; +import org.jboss.resteasy.reactive.multipart.FileUpload; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Test; @@ -36,6 +42,7 @@ public class MultipartTest { + "" + "Divino Pastor" + ""; + private final File HTML_FILE = new File("./src/test/resources/test.html"); @RegisterExtension static QuarkusUnitTest test = new QuarkusUnitTest() @@ -51,7 +58,7 @@ public void testOutput() { .extract().asString(); assertContains(response, "name", MediaType.TEXT_PLAIN, EXPECTED_RESPONSE_NAME); - assertContains(response, "person", MediaType.APPLICATION_XML, EXPECTED_RESPONSE_PERSON); + assertContains(response, "person", MediaType.TEXT_XML, EXPECTED_RESPONSE_PERSON); } @Test @@ -68,6 +75,19 @@ public void testInput() { assertThat(response).isEqualTo("John-Divino Pastor"); } + @Test + public void testInputFile() throws IOException { + String response = RestAssured + .given() + .multiPart("file", HTML_FILE, "text/html") + .post("/multipart/input/file") + .then() + .statusCode(200) + .extract().asString(); + + assertThat(response).isEqualTo(String.valueOf(Files.readAllBytes(HTML_FILE.toPath()).length)); + } + private void assertContains(String response, String name, String contentType, Object value) { String[] lines = response.split("--"); assertThat(lines).anyMatch(line -> line.contains(String.format(EXPECTED_CONTENT_DISPOSITION_PART, name)) @@ -97,6 +117,13 @@ public String input(@MultipartForm MultipartInput input) { return input.name + "-" + input.school.name; } + @POST + @Path("/input/file") + @Consumes(MediaType.MULTIPART_FORM_DATA) + public int inputFile(@MultipartForm FileUploadData data) throws IOException { + return Files.readAllBytes(data.fileUpload.filePath()).length; + } + } private static class MultipartOutputResponse { @@ -105,10 +132,15 @@ private static class MultipartOutputResponse { String name; @RestForm - @PartType(MediaType.APPLICATION_XML) + @PartType(MediaType.TEXT_XML) Person person; } + public static class FileUploadData { + @FormParam("file") + FileUpload fileUpload; + } + public static class MultipartInput { @RestForm diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/resources/test.html b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/resources/test.html new file mode 100644 index 0000000000000..0d2c081db5dc9 --- /dev/null +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-jaxb/deployment/src/test/resources/test.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-servlet/runtime/src/main/java/io/quarkus/resteasy/reactive/server/servlet/runtime/ServletRequestContext.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive-servlet/runtime/src/main/java/io/quarkus/resteasy/reactive/server/servlet/runtime/ServletRequestContext.java index c071b9fd9db75..928477c1610d6 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive-servlet/runtime/src/main/java/io/quarkus/resteasy/reactive/server/servlet/runtime/ServletRequestContext.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-servlet/runtime/src/main/java/io/quarkus/resteasy/reactive/server/servlet/runtime/ServletRequestContext.java @@ -35,6 +35,7 @@ import org.jboss.resteasy.reactive.spi.ThreadSetupAction; import io.netty.channel.EventLoop; +import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.util.concurrent.ScheduledFuture; import io.quarkus.arc.Arc; import io.quarkus.arc.impl.LazyValue; @@ -45,6 +46,7 @@ import io.undertow.server.HttpServerExchange; import io.undertow.server.ResponseCommitListener; import io.vertx.core.Handler; +import io.vertx.core.MultiMap; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; import io.vertx.core.net.impl.ConnectionBase; @@ -113,6 +115,16 @@ public ServerHttpResponse serverResponse() { return this; } + @Override + protected void setQueryParamsFrom(String uri) { + MultiMap map = context.queryParams(); + map.clear(); + Map> decodedParams = new QueryStringDecoder(uri).parameters(); + for (Map.Entry> entry : decodedParams.entrySet()) { + map.add(entry.getKey(), entry.getValue()); + } + } + protected void handleRequestScopeActivation() { super.handleRequestScopeActivation(); QuarkusHttpUser user = (QuarkusHttpUser) context.user(); diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SimpleQuarkusRestTestCase.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SimpleQuarkusRestTestCase.java index 51ef18e647cc1..9dea4e08961c7 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SimpleQuarkusRestTestCase.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SimpleQuarkusRestTestCase.java @@ -8,6 +8,7 @@ import java.util.function.Supplier; +import org.apache.http.HttpStatus; import org.hamcrest.Matchers; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; @@ -19,6 +20,7 @@ import io.quarkus.test.QuarkusUnitTest; import io.restassured.RestAssured; +import io.restassured.http.ContentType; import io.restassured.http.Headers; public class SimpleQuarkusRestTestCase { @@ -107,6 +109,12 @@ public void testSubResource() { .then().body(Matchers.equalTo("otherSub")); RestAssured.get("/simple/sub") .then().body(Matchers.equalTo("sub")); + + RestAssured.with() + .contentType(ContentType.JSON) + .body("{\"test\": true}") + .patch("/simple/sub/patch/text") + .then().statusCode(HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE); } @Test diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SubResource.java b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SubResource.java index 00b37fdf42c6c..e1546a77d6fc8 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SubResource.java +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive/deployment/src/test/java/io/quarkus/resteasy/reactive/server/test/simple/SubResource.java @@ -1,7 +1,10 @@ package io.quarkus.resteasy.reactive.server.test.simple; +import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.PATCH; import javax.ws.rs.Path; +import javax.ws.rs.core.MediaType; public class SubResource { @@ -15,4 +18,11 @@ public String sub() { public String otherPath() { return "otherSub"; } + + @Path("patch/text") + @PATCH + @Consumes(MediaType.TEXT_PLAIN) + public String patchWithTextPlain(String patch) { + return "test-value: " + patch; + } } diff --git a/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookie.properties b/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookie.properties index b19a82a3f4006..55a17ccedef34 100644 --- a/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookie.properties +++ b/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookie.properties @@ -1,7 +1,7 @@ mp.jwt.verify.publickey.location=/publicKey.pem mp.jwt.verify.issuer=https://server.example.com smallrye.jwt.claims.groups=User -smallrye.jwt.token.header=Cookie -smallrye.jwt.token.cookie=cookie_a +mp.jwt.token.header=Cookie +mp.jwt.token.cookie=cookie_a smallrye.jwt.sign.key.location=/privateKey.pem quarkus.smallrye-jwt.enabled=true diff --git a/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookieDev.properties b/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookieDev.properties index 9653421903e09..99231ba51bfc0 100644 --- a/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookieDev.properties +++ b/extensions/smallrye-jwt/deployment/src/test/resources/applicationJwtCookieDev.properties @@ -1,7 +1,7 @@ #mp.jwt.verify.publickey.location=/publicKey.pem #mp.jwt.verify.issuer=https://server.example.com #smallrye.jwt.claims.groups=User -#smallrye.jwt.token.header=Cookie -#smallrye.jwt.token.cookie=cookie_a +#mp.jwt.token.header=Cookie +#mp.jwt.token.cookie=cookie_a #smallrye.jwt.sign.key.location=/privateKey.pem quarkus.smallrye-jwt.enabled=true diff --git a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/QuarkusClassLoader.java b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/QuarkusClassLoader.java index fc3a2366c740a..d269b949db945 100644 --- a/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/QuarkusClassLoader.java +++ b/independent-projects/bootstrap/core/src/main/java/io/quarkus/bootstrap/classloading/QuarkusClassLoader.java @@ -48,6 +48,15 @@ public static List getElements(String resourceName, boolean lo return ((QuarkusClassLoader) ccl).getElementsWithResource(resourceName, localOnly); } + public List getAllElements(boolean localOnly) { + List ret = new ArrayList<>(); + if (parent instanceof QuarkusClassLoader && !localOnly) { + ret.addAll(((QuarkusClassLoader) parent).getAllElements(localOnly)); + } + ret.addAll(elements); + return ret; + } + /** * Indicates if a given class is present at runtime. * diff --git a/independent-projects/bootstrap/gradle-resolver/src/main/java/io/quarkus/bootstrap/resolver/QuarkusGradleModelFactory.java b/independent-projects/bootstrap/gradle-resolver/src/main/java/io/quarkus/bootstrap/resolver/QuarkusGradleModelFactory.java index 6c42d1f260ffa..6177ef610942f 100644 --- a/independent-projects/bootstrap/gradle-resolver/src/main/java/io/quarkus/bootstrap/resolver/QuarkusGradleModelFactory.java +++ b/independent-projects/bootstrap/gradle-resolver/src/main/java/io/quarkus/bootstrap/resolver/QuarkusGradleModelFactory.java @@ -7,6 +7,7 @@ import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ModelBuilder; import org.gradle.tooling.ProjectConnection; +import org.gradle.wrapper.GradleUserHomeLookup; import io.quarkus.bootstrap.model.ApplicationModel; @@ -19,6 +20,7 @@ public static ApplicationModel create(File projectDir, String mode, String... ta public static ApplicationModel create(File projectDir, String mode, List jvmArgs, String... tasks) { try (ProjectConnection connection = GradleConnector.newConnector() .forProjectDirectory(projectDir) + .useGradleUserHomeDir(GradleUserHomeLookup.gradleUserHome()) .connect()) { return connection.action(new QuarkusModelBuildAction(mode)).forTasks(tasks).addJvmArguments(jvmArgs).run(); } @@ -27,6 +29,7 @@ public static ApplicationModel create(File projectDir, String mode, List public static ApplicationModel createForTasks(File projectDir, String... tasks) { try (ProjectConnection connection = GradleConnector.newConnector() .forProjectDirectory(projectDir) + .useGradleUserHomeDir(GradleUserHomeLookup.gradleUserHome()) .connect()) { final ModelBuilder modelBuilder = connection.model(ApplicationModel.class); if (tasks.length != 0) { diff --git a/independent-projects/bootstrap/pom.xml b/independent-projects/bootstrap/pom.xml index e34ae94641a12..10ae2273b5a31 100644 --- a/independent-projects/bootstrap/pom.xml +++ b/independent-projects/bootstrap/pom.xml @@ -51,7 +51,7 @@ 3.5.1 4.4.15 1.0.0.Final - 2.13.4 + 2.13.4.20221013 1.3.5 2.0.2 1.0 diff --git a/independent-projects/extension-maven-plugin/pom.xml b/independent-projects/extension-maven-plugin/pom.xml index 7ac9c49a56f05..7d071979a6c2f 100644 --- a/independent-projects/extension-maven-plugin/pom.xml +++ b/independent-projects/extension-maven-plugin/pom.xml @@ -35,7 +35,7 @@ 11 3.0.0-M7 1.6.8 - 2.13.4 + 2.13.4.20221013 5.9.1 diff --git a/independent-projects/resteasy-reactive/pom.xml b/independent-projects/resteasy-reactive/pom.xml index 89e530f5ae249..c77a06c794ac6 100644 --- a/independent-projects/resteasy-reactive/pom.xml +++ b/independent-projects/resteasy-reactive/pom.xml @@ -61,7 +61,7 @@ 4.5.1 1.0.0.Final 2.0.0.Final - 2.13.4 + 2.13.4.20221013 1.1.2 2.0.2 1.0.11 diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java index b732d92e289ee..408399d69ca15 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java @@ -28,6 +28,7 @@ import javax.ws.rs.ext.ReaderInterceptor; import javax.ws.rs.ext.WriterInterceptor; +import org.jboss.resteasy.reactive.common.NotImplementedYet; import org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext; import org.jboss.resteasy.reactive.common.util.Encode; import org.jboss.resteasy.reactive.common.util.PathSegmentImpl; @@ -479,13 +480,17 @@ public ResteasyReactiveRequestContext setRequestUri(URI requestURI) { this.path = requestURI.getPath(); this.authority = requestURI.getRawAuthority(); this.scheme = requestURI.getScheme(); - // FIXME: it's possible we may have to also update the query part + setQueryParamsFrom(requestURI.toString()); // invalidate those this.uriInfo = null; this.absoluteUri = null; return this; } + protected void setQueryParamsFrom(String uri) { + throw new NotImplementedYet(); + } + /** * Returns the current response content type. If a response has been set and has an * explicit content type then this is used, otherwise it returns any content type diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java index 67118258789de..1ca909d8bd1b9 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/startup/RuntimeResourceDeployment.java @@ -312,8 +312,8 @@ public RuntimeResource buildResourceMethod(ResourceClass clazz, // we only need to parse the signature and create generic type when the declared type differs from the type genericType = TypeSignatureParser.parse(bodyParameter.signature); } - handlers.add(new RequestDeserializeHandler(typeClass, genericType, - consumesMediaTypes.isEmpty() ? null : consumesMediaTypes.get(0), serialisers, bodyParameterIndex)); + handlers.add(new RequestDeserializeHandler(typeClass, genericType, consumesMediaTypes, serialisers, + bodyParameterIndex)); } // given that we may inject form params in the endpoint we need to make sure we read the body before diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/RequestDeserializeHandler.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/RequestDeserializeHandler.java index 0203a0285b238..701946a95ca5c 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/RequestDeserializeHandler.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/RequestDeserializeHandler.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.util.Collections; import java.util.List; import javax.ws.rs.BadRequestException; @@ -17,6 +18,7 @@ import javax.ws.rs.ext.ReaderInterceptor; import org.jboss.logging.Logger; +import org.jboss.resteasy.reactive.common.util.MediaTypeHelper; import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; import org.jboss.resteasy.reactive.server.core.ServerSerialisers; import org.jboss.resteasy.reactive.server.jaxrs.ReaderInterceptorContextImpl; @@ -29,30 +31,40 @@ public class RequestDeserializeHandler implements ServerRestHandler { private final Class type; private final Type genericType; - private final MediaType mediaType; + private final List acceptableMediaTypes; private final ServerSerialisers serialisers; private final int parameterIndex; - public RequestDeserializeHandler(Class type, Type genericType, MediaType mediaType, ServerSerialisers serialisers, + public RequestDeserializeHandler(Class type, Type genericType, List acceptableMediaTypes, + ServerSerialisers serialisers, int parameterIndex) { this.type = type; this.genericType = genericType; - this.mediaType = mediaType; + this.acceptableMediaTypes = acceptableMediaTypes; this.serialisers = serialisers; this.parameterIndex = parameterIndex; } @Override public void handle(ResteasyReactiveRequestContext requestContext) throws Exception { - MediaType effectiveRequestType = mediaType; - String requestTypeString = requestContext.serverRequest().getRequestHeader(HttpHeaders.CONTENT_TYPE); - if (requestTypeString != null) { + MediaType effectiveRequestType = null; + Object requestType = requestContext.getHeader(HttpHeaders.CONTENT_TYPE, true); + if (requestType != null) { try { - effectiveRequestType = MediaType.valueOf(requestTypeString); + effectiveRequestType = MediaType.valueOf((String) requestType); } catch (Exception e) { throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST).build()); } - } else if (effectiveRequestType == null) { + + // We need to verify media type for sub-resources, this mimics what is done in {@code ClassRoutingHandler} + if (MediaTypeHelper.getFirstMatch( + acceptableMediaTypes, + Collections.singletonList(effectiveRequestType)) == null) { + throw new NotSupportedException("The content-type header value did not match the value in @Consumes"); + } + } else if (!acceptableMediaTypes.isEmpty()) { + effectiveRequestType = acceptableMediaTypes.get(0); + } else { effectiveRequestType = MediaType.APPLICATION_OCTET_STREAM_TYPE; } List> readers = serialisers.findReaders(null, type, effectiveRequestType, RuntimeType.SERVER); diff --git a/independent-projects/resteasy-reactive/server/vertx/src/main/java/org/jboss/resteasy/reactive/server/vertx/VertxResteasyReactiveRequestContext.java b/independent-projects/resteasy-reactive/server/vertx/src/main/java/org/jboss/resteasy/reactive/server/vertx/VertxResteasyReactiveRequestContext.java index 8d09ae9be4a98..7d514bd590443 100644 --- a/independent-projects/resteasy-reactive/server/vertx/src/main/java/org/jboss/resteasy/reactive/server/vertx/VertxResteasyReactiveRequestContext.java +++ b/independent-projects/resteasy-reactive/server/vertx/src/main/java/org/jboss/resteasy/reactive/server/vertx/VertxResteasyReactiveRequestContext.java @@ -29,10 +29,12 @@ import io.netty.buffer.Unpooled; import io.netty.channel.EventLoop; import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.util.concurrent.ScheduledFuture; import io.vertx.core.AsyncResult; import io.vertx.core.Context; import io.vertx.core.Handler; +import io.vertx.core.MultiMap; import io.vertx.core.Vertx; import io.vertx.core.buffer.Buffer; import io.vertx.core.http.HttpServerRequest; @@ -107,6 +109,16 @@ public ServerHttpResponse serverResponse() { return this; } + @Override + protected void setQueryParamsFrom(String uri) { + MultiMap map = context.queryParams(); + map.clear(); + Map> decodedParams = new QueryStringDecoder(uri).parameters(); + for (Map.Entry> entry : decodedParams.entrySet()) { + map.add(entry.getKey(), entry.getValue()); + } + } + @Override protected EventLoop getEventLoop() { return ((ConnectionBase) context.request().connection()).channel().eventLoop(); diff --git a/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/resource/basic/RequestFilterQueryParamsTest.java b/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/resource/basic/RequestFilterQueryParamsTest.java new file mode 100644 index 0000000000000..130f8c79598bf --- /dev/null +++ b/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/resource/basic/RequestFilterQueryParamsTest.java @@ -0,0 +1,66 @@ +package org.jboss.resteasy.reactive.server.vertx.test.resource.basic; + +import static io.restassured.RestAssured.get; + +import java.io.IOException; +import java.net.URI; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.ext.Provider; + +import org.hamcrest.Matchers; +import org.jboss.resteasy.reactive.server.vertx.test.framework.ResteasyReactiveUnitTest; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class RequestFilterQueryParamsTest { + + @RegisterExtension + static ResteasyReactiveUnitTest test = new ResteasyReactiveUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(BlockingHelloResource.class, ReplacePathAndQueryParamsFilter.class)); + + @Test + public void test() { + get("/dummy") + .then() + .statusCode(200) + .body(Matchers.equalTo("Hello filter")); + } + + @Path("hello") + public static class BlockingHelloResource { + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String hello(@QueryParam("name") @DefaultValue("world") String name) { + return "Hello " + name; + } + } + + @Provider + @PreMatching + public static class ReplacePathAndQueryParamsFilter implements ContainerRequestFilter { + + @Override + public void filter(ContainerRequestContext requestContext) + throws IOException { + UriBuilder builder = requestContext.getUriInfo().getRequestUriBuilder(); + builder.replacePath("/hello"); + builder.replaceQueryParam("name", "filter"); + URI uri = builder.build(); + requestContext.setRequestUri(uri); + } + } +} diff --git a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle-kotlin-dsl/base/build-layout.include.qute b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle-kotlin-dsl/base/build-layout.include.qute index c479f7a41d5e6..3b643510d09a4 100644 --- a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle-kotlin-dsl/base/build-layout.include.qute +++ b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle-kotlin-dsl/base/build-layout.include.qute @@ -59,3 +59,7 @@ java { {/if} } {/} + +tasks.withType { + systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager") +} \ No newline at end of file diff --git a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle/base/build-layout.include.qute b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle/base/build-layout.include.qute index de2062542adfb..53c267137122b 100644 --- a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle/base/build-layout.include.qute +++ b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle/base/build-layout.include.qute @@ -55,3 +55,7 @@ java { {/if} } {/} + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/independent-projects/tools/pom.xml b/independent-projects/tools/pom.xml index ec81155d7ba80..e837c2a9c0dcf 100644 --- a/independent-projects/tools/pom.xml +++ b/independent-projects/tools/pom.xml @@ -49,7 +49,7 @@ 3.23.1 - 2.13.4 + 2.13.4.20221013 2.0.2 5.9.1 1.21 diff --git a/integration-tests/csrf-reactive/src/main/java/io/quarkus/it/csrf/TestResource.java b/integration-tests/csrf-reactive/src/main/java/io/quarkus/it/csrf/TestResource.java index 3e836c35f093c..b89d7a18cb771 100644 --- a/integration-tests/csrf-reactive/src/main/java/io/quarkus/it/csrf/TestResource.java +++ b/integration-tests/csrf-reactive/src/main/java/io/quarkus/it/csrf/TestResource.java @@ -2,11 +2,13 @@ import javax.inject.Inject; import javax.ws.rs.Consumes; +import javax.ws.rs.CookieParam; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.Cookie; import javax.ws.rs.core.MediaType; import io.quarkus.qute.Template; @@ -17,7 +19,10 @@ public class TestResource { @Inject - Template csrfToken; + Template csrfTokenForm; + + @Inject + Template csrfTokenMultipart; @Inject RoutingContext routingContext; @@ -26,7 +31,7 @@ public class TestResource { @Path("/csrfTokenForm") @Produces(MediaType.TEXT_HTML) public TemplateInstance getCsrfTokenForm() { - return csrfToken.instance(); + return csrfTokenForm.instance(); } @POST @@ -37,6 +42,23 @@ public String postCsrfTokenForm(@FormParam("name") String name) { return name + ":" + routingContext.get("csrf_token_verified", false); } + @GET + @Path("/csrfTokenMultipart") + @Produces(MediaType.TEXT_HTML) + public TemplateInstance getCsrfTokenMultipart() { + return csrfTokenMultipart.instance(); + } + + @POST + @Path("/csrfTokenMultipart") + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_PLAIN) + public String postCsrfTokenMultipart(@FormParam("name") String name, + @FormParam("csrf-token") String csrfTokenParam, @CookieParam("csrftoken") Cookie csrfTokenCookie) { + return name + ":" + routingContext.get("csrf_token_verified", false) + ":" + + csrfTokenCookie.getValue().equals(csrfTokenParam); + } + @GET @Path("/hello") @Produces(MediaType.TEXT_PLAIN) diff --git a/integration-tests/csrf-reactive/src/main/resources/application.properties b/integration-tests/csrf-reactive/src/main/resources/application.properties index 7eb09958a644e..51b5ef2d43707 100644 --- a/integration-tests/csrf-reactive/src/main/resources/application.properties +++ b/integration-tests/csrf-reactive/src/main/resources/application.properties @@ -1,2 +1,3 @@ quarkus.csrf-reactive.cookie-name=csrftoken -quarkus.csrf-reactive.create-token-path=/service/csrfTokenForm +quarkus.csrf-reactive.create-token-path=/service/csrfTokenForm,/service/csrfTokenMultipart + diff --git a/integration-tests/csrf-reactive/src/main/resources/templates/csrfToken.html b/integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenForm.html similarity index 91% rename from integration-tests/csrf-reactive/src/main/resources/templates/csrfToken.html rename to integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenForm.html index 1952079e6874e..0eb2ce60791f1 100644 --- a/integration-tests/csrf-reactive/src/main/resources/templates/csrfToken.html +++ b/integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenForm.html @@ -2,7 +2,7 @@ -CSRF Token Test +CSRF Token Form Test

CSRF Test

diff --git a/integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenMultipart.html b/integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenMultipart.html new file mode 100644 index 0000000000000..b3425d7fdb6c6 --- /dev/null +++ b/integration-tests/csrf-reactive/src/main/resources/templates/csrfTokenMultipart.html @@ -0,0 +1,17 @@ + + + + +CSRF Token Multipart Test + + +

CSRF Test

+ +
+ + +

Your Name:

+

+
+ + diff --git a/integration-tests/csrf-reactive/src/test/java/io/quarkus/it/csrf/CsrfReactiveTest.java b/integration-tests/csrf-reactive/src/test/java/io/quarkus/it/csrf/CsrfReactiveTest.java index 84359494b1955..2e2998f0ddafc 100644 --- a/integration-tests/csrf-reactive/src/test/java/io/quarkus/it/csrf/CsrfReactiveTest.java +++ b/integration-tests/csrf-reactive/src/test/java/io/quarkus/it/csrf/CsrfReactiveTest.java @@ -22,12 +22,12 @@ public class CsrfReactiveTest { @Test - public void testCsrfToken() throws Exception { + public void testCsrfTokenInForm() throws Exception { try (final WebClient webClient = createWebClient()) { HtmlPage htmlPage = webClient.getPage("http://localhost:8081/service/csrfTokenForm"); - assertEquals("CSRF Token Test", htmlPage.getTitleText()); + assertEquals("CSRF Token Form Test", htmlPage.getTitleText()); HtmlForm loginForm = htmlPage.getForms().get(0); @@ -52,7 +52,7 @@ public void testCsrfTokenInFormButNoCookie() throws Exception { HtmlPage htmlPage = webClient.getPage("http://localhost:8081/service/csrfTokenForm"); - assertEquals("CSRF Token Test", htmlPage.getTitleText()); + assertEquals("CSRF Token Form Test", htmlPage.getTitleText()); HtmlForm loginForm = htmlPage.getForms().get(0); @@ -73,13 +73,38 @@ public void testCsrfTokenInFormButNoCookie() throws Exception { } } + @Test + public void testCsrfTokenInMultipart() throws Exception { + try (final WebClient webClient = createWebClient()) { + + HtmlPage htmlPage = webClient.getPage("http://localhost:8081/service/csrfTokenMultipart"); + + assertEquals("CSRF Token Multipart Test", htmlPage.getTitleText()); + + HtmlForm loginForm = htmlPage.getForms().get(0); + + loginForm.getInputByName("name").setValueAttribute("alice"); + + assertNotNull(webClient.getCookieManager().getCookie("csrftoken")); + + TextPage textPage = loginForm.getInputByName("submit").click(); + + assertEquals("alice:true:true", textPage.getContent()); + + textPage = webClient.getPage("http://localhost:8081/service/hello"); + assertEquals("hello", textPage.getContent()); + + webClient.getCookieManager().clearCookies(); + } + } + @Test public void testWrongCsrfTokenCookieValue() throws Exception { try (final WebClient webClient = createWebClient()) { HtmlPage htmlPage = webClient.getPage("http://localhost:8081/service/csrfTokenForm"); - assertEquals("CSRF Token Test", htmlPage.getTitleText()); + assertEquals("CSRF Token Form Test", htmlPage.getTitleText()); HtmlForm loginForm = htmlPage.getForms().get(0); @@ -109,7 +134,7 @@ public void testWrongCsrfTokenFormValue() throws Exception { HtmlPage htmlPage = webClient.getPage("http://localhost:8081/service/csrfTokenForm"); - assertEquals("CSRF Token Test", htmlPage.getTitleText()); + assertEquals("CSRF Token Form Test", htmlPage.getTitleText()); assertNotNull(webClient.getCookieManager().getCookie("csrftoken")); diff --git a/integration-tests/gradle/src/main/resources/add-extension-multi-module-kts/build.gradle.kts b/integration-tests/gradle/src/main/resources/add-extension-multi-module-kts/build.gradle.kts index 4487c65225990..59c9fd2289ee3 100644 --- a/integration-tests/gradle/src/main/resources/add-extension-multi-module-kts/build.gradle.kts +++ b/integration-tests/gradle/src/main/resources/add-extension-multi-module-kts/build.gradle.kts @@ -34,6 +34,7 @@ subprojects { dependsOn("cleanTest") useJUnitPlatform() setForkEvery(1) + systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager") } } diff --git a/integration-tests/gradle/src/main/resources/add-extension-multi-module/build.gradle b/integration-tests/gradle/src/main/resources/add-extension-multi-module/build.gradle index ed221683d6fd5..624f79ca01176 100644 --- a/integration-tests/gradle/src/main/resources/add-extension-multi-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/add-extension-multi-module/build.gradle @@ -31,6 +31,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/add-remove-extension-single-module-kts/build.gradle.kts b/integration-tests/gradle/src/main/resources/add-remove-extension-single-module-kts/build.gradle.kts index 1e0d49405b3e8..26749c45d7413 100644 --- a/integration-tests/gradle/src/main/resources/add-remove-extension-single-module-kts/build.gradle.kts +++ b/integration-tests/gradle/src/main/resources/add-remove-extension-single-module-kts/build.gradle.kts @@ -31,3 +31,7 @@ tasks.withType { options.encoding = "UTF-8" options.compilerArgs.add("-parameters") } + +tasks.withType { + systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager") +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/add-remove-extension-single-module/build.gradle b/integration-tests/gradle/src/main/resources/add-remove-extension-single-module/build.gradle index b48ff0734cec8..8eb1883b4f761 100644 --- a/integration-tests/gradle/src/main/resources/add-remove-extension-single-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/add-remove-extension-single-module/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/additional-source-sets/build.gradle b/integration-tests/gradle/src/main/resources/additional-source-sets/build.gradle index 114da02059c66..82afdbf6beb8c 100644 --- a/integration-tests/gradle/src/main/resources/additional-source-sets/build.gradle +++ b/integration-tests/gradle/src/main/resources/additional-source-sets/build.gradle @@ -51,4 +51,9 @@ task functionalTest(type: Test, description: 'Functional tests', dependsOn: [pro showStandardStreams = true } systemProperty 'quarkus.http.host', 'localhost' + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/build.gradle b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/build.gradle index 14b143d580117..808d4f4565086 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/annotation-processor-multi-module/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/build.gradle b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/build.gradle index 7bf376105146c..87af2bc06507d 100644 --- a/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/annotation-processor-simple-module/build.gradle @@ -10,6 +10,7 @@ test { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/basic-java-application-project/build.gradle b/integration-tests/gradle/src/main/resources/basic-java-application-project/build.gradle index b419868a8d7cf..001218177827e 100644 --- a/integration-tests/gradle/src/main/resources/basic-java-application-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-java-application-project/build.gradle @@ -32,3 +32,7 @@ run { systemProperty 'maven.repo.local', System.properties.get('maven.repo.local') } } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/basic-java-library-module/application/build.gradle b/integration-tests/gradle/src/main/resources/basic-java-library-module/application/build.gradle index e1da8c5688666..ff10989e6253c 100644 --- a/integration-tests/gradle/src/main/resources/basic-java-library-module/application/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-java-library-module/application/build.gradle @@ -25,3 +25,7 @@ dependencies { compileJava { options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/basic-java-native-module/build.gradle b/integration-tests/gradle/src/main/resources/basic-java-native-module/build.gradle index 64bd833c28571..a205dc2e19ee5 100644 --- a/integration-tests/gradle/src/main/resources/basic-java-native-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-java-native-module/build.gradle @@ -34,3 +34,7 @@ quarkusBuild { additionalArgs= ["--verbose"] } } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/basic-java-platform-module/application/build.gradle b/integration-tests/gradle/src/main/resources/basic-java-platform-module/application/build.gradle index 2211d80c2c3d7..a5077c2d73577 100644 --- a/integration-tests/gradle/src/main/resources/basic-java-platform-module/application/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-java-platform-module/application/build.gradle @@ -24,3 +24,7 @@ dependencies { compileJava { options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/basic-java-platform-module/build.gradle b/integration-tests/gradle/src/main/resources/basic-java-platform-module/build.gradle index 9a8ffae193ca8..fdc9c6e3f00f7 100644 --- a/integration-tests/gradle/src/main/resources/basic-java-platform-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-java-platform-module/build.gradle @@ -23,4 +23,5 @@ subprojects{ } mavenCentral() } + } diff --git a/integration-tests/gradle/src/main/resources/basic-kotlin-application-project/build.gradle b/integration-tests/gradle/src/main/resources/basic-kotlin-application-project/build.gradle index f137e7da00ebf..d5555df33d212 100644 --- a/integration-tests/gradle/src/main/resources/basic-kotlin-application-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-kotlin-application-project/build.gradle @@ -22,3 +22,7 @@ dependencies { compileJava { options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/basic-multi-module-project-test-setup/build.gradle b/integration-tests/gradle/src/main/resources/basic-multi-module-project-test-setup/build.gradle index fd06b14577014..35dfbb1ba17e8 100644 --- a/integration-tests/gradle/src/main/resources/basic-multi-module-project-test-setup/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-multi-module-project-test-setup/build.gradle @@ -27,6 +27,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/basic-multi-module-project/build.gradle b/integration-tests/gradle/src/main/resources/basic-multi-module-project/build.gradle index 14b143d580117..808d4f4565086 100644 --- a/integration-tests/gradle/src/main/resources/basic-multi-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/basic-multi-module-project/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/bean-in-testsources-project/build.gradle b/integration-tests/gradle/src/main/resources/bean-in-testsources-project/build.gradle index a62a88f6f7d97..f1918d0e21491 100644 --- a/integration-tests/gradle/src/main/resources/bean-in-testsources-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/bean-in-testsources-project/build.gradle @@ -44,3 +44,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/builder/multi-module-project/build.gradle b/integration-tests/gradle/src/main/resources/builder/multi-module-project/build.gradle index ce18c2c3e0ef4..deb1de21224ca 100644 --- a/integration-tests/gradle/src/main/resources/builder/multi-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/builder/multi-module-project/build.gradle @@ -15,6 +15,9 @@ subprojects { implementation enforcedPlatform("io.quarkus:quarkus-bom:${quarkusPlatformVersion}") } + test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" + } } group 'org.acme' diff --git a/integration-tests/gradle/src/main/resources/builder/simple-module-project/build.gradle b/integration-tests/gradle/src/main/resources/builder/simple-module-project/build.gradle index 50c8b19cbecf6..15c067cb1f5d5 100644 --- a/integration-tests/gradle/src/main/resources/builder/simple-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/builder/simple-module-project/build.gradle @@ -23,3 +23,7 @@ version '1.0-SNAPSHOT' compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-dao/build.gradle b/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-dao/build.gradle index 1154fdcc1e7a0..9b23e6a3b0e3b 100644 --- a/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-dao/build.gradle +++ b/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-dao/build.gradle @@ -33,3 +33,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-rest/build.gradle b/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-rest/build.gradle index 932e44b26c951..600011ad38dc0 100644 --- a/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-rest/build.gradle +++ b/integration-tests/gradle/src/main/resources/composite-project-with-dependencies/gradle-rest/build.gradle @@ -33,3 +33,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/conditional-test-project/build.gradle b/integration-tests/gradle/src/main/resources/conditional-test-project/build.gradle index a99b228610181..f77983c869ccf 100644 --- a/integration-tests/gradle/src/main/resources/conditional-test-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/conditional-test-project/build.gradle @@ -11,4 +11,8 @@ repositories { } } mavenCentral() +} + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/configuration-inheritance-project/build.gradle b/integration-tests/gradle/src/main/resources/configuration-inheritance-project/build.gradle index bb1684b11a13e..ea21c048c63d7 100644 --- a/integration-tests/gradle/src/main/resources/configuration-inheritance-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/configuration-inheritance-project/build.gradle @@ -26,3 +26,6 @@ dependencies { testImplementation 'org.apache.commons:commons-collections4::tests' } +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/custom-config-java-module/build.gradle b/integration-tests/gradle/src/main/resources/custom-config-java-module/build.gradle index 8836c7dc4385e..6befe0a18aae1 100644 --- a/integration-tests/gradle/src/main/resources/custom-config-java-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/custom-config-java-module/build.gradle @@ -41,3 +41,7 @@ quarkusBuild { attributes(['framework': 'quarkus'], 'org.acme') } } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/custom-filesystem-provider/build.gradle b/integration-tests/gradle/src/main/resources/custom-filesystem-provider/build.gradle index 63ee9a191c3b8..a19bc40ed1121 100644 --- a/integration-tests/gradle/src/main/resources/custom-filesystem-provider/build.gradle +++ b/integration-tests/gradle/src/main/resources/custom-filesystem-provider/build.gradle @@ -26,6 +26,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/custom-java-native-sourceset-module/build.gradle b/integration-tests/gradle/src/main/resources/custom-java-native-sourceset-module/build.gradle index 762beb11df6a7..b5177659f6239 100644 --- a/integration-tests/gradle/src/main/resources/custom-java-native-sourceset-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/custom-java-native-sourceset-module/build.gradle @@ -51,3 +51,7 @@ quarkusBuild { additionalArgs= ["--verbose"] } } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/custom-working-dir-app/build.gradle b/integration-tests/gradle/src/main/resources/custom-working-dir-app/build.gradle index c106c3a43c5a5..894683709d7ef 100644 --- a/integration-tests/gradle/src/main/resources/custom-working-dir-app/build.gradle +++ b/integration-tests/gradle/src/main/resources/custom-working-dir-app/build.gradle @@ -24,3 +24,6 @@ dependencies { implementation 'io.quarkus:quarkus-resteasy' } +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/dependency-constraints-project/build.gradle b/integration-tests/gradle/src/main/resources/dependency-constraints-project/build.gradle index 71e66b2faafee..ddc36ff83fe0b 100644 --- a/integration-tests/gradle/src/main/resources/dependency-constraints-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/dependency-constraints-project/build.gradle @@ -26,3 +26,6 @@ dependencies { implementation 'javax.json.bind:javax.json.bind-api' } +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/dotenv-config-java-module/build.gradle b/integration-tests/gradle/src/main/resources/dotenv-config-java-module/build.gradle index 8939d5fa545bc..cee84de50782d 100644 --- a/integration-tests/gradle/src/main/resources/dotenv-config-java-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/dotenv-config-java-module/build.gradle @@ -32,3 +32,7 @@ compileTestJava { quarkusDev { workingDir = System.getProperty("java.io.tmpdir") } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/extensions/simple-extension/build.gradle b/integration-tests/gradle/src/main/resources/extensions/simple-extension/build.gradle index 5209aed3b9ec5..bb7d195b2d00a 100644 --- a/integration-tests/gradle/src/main/resources/extensions/simple-extension/build.gradle +++ b/integration-tests/gradle/src/main/resources/extensions/simple-extension/build.gradle @@ -10,4 +10,8 @@ subprojects { } mavenCentral() } + + test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" + } } diff --git a/integration-tests/gradle/src/main/resources/grpc-multi-module-project/build.gradle b/integration-tests/gradle/src/main/resources/grpc-multi-module-project/build.gradle index 5cdd5de7bd9ea..b82b3fa58c021 100644 --- a/integration-tests/gradle/src/main/resources/grpc-multi-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/grpc-multi-module-project/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/implementation-files/build.gradle b/integration-tests/gradle/src/main/resources/implementation-files/build.gradle index 5b2f3a5498f5a..42a0640ea6ef7 100644 --- a/integration-tests/gradle/src/main/resources/implementation-files/build.gradle +++ b/integration-tests/gradle/src/main/resources/implementation-files/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/integration-tests/gradle/src/main/resources/inject-bean-from-test-config/application/build.gradle b/integration-tests/gradle/src/main/resources/inject-bean-from-test-config/application/build.gradle index ada294592de5d..20cb3a454ae3e 100644 --- a/integration-tests/gradle/src/main/resources/inject-bean-from-test-config/application/build.gradle +++ b/integration-tests/gradle/src/main/resources/inject-bean-from-test-config/application/build.gradle @@ -26,3 +26,7 @@ dependencies { compileJava { options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/inject-quarkus-app-properties/build.gradle b/integration-tests/gradle/src/main/resources/inject-quarkus-app-properties/build.gradle index b48ff0734cec8..5344bbba124b4 100644 --- a/integration-tests/gradle/src/main/resources/inject-quarkus-app-properties/build.gradle +++ b/integration-tests/gradle/src/main/resources/inject-quarkus-app-properties/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/it-test-basic-project/build.gradle b/integration-tests/gradle/src/main/resources/it-test-basic-project/build.gradle index b48ff0734cec8..5344bbba124b4 100644 --- a/integration-tests/gradle/src/main/resources/it-test-basic-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/it-test-basic-project/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/jandex-basic-multi-module-project/build.gradle b/integration-tests/gradle/src/main/resources/jandex-basic-multi-module-project/build.gradle index ac6fbff6d5181..a660532cd5b07 100644 --- a/integration-tests/gradle/src/main/resources/jandex-basic-multi-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/jandex-basic-multi-module-project/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { @@ -40,4 +41,5 @@ subprojects { implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") } -} + +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/list-extension-single-module/build.gradle b/integration-tests/gradle/src/main/resources/list-extension-single-module/build.gradle index f39042bb09cae..110cc3b36476f 100644 --- a/integration-tests/gradle/src/main/resources/list-extension-single-module/build.gradle +++ b/integration-tests/gradle/src/main/resources/list-extension-single-module/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/multi-module-included-build/app/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-included-build/app/build.gradle index 6cdbc42da677b..25fcdfb7b3aec 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-included-build/app/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-included-build/app/build.gradle @@ -25,3 +25,7 @@ compileJava { options.encoding = 'UTF-8' options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/multi-module-included-build/external-library/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-included-build/external-library/build.gradle index 08fdcceb1726b..a011dcbeb53bf 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-included-build/external-library/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-included-build/external-library/build.gradle @@ -23,3 +23,7 @@ compileJava { options.encoding = 'UTF-8' options.compilerArgs << '-parameters' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/multi-module-named-injection/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-named-injection/build.gradle index 8c97c86a5a08d..143c56b3bd0a9 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-named-injection/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-named-injection/build.gradle @@ -12,3 +12,4 @@ repositories { group 'org.acme' version '1.0.0-SNAPSHOT' + diff --git a/integration-tests/gradle/src/main/resources/multi-module-named-injection/quarkus/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-named-injection/quarkus/build.gradle index 7c24937fa94a0..b4e232e9f2e66 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-named-injection/quarkus/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-named-injection/quarkus/build.gradle @@ -34,3 +34,7 @@ compileTestJava { test { systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/app/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/app/build.gradle index f40c12cd0679e..104f18f73c5b9 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/app/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/app/build.gradle @@ -29,3 +29,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/build.gradle b/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/build.gradle index 31279ba048535..a9e16aa2b1c09 100644 --- a/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/build.gradle +++ b/integration-tests/gradle/src/main/resources/multi-module-parent-dependency/build.gradle @@ -15,5 +15,7 @@ subprojects { } mavenCentral() } + + } diff --git a/integration-tests/gradle/src/main/resources/mutable-jar/build.gradle b/integration-tests/gradle/src/main/resources/mutable-jar/build.gradle index b48ff0734cec8..8eb1883b4f761 100644 --- a/integration-tests/gradle/src/main/resources/mutable-jar/build.gradle +++ b/integration-tests/gradle/src/main/resources/mutable-jar/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/quarkus-dev-dependency/build.gradle b/integration-tests/gradle/src/main/resources/quarkus-dev-dependency/build.gradle index f04d43aa88cbd..413a59cb3998a 100644 --- a/integration-tests/gradle/src/main/resources/quarkus-dev-dependency/build.gradle +++ b/integration-tests/gradle/src/main/resources/quarkus-dev-dependency/build.gradle @@ -35,3 +35,7 @@ run { systemProperty 'maven.repo.local', System.properties.get('maven.repo.local') } } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/spring-dependency-plugin-project/build.gradle b/integration-tests/gradle/src/main/resources/spring-dependency-plugin-project/build.gradle index 387268f74a956..5b131c4823ad6 100644 --- a/integration-tests/gradle/src/main/resources/spring-dependency-plugin-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/spring-dependency-plugin-project/build.gradle @@ -29,4 +29,8 @@ dependencies { compileJava { options.compilerArgs << '-parameters' +} + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/test-resources-in-build-steps/build.gradle b/integration-tests/gradle/src/main/resources/test-resources-in-build-steps/build.gradle index 29e89df52bb10..9423450c36d63 100644 --- a/integration-tests/gradle/src/main/resources/test-resources-in-build-steps/build.gradle +++ b/integration-tests/gradle/src/main/resources/test-resources-in-build-steps/build.gradle @@ -29,4 +29,8 @@ subprojects { } mavenCentral() } + + test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" + } } diff --git a/integration-tests/gradle/src/main/resources/test-resources-vs-main-resources/build.gradle b/integration-tests/gradle/src/main/resources/test-resources-vs-main-resources/build.gradle index b48ff0734cec8..5344bbba124b4 100644 --- a/integration-tests/gradle/src/main/resources/test-resources-vs-main-resources/build.gradle +++ b/integration-tests/gradle/src/main/resources/test-resources-vs-main-resources/build.gradle @@ -31,3 +31,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/test-that-fast-jar-format-works/build.gradle b/integration-tests/gradle/src/main/resources/test-that-fast-jar-format-works/build.gradle index be3541f14760f..af30d8fba3100 100644 --- a/integration-tests/gradle/src/main/resources/test-that-fast-jar-format-works/build.gradle +++ b/integration-tests/gradle/src/main/resources/test-that-fast-jar-format-works/build.gradle @@ -28,3 +28,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/test-that-legacy-jar-format-works/build.gradle b/integration-tests/gradle/src/main/resources/test-that-legacy-jar-format-works/build.gradle index be3541f14760f..ac89bc74a00f2 100644 --- a/integration-tests/gradle/src/main/resources/test-that-legacy-jar-format-works/build.gradle +++ b/integration-tests/gradle/src/main/resources/test-that-legacy-jar-format-works/build.gradle @@ -28,3 +28,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} diff --git a/integration-tests/gradle/src/main/resources/test-uber-jar-format-works/build.gradle b/integration-tests/gradle/src/main/resources/test-uber-jar-format-works/build.gradle index be3541f14760f..af30d8fba3100 100644 --- a/integration-tests/gradle/src/main/resources/test-uber-jar-format-works/build.gradle +++ b/integration-tests/gradle/src/main/resources/test-uber-jar-format-works/build.gradle @@ -28,3 +28,7 @@ compileJava { compileTestJava { options.encoding = 'UTF-8' } + +test { + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" +} \ No newline at end of file diff --git a/integration-tests/gradle/src/main/resources/uber-jar-for-multi-module-project/build.gradle b/integration-tests/gradle/src/main/resources/uber-jar-for-multi-module-project/build.gradle index ac6fbff6d5181..63779769696e1 100644 --- a/integration-tests/gradle/src/main/resources/uber-jar-for-multi-module-project/build.gradle +++ b/integration-tests/gradle/src/main/resources/uber-jar-for-multi-module-project/build.gradle @@ -24,6 +24,7 @@ subprojects { dependsOn 'cleanTest' useJUnitPlatform() forkEvery 1 + systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" } repositories { diff --git a/jakarta/rewrite.yml b/jakarta/rewrite.yml index 8b37a399dfdc6..2a91603ad2fcf 100644 --- a/jakarta/rewrite.yml +++ b/jakarta/rewrite.yml @@ -594,7 +594,7 @@ recipeList: newValue: 3.0.0-RC1 - org.openrewrite.maven.ChangePropertyValue: key: smallrye-reactive-messaging.version - newValue: 4.0.0.RC1 + newValue: 4.0.0 - org.openrewrite.maven.ChangePropertyValue: key: microprofile-rest-client.version newValue: 3.0 @@ -646,7 +646,7 @@ recipeList: newValue: 3.0 - org.openrewrite.maven.ChangePropertyValue: key: microprofile-reactive-messaging-tck.version - newValue: 3.0-RC2 + newValue: 3.0 - org.openrewrite.maven.ChangePropertyValue: key: microprofile-rest-client-tck.version newValue: 3.0