Skip to content

Commit

Permalink
Clarify the contract of features and capabilities
Browse files Browse the repository at this point in the history
- introduce enums for core extensions
- validate duplicate features
  • Loading branch information
mkouba committed Jun 3, 2020
1 parent 5b4683d commit 069e436
Show file tree
Hide file tree
Showing 134 changed files with 668 additions and 391 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,17 @@
import java.util.Set;

import io.quarkus.builder.item.SimpleBuildItem;
import io.quarkus.deployment.builditem.CapabilityBuildItem;

/**
* The list of capabilities.
* This build items holds the set of registered capabilities.
*
* @see CapabilityBuildItem
*/
public final class Capabilities extends SimpleBuildItem {

public static final String AGROAL = "io.quarkus.agroal";
public static final String CDI_ARC = "io.quarkus.cdi";
public static final String SERVLET = "io.quarkus.servlet";
public static final String TRANSACTIONS = "io.quarkus.transactions";
public static final String JACKSON = "io.quarkus.jackson";
public static final String JSONB = "io.quarkus.jsonb";
public static final String REST_JACKSON = "io.quarkus.rest.jackson";
public static final String REST_JSONB = "io.quarkus.rest.jsonb";
public static final String RESTEASY_JSON_EXTENSION = "io.quarkus.resteasy-json";
public static final String RESTEASY = "io.quarkus.resteasy";
public static final String JWT = "io.quarkus.jwt";
public static final String TIKA = "io.quarkus.tika";
public static final String MONGODB_PANACHE = "io.quarkus.mongodb.panache";
public static final String FLYWAY = "io.quarkus.flyway";
public static final String LIQUIBASE = "io.quarkus.liquibase";
public static final String SECURITY = "io.quarkus.security";
public static final String SECURITY_ELYTRON_OAUTH2 = "io.quarkus.elytron.security.oauth2";
public static final String SECURITY_ELYTRON_JDBC = "io.quarkus.elytron.security.jdbc";
public static final String SECURITY_ELYTRON_LDAP = "io.quarkus.elytron.security.ldap";
public static final String SECURITY_JPA = "io.quarkus.security.jpa";
public static final String QUARTZ = "io.quarkus.quartz";
public static final String METRICS = "io.quarkus.metrics";
public static final String RESTEASY_MUTINY_EXTENSION = "io.quarkus.resteasy-mutiny";
public static final String CONTAINER_IMAGE_JIB = "io.quarkus.container-image-jib";
public static final String CONTAINER_IMAGE_DOCKER = "io.quarkus.container-image-docker";
public static final String CONTAINER_IMAGE_S2I = "io.quarkus.container-image-s2i";
public static final String HIBERNATE_ORM = "io.quarkus.hibernate-orm";
public static final String SMALLRYE_OPENTRACING = "io.quarkus.opentracing";

private final Set<String> capabilities;

public boolean isCapabilityPresent(String capability) {
return capabilities.contains(capability);
}

public Capabilities(Set<String> capabilities) {
this.capabilities = capabilities;
}
Expand All @@ -52,4 +22,20 @@ public Set<String> getCapabilities() {
return capabilities;
}

public boolean isPresent(Capability capability) {
return isPresent(capability.getName());
}

public boolean isPresent(String capability) {
return capabilities.contains(capability);
}

public boolean isMissing(String capability) {
return !isPresent(capability);
}

public boolean isMissing(Capability capability) {
return isMissing(capability.getName());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package io.quarkus.deployment;

/**
* Represents a capability of a core extension.
*/
public enum Capability {

/**
* A datasource connection pool implementation
*/
AGROAL,
/**
* JSR 365 compatible contexts and dependency injection
*/
CDI,
/**
* Java Servlet API
*/
SERVLET,
/**
* Java Transaction API (JTA)
*/
TRANSACTIONS,
JACKSON,
JSONB,
REST_JACKSON,
REST_JSONB,
RESTEASY,
RESTEASY_JSON,
RESTEASY_MUTINY,
JWT,
TIKA,
MONGODB_PANACHE,
FLYWAY,
LIQUIBASE,
SECURITY,
SECURITY_ELYTRON_OAUTH2,
SECURITY_ELYTRON_JDBC,
SECURITY_ELYTRON_LDAP,
SECURITY_JPA,
QUARTZ,
METRICS,
CONTAINER_IMAGE_JIB,
CONTAINER_IMAGE_DOCKER,
CONTAINER_IMAGE_S2I,
HIBERNATE_ORM,
SMALLRYE_OPENTRACING,
;

/**
*
* @return the name
*/
public String getName() {
return "io.quarkus." + toString().toLowerCase().replace("_", ".");
}

}
123 changes: 123 additions & 0 deletions core/deployment/src/main/java/io/quarkus/deployment/Feature.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package io.quarkus.deployment;

import io.quarkus.deployment.builditem.FeatureBuildItem;

/**
* Represents a feature provided by a core extension.
*
* @see FeatureBuildItem
*/
public enum Feature {

AGROAL,
AMAZON_DYNAMODB,
AMAZON_LAMBDA,
AMAZON_S3,
AMAZON_SNS,
AMAZON_SQS,
AMAZON_SES,
AMAZON_KMS,
ARTEMIS_CORE,
ARTEMIS_JMS,
CACHE,
CDI,
CONFIG_YAML,
CONSUL_CONFIG,
ELASTICSEARCH_REST_CLIENT,
FLYWAY,
GRPC_CLIENT,
GRPC_SERVER,
HIBERNATE_ORM,
HIBERNATE_ORM_PANACHE,
HIBERNATE_ORM_PANACHE_KOTLIN,
HIBERNATE_ORM_REST_DATA_PANACHE,
HIBERNATE_VALIDATOR,
HIBERNATE_SEARCH_ELASTICSEARCH,
INFINISPAN_CLIENT,
INFINISPAN_EMBEDDED,
JAEGER,
JDBC_DERBY,
JDBC_H2,
JDBC_POSTGRESQL,
JDBC_MARIADB,
JDBC_MSSQL,
JDBC_MYSQL,
JGIT,
JSCH,
KAFKA_STREAMS,
KEYCLOAK_AUTHORIZATION,
KOTLIN,
KUBERNETES,
KUBERNETES_CLIENT,
LIQUIBASE,
LOGGING_GELF,
MAILER,
MONGODB_CLIENT,
MONGODB_PANACHE,
MUTINY,
NARAYANA_JTA,
NARAYANA_STM,
REACTIVE_PG_CLIENT,
REACTIVE_MYSQL_CLIENT,
NEO4J,
OIDC,
OPTAPLANNER,
OPTAPLANNER_JACKSON,
OPTAPLANNER_JSONB,
PICOCLI,
QUTE,
RESTEASY,
RESTEASY_JACKSON,
RESTEASY_JAXB,
RESTEASY_JSONB,
RESTEASY_MUTINY,
RESTEASY_QUTE,
REST_CLIENT,
REST_CLIENT_JACKSON,
REST_CLIENT_JAXB,
REST_CLIENT_JSONB,
SCALA,
SCHEDULER,
SECURITY,
SECURITY_JDBC,
SECURITY_LDAP,
SECURITY_JPA,
SECURITY_PROPERTIES_FILE,
SECURITY_OAUTH2,
SERVLET,
SMALLRYE_CONTEXT_PROPAGATION,
SMALLRYE_FAULT_TOLERANCE,
SMALLRYE_HEALTH,
SMALLRYE_JWT,
SMALLRYE_METRICS,
SMALLRYE_OPENAPI,
SMALLRYE_OPENTRACING,
SMALLRYE_REACTIVE_MESSAGING,
SMALLRYE_REACTIVE_MESSAGING_KAFKA,
SMALLRYE_REACTIVE_MESSAGING_AMQP,
SMALLRYE_REACTIVE_MESSAGING_MQTT,
SMALLRYE_REACTIVE_STREAMS_OPERATORS,
SMALLRYE_REACTIVE_TYPE_CONVERTERS,
SMALLRYE_GRAPHQL,
SPRING_DI,
SPRING_WEB,
SPRING_DATA_JPA,
SPRING_SECURITY,
SPRING_BOOT_PROPERTIES,
SPRING_CACHE,
SPRING_CLOUD_CONFIG_CLIENT,
SWAGGER_UI,
TIKA,
UNDERTOW_WEBSOCKETS,
VAULT,
VERTX,
VERTX_WEB,
VERTX_GRAPHQL,
WEBJARS_LOCATOR,
;

public String getName() {
return toString().toLowerCase().replace("_", "-");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,31 @@

import io.quarkus.builder.item.MultiBuildItem;
import io.quarkus.deployment.Capabilities;
import io.quarkus.deployment.Capability;

/**
* Registers an internal feature.
* Represents a technical capability that can be queried by other extensions.
* <p>
* Build steps can inject {@link Capabilities} - a convenient build item that holds the set of registered capabilities.
* <p>
* An extension may provide multiple capabilities. Multiple extensions can provide the same capability. By default, capabilities
* are not displayed to users.
* <p>
* Capabilities should follow the naming conventions of Java packages; e.g. {@code io.quarkus.security.jpa}. Capabilities
* provided by core extensions should be listed in the {@link Capability} enum and their name should always start with the
* {@code io.quarkus} prefix.
*
* @see Capabilities#isCapabilityPresent(String)
* @see Capabilities
* @see Capability
*/
public final class CapabilityBuildItem extends MultiBuildItem {

private final String name;

public CapabilityBuildItem(Capability capability) {
this(capability.getName());
}

public CapabilityBuildItem(String name) {
if (name == null) {
throw new IllegalArgumentException("name cannot be null");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package io.quarkus.deployment.builditem;

import io.quarkus.builder.item.MultiBuildItem;
import io.quarkus.deployment.Feature;

public final class ExtensionSslNativeSupportBuildItem extends MultiBuildItem {

private String extension;

public ExtensionSslNativeSupportBuildItem(Feature feature) {
this(feature.getName());
}

public ExtensionSslNativeSupportBuildItem(String extension) {
this.extension = extension;
}
Expand Down
Loading

0 comments on commit 069e436

Please sign in to comment.