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
- deprecate capabilities constants
- only extensions that use hard-coded string constants may be broken
(due to introduction of naming conventions)
  • Loading branch information
mkouba committed Jun 9, 2020
1 parent 4dc464a commit 770dbae
Show file tree
Hide file tree
Showing 138 changed files with 794 additions and 414 deletions.
115 changes: 81 additions & 34 deletions core/deployment/src/main/java/io/quarkus/deployment/Capabilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,75 @@
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";
public static final String HIBERNATE_REACTIVE = "io.quarkus.hibernate-reactive";
// The following constants will be removed at some point post Quarkus 1.6
@Deprecated
public static final String AGROAL = Capability.AGROAL.getName();
@Deprecated
public static final String CDI_ARC = Capability.CDI.getName();
@Deprecated
public static final String SERVLET = Capability.SERVLET.getName();
@Deprecated
public static final String TRANSACTIONS = Capability.TRANSACTIONS.getName();
@Deprecated
public static final String JACKSON = Capability.JACKSON.getName();
@Deprecated
public static final String JSONB = Capability.JSONB.getName();
@Deprecated
public static final String REST_JACKSON = Capability.REST_JACKSON.getName();
@Deprecated
public static final String REST_JSONB = Capability.REST_JSONB.getName();
@Deprecated
public static final String RESTEASY_JSON_EXTENSION = Capability.RESTEASY_JSON.getName();
@Deprecated
public static final String RESTEASY = Capability.RESTEASY.getName();
@Deprecated
public static final String JWT = Capability.JWT.getName();
@Deprecated
public static final String TIKA = Capability.TIKA.getName();
@Deprecated
public static final String MONGODB_PANACHE = Capability.MONGODB_PANACHE.getName();
@Deprecated
public static final String FLYWAY = Capability.FLYWAY.getName();
@Deprecated
public static final String LIQUIBASE = Capability.LIQUIBASE.getName();
@Deprecated
public static final String SECURITY = Capability.SECURITY.getName();
@Deprecated
public static final String SECURITY_ELYTRON_OAUTH2 = Capability.SECURITY_ELYTRON_OAUTH2.getName();
@Deprecated
public static final String SECURITY_ELYTRON_JDBC = Capability.SECURITY_ELYTRON_JDBC.getName();
@Deprecated
public static final String SECURITY_ELYTRON_LDAP = Capability.SECURITY_ELYTRON_LDAP.getName();
@Deprecated
public static final String SECURITY_JPA = Capability.SECURITY_JPA.getName();
@Deprecated
public static final String QUARTZ = Capability.QUARTZ.getName();
@Deprecated
public static final String METRICS = Capability.METRICS.getName();
@Deprecated
public static final String RESTEASY_MUTINY_EXTENSION = Capability.RESTEASY_MUTINY.getName();
@Deprecated
public static final String CONTAINER_IMAGE_JIB = Capability.CONTAINER_IMAGE_JIB.getName();
@Deprecated
public static final String CONTAINER_IMAGE_DOCKER = Capability.CONTAINER_IMAGE_DOCKER.getName();
@Deprecated
public static final String CONTAINER_IMAGE_S2I = Capability.CONTAINER_IMAGE_S2I.getName();
@Deprecated
public static final String HIBERNATE_ORM = Capability.HIBERNATE_ORM.getName();
@Deprecated
public static final String SMALLRYE_OPENTRACING = Capability.SMALLRYE_OPENTRACING.getName();

private final Set<String> capabilities;

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

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

public boolean isCapabilityPresent(String capability) {
return isPresent(capability);
}

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,59 @@
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,
HIBERNATE_REACTIVE,
SMALLRYE_OPENTRACING,
;

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

}
125 changes: 125 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,125 @@
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_REACTIVE,
HIBERNATE_SEARCH_ELASTICSEARCH,
HIBERNATE_VALIDATOR,
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,
REACTIVE_DB2_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 770dbae

Please sign in to comment.