Skip to content

Commit

Permalink
Pass additional data spec types to the problem builder
Browse files Browse the repository at this point in the history
  • Loading branch information
donat committed May 15, 2024
1 parent 6ff6f30 commit 0cbcad5
Show file tree
Hide file tree
Showing 27 changed files with 86 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import org.gradle.api.problems.internal.InternalProblems;
import org.gradle.api.problems.internal.Problem;
import org.gradle.api.problems.internal.ProblemsProgressEventEmitterHolder;
import org.gradle.api.problems.internal.TypeValidationData;
import org.gradle.api.problems.internal.TypeValidationDataSpec;
import org.gradle.internal.reflect.validation.DefaultTypeAwareProblemBuilder;
import org.gradle.internal.reflect.validation.TypeAwareProblemBuilder;
import org.gradle.internal.reflect.validation.TypeValidationContext;
Expand Down Expand Up @@ -65,7 +65,7 @@ public void visitPropertyProblem(Action<? super TypeAwareProblemBuilder> problem
problemBuilder.withAnnotationType(rootType);
pluginId()
.map(PluginId::getId)
.ifPresent(id -> problemBuilder.additionalData(TypeValidationData.class, data -> data.pluginId(id)));
.ifPresent(id -> problemBuilder.additionalData(TypeValidationDataSpec.class, data -> data.pluginId(id)));
recordProblem(problemBuilder.build());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.gradle.api.problems.internal.InternalProblemBuilder;
import org.gradle.api.problems.internal.Problem;
import org.gradle.api.problems.internal.TypeValidationData;
import org.gradle.api.problems.internal.TypeValidationDataSpec;

import javax.annotation.Nullable;
import java.util.Arrays;
Expand All @@ -38,14 +39,14 @@ public DefaultTypeAwareProblemBuilder(InternalProblemBuilder problemBuilder) {
@Override
public TypeAwareProblemBuilder withAnnotationType(@Nullable Class<?> classWithAnnotationAttached) {
if (classWithAnnotationAttached != null) {
additionalData(TypeValidationData.class, data -> data.typeName(classWithAnnotationAttached.getName().replaceAll("\\$", ".")));
additionalData(TypeValidationDataSpec.class, data -> data.typeName(classWithAnnotationAttached.getName().replaceAll("\\$", ".")));
}
return this;
}

@Override
public TypeAwareProblemBuilder forProperty(String propertyName) {
additionalData(TypeValidationData.class, data -> data.propertyName(propertyName));
additionalData(TypeValidationDataSpec.class, data -> data.propertyName(propertyName));
return this;
}

Expand All @@ -55,7 +56,7 @@ public TypeAwareProblemBuilder parentProperty(@Nullable String parentProperty) {
return this;
}
String pp = getParentProperty(parentProperty);
additionalData(TypeValidationData.class, data -> data.parentPropertyName(pp));
additionalData(TypeValidationDataSpec.class, data -> data.parentPropertyName(pp));
parentPropertyAdditionalData = pp;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.gradle.api.NonNullApi;
import org.gradle.api.problems.ProblemGroup;
import org.gradle.api.problems.Severity;
import org.gradle.api.problems.internal.AdditionalData;
import org.gradle.api.problems.internal.AdditionalDataSpec;
import org.gradle.api.problems.internal.DocLink;
import org.gradle.api.problems.internal.InternalProblemBuilder;
import org.gradle.api.problems.internal.Problem;
Expand Down Expand Up @@ -117,8 +117,8 @@ public InternalProblemBuilder taskPathLocation(String buildTreePath) {
}

@Override
public <T extends AdditionalData<U>, U> InternalProblemBuilder additionalData(Class<? extends AdditionalData<U>> type, Action<? super U> config) {
return validateDelegate(delegate.additionalData(type, config));
public <U extends AdditionalDataSpec> InternalProblemBuilder additionalData(Class<? extends U> specType, Action<? super U> config) {
return validateDelegate(delegate.additionalData(specType, config));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.gradle.api.internal.DocumentationRegistry;
import org.gradle.api.logging.configuration.WarningMode;
import org.gradle.api.problems.Problems;
import org.gradle.api.problems.internal.DeprecationData;
import org.gradle.api.problems.internal.DeprecationDataSpec;
import org.gradle.api.problems.internal.GradleCoreProblemGroup;
import org.gradle.api.problems.internal.InternalProblemReporter;
Expand Down Expand Up @@ -105,7 +104,7 @@ public void execute(InternalProblemSpec builder) {
.contextualLabel(usage.getSummary())
.details(usage.getRemovalDetails())
.documentedAt(usage.getDocumentationUrl())
.additionalData(DeprecationData.class, new Action<DeprecationDataSpec>() {
.additionalData(DeprecationDataSpec.class, new Action<DeprecationDataSpec>() {
@Override
public void execute(DeprecationDataSpec data) {
data.type(usage.getType().toDeprecationDataType());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -596,9 +596,9 @@ private static JsonObject serializeGroup(ProblemGroup group) {
}
}

private static class AdditionalDataAdapter extends TypeAdapter<AdditionalData<?>> {
private static class AdditionalDataAdapter extends TypeAdapter<AdditionalData> {
@Override
public void write(JsonWriter out, AdditionalData<?> value) throws IOException {
public void write(JsonWriter out, AdditionalData value) throws IOException {
if (value == null) {
out.nullValue();
return;
Expand Down Expand Up @@ -627,7 +627,7 @@ public void write(JsonWriter out, AdditionalData<?> value) throws IOException {
}

@Override
public AdditionalData<?> read(JsonReader in) throws IOException {
public AdditionalData read(JsonReader in) throws IOException {
if (in.hasNext()) {
in.beginObject();
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ import com.google.gson.Gson
import org.gradle.api.problems.Severity
import org.gradle.api.problems.internal.DefaultProblemReporter
import org.gradle.api.problems.internal.DeprecationData
import org.gradle.api.problems.internal.DeprecationDataSpec
import org.gradle.api.problems.internal.DocLink
import org.gradle.api.problems.internal.GeneralData
import org.gradle.api.problems.internal.GradleCoreProblemGroup
import org.gradle.api.problems.internal.InternalProblemReporter
import org.gradle.api.problems.internal.ProblemEmitter
import org.gradle.api.problems.internal.TypeValidationData
import org.gradle.api.problems.internal.TypeValidationDataSpec
import spock.lang.Specification

class ValidationProblemSerializationTest extends Specification {
Expand Down Expand Up @@ -186,7 +188,7 @@ class ValidationProblemSerializationTest extends Specification {
given:
def problem = problemReporter.create {
it.id("id", "label", GradleCoreProblemGroup.validation())
.additionalData(TypeValidationData.class) {
.additionalData(TypeValidationDataSpec.class) {
it.propertyName("property")
it.typeName("type")
it.parentPropertyName("parent")
Expand Down Expand Up @@ -214,7 +216,7 @@ class ValidationProblemSerializationTest extends Specification {
given:
def problem = problemReporter.create {
it.id("id", "label")
.additionalData(GeneralData) {
.additionalData(GeneralDataSpec) {
it.put('foo', 'bar')
}
}
Expand All @@ -235,7 +237,7 @@ class ValidationProblemSerializationTest extends Specification {
given:
def problem = problemReporter.create {
it.id("id", "label")
.additionalData(DeprecationData) {
.additionalData(DeprecationDataSpec) {
it.type(DeprecationData.Type.BUILD_INVOCATION)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ class ProblemsServiceIntegrationTest extends AbstractIntegrationSpec {
withReportProblemTask """
problems.forNamespace('org.example.plugin').reporting {
it.id('type', 'label')
.additionalData(org.gradle.api.problems.internal.GeneralData) {
.additionalData(org.gradle.api.problems.internal.GeneralDataSpec) {
it.put('key','value')
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,9 @@
* <li>{@link org.gradle.api.problems.internal.DeprecationData}</li>
* </ul>
*
* @param <T> the builder type expected to configure a new instance.
* @see InternalProblemSpec#additionalData(Class, Action)
*/
@Incubating
public interface AdditionalData<T> {
public interface AdditionalData {

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

package org.gradle.api.problems.internal;

public interface AdditionalDataBuilder<T extends AdditionalData<?>> {
public interface AdditionalDataBuilder<T extends AdditionalData> {
T build();
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,21 @@
public class AdditionalDataBuilderFactory {

@SuppressWarnings("unchecked")
public static <S extends AdditionalData<?>> AdditionalDataBuilder<S> builderFor(Class<? extends S> type) {
public static <T extends AdditionalData, S extends AdditionalDataSpec> AdditionalDataBuilder<T> builderFor(Class<? extends S> type) {
Preconditions.checkNotNull(type);
if (TypeValidationData.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<S>) DefaultTypeValidationData.builder();
} else if (DeprecationData.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<S>) DefaultDeprecationData.builder();
} else if (GeneralData.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<S>) DefaultGeneralData.builder();
if (TypeValidationDataSpec.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<T>) DefaultTypeValidationData.builder();
} else if (DeprecationDataSpec.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<T>) DefaultDeprecationData.builder();
} else if (GeneralDataSpec.class.isAssignableFrom(type)) {
return (AdditionalDataBuilder<T>) DefaultGeneralData.builder();
} else {
throw new IllegalArgumentException("Unsupported type: " + type);
}
}

@SuppressWarnings("unchecked")
public static <S extends AdditionalData<?>> AdditionalDataBuilder<S> builderFor(S instance) {
public static <S extends AdditionalData> AdditionalDataBuilder<S> builderFor(S instance) {
Preconditions.checkNotNull(instance);
if (TypeValidationData.class.isInstance(instance)) {
return (AdditionalDataBuilder<S>) DefaultTypeValidationData.builder((TypeValidationData) instance);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.gradle.api.problems.internal;

/**
* Marker interface for additional data that can be attached to a {@link Problem}.
*/
public interface AdditionalDataSpec {
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class DefaultProblem implements Serializable, Problem {
private final List<ProblemLocation> problemLocations;
private final String details;
private final RuntimeException exception;
private final AdditionalData<?> additionalData;
private final AdditionalData additionalData;

protected DefaultProblem(
ProblemDefinition problemDefinition,
Expand All @@ -40,7 +40,7 @@ protected DefaultProblem(
List<ProblemLocation> problemLocations,
@Nullable String details,
RuntimeException exception,
@Nullable AdditionalData<?> additionalData
@Nullable AdditionalData additionalData
) {
this.problemDefinition = problemDefinition;
this.contextualLabel = contextualLabel;
Expand Down Expand Up @@ -85,7 +85,7 @@ public RuntimeException getException() {
}

@Override
public AdditionalData<?> getAdditionalData() {
public AdditionalData getAdditionalData() {
return additionalData;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@
public class DefaultProblemBuilder implements InternalProblemBuilder {

private static List<Class<?>> supportedAdditionalDataTypes = ImmutableList.<Class<?>>of(
GeneralData.class,
DeprecationData.class,
TypeValidationData.class
GeneralDataSpec.class,
DeprecationDataSpec.class,
TypeValidationDataSpec.class
);

private ProblemId id;
Expand All @@ -43,7 +43,7 @@ public class DefaultProblemBuilder implements InternalProblemBuilder {
private DocLink docLink;
private List<String> solutions;
private RuntimeException exception;
private AdditionalData<?> additionalData;
private AdditionalData additionalData;
private boolean collectLocation = false;

public DefaultProblemBuilder(Problem problem) {
Expand Down Expand Up @@ -73,8 +73,8 @@ public Problem build() {
return invalidProblem("missing-parent", "Problem id must have a parent", null);
}

if (additionalData instanceof UnsupportedAdditionalData) {
return invalidProblem("unsupported-additional-data", "Unsupported additional data type", "Unsupported additional data type: " + ((UnsupportedAdditionalData)additionalData).getType().getName() + ". Supported types are: " + supportedAdditionalDataTypes);
if (additionalData instanceof UnsupportedAdditionalDataSpec) {
return invalidProblem("unsupported-additional-data", "Unsupported additional data type", "Unsupported additional data type: " + ((UnsupportedAdditionalDataSpec)additionalData).getType().getName() + ". Supported types are: " + supportedAdditionalDataTypes);
}

ProblemDefinition problemDefinition = new DefaultProblemDefinition(id, getSeverity(), docLink);
Expand Down Expand Up @@ -212,11 +212,11 @@ public InternalProblemBuilder solution(@Nullable String solution) {

@Override
@SuppressWarnings("unchecked")
public <T extends AdditionalData<U>, U> InternalProblemBuilder additionalData(Class<? extends AdditionalData<U>> type, Action<? super U> config) {
if (!supportedAdditionalDataTypes.contains(type)) {
additionalData = new UnsupportedAdditionalData(type);
}else if (additionalData == null) {
AdditionalDataBuilder<?> additionalDatabuilder = AdditionalDataBuilderFactory.builderFor(type);
public <U extends AdditionalDataSpec> InternalProblemBuilder additionalData(Class<? extends U> specType, Action<? super U> config) {
if (!supportedAdditionalDataTypes.contains(specType)) {
additionalData = new UnsupportedAdditionalDataSpec(specType);
} else if (additionalData == null) {
AdditionalDataBuilder<?> additionalDatabuilder = AdditionalDataBuilderFactory.builderFor(specType);
config.execute((U) additionalDatabuilder);
additionalData = additionalDatabuilder.build();
} else {
Expand All @@ -243,11 +243,11 @@ protected void addLocation(ProblemLocation location) {
}

@SuppressWarnings("rawtypes")
private static class UnsupportedAdditionalData implements AdditionalData {
private static class UnsupportedAdditionalDataSpec implements AdditionalData {

private final Class<?> type;

UnsupportedAdditionalData(Class<?> type) {
UnsupportedAdditionalDataSpec(Class<?> type) {
this.type = type;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
/**
* Additional data type that can be used to attach deprecation information to a problem.
*/
public interface DeprecationData extends AdditionalData<DeprecationDataSpec> {
public interface DeprecationData extends AdditionalData {

enum Type {
USER_CODE_DIRECT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
/**
* Specifies configuration options when creating a new DeprecationData instance.
*/
public interface DeprecationDataSpec {
public interface DeprecationDataSpec extends AdditionalDataSpec {
DeprecationDataSpec type(DeprecationData.Type type);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
/**
* General additional data type that can be used to attach arbitrary data to a problem with a string map.
*/
public interface GeneralData extends AdditionalData<GeneralDataSpec> {
public interface GeneralData extends AdditionalData {

Map<String, String> getAsMap();
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@
/**
* Specifies configuration options when creating a new GeneralData instance.
*/
public interface GeneralDataSpec {
public interface GeneralDataSpec extends AdditionalDataSpec {
GeneralDataSpec put(String key, String value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public interface InternalProblemBuilder extends InternalProblemSpec {
InternalProblemBuilder solution(String solution);

@Override
<T extends AdditionalData<U>, U> InternalProblemBuilder additionalData(Class<? extends AdditionalData<U>> type, Action<? super U> config);
<U extends AdditionalDataSpec> InternalProblemBuilder additionalData(Class<? extends U> specType, Action<? super U> config);

@Override
InternalProblemBuilder withException(RuntimeException e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,12 @@ public interface InternalProblemSpec extends ProblemSpec {
* <p>
* If not additional data was configured for this problem, then a new instance will be created. If additional data was already configured, then the existing instance will be used and the configuration will be applied to it.
*
* @param type the type of the additional data (see the AdditionalData interface for the list of supported types)
* @param specType the type of the additional data (see the AdditionalData interface for the list of supported types)
* @param config The action configuring the additional data
* @return this
* @param <T> The type of the additional data
* @param <U> The type of the configurator object that will be applied to the additional data
*/
<T extends AdditionalData<U>, U> InternalProblemSpec additionalData(Class<? extends AdditionalData<U>> type, Action<? super U> config);
<U extends AdditionalDataSpec> InternalProblemSpec additionalData(Class<? extends U> specType, Action<? super U> config);

/**
* Declares that this problem was emitted by a task with the given path.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public interface Problem {
* The supported types are listed on {@link AdditionalData}.
*/
@Nullable
AdditionalData<?> getAdditionalData();
AdditionalData getAdditionalData();

/**
* Returns a problem builder with fields initialized with values from this instance.
Expand Down

0 comments on commit 0cbcad5

Please sign in to comment.