Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[WFCORE-6750][Preview] Integrate the scanner for the unstable API annotations #5913

Merged
merged 3 commits into from
Jun 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,7 @@ public class ModelDescriptionConstants {
public static final String TYPE = "type";
public static final String UDP = "udp";
public static final String UNDEFINE_ATTRIBUTE_OPERATION = "undefine-attribute";
public static final String UNSTABLE_API_ANNOTATIONS = "unstable-api-annotations";
public static final String UNDEPLOY = "undeploy";
public static final String UNREADABLE_CHILDREN = "unreadable-children";
public static final String UPLOAD_DEPLOYMENT_BYTES = "upload-deployment-bytes";
Expand Down
5 changes: 5 additions & 0 deletions core-feature-pack/common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,11 @@
<groupId>org.wildfly.security</groupId>
<artifactId>wildfly-elytron-x500-principal</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.unstable.api.annotation</groupId>
<artifactId>unstable-api-annotation-classpath-indexer</artifactId>
</dependency>


<dependency>
<groupId>org.wildfly.core</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Comment to include file
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ Copyright The WildFly Authors
~ SPDX-License-Identifier: Apache-2.0
-->

<module xmlns="urn:jboss:module:1.9" name="org.wildfly._internal.unstable-api-annotation-index">

<properties>
<property name="jboss.api" value="private"/>
</properties>

<resources>
<resource-root path="content"></resource-root>
</resources>

<exports>
<include path="*"/>
<include path="**/*"/>
</exports>
</module>
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,19 @@
<dependencies>
<!-- for java.beans -->
<module name="java.desktop"/>
<module name="io.smallrye.jandex"/>
<module name="org.jboss.as.controller"/>
<module name="org.jboss.as.server" />
<module name="org.jboss.as.version" />
<module name="org.jboss.logging"/>
<module name="org.jboss.modules"/>
<module name="org.jboss.msc"/>
<module name="org.jboss.staxmapper"/>
<module name="org.jboss.vfs" services="import"/>
<module name="org.wildfly.extension.core-management-client"/>
<module name="org.wildfly.security.elytron-private"/>
<module name="org.wildfly.service"/>
<module name="org.wildfly.unstable.annotation.api.indexer"/>
<module name="org.wildfly._internal.unstable-api-annotation-index"/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't those modules be optional

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ehsavoie The indices and the dependency on the scanner need to always be added, or we would need a layer which doesn't seem practical for a preview feature. A bit further down the line (once this reaches community level) I would like to add a layer which enables the configuration to turn the scanning on. But still there is a hard dependency on the indexer

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I was wondering about adding all those indexes and jars if one just doesn't want the feature

</dependencies>
</module>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ Copyright The WildFly Authors
~ SPDX-License-Identifier: Apache-2.0
-->

<module xmlns="urn:jboss:module:1.9" name="org.wildfly.unstable.annotation.api.indexer">
<properties>
<property name="jboss.api" value="private"/>
</properties>

<resources>
<artifact name="${org.wildfly.unstable.api.annotation:unstable-api-annotation-classpath-indexer}"/>
</resources>

<dependencies>
<module name="org.jboss.logging"/>
<module name="io.smallrye.jandex"/>
</dependencies>
</module>
5 changes: 5 additions & 0 deletions core-management/core-management-subsystem/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.wildfly.unstable.api.annotation</groupId>
<artifactId>unstable-api-annotation-classpath-indexer</artifactId>
</dependency>

<dependency>
<groupId>org.jboss.logmanager</groupId>
<artifactId>jboss-logmanager</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,29 @@
import org.jboss.as.controller.ExtensionContext;
import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.PersistentResourceXMLDescriptionWriter;
import org.jboss.as.controller.SubsystemRegistration;
import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
import org.jboss.as.controller.descriptions.StandardResourceDescriptionResolver;
import org.jboss.as.controller.operations.common.GenericSubsystemDescribeHandler;
import org.jboss.as.controller.parsing.ExtensionParsingContext;
import org.jboss.as.controller.registry.ManagementResourceRegistration;

import java.util.EnumSet;

/**
* @author <a href="http://jmesnil.net/">Jeff Mesnil</a> (c) 2016 Red Hat inc.
*/
public class CoreManagementExtension implements Extension {
public static final String SUBSYSTEM_NAME = "core-management";
static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
public static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(SUBSYSTEM, SUBSYSTEM_NAME);
static final PathElement PROCESS_STATE_LISTENER_PATH = PathElement.pathElement("process-state-listener");

static final String RESOURCE_NAME = CoreManagementExtension.class.getPackage().getName() + ".LocalDescriptions";

private static final ModelVersion CURRENT_VERSION = ModelVersion.create(1, 0, 0);
static final ModelVersion VERSION_1_0_0 = ModelVersion.create(1, 0, 0);

static final ModelVersion CURRENT_VERSION = VERSION_1_0_0;

public static ResourceDescriptionResolver getResourceDescriptionResolver(final String... keyPrefix) {
StringBuilder prefix = new StringBuilder(SUBSYSTEM_NAME);
Expand All @@ -44,7 +49,7 @@ public static ResourceDescriptionResolver getResourceDescriptionResolver(final S
@Override
public void initialize(ExtensionContext context) {
final SubsystemRegistration subsystem = context.registerSubsystem(SUBSYSTEM_NAME, CURRENT_VERSION);
subsystem.registerXMLElementWriter(CoreManagementSubsystemParser_1_0::new);
subsystem.registerXMLElementWriter(new PersistentResourceXMLDescriptionWriter(CoreManagementSubsystemSchema.CURRENT.get(context.getStability())));
//This subsystem should be runnable on a host
subsystem.setHostCapable();
ManagementResourceRegistration registration = subsystem.registerSubsystemModel(new CoreManagementRootResourceDefinition());
Expand All @@ -53,8 +58,6 @@ public void initialize(ExtensionContext context) {

@Override
public void initializeParsers(ExtensionParsingContext context) {
// For the current version we don't use a Supplier as we want its description initialized
// TODO if any new xsd versions are added, use a Supplier for the old version
context.setSubsystemXmlMapping(SUBSYSTEM_NAME, CoreManagementSubsystemParser_1_0.NAMESPACE, new CoreManagementSubsystemParser_1_0());
context.setSubsystemXmlMappings(CoreManagementExtension.SUBSYSTEM_NAME, EnumSet.allOf(CoreManagementSubsystemSchema.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ public Collection<AttributeDefinition> getAttributes() {
@Override
protected List<? extends PersistentResourceDefinition> getChildren() {
return Arrays.asList(ConfigurationChangeResourceDefinition.INSTANCE,
new ProcessStateListenerResourceDefinition()
new ProcessStateListenerResourceDefinition(),
UnstableApiAnnotationResourceDefinition.INSTANCE
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright The WildFly Authors
* SPDX-License-Identifier: Apache-2.0
*/

package org.wildfly.extension.core.management;

import org.jboss.as.controller.Feature;
import org.jboss.as.controller.PersistentResourceXMLDescription;
import org.jboss.as.controller.PersistentSubsystemSchema;
import org.jboss.as.controller.SubsystemSchema;
import org.jboss.as.controller.xml.VersionedNamespace;
import org.jboss.as.version.Stability;
import org.jboss.staxmapper.IntVersion;

import java.util.EnumSet;
import java.util.Map;

/**
* Parser and Marshaller for core-management subsystem.
*
* <em>All resources and attributes must be listed explicitly and not through any collections.</em>
* This ensures that if the resource definitions change in later version (e.g. a new attribute is added),
* this will have no impact on parsing this specific version of the subsystem.
*
* @author <a href="http://jmesnil.net/">Jeff Mesnil</a> (c) 2016 Red Hat inc.
*/
public enum CoreManagementSubsystemSchema implements PersistentSubsystemSchema<CoreManagementSubsystemSchema> {

VERSION_1_0(1),
VERSION_1_0_PREVIEW(1, Stability.PREVIEW);
static final Map<Stability, CoreManagementSubsystemSchema> CURRENT = Feature.map(EnumSet.of(VERSION_1_0, VERSION_1_0_PREVIEW));

private final VersionedNamespace<IntVersion, CoreManagementSubsystemSchema> namespace;

CoreManagementSubsystemSchema(int major) {
this.namespace = SubsystemSchema.createLegacySubsystemURN(CoreManagementExtension.SUBSYSTEM_NAME, new IntVersion(major, 0));
}

CoreManagementSubsystemSchema(int major, Stability stability) {
this.namespace = SubsystemSchema.createLegacySubsystemURN(CoreManagementExtension.SUBSYSTEM_NAME, stability, new IntVersion(major, 0));
}

@Override
public VersionedNamespace<IntVersion, CoreManagementSubsystemSchema> getNamespace() {
return this.namespace;
}

@Override
public PersistentResourceXMLDescription getXMLDescription() {
PersistentResourceXMLDescription.Factory factory = PersistentResourceXMLDescription.factory(this);
PersistentResourceXMLDescription.Builder builder = factory.builder(CoreManagementExtension.SUBSYSTEM_PATH);
builder.addChild(
factory.builder(ConfigurationChangeResourceDefinition.PATH)
.addAttribute(ConfigurationChangeResourceDefinition.MAX_HISTORY)
.build());
builder.addChild(
factory.builder(UnstableApiAnnotationResourceDefinition.RESOURCE_REGISTRATION)
.addAttribute(UnstableApiAnnotationResourceDefinition.LEVEL)
.build());
builder.addChild(
factory.builder(CoreManagementExtension.PROCESS_STATE_LISTENER_PATH)

.addAttribute(ProcessStateListenerResourceDefinition.LISTENER_CLASS)
.addAttribute(ProcessStateListenerResourceDefinition.LISTENER_MODULE)
.addAttribute(ProcessStateListenerResourceDefinition.PROPERTIES)
.addAttribute(ProcessStateListenerResourceDefinition.TIMEOUT)
.build());
return builder.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*
* Copyright The WildFly Authors
* SPDX-License-Identifier: Apache-2.0
*/
package org.wildfly.extension.core.management;

import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVICE;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.UNSTABLE_API_ANNOTATIONS;
import static org.jboss.as.server.deployment.Phase.PARSE;
import static org.jboss.as.server.deployment.Phase.PARSE_REPORT_EXPERIMENTAL_ANNOTATIONS;
import static org.jboss.as.server.deployment.Phase.PARSE_SCAN_EXPERIMENTAL_ANNOTATIONS;
import static org.wildfly.extension.core.management.CoreManagementExtension.SUBSYSTEM_NAME;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.jboss.as.controller.AbstractBoottimeAddStepHandler;
import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.OperationContext;
import org.jboss.as.controller.OperationFailedException;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.PersistentResourceDefinition;
import org.jboss.as.controller.ReloadRequiredRemoveStepHandler;
import org.jboss.as.controller.ResourceRegistration;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.validation.EnumValidator;
import org.jboss.as.controller.registry.Resource;
import org.jboss.as.server.AbstractDeploymentChainStep;
import org.jboss.as.server.DeploymentProcessorTarget;
import org.jboss.as.version.Stability;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.ModelType;
import org.wildfly.extension.core.management.deployment.ReportUnstableApiAnnotationsProcessor;
import org.wildfly.extension.core.management.deployment.ScanUnstableApiAnnotationsProcessor;

/**
* Resource to configure the unstable api annotation usage reporting.
*
*/
public class UnstableApiAnnotationResourceDefinition extends PersistentResourceDefinition {
pferraro marked this conversation as resolved.
Show resolved Hide resolved

public static final Stability STABILITY = Stability.PREVIEW;
public static final SimpleAttributeDefinition LEVEL = SimpleAttributeDefinitionBuilder.create(
ModelDescriptionConstants.LEVEL, ModelType.STRING, true)
.setValidator(EnumValidator.create(UnstableApiAnnotationLevel.class))
.setDefaultValue(new ModelNode(UnstableApiAnnotationLevel.LOG.name()))
.setRestartAllServices()
.build();
public static final PathElement PATH = PathElement.pathElement(SERVICE, UNSTABLE_API_ANNOTATIONS);
kabir marked this conversation as resolved.
Show resolved Hide resolved
static final ResourceRegistration RESOURCE_REGISTRATION = ResourceRegistration.of(PATH, STABILITY);
static final UnstableApiAnnotationResourceDefinition INSTANCE = new UnstableApiAnnotationResourceDefinition();

private static final List<AttributeDefinition> ATTRIBUTES = Collections.singletonList(LEVEL);

private UnstableApiAnnotationResourceDefinition() {
super(
new Parameters(
RESOURCE_REGISTRATION,
CoreManagementExtension.getResourceDescriptionResolver(UNSTABLE_API_ANNOTATIONS))
.setAddHandler(UnstableApiAnnotationResourceAddHandler.INSTANCE)
.setRemoveHandler(ReloadRequiredRemoveStepHandler.INSTANCE));
}


@Override
public Collection<AttributeDefinition> getAttributes() {
return ATTRIBUTES;
}

private static class UnstableApiAnnotationResourceAddHandler extends AbstractBoottimeAddStepHandler {


static final UnstableApiAnnotationResourceAddHandler INSTANCE = new UnstableApiAnnotationResourceAddHandler();
@Override
public void performBoottime(OperationContext context, ModelNode operation, Resource resource) throws OperationFailedException {
ModelNode model = resource.getModel();
String levelValue = UnstableApiAnnotationResourceDefinition.LEVEL.resolveModelAttribute(context, model).asString();
UnstableApiAnnotationLevel level = UnstableApiAnnotationLevel.valueOf(levelValue);

if (context.isNormalServer()) {
context.addStep(new AbstractDeploymentChainStep() {
@Override
protected void execute(DeploymentProcessorTarget processorTarget) {
processorTarget.addDeploymentProcessor(SUBSYSTEM_NAME, PARSE, PARSE_SCAN_EXPERIMENTAL_ANNOTATIONS,
new ScanUnstableApiAnnotationsProcessor(context.getRunningMode(), context.getStability(), level));
processorTarget.addDeploymentProcessor(SUBSYSTEM_NAME, PARSE, PARSE_REPORT_EXPERIMENTAL_ANNOTATIONS,
new ReportUnstableApiAnnotationsProcessor(level));
}
}, OperationContext.Stage.RUNTIME);
}
}
}


public enum UnstableApiAnnotationLevel {
LOG,
ERROR
}

}
Loading