diff --git a/build.gradle b/build.gradle index f0920407..3e7130f0 100644 --- a/build.gradle +++ b/build.gradle @@ -81,7 +81,15 @@ configure(allprojects - project(':netflix-sel')) { } spotbugs { - ignoreFailures = true + ignoreFailures = false + } + + tasks.withType(com.github.spotbugs.snom.SpotBugsTask) { + enabled = name.contains("Main") + reports { + xml.enabled = true + html.enabled = true + } } group = 'com.netflix.maestro' diff --git a/maestro-common/src/main/java/com/netflix/maestro/exceptions/MaestroBadRequestException.java b/maestro-common/src/main/java/com/netflix/maestro/exceptions/MaestroBadRequestException.java index a4535231..159acd60 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/exceptions/MaestroBadRequestException.java +++ b/maestro-common/src/main/java/com/netflix/maestro/exceptions/MaestroBadRequestException.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.exceptions; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -20,6 +21,7 @@ /** Maestro Workflow Bad Request exception. */ @Getter +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroBadRequestException extends MaestroRuntimeException { private static final long serialVersionUID = -5554778492523995123L; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/api/JobTemplateCreateRequest.java b/maestro-common/src/main/java/com/netflix/maestro/models/api/JobTemplateCreateRequest.java index 196eb299..ec2f2d60 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/api/JobTemplateCreateRequest.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/api/JobTemplateCreateRequest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.definition.GitInfo; import com.netflix.maestro.models.definition.User; import com.netflix.maestro.models.stepruntime.JobTemplate; @@ -39,6 +40,7 @@ value = {"owner", "status", "support", "test_workflows", "git_info", "definition"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class JobTemplateCreateRequest { /** reserved fields cannot be set within extraInfo. */ private static final Set RESERVED_FIELDS = diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/api/SignalCreateRequest.java b/maestro-common/src/main/java/com/netflix/maestro/models/api/SignalCreateRequest.java index 44c5b45f..8acc0603 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/api/SignalCreateRequest.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/api/SignalCreateRequest.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.signal.SignalParamValue; import com.netflix.maestro.validations.MaestroNameConstraint; import java.util.LinkedHashMap; @@ -26,6 +27,7 @@ alphabetic = true) @Data @ToString +@SuppressFBWarnings("EI_EXPOSE_REP") public class SignalCreateRequest { /** Name of the signal. */ @MaestroNameConstraint private String name; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/api/StepOutputDataRequest.java b/maestro-common/src/main/java/com/netflix/maestro/models/api/StepOutputDataRequest.java index 9a9b8849..2ec4c6ec 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/api/StepOutputDataRequest.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/api/StepOutputDataRequest.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.artifact.Artifact; import com.netflix.maestro.models.parameter.Parameter; import jakarta.validation.Valid; @@ -20,6 +21,7 @@ value = {"params", "artifacts"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class StepOutputDataRequest { @Valid private Map params; @Valid private Map artifacts; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowCreateRequest.java b/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowCreateRequest.java index dfc3bc0d..aed99350 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowCreateRequest.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowCreateRequest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.Defaults; import com.netflix.maestro.models.definition.GitInfo; import com.netflix.maestro.models.definition.Properties; @@ -36,6 +37,7 @@ value = {"properties", "workflow", "is_active", "git_info"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowCreateRequest { @Valid @PropertiesConstraint private Properties properties; @Valid @WorkflowConstraint private Workflow workflow; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowPropertiesUpdateRequest.java b/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowPropertiesUpdateRequest.java index 485c1f82..01512735 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowPropertiesUpdateRequest.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/api/WorkflowPropertiesUpdateRequest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroValidationException; import com.netflix.maestro.models.definition.AccessControl; import com.netflix.maestro.models.definition.Alerting; @@ -40,6 +41,7 @@ }, alphabetic = true) @Data +@SuppressFBWarnings({"EI_EXPOSE_REP", "CT_CONSTRUCTOR_THROW"}) public class WorkflowPropertiesUpdateRequest { @Valid @PropertiesConstraint private Properties properties; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/artifact/DefaultArtifact.java b/maestro-common/src/main/java/com/netflix/maestro/models/artifact/DefaultArtifact.java index 22a545d5..9b130d15 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/artifact/DefaultArtifact.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/artifact/DefaultArtifact.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.LinkedHashMap; import java.util.Map; import lombok.EqualsAndHashCode; @@ -30,6 +31,7 @@ @JsonPropertyOrder(alphabetic = true) @EqualsAndHashCode @ToString +@SuppressFBWarnings("EI_EXPOSE_REP") public class DefaultArtifact implements Artifact { private static final String VALUE_FIELD = "value"; private final Map data = new LinkedHashMap<>(); diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/definition/Metadata.java b/maestro-common/src/main/java/com/netflix/maestro/models/definition/Metadata.java index fed1aa3b..284a45f9 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/definition/Metadata.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/definition/Metadata.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import java.util.Arrays; import java.util.HashSet; @@ -37,6 +38,7 @@ value = {"workflow_id", "workflow_version_id", "create_time", "version_author", "git_info"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class Metadata { /** Constants for extra info key mappings. */ private static final String SOURCE = "source"; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/definition/StepTransition.java b/maestro-common/src/main/java/com/netflix/maestro/models/definition/StepTransition.java index 68916453..a7898950 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/definition/StepTransition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/definition/StepTransition.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import java.util.ArrayList; import java.util.HashSet; @@ -31,6 +32,7 @@ value = {"predecessors", "successors"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class StepTransition { /** * This is optional. Callers do not need to provide it. If empty, will derive it from DAG during diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/definition/Tag.java b/maestro-common/src/main/java/com/netflix/maestro/models/definition/Tag.java index 805e0d70..2d78d587 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/definition/Tag.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/definition/Tag.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.validations.MaestroNameConstraint; import java.util.HashMap; import java.util.Locale; @@ -33,6 +34,7 @@ value = {"name", "namespace", "permit", "attributes"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class Tag { @MaestroNameConstraint private String name; private Namespace namespace; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/definition/TagList.java b/maestro-common/src/main/java/com/netflix/maestro/models/definition/TagList.java index 386ad075..255bb05e 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/definition/TagList.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/definition/TagList.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import jakarta.validation.Valid; import java.util.ArrayList; @@ -34,6 +35,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder(alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class TagList { /** singleton object for empty tag list. */ public static final TagList EMPTY_TAG_LIST = new TagList(Collections.emptyList()); diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/initiator/UpstreamInitiator.java b/maestro-common/src/main/java/com/netflix/maestro/models/initiator/UpstreamInitiator.java index dcbb1ede..958c91ae 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/initiator/UpstreamInitiator.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/initiator/UpstreamInitiator.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.exceptions.MaestroUnprocessableEntityException; import com.netflix.maestro.models.parameter.ParamSource; @@ -37,6 +38,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder(alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public abstract class UpstreamInitiator implements Initiator { private List ancestors; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/instance/ForeachDetails.java b/maestro-common/src/main/java/com/netflix/maestro/models/instance/ForeachDetails.java index 3a4b28b7..34b91743 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/instance/ForeachDetails.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/instance/ForeachDetails.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import jakarta.validation.constraints.NotNull; import java.io.IOException; @@ -46,6 +47,7 @@ @EqualsAndHashCode @Getter @SuppressWarnings("PMD.LooseCoupling") +@SuppressFBWarnings({"EI_EXPOSE_REP", "NP_NULL_ON_SOME_PATH"}) public class ForeachDetails { @JsonValue @NotNull private final EnumMap> info; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowInstance.java b/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowInstance.java index 8a64485d..6894d359 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowInstance.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowInstance.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.artifact.Artifact; import com.netflix.maestro.models.definition.StepTransition; import com.netflix.maestro.models.definition.Workflow; @@ -70,6 +71,7 @@ }, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowInstance { @Valid @NotNull private String workflowId; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowRuntimeOverview.java b/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowRuntimeOverview.java index abbdaa97..a0dffbc0 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowRuntimeOverview.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/instance/WorkflowRuntimeOverview.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.definition.StepTransition; import com.netflix.maestro.utils.Checks; import java.util.EnumMap; @@ -37,8 +38,9 @@ alphabetic = true) @Data @SuppressWarnings("PMD.LooseCoupling") +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowRuntimeOverview { - private long totalStepCount; + private volatile long totalStepCount; private EnumMap stepOverview = new EnumMap<>(StepInstance.Status.class); diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/AbstractParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/AbstractParameter.java index cc22141d..0a27ca16 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/AbstractParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/AbstractParameter.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.Constants; import com.netflix.maestro.models.definition.TagList; import com.netflix.maestro.utils.Checks; @@ -36,6 +37,7 @@ @Getter @SuperBuilder(toBuilder = true) @EqualsAndHashCode +@SuppressFBWarnings("EI_EXPOSE_REP") public abstract class AbstractParameter implements Parameter { @Setter @JsonIgnore @MaestroReferenceIdConstraint private String name; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParamDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParamDefinition.java index 5503f226..3023b9fb 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParamDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParamDefinition.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the returned array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -42,6 +41,7 @@ @SuperBuilder(toBuilder = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class BooleanArrayParamDefinition extends AbstractParamDefinition { private final boolean[] value; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParameter.java index c6b568cc..79df497b 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/BooleanArrayParameter.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the evaluated array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -51,6 +50,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class BooleanArrayParameter extends AbstractParameter { private final boolean[] value; private boolean[] evaluatedResult; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParamDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParamDefinition.java index da173f04..0070ef24 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParamDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParamDefinition.java @@ -34,7 +34,6 @@ * *

SHOULD NOT mutate the returned array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -45,6 +44,7 @@ @SuperBuilder(toBuilder = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class DoubleArrayParamDefinition extends AbstractParamDefinition { private final BigDecimal[] value; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParameter.java index 4d9a9d1b..1bd2f5f9 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/DoubleArrayParameter.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the evaluated array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -51,6 +50,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class DoubleArrayParameter extends AbstractParameter { private final BigDecimal[] value; private double[] evaluatedResult; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParamDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParamDefinition.java index c28c3c81..163a920b 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParamDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParamDefinition.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the returned array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -42,6 +41,7 @@ @SuperBuilder(toBuilder = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class LongArrayParamDefinition extends AbstractParamDefinition { private final long[] value; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParameter.java index c08d0277..fea7f9dd 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/LongArrayParameter.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the evaluated array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -51,6 +50,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class LongArrayParameter extends AbstractParameter { private final long[] value; private long[] evaluatedResult; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/MapParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/MapParameter.java index 6797ab9e..0d4efe1b 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/MapParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/MapParameter.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.utils.Checks; import com.netflix.maestro.utils.MapHelper; @@ -67,6 +68,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class MapParameter extends AbstractParameter { @Valid private final Map value; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParamDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParamDefinition.java index 65551793..0a04af8d 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParamDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParamDefinition.java @@ -31,7 +31,6 @@ * *

SHOULD NOT mutate the returned array data. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -42,6 +41,7 @@ @SuperBuilder(toBuilder = true) @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class StringArrayParamDefinition extends AbstractParamDefinition { private final String[] value; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParameter.java index 7fe53168..1593d306 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringArrayParameter.java @@ -34,7 +34,6 @@ *

SHOULD NOT mutate the evaluated array data. */ @Slf4j -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder( @@ -54,6 +53,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class StringArrayParameter extends AbstractParameter { private final String[] value; private String[] evaluatedResult; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringMapParameter.java b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringMapParameter.java index 267f3295..8e73b323 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringMapParameter.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/parameter/StringMapParameter.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.netflix.maestro.annotations.SuppressFBWarnings; import jakarta.validation.Valid; import java.util.Map; import lombok.EqualsAndHashCode; @@ -50,6 +51,7 @@ @Getter(onMethod = @__({@Override})) @SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) +@SuppressFBWarnings("EI_EXPOSE_REP") public final class StringMapParameter extends AbstractParameter { @Valid private final Map value; private Map evaluatedResult; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalDependenciesDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalDependenciesDefinition.java index 5bcc6739..ec446d17 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalDependenciesDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalDependenciesDefinition.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.List; import java.util.Map; import lombok.Data; @@ -29,6 +30,7 @@ * @param definitions signal dependency definitions. */ @JsonInclude(JsonInclude.Include.NON_EMPTY) +@SuppressFBWarnings("EI_EXPOSE_REP") public record SignalDependenciesDefinition( @JsonValue List definitions) { /** Constructor. */ diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalOutputsDefinition.java b/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalOutputsDefinition.java index 3236922d..d263265d 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalOutputsDefinition.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/signal/SignalOutputsDefinition.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.parameter.ParamDefinition; import com.netflix.maestro.models.parameter.ParamType; import com.netflix.maestro.utils.Checks; @@ -32,6 +33,7 @@ * @param definitions signal output definitions. */ @JsonInclude(JsonInclude.Include.NON_EMPTY) +@SuppressFBWarnings("EI_EXPOSE_REP") public record SignalOutputsDefinition(@JsonValue List definitions) { /** Constructor. */ @JsonCreator diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/JobTemplate.java b/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/JobTemplate.java index a798f6d5..0ba064b1 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/JobTemplate.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/JobTemplate.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.Constants; import com.netflix.maestro.models.definition.GitInfo; import com.netflix.maestro.models.definition.StepType; @@ -44,6 +45,7 @@ value = {"metadata", "definition"}, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class JobTemplate { @Valid @NotNull private Metadata metadata; @Valid @NotNull private Definition definition; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/TitusCommand.java b/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/TitusCommand.java index e91c767d..f482973f 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/TitusCommand.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/stepruntime/TitusCommand.java @@ -62,7 +62,7 @@ @Data @NoArgsConstructor @AllArgsConstructor -@SuppressFBWarnings({"EI", "EI2"}) +@SuppressFBWarnings("EI_EXPOSE_REP") public class TitusCommand { private String applicationName; private Map attributes; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/tagpermits/TagPermit.java b/maestro-common/src/main/java/com/netflix/maestro/models/tagpermits/TagPermit.java index 6ce021b1..62a844ca 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/tagpermits/TagPermit.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/tagpermits/TagPermit.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.timeline.Timeline; import lombok.Data; import lombok.NoArgsConstructor; @@ -28,6 +29,7 @@ alphabetic = true) @NoArgsConstructor @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class TagPermit { private String tag; private int maxAllowed; diff --git a/maestro-common/src/main/java/com/netflix/maestro/models/timeline/WorkflowTimeline.java b/maestro-common/src/main/java/com/netflix/maestro/models/timeline/WorkflowTimeline.java index 4e9cfeb4..dde6cd95 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/models/timeline/WorkflowTimeline.java +++ b/maestro-common/src/main/java/com/netflix/maestro/models/timeline/WorkflowTimeline.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.definition.User; import java.util.List; import lombok.EqualsAndHashCode; @@ -31,6 +32,7 @@ alphabetic = true) @Getter @EqualsAndHashCode +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowTimeline { private final String workflowId; private final List timelineEvents; diff --git a/maestro-common/src/main/java/com/netflix/maestro/utils/TriggerHelper.java b/maestro-common/src/main/java/com/netflix/maestro/utils/TriggerHelper.java index e32545c7..ff0c9d8d 100644 --- a/maestro-common/src/main/java/com/netflix/maestro/utils/TriggerHelper.java +++ b/maestro-common/src/main/java/com/netflix/maestro/utils/TriggerHelper.java @@ -17,6 +17,7 @@ import com.cronutils.model.definition.CronDefinitionBuilder; import com.cronutils.model.time.ExecutionTime; import com.cronutils.parser.CronParser; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.Defaults; import com.netflix.maestro.models.trigger.CronTimeTrigger; import com.netflix.maestro.models.trigger.PredefinedTimeTrigger; @@ -32,6 +33,7 @@ /** Cron Helper utility class. */ @Slf4j +@SuppressFBWarnings("DMI_RANDOM_USED_ONLY_ONCE") public final class TriggerHelper { /** Private constructor for utility class. */ private TriggerHelper() {} diff --git a/maestro-database/src/main/java/com/netflix/maestro/database/AbstractDatabaseDao.java b/maestro-database/src/main/java/com/netflix/maestro/database/AbstractDatabaseDao.java index 3ec48645..fd0ce018 100644 --- a/maestro-database/src/main/java/com/netflix/maestro/database/AbstractDatabaseDao.java +++ b/maestro-database/src/main/java/com/netflix/maestro/database/AbstractDatabaseDao.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.database.utils.ConnectionFunction; import com.netflix.maestro.database.utils.ResultProcessor; import com.netflix.maestro.database.utils.StatementFunction; @@ -49,6 +50,7 @@ "PMD.AbstractClassWithoutAbstractMethod", "PMD.PreserveStackTrace" }) +@SuppressFBWarnings("EI_EXPOSE_REP") public abstract class AbstractDatabaseDao { private static final String RETRY_SQL_STATE = "40001"; private static final String QUERY_ERROR_METRIC_NAME = "maestro_db_query_error"; diff --git a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/Dag.java b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/Dag.java index f191bc76..1aa5f1dc 100644 --- a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/Dag.java +++ b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/Dag.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import java.io.IOException; import java.util.List; @@ -24,6 +25,7 @@ */ @JsonDeserialize(using = Dag.DagDeserializer.class) @JsonSerialize(using = Dag.DagSerializer.class) +@SuppressFBWarnings("EI_EXPOSE_REP") public record Dag(@Nullable String order, @Nullable Map> transitions) { public Dag { diff --git a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflow.java b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflow.java index 5a72053d..b2f92712 100644 --- a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflow.java +++ b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflow.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.dsl.jobs.Job; import com.netflix.maestro.utils.Checks; import java.util.LinkedHashMap; @@ -17,6 +18,7 @@ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class DslWorkflow { private String id; private String name; diff --git a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflowDef.java b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflowDef.java index 52fd9aeb..a7a2cf4a 100644 --- a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflowDef.java +++ b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/DslWorkflowDef.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; /** * DSL Workflow Definition. @@ -10,4 +11,5 @@ * @param workflow DSL workflow */ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +@SuppressFBWarnings("EI_EXPOSE_REP") public record DslWorkflowDef(@JsonAlias({"Workflow"}) DslWorkflow workflow) {} diff --git a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/jobs/BaseJob.java b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/jobs/BaseJob.java index 411125ff..a5f3169e 100644 --- a/maestro-dsl/src/main/java/com/netflix/maestro/dsl/jobs/BaseJob.java +++ b/maestro-dsl/src/main/java/com/netflix/maestro/dsl/jobs/BaseJob.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.definition.FailureMode; import com.netflix.maestro.utils.Checks; import java.util.LinkedHashMap; @@ -16,6 +17,7 @@ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonInclude(JsonInclude.Include.NON_NULL) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public abstract class BaseJob implements Job { /** reserved fields cannot be set within jobParams. */ static final Set RESERVED_FIELDS = diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/concurrency/MaestroTagPermitManager.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/concurrency/MaestroTagPermitManager.java index 6ff89e42..3e3f7390 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/concurrency/MaestroTagPermitManager.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/concurrency/MaestroTagPermitManager.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.concurrency; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroTagPermitDao; import com.netflix.maestro.engine.tasks.MaestroTagPermitTask; import com.netflix.maestro.models.Constants; @@ -28,6 +29,7 @@ /** Database based implementation of tag permit manager. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroTagPermitManager implements TagPermitManager { private static final int NOT_FOUND_STATUS_CODE = -1; private static final int INTERNAL_FLOW_GROUP_ID = 0; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroRunStrategyDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroRunStrategyDao.java index 7f1b9627..056165ef 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroRunStrategyDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroRunStrategyDao.java @@ -68,13 +68,13 @@ * to avoid unexpected behavior. Users have to manually stop them before switching to LAST_ONLY * because a new run might unexpectedly stop all previously queued or running instances. */ -@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION") @SuppressWarnings({ "PMD.ExhaustiveSwitchHasDefault", "PMD.ReplaceJavaUtilDate", "checkstyle:MultipleStringLiterals" }) @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroRunStrategyDao extends AbstractDatabaseDao { private static final String ONE_STRING = "1"; private static final String TWO_STRING = "2"; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepBreakpointDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepBreakpointDao.java index d524a5c7..b5b52002 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepBreakpointDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepBreakpointDao.java @@ -75,8 +75,8 @@ *

Store paused step attempts which additional column ("system_generated"=true) since the schema * of paused step attempt is same as that of breakpoint. */ -@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION") @Slf4j +@SuppressFBWarnings({"EI_EXPOSE_REP", "OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE"}) public class MaestroStepBreakpointDao extends AbstractDatabaseDao { private static final String WORKFLOW_ID = "workflow_id"; private static final String VERSION = "version"; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceActionDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceActionDao.java index df818d5e..47308556 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceActionDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceActionDao.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.annotations.VisibleForTesting; import com.netflix.maestro.database.AbstractDatabaseDao; import com.netflix.maestro.database.DatabaseConfiguration; @@ -72,6 +73,7 @@ */ @Slf4j @SuppressWarnings("checkstyle:MultipleStringLiterals") +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroStepInstanceActionDao extends AbstractDatabaseDao { private static final String INSERT_ACTION_QUERY = "INSERT INTO maestro_step_instance_action (workflow_id,workflow_instance_id,workflow_run_id,step_id,payload) " diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDao.java index 6ccc5777..1d0c1490 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroStepInstanceDao.java @@ -64,7 +64,7 @@ *

In the data model, we use `null` to indicate `unset`. */ @SuppressWarnings("checkstyle:MultipleStringLiterals") -@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION") +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroStepInstanceDao extends AbstractDatabaseDao { private static final TypeReference> ARTIFACTS_REFERENCE = new TypeReference<>() {}; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java index 14fa8099..c4b34eb4 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowDao.java @@ -81,8 +81,7 @@ * *

In the data model, we use `null` to indicate `unset`. */ -// mute the false positive error due to https://github.com/spotbugs/spotbugs/issues/293 -@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION") +@SuppressFBWarnings("EI_EXPOSE_REP") @SuppressWarnings({"PMD.LooseCoupling", "PMD.ReplaceJavaUtilDate"}) @Slf4j public class MaestroWorkflowDao extends AbstractDatabaseDao { @@ -408,17 +407,17 @@ private TriggerUuids adjustTriggerUuids( boolean isEmpty = true; if (versionId > Constants.INACTIVE_VERSION_ID && snapshot != null - && (snapshot.getTimeTriggerDisabled() != Boolean.TRUE - || snapshot.getSignalTriggerDisabled() != Boolean.TRUE)) { + && (!Boolean.TRUE.equals(snapshot.getTimeTriggerDisabled()) + || !Boolean.TRUE.equals(snapshot.getSignalTriggerDisabled()))) { TriggerUuids.TriggerUuidsBuilder builder = TriggerUuids.builder(); TriggerUuids uuids = getUuids.get(); if (uuids != null) { - if (snapshot.getTimeTriggerDisabled() != Boolean.TRUE + if (!Boolean.TRUE.equals(snapshot.getTimeTriggerDisabled()) && uuids.getTimeTriggerUuid() != null) { builder.timeTriggerUuid(uuids.getTimeTriggerUuid()); isEmpty = false; } - if (snapshot.getSignalTriggerDisabled() != Boolean.TRUE + if (!Boolean.TRUE.equals(snapshot.getSignalTriggerDisabled()) && uuids.getSignalTriggerUuids() != null) { builder.signalTriggerUuids(uuids.getSignalTriggerUuids()); isEmpty = false; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDao.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDao.java index fc934ef9..7ed0ebdf 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDao.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dao/MaestroWorkflowInstanceDao.java @@ -68,8 +68,7 @@ * *

In the data model, we use `null` to indicate `unset`. */ -// mute the false positive error due to https://github.com/spotbugs/spotbugs/issues/293 -@SuppressFBWarnings("OBL_UNSATISFIED_OBLIGATION") +@SuppressFBWarnings({"EI_EXPOSE_REP", "DCN_NULLPOINTER_EXCEPTION"}) @SuppressWarnings("PMD.ReplaceJavaUtilDate") @Slf4j public class MaestroWorkflowInstanceDao extends AbstractDatabaseDao { diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/OutputData.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/OutputData.java index 0d900240..1ad86585 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/OutputData.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/OutputData.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.artifact.Artifact; import com.netflix.maestro.models.definition.StepType; import com.netflix.maestro.models.parameter.Parameter; @@ -47,6 +48,7 @@ @AllArgsConstructor @ToString @Builder +@SuppressFBWarnings("EI_EXPOSE_REP") public class OutputData { @Setter private StepType externalJobType; @Setter private String externalJobId; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/StepTagPermit.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/StepTagPermit.java index 07824f02..c7c88e3c 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/StepTagPermit.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/dto/StepTagPermit.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.dto; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.timeline.TimelineActionEvent; import java.util.UUID; @@ -25,6 +26,7 @@ * @param limits tag permit limits * @param event timeline action event */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record StepTagPermit( UUID uuid, long seqNum, diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/ExprEvaluator.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/ExprEvaluator.java index 5579392f..db0724a5 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/ExprEvaluator.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/ExprEvaluator.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.eval; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.properties.SelProperties; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.exceptions.MaestroInvalidExpressionException; @@ -27,6 +28,7 @@ /** SEL expression evaluator wrapper. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class ExprEvaluator { private static final String SEMICOLON = ";"; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/MaestroParamExtensionRepo.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/MaestroParamExtensionRepo.java index 2f244aca..590128f2 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/MaestroParamExtensionRepo.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/eval/MaestroParamExtensionRepo.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.engine.handlers.SignalHandler; import com.netflix.maestro.exceptions.MaestroUnprocessableEntityException; @@ -29,6 +30,7 @@ /** A repository to hold maestro param extensions for the param evaluation. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroParamExtensionRepo { private static final int THREAD_NUM = 3; private final ThreadLocal repos = new ThreadLocal<>(); diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepRuntimeManager.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepRuntimeManager.java index d35e5164..a199040d 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepRuntimeManager.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepRuntimeManager.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.execution; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.db.StepAction; import com.netflix.maestro.engine.metrics.MetricConstants; import com.netflix.maestro.engine.params.ParamsManager; @@ -33,6 +34,7 @@ /** step runtime manager to manage step runtime and their results. */ @SuppressWarnings("PMD.ExhaustiveSwitchHasDefault") +@SuppressFBWarnings("EI_EXPOSE_REP") public final class StepRuntimeManager { private final Map stepRuntimeMap; private final ObjectMapper objectMapper; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepSyncManager.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepSyncManager.java index a90a89b5..406eda26 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepSyncManager.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/StepSyncManager.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.execution; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.engine.db.DbOperation; import com.netflix.maestro.exceptions.MaestroInternalError; @@ -27,6 +28,7 @@ * Step synchronization manager to write the update to maestro step instance table and also publish * the events to the internal queue. */ +@SuppressFBWarnings("EI_EXPOSE_REP") public final class StepSyncManager { private final MaestroStepInstanceDao instanceDao; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/WorkflowRuntimeSummary.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/WorkflowRuntimeSummary.java index c94e29d5..b4561cf3 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/WorkflowRuntimeSummary.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/execution/WorkflowRuntimeSummary.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.artifact.Artifact; import com.netflix.maestro.models.instance.WorkflowInstance; import com.netflix.maestro.models.instance.WorkflowRollupOverview; @@ -46,6 +47,7 @@ }, alphabetic = true) @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowRuntimeSummary { private WorkflowInstance.Status instanceStatus = WorkflowInstance.Status.CREATED; // initial state diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/MaestroExecutionPreparer.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/MaestroExecutionPreparer.java index 948de61a..de95f017 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/MaestroExecutionPreparer.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/MaestroExecutionPreparer.java @@ -1,6 +1,7 @@ package com.netflix.maestro.engine.handlers; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.engine.db.DbOperation; @@ -38,6 +39,7 @@ * * @author jun-he */ +@SuppressFBWarnings({"EI_EXPOSE_REP", "BX_UNBOXING_IMMEDIATELY_REBOXED"}) public class MaestroExecutionPreparer implements ExecutionPreparer { private final MaestroWorkflowInstanceDao instanceDao; private final MaestroStepInstanceDao stepInstanceDao; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/WorkflowRunner.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/WorkflowRunner.java index cc45d8a6..ca43c5fd 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/WorkflowRunner.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/handlers/WorkflowRunner.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.handlers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.transformation.WorkflowTranslator; import com.netflix.maestro.engine.utils.WorkflowHelper; import com.netflix.maestro.exceptions.MaestroInternalError; @@ -29,6 +30,7 @@ /** Workflow runner to run a maestro workflow in the internal flow engine. */ @AllArgsConstructor @Slf4j +@SuppressFBWarnings({"EI_EXPOSE_REP", "DCN_NULLPOINTER_EXCEPTION"}) public class WorkflowRunner { private final MaestroFlowDao flowDao; private final FlowOperation flowOperation; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/metrics/MetricConstants.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/metrics/MetricConstants.java index 7c3f0900..e77eeabf 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/metrics/MetricConstants.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/metrics/MetricConstants.java @@ -12,7 +12,10 @@ */ package com.netflix.maestro.engine.metrics; +import com.netflix.maestro.annotations.SuppressFBWarnings; + /** Class for Metric constants such as keys / tags for engine package. */ +@SuppressFBWarnings("NM_SAME_SIMPLE_NAME_AS_SUPERCLASS") public final class MetricConstants extends com.netflix.maestro.metrics.MetricConstants { private MetricConstants() {} diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/params/DefaultParamManager.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/params/DefaultParamManager.java index 03022b5f..0321cb60 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/params/DefaultParamManager.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/params/DefaultParamManager.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroRuntimeException; import com.netflix.maestro.models.definition.StepType; import com.netflix.maestro.models.parameter.ParamDefinition; @@ -27,6 +28,7 @@ /** DefaultParamManager used to manage various levels of default and schema level parameters. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class DefaultParamManager { private static final String WORKFLOW_PARAMS_FILE = "defaultparams/default-workflow-params.yaml"; private static final String NETFLIX_PARAMS_FILE = "defaultparams/default-step-params.yaml"; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/InstanceActionJobEventProcessor.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/InstanceActionJobEventProcessor.java index af0b6a9b..1cb9021b 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/InstanceActionJobEventProcessor.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/InstanceActionJobEventProcessor.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.processors; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.exceptions.MaestroRetryableError; @@ -43,6 +44,7 @@ */ @Slf4j @AllArgsConstructor +@SuppressFBWarnings({"EI_EXPOSE_REP", "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"}) public class InstanceActionJobEventProcessor implements MaestroEventProcessor { private static final Integer DEFAULT_ACTION_CODE = diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/TerminateThenRunJobEventProcessor.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/TerminateThenRunJobEventProcessor.java index 6634bca2..9a93dd00 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/TerminateThenRunJobEventProcessor.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/processors/TerminateThenRunJobEventProcessor.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.processors; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceActionDao; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.engine.handlers.WorkflowRunner; @@ -39,6 +40,7 @@ */ @Slf4j @AllArgsConstructor +@SuppressFBWarnings({"EI_EXPOSE_REP", "DCN_NULLPOINTER_EXCEPTION"}) public class TerminateThenRunJobEventProcessor implements MaestroEventProcessor { private final MaestroWorkflowInstanceDao instanceDao; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/steps/StepRuntime.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/steps/StepRuntime.java index 8eba7098..839c7dfd 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/steps/StepRuntime.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/steps/StepRuntime.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.steps; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.execution.StepRuntimeSummary; import com.netflix.maestro.engine.execution.WorkflowSummary; import com.netflix.maestro.models.Constants; @@ -37,6 +38,7 @@ *

The whole execution offers at-least-once guarantee. Therefore, the logic implemented here * should be idempotent. For example, Periodically check sleep time or check the container status. */ +@SuppressFBWarnings("EI_EXPOSE_REP") public interface StepRuntime { /** Maestro system user. */ User SYSTEM_USER = User.create(Constants.MAESTRO_QUALIFIER); diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroEndTask.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroEndTask.java index 26886863..adc93ee3 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroEndTask.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroEndTask.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.tasks; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceActionDao; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.engine.execution.WorkflowRuntimeSummary; @@ -59,6 +60,7 @@ * terminate this workflow instance DAG tree. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public final class MaestroEndTask implements FlowTask { private static final long WORKFLOW_LONG_START_DELAY_INTERVAL = 180000; private static final User END_TASK_USER = User.create(Constants.DEFAULT_END_TASK_NAME); diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroGateTask.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroGateTask.java index 4602338c..723241d3 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroGateTask.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroGateTask.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.tasks; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.engine.execution.WorkflowSummary; import com.netflix.maestro.engine.transformation.Translator; @@ -33,6 +34,7 @@ * execution following the order defined in the DAG of the Maestro workflow definition. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public final class MaestroGateTask implements FlowTask { private final MaestroStepInstanceDao stepInstanceDao; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroStartTask.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroStartTask.java index b28c2703..e56a91b6 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroStartTask.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroStartTask.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.tasks; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.engine.execution.WorkflowSummary; import com.netflix.maestro.engine.utils.StepHelper; @@ -32,6 +33,7 @@ * be simplified with the new internal flow engine but not required for now. */ @Slf4j +@SuppressFBWarnings({"EI_EXPOSE_REP", "DCN_NULLPOINTER_EXCEPTION"}) public final class MaestroStartTask implements FlowTask { /** Special prefix to indicate that the failure is due to dedup and ignore its finalized. */ public static final String DEDUP_FAILURE_PREFIX = "[DEDUP][IGNORE]"; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTagPermitTask.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTagPermitTask.java index adf88590..802c7b53 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTagPermitTask.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTagPermitTask.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.engine.tasks; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroTagPermitDao; import com.netflix.maestro.engine.dto.StepTagPermit; import com.netflix.maestro.engine.dto.StepUuidSeq; @@ -41,6 +42,7 @@ * is an internal task and should not be used externally by users. */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public final class MaestroTagPermitTask implements FlowTask { /** Status code for step acquired tag permits. */ public static final int ACQUIRED_STATUS_CODE = 7; diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTask.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTask.java index 29148c2b..98ab1e1c 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTask.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/tasks/MaestroTask.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.annotations.VisibleForTesting; import com.netflix.maestro.engine.concurrency.InstanceStepConcurrencyHandler; import com.netflix.maestro.engine.concurrency.TagPermitManager; @@ -97,6 +98,7 @@ * data update and persistence. */ @Slf4j +@SuppressFBWarnings({"EI_EXPOSE_REP", "SF_SWITCH_FALLTHROUGH"}) public final class MaestroTask implements FlowTask { private static final User MAESTRO_TASK_USER = User.create(Constants.MAESTRO_TASK_NAME); diff --git a/maestro-engine/src/main/java/com/netflix/maestro/engine/templates/JobTemplateManager.java b/maestro-engine/src/main/java/com/netflix/maestro/engine/templates/JobTemplateManager.java index 9a9c71b6..93e01b55 100644 --- a/maestro-engine/src/main/java/com/netflix/maestro/engine/templates/JobTemplateManager.java +++ b/maestro-engine/src/main/java/com/netflix/maestro/engine/templates/JobTemplateManager.java @@ -13,6 +13,7 @@ package com.netflix.maestro.engine.templates; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroJobTemplateDao; import com.netflix.maestro.engine.execution.WorkflowSummary; import com.netflix.maestro.engine.params.ParamsMergeHelper; @@ -45,6 +46,7 @@ * call. For example, we can define different jobs based on kubernetes with different schemas. Each * job can be identified as a subtype of kubernetes step type. */ +@SuppressFBWarnings("EI_EXPOSE_REP") public class JobTemplateManager { private record JobKey(String jobType, String version) {} diff --git a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/config/MaestroExtensionsConfiguration.java b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/config/MaestroExtensionsConfiguration.java index cecbe445..86e28392 100644 --- a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/config/MaestroExtensionsConfiguration.java +++ b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/config/MaestroExtensionsConfiguration.java @@ -13,7 +13,6 @@ package com.netflix.maestro.extensions.config; import com.fasterxml.jackson.databind.ObjectMapper; -import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.database.DatabaseConfiguration; import com.netflix.maestro.extensions.dao.MaestroForeachFlattenedDao; import com.netflix.maestro.extensions.handlers.ForeachFlatteningHandler; @@ -45,7 +44,6 @@ @ComponentScan(basePackages = "com.netflix.maestro.extensions") @EnableConfigurationProperties(MaestroExtensionsProperties.class) @ConditionalOnProperty(value = "extensions.enabled", havingValue = "true") -@SuppressFBWarnings("EI_EXPOSE_REP2") @Slf4j public class MaestroExtensionsConfiguration { diff --git a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/models/StepEventHandlerInput.java b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/models/StepEventHandlerInput.java index 525555ed..dd04e480 100644 --- a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/models/StepEventHandlerInput.java +++ b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/models/StepEventHandlerInput.java @@ -26,7 +26,7 @@ * @param stepId id of the step. * @param stepAttemptId attempt id of the step. */ -@SuppressFBWarnings({"EI_EXPOSE_REP", "EI_EXPOSE_REP2"}) +@SuppressFBWarnings("EI_EXPOSE_REP") public record StepEventHandlerInput( @NotNull WorkflowInstance workflowInstance, @NotNull String stepId, diff --git a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/MaestroEventProcessor.java b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/MaestroEventProcessor.java index edb0afca..ca0021be 100644 --- a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/MaestroEventProcessor.java +++ b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/MaestroEventProcessor.java @@ -12,7 +12,6 @@ */ package com.netflix.maestro.extensions.processors; -import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroRetryableError; import com.netflix.maestro.extensions.handlers.ForeachFlatteningHandler; import com.netflix.maestro.extensions.models.StepEventHandlerInput; @@ -32,7 +31,6 @@ * subscription handling which are not yet ported to OSS. */ @Slf4j -@SuppressFBWarnings("EI_EXPOSE_REP2") public class MaestroEventProcessor { private static final String TYPE_TAG = "type"; private static final String METRIC_PROCESSOR_FAILURE = "maestroevent.processor.failure"; diff --git a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/StepEventPreprocessor.java b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/StepEventPreprocessor.java index ccf196ad..81bcaedb 100644 --- a/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/StepEventPreprocessor.java +++ b/maestro-extensions/src/main/java/com/netflix/maestro/extensions/processors/StepEventPreprocessor.java @@ -13,7 +13,6 @@ package com.netflix.maestro.extensions.processors; import com.netflix.maestro.annotations.Nullable; -import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroNotFoundException; import com.netflix.maestro.extensions.models.StepEventHandlerInput; import com.netflix.maestro.extensions.provider.MaestroClient; @@ -27,7 +26,6 @@ * StepInstanceStatusChangeEvent} and creates a {@link StepEventHandlerInput}. */ @Slf4j -@SuppressFBWarnings("EI_EXPOSE_REP2") public class StepEventPreprocessor { private static final String METRIC_INSTANCE_NOT_FOUND = "maestroevent.preprocessor.instance.not.found"; diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/Action.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/Action.java index 20a16f94..71e0ff90 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/Action.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/Action.java @@ -1,6 +1,7 @@ package com.netflix.maestro.flow.actor; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.flow.Constants; import com.netflix.maestro.flow.models.Flow; import com.netflix.maestro.flow.models.Task; @@ -17,6 +18,7 @@ record GroupStart() implements Action {} Action GROUP_START = new GroupStart(); + @SuppressFBWarnings("EI_EXPOSE_REP") record FlowLaunch(Flow flow, boolean resume) implements Action {} record GroupHeartbeat() implements Action {} @@ -82,6 +84,7 @@ record TaskPing(int code) implements Action {} Action TASK_PING = new TaskPing(Constants.TASK_PING_CODE); + @SuppressFBWarnings("EI_EXPOSE_REP") record TaskUpdate(Task updatedTask) implements Action {} record TaskTimeout() implements Action {} diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/BaseActor.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/BaseActor.java index 8abd15c5..09c2ed39 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/BaseActor.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/BaseActor.java @@ -1,6 +1,7 @@ package com.netflix.maestro.flow.actor; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.annotations.VisibleForTesting; import com.netflix.maestro.flow.engine.ExecutionContext; import com.netflix.maestro.metrics.MaestroMetrics; @@ -19,6 +20,7 @@ * * @author jun-he */ +@SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE") abstract sealed class BaseActor implements Actor permits GroupActor, FlowActor, TaskActor { private final BlockingQueue actions = new LinkedBlockingQueue<>(); // best effort de-duplication. Still possible that same actions are in the queue multiple times. diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/FlowActor.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/FlowActor.java index 9b304431..d43acfd6 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/FlowActor.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/actor/FlowActor.java @@ -14,6 +14,7 @@ import java.util.ListIterator; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -44,7 +45,7 @@ final class FlowActor extends BaseActor { private final Flow flow; // read-only access from all child actors private final long reconciliationInterval; // flow reconciliation interval in millis private final long refreshInterval; // flow refresh (monitor task) interval in millis - private boolean finalized; // flag indicating if the final call is done + private volatile boolean finalized; // flag indicating if the final call is done FlowActor(Flow flow, GroupActor parent, ExecutionContext context) { super(context, parent); @@ -153,7 +154,7 @@ private void reconcile(Action.FlowReconcile action) { } private long delayForNext(long delayInterval) { - return delayInterval + (int) (JITTER * Math.random()); + return delayInterval + ThreadLocalRandom.current().nextLong(JITTER); } private void refresh() { diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/ExecutionContext.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/ExecutionContext.java index 24f91665..fd606895 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/ExecutionContext.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/ExecutionContext.java @@ -1,5 +1,6 @@ package com.netflix.maestro.flow.engine; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.exceptions.MaestroNotFoundException; import com.netflix.maestro.exceptions.MaestroRetryableError; @@ -35,6 +36,7 @@ * @author jun-he */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class ExecutionContext { // central dispatcher to schedule a delayed action for all actors private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); @@ -331,6 +333,7 @@ public FlowGroup claimGroup() { * * @param group flow group to heartbeat */ + @SuppressFBWarnings("NP_NULL_ON_SOME_PATH") @SuppressWarnings("PMD.DoNotTerminateVM") public long heartbeatGroup(FlowGroup group) { Long heartbeatTs = flowDao.heartbeatGroup(group); diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/FlowExecutor.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/FlowExecutor.java index 0d15f6d8..c145875f 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/FlowExecutor.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/engine/FlowExecutor.java @@ -1,6 +1,7 @@ package com.netflix.maestro.flow.engine; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.flow.Constants; import com.netflix.maestro.flow.actor.Action; import com.netflix.maestro.flow.actor.Actor; @@ -28,6 +29,7 @@ * @author jun-he */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class FlowExecutor { private final ScheduledExecutorService maintainer = Executors.newSingleThreadScheduledExecutor(); private final Map groupActors = new ConcurrentHashMap<>(); // never remove diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Flow.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Flow.java index 81ed794e..4fe61a66 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Flow.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Flow.java @@ -1,5 +1,6 @@ package com.netflix.maestro.flow.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.utils.Checks; import java.util.ArrayList; import java.util.Collection; @@ -19,6 +20,7 @@ * @author jun-he */ @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class Flow { @Getter public enum Status { @@ -55,9 +57,9 @@ public enum Status { // transient mutable data private volatile Status status; - private long updateTime; + private volatile long updateTime; private String reasonForIncompletion; - private long seq; + private volatile long seq; private Task prepareTask; // inline task runs at the beginning before user jobs private Task monitorTask; // inline task runs whenever there is an update in the flow diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/FlowDef.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/FlowDef.java index c601d60f..55ab495f 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/FlowDef.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/FlowDef.java @@ -1,5 +1,6 @@ package com.netflix.maestro.flow.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.List; import lombok.Data; @@ -10,6 +11,7 @@ * @author jun-he */ @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class FlowDef { private TaskDef prepareTask; // TaskDef for the task to run at the beginning before user tasks private TaskDef monitorTask; // TaskDef for the task to run whenever there is an update diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Task.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Task.java index f18921a1..d42bbbbe 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Task.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/Task.java @@ -1,6 +1,7 @@ package com.netflix.maestro.flow.models; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.flow.Constants; import java.util.Map; import lombok.Data; @@ -26,6 +27,7 @@ * @author jun-he */ @Data +@SuppressFBWarnings("EI_EXPOSE_REP") public class Task { @Getter diff --git a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/TaskDef.java b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/TaskDef.java index d5b338b6..823f2ca0 100644 --- a/maestro-flow/src/main/java/com/netflix/maestro/flow/models/TaskDef.java +++ b/maestro-flow/src/main/java/com/netflix/maestro/flow/models/TaskDef.java @@ -1,6 +1,7 @@ package com.netflix.maestro.flow.models; import com.netflix.maestro.annotations.Nullable; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.List; /** @@ -13,4 +14,5 @@ * @param joinOn this is nullable and optional field. * @author jun-he */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record TaskDef(String taskReferenceName, String type, @Nullable List joinOn) {} diff --git a/maestro-http/src/main/java/com/netflix/maestro/engine/http/UrlValidator.java b/maestro-http/src/main/java/com/netflix/maestro/engine/http/UrlValidator.java index 7ba2124d..00cad732 100644 --- a/maestro-http/src/main/java/com/netflix/maestro/engine/http/UrlValidator.java +++ b/maestro-http/src/main/java/com/netflix/maestro/engine/http/UrlValidator.java @@ -58,6 +58,9 @@ public UrlValidator(HttpStepProperties properties) { * @throws MaestroValidationException if the URL is invalid or not allowed */ public URI validateAndParseUri(String url) { + if (url == null) { + throw new MaestroValidationException("URL cannot be null."); + } try { URI uri = URI.create(url); String scheme = uri.getScheme(); @@ -82,7 +85,7 @@ public URI validateAndParseUri(String url) { "URL host [%s] is not allowed. Please contact the administrator.", host); } return uri; - } catch (NullPointerException | IllegalArgumentException e) { + } catch (IllegalArgumentException e) { LOG.info("Rejected malformed URL: [{}]", url, e); throw new MaestroValidationException(e, "Invalid URL: [%s]", url); } diff --git a/maestro-http/src/test/java/com/netflix/maestro/engine/http/UrlValidatorTest.java b/maestro-http/src/test/java/com/netflix/maestro/engine/http/UrlValidatorTest.java index cf2cb8cf..b073ab7d 100644 --- a/maestro-http/src/test/java/com/netflix/maestro/engine/http/UrlValidatorTest.java +++ b/maestro-http/src/test/java/com/netflix/maestro/engine/http/UrlValidatorTest.java @@ -93,7 +93,13 @@ public void testInvalidUrl() { } // Test malformed URLs - for (String url : Arrays.asList(null, " ", "http://", "invalid url")) { + AssertHelper.assertThrows( + "Null URL", + MaestroValidationException.class, + "URL cannot be null.", + () -> validator.validateAndParseUri(null)); + + for (String url : Arrays.asList(" ", "http://", "invalid url")) { AssertHelper.assertThrows( "Malformed URL", MaestroValidationException.class, diff --git a/maestro-queue/src/main/java/com/netflix/maestro/queue/MaestroQueueSystem.java b/maestro-queue/src/main/java/com/netflix/maestro/queue/MaestroQueueSystem.java index f2784740..11d0df44 100644 --- a/maestro-queue/src/main/java/com/netflix/maestro/queue/MaestroQueueSystem.java +++ b/maestro-queue/src/main/java/com/netflix/maestro/queue/MaestroQueueSystem.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.queue; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.metrics.MaestroMetrics; import com.netflix.maestro.models.error.Details; @@ -30,9 +31,15 @@ @Slf4j @SuppressWarnings("PMD.LooseCoupling") public class MaestroQueueSystem { + @SuppressFBWarnings("EI_EXPOSE_REP2") private final EnumMap> eventQueues; + + @SuppressFBWarnings("EI_EXPOSE_REP2") private final MaestroQueueDao queueDao; + + @SuppressFBWarnings("EI_EXPOSE_REP2") private final QueueProperties properties; + private final MaestroMetrics metrics; public MaestroQueueSystem( @@ -129,6 +136,7 @@ private long getTimeoutForJobType(MaestroJobEvent.Type type) { * * @param message the message to notify */ + @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE") public void notify(MessageDto message) { if (message == null) { return; diff --git a/maestro-queue/src/main/java/com/netflix/maestro/queue/metrics/MetricConstants.java b/maestro-queue/src/main/java/com/netflix/maestro/queue/metrics/MetricConstants.java index 68505812..c14f06f4 100644 --- a/maestro-queue/src/main/java/com/netflix/maestro/queue/metrics/MetricConstants.java +++ b/maestro-queue/src/main/java/com/netflix/maestro/queue/metrics/MetricConstants.java @@ -12,7 +12,10 @@ */ package com.netflix.maestro.queue.metrics; +import com.netflix.maestro.annotations.SuppressFBWarnings; + /** Class for Metric constants such as keys / tags for queue package. */ +@SuppressFBWarnings("NM_SAME_SIMPLE_NAME_AS_SUPERCLASS") public final class MetricConstants extends com.netflix.maestro.metrics.MetricConstants { /** Constructor for MetricConstants. */ diff --git a/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorker.java b/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorker.java index bf94b078..dd318cd6 100644 --- a/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorker.java +++ b/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorker.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.queue.worker; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroInternalError; import com.netflix.maestro.exceptions.MaestroNotFoundException; import com.netflix.maestro.metrics.MaestroMetrics; @@ -42,9 +43,14 @@ public final class MaestroQueueWorker implements Runnable { private final long scanInterval; private final long retryInterval; + @SuppressFBWarnings("EI_EXPOSE_REP2") private final MaestroQueueDao queueDao; + private final ScheduledExecutorService scheduler; + + @SuppressFBWarnings("EI_EXPOSE_REP2") private final BlockingQueue messageQueue; + private final MaestroJobEventDispatcher dispatcher; private final MaestroMetrics metrics; @@ -160,7 +166,10 @@ private void processMessage(MessageDto message) { currentSize, messageLimit); } - requeue(message, scanInterval + (int) (JITTER_IN_MILLIS * Math.random())); + requeue( + message, + scanInterval + + java.util.concurrent.ThreadLocalRandom.current().nextLong(JITTER_IN_MILLIS)); } else if (message.ownedUntil() > curTime) { metrics.timer( MetricConstants.WORKER_QUEUE_QUEUEING_DELAY, @@ -208,6 +217,7 @@ private void processOrReplace(MessageDto prevMsg, MaestroJobEvent jobEvent, long // note that not requeue as the message goes to another queue in the current use cases } + @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE") private void requeue(MessageDto message, long delayInMillis) { if (!running) { LOG.debug( diff --git a/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorkerService.java b/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorkerService.java index 8bf49e6e..72dda2e5 100644 --- a/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorkerService.java +++ b/maestro-queue/src/main/java/com/netflix/maestro/queue/worker/MaestroQueueWorkerService.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.queue.worker; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.metrics.MaestroMetrics; import com.netflix.maestro.queue.dao.MaestroQueueDao; import com.netflix.maestro.queue.jobevents.MaestroJobEvent; @@ -63,7 +64,8 @@ public MaestroQueueWorkerService( if (!visited.contains(queueId)) { visited.add(queueId); // boostrap the queue with a message to trigger the worker - messageQueue.offer(MessageDto.SCAN_CMD_MSG); + @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE") + boolean ignored = messageQueue.offer(MessageDto.SCAN_CMD_MSG); queueDao.addLockIfAbsent(queueId); var workerProperties = properties.getQueueWorkerProperties(queueId); int workerNum = workerProperties.getWorkerNum(); diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/config/MaestroWebMvcConfig.java b/maestro-server/src/main/java/com/netflix/maestro/server/config/MaestroWebMvcConfig.java index f3353023..383f2064 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/config/MaestroWebMvcConfig.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/config/MaestroWebMvcConfig.java @@ -13,6 +13,7 @@ package com.netflix.maestro.server.config; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.dsl.DslWorkflowDef; import com.netflix.maestro.dsl.parsers.WorkflowParser; import com.netflix.maestro.models.api.WorkflowCreateRequest; @@ -32,6 +33,7 @@ /** Maestro MVC configuration for custom message converters. */ @Configuration +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroWebMvcConfig implements WebMvcConfigurer { private final WorkflowParser workflowParser; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/FlowEngineController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/FlowEngineController.java index 644c9e6d..31c16289 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/FlowEngineController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/FlowEngineController.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.flow.models.FlowDef; import com.netflix.maestro.flow.runtime.FlowOperation; import io.swagger.v3.oas.annotations.Operation; @@ -39,6 +40,7 @@ value = "/api/v3/groups", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) +@SuppressFBWarnings("EI_EXPOSE_REP") public class FlowEngineController { private final FlowOperation flowOperation; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/JobTemplateController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/JobTemplateController.java index a9355fec..e76a975e 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/JobTemplateController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/JobTemplateController.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroJobTemplateDao; import com.netflix.maestro.exceptions.MaestroNotFoundException; import com.netflix.maestro.models.api.JobTemplateCreateRequest; @@ -41,6 +42,7 @@ value = "/api/v3/job-templates", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) +@SuppressFBWarnings("EI_EXPOSE_REP") public class JobTemplateController { private final MaestroJobTemplateDao jobTemplateDao; private final User.UserBuilder callerBuilder; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/SignalController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/SignalController.java index 229db069..a659f848 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/SignalController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/SignalController.java @@ -1,5 +1,6 @@ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.Constants; import com.netflix.maestro.models.api.SignalCreateRequest; import com.netflix.maestro.models.signal.SignalInstance; @@ -28,6 +29,7 @@ value = "/api/v3/signals", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) +@SuppressFBWarnings("EI_EXPOSE_REP") public class SignalController { private final MaestroSignalBrokerDao brokerDao; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepBreakpointController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepBreakpointController.java index 3be92247..58c58cbc 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepBreakpointController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepBreakpointController.java @@ -1,5 +1,6 @@ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepBreakpointDao; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.models.Actions; @@ -58,6 +59,7 @@ produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @SuppressWarnings("PMD.AvoidDuplicateLiterals") +@SuppressFBWarnings("EI_EXPOSE_REP") public class StepBreakpointController { private final MaestroStepBreakpointDao stepBreakpointDao; private final MaestroWorkflowInstanceDao instanceDao; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepInstanceController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepInstanceController.java index 2975c9f7..3dbccc21 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepInstanceController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/StepInstanceController.java @@ -1,5 +1,6 @@ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroStepInstanceDao; import com.netflix.maestro.models.Actions; import com.netflix.maestro.models.instance.StepInstance; @@ -33,6 +34,7 @@ produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @SuppressWarnings("PMD.AvoidDuplicateLiterals") +@SuppressFBWarnings("EI_EXPOSE_REP") public class StepInstanceController { private final MaestroStepInstanceDao stepInstanceDao; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/TagPermitController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/TagPermitController.java index 2c38b4f3..a6a933c2 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/TagPermitController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/TagPermitController.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.concurrency.TagPermitManager; import com.netflix.maestro.exceptions.MaestroNotFoundException; import com.netflix.maestro.models.api.TagPermitRequest; @@ -39,6 +40,7 @@ value = "/api/v3/tag-permits", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) +@SuppressFBWarnings("EI_EXPOSE_REP") public class TagPermitController { private final TagPermitManager tagPermitManager; private final User.UserBuilder callerBuilder; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowController.java index 2efaef51..809e18b3 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowController.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroWorkflowDao; import com.netflix.maestro.engine.dao.MaestroWorkflowDeletionDao; import com.netflix.maestro.engine.db.PropertiesUpdate; @@ -72,6 +73,7 @@ produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @SuppressWarnings("PMD.AvoidDuplicateLiterals") +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowController { private static final Set VALID_UPDATE_PROPERTY_TAGS_TYPES = Set.of(Type.ADD_WORKFLOW_TAG, Type.DELETE_WORKFLOW_TAG); diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowInstanceController.java b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowInstanceController.java index 52d33011..e67f1f2a 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowInstanceController.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/controllers/WorkflowInstanceController.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.controllers; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.dao.MaestroWorkflowInstanceDao; import com.netflix.maestro.models.Actions; import com.netflix.maestro.models.Constants; @@ -45,6 +46,7 @@ produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @SuppressWarnings("PMD.AvoidDuplicateLiterals") +@SuppressFBWarnings("EI_EXPOSE_REP") public class WorkflowInstanceController { private static final int WORKFLOW_INSTANCE_MAX_BATCH_LIMIT = 200; private static final int WORKFLOW_INSTANCE_MIN_BATCH_LIMIT = 1; diff --git a/maestro-server/src/main/java/com/netflix/maestro/server/runtime/RestBasedFlowOperation.java b/maestro-server/src/main/java/com/netflix/maestro/server/runtime/RestBasedFlowOperation.java index 885d9e07..038909d4 100644 --- a/maestro-server/src/main/java/com/netflix/maestro/server/runtime/RestBasedFlowOperation.java +++ b/maestro-server/src/main/java/com/netflix/maestro/server/runtime/RestBasedFlowOperation.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.server.runtime; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.exceptions.MaestroRetryableError; import com.netflix.maestro.flow.dao.MaestroFlowDao; import com.netflix.maestro.flow.engine.FlowExecutor; @@ -25,6 +26,7 @@ import org.springframework.web.client.RestTemplate; /** Implementation of FlowOperation using REST API. */ +@SuppressFBWarnings("EI_EXPOSE_REP") public class RestBasedFlowOperation implements FlowOperation { private final RestTemplate restTemplate; diff --git a/maestro-signal/src/main/java/com/netflix/maestro/signal/dao/MaestroSignalBrokerDao.java b/maestro-signal/src/main/java/com/netflix/maestro/signal/dao/MaestroSignalBrokerDao.java index dac09253..a7a96ce7 100644 --- a/maestro-signal/src/main/java/com/netflix/maestro/signal/dao/MaestroSignalBrokerDao.java +++ b/maestro-signal/src/main/java/com/netflix/maestro/signal/dao/MaestroSignalBrokerDao.java @@ -1,6 +1,7 @@ package com.netflix.maestro.signal.dao; import com.fasterxml.jackson.databind.ObjectMapper; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.database.AbstractDatabaseDao; import com.netflix.maestro.database.DatabaseConfiguration; import com.netflix.maestro.exceptions.MaestroResourceConflictException; @@ -37,6 +38,7 @@ * @author jun-he */ @Slf4j +@SuppressFBWarnings("EI_EXPOSE_REP") public class MaestroSignalBrokerDao extends AbstractDatabaseDao { private final MaestroSignalInstanceDao instanceDao; private final MaestroSignalParamDao paramDao; diff --git a/maestro-signal/src/main/java/com/netflix/maestro/signal/metrics/MetricConstants.java b/maestro-signal/src/main/java/com/netflix/maestro/signal/metrics/MetricConstants.java index d91c12f4..0e5ac584 100644 --- a/maestro-signal/src/main/java/com/netflix/maestro/signal/metrics/MetricConstants.java +++ b/maestro-signal/src/main/java/com/netflix/maestro/signal/metrics/MetricConstants.java @@ -1,10 +1,13 @@ package com.netflix.maestro.signal.metrics; +import com.netflix.maestro.annotations.SuppressFBWarnings; + /** * Constants for signal metrics. * * @author jun-he */ +@SuppressFBWarnings("NM_SAME_SIMPLE_NAME_AS_SUPERCLASS") public final class MetricConstants extends com.netflix.maestro.metrics.MetricConstants { private MetricConstants() {} diff --git a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalMatchDto.java b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalMatchDto.java index 4ae1a002..26489b48 100644 --- a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalMatchDto.java +++ b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalMatchDto.java @@ -1,5 +1,6 @@ package com.netflix.maestro.signal.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.signal.SignalOperator; import com.netflix.maestro.models.signal.SignalParamValue; import java.util.List; @@ -11,6 +12,7 @@ * @param paramMatches params to match * @author jun-he */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record SignalMatchDto(String signalName, List paramMatches) { public boolean withParams() { return paramMatches != null && !paramMatches.isEmpty(); diff --git a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDef.java b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDef.java index 635c7164..11f500a2 100644 --- a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDef.java +++ b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDef.java @@ -1,5 +1,6 @@ package com.netflix.maestro.signal.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.models.trigger.SignalTrigger; /** @@ -10,5 +11,6 @@ * @param signalTrigger signal trigger * @author jun-he */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record SignalTriggerDef( String workflowId, String triggerUuid, SignalTrigger signalTrigger) {} diff --git a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDto.java b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDto.java index 3ab6f1ca..8f617bcd 100644 --- a/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDto.java +++ b/maestro-signal/src/main/java/com/netflix/maestro/signal/models/SignalTriggerDto.java @@ -1,5 +1,7 @@ package com.netflix.maestro.signal.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; + /** * Data model for getting a signal trigger table record. Won't be persisted. * @@ -10,6 +12,7 @@ * @param checkpoints corresponding signal checkpoints * @author jun-he */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record SignalTriggerDto( String workflowId, String triggerUuid, diff --git a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/messageprocessors/TimeTriggerExecutionProcessor.java b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/messageprocessors/TimeTriggerExecutionProcessor.java index 8a3d4efc..341ed86f 100644 --- a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/messageprocessors/TimeTriggerExecutionProcessor.java +++ b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/messageprocessors/TimeTriggerExecutionProcessor.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.timetrigger.messageprocessors; +import com.netflix.maestro.annotations.SuppressFBWarnings; import com.netflix.maestro.engine.execution.RunResponse; import com.netflix.maestro.engine.utils.ExceptionClassifier; import com.netflix.maestro.exceptions.MaestroNotFoundException; @@ -35,7 +36,6 @@ import java.util.Date; import java.util.List; import java.util.Optional; -import java.util.Random; import java.util.function.Supplier; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -43,6 +43,7 @@ /** Processor class to process execution messages for time triggers. */ @Slf4j @AllArgsConstructor +@SuppressFBWarnings("EI_EXPOSE_REP") public class TimeTriggerExecutionProcessor { private TimeTriggerProducer timeTriggerProducer; private MaestroWorkflowLauncher maestroWorkflowLauncher; @@ -161,7 +162,9 @@ private long calculateMessageDelay(Date firstExecutionDate) { firstExecutionDate); if (fullDelayForExecution > props.getMaxDelay()) { fullDelayForExecution = - props.getMaxDelay() - props.getMaxJitter() + new Random().nextInt(props.getMaxJitter()); + props.getMaxDelay() + - props.getMaxJitter() + + java.util.concurrent.ThreadLocalRandom.current().nextInt(props.getMaxJitter()); } return Math.max(0, fullDelayForExecution); } diff --git a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/metrics/MetricConstants.java b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/metrics/MetricConstants.java index ec83ae1e..b5df0079 100644 --- a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/metrics/MetricConstants.java +++ b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/metrics/MetricConstants.java @@ -12,7 +12,10 @@ */ package com.netflix.maestro.timetrigger.metrics; +import com.netflix.maestro.annotations.SuppressFBWarnings; + /** Constants for time trigger metrics. */ +@SuppressFBWarnings("NM_SAME_SIMPLE_NAME_AS_SUPERCLASS") public final class MetricConstants extends com.netflix.maestro.metrics.MetricConstants { private MetricConstants() {} diff --git a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/models/PlannedTimeTriggerExecution.java b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/models/PlannedTimeTriggerExecution.java index 7a181eb1..50760515 100644 --- a/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/models/PlannedTimeTriggerExecution.java +++ b/maestro-timetrigger/src/main/java/com/netflix/maestro/timetrigger/models/PlannedTimeTriggerExecution.java @@ -12,6 +12,7 @@ */ package com.netflix.maestro.timetrigger.models; +import com.netflix.maestro.annotations.SuppressFBWarnings; import java.util.Date; /** @@ -20,5 +21,6 @@ * @param timeTriggerWithWatermark the time trigger with watermark * @param executionDate the execution date */ +@SuppressFBWarnings("EI_EXPOSE_REP") public record PlannedTimeTriggerExecution( TimeTriggerWithWatermark timeTriggerWithWatermark, Date executionDate) {}