Class DetectShadowApisTask
- All Implemented Interfaces:
Comparable<org.gradle.api.Task>,org.gradle.api.internal.DynamicObjectAware,org.gradle.api.internal.TaskInternal,org.gradle.api.Named,org.gradle.api.plugins.ExtensionAware,org.gradle.api.Task,org.gradle.util.Configurable<org.gradle.api.Task>
@RestController classes, compares the endpoints they expose
against the configured OpenAPI documentation, and writes an AsciiDoc report of every endpoint
that is not described - the "shadow APIs".
Registered automatically by ShadowApiDetectorPlugin under the name
detectShadowApis.
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.gradle.api.Named
org.gradle.api.Named.Namer -
Field Summary
Fields inherited from interface org.gradle.api.Task
TASK_ACTION, TASK_CONSTRUCTOR_ARGS, TASK_DEPENDS_ON, TASK_DESCRIPTION, TASK_GROUP, TASK_NAME, TASK_OVERWRITE, TASK_TYPE -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidapplyFailOnShadowOverride(boolean value) CLI entry point forgetFailOnShadowOverride().voidapplyScanForShadows(String value) CLI entry point forgetScanForShadows().voidapplyUpdateContractHistoryOverride(boolean value) CLI entry point forgetUpdateContractHistoryOverride().voidgenerate()Task action: either scans a single controller named or pathed bygetScanForShadows()and prints its findings to the console (seescanSingleController(String)), or - when that property is unset - scans every@RestControllerclass undergetControllerDirs(), loads the configured OpenAPI documentation, and writes the shadow API report.abstract org.gradle.api.file.RegularFilePropertyFile that the persisted contract progress history is read from and, whengetUpdateContractHistory()istrue, written back to.The absolute path ofgetContractHistoryFile(), tracked as a plain@Inputvalue - not the file's content, whichgetContractHistoryFile()itself is deliberately excluded from up-to-date checking for.abstract org.gradle.api.file.ConfigurableFileCollectionDirectories to search recursively for@RestControllerclasses.abstract org.gradle.api.provider.Property<Boolean> Whether the build should fail when shadow APIs are found.abstract org.gradle.api.provider.Property<Boolean> Single-run override ofgetFailOnShadow(), settable only from the command line via--failOnShadow/--no-failOnShadow- never wired from the DSL, and unset by default.abstract org.gradle.api.file.DirectoryPropertyDirectory where OpenAPI descriptions are stored, tracked so that changes to any document reachable fromgetRootDocument()invalidate the task's cached result.abstract org.gradle.api.file.DirectoryPropertyThe project directory, used only to resolve a relativegetScanForShadows()path against - never against this process's own working directory, which need not be the project directory at all (e.g.abstract org.gradle.api.file.DirectoryPropertyDirectory the AsciiDoc report is written to.abstract org.gradle.api.provider.Property<String> Name of the generated AsciiDoc report file (without path).abstract org.gradle.api.file.RegularFilePropertyThe root OpenAPI document describing the API.abstract org.gradle.api.provider.Property<String> The name or path of a single@RestControllerclass to scan for shadow APIs, settable only from the command line via--scanForShadows=<name-or-path>- never wired from the DSL, and unset by default.abstract org.gradle.api.provider.Property<String> Version of the system under test whose@RestControllerclasses were scanned, printed in the generated report as e.g.abstract org.gradle.api.provider.Property<Boolean> Whether to persist, across builds, a history of when each endpoint first reached each stage of its contract lifecycle - declared, implemented, verified.abstract org.gradle.api.provider.Property<Boolean> WhethergetContractHistoryFile()is written back to disk after being updated with the current run's endpoints.abstract org.gradle.api.provider.Property<Boolean> Single-run override ofgetUpdateContractHistory(), settable only from the command line via--updateContractHistory/--no-updateContractHistory- never wired from the DSL, and unset by default.Methods inherited from class org.gradle.api.DefaultTask
compareTo, configure, dependsOn, doFirst, doFirst, doFirst, doLast, doLast, doLast, finalizedBy, getActions, getAnt, getDependsOn, getDescription, getDestroyables, getDidWork, getEnabled, getExtensions, getFinalizedBy, getGroup, getInputs, getLocalState, getLogger, getLogging, getMustRunAfter, getName, getOutputs, getPath, getProject, getShouldRunAfter, getState, getTaskDependencies, getTemporaryDir, getTimeout, hasProperty, mustRunAfter, onlyIf, onlyIf, onlyIf, property, setActions, setDependsOn, setDescription, setDidWork, setEnabled, setFinalizedBy, setGroup, setMustRunAfter, setOnlyIf, setOnlyIf, setOnlyIf, setProperty, setShouldRunAfter, shouldRunAfter, usesServiceMethods inherited from class org.gradle.api.internal.AbstractTask
acceptServiceReferences, appendParallelSafeAction, doNotTrackState, doNotTrackStateIf, getAsDynamicObject, getIdentityPath, getImpliesSubProjects, getLifecycleDependencies, getOnlyIf, getReasonNotToTrackState, getReasonsNotToTrackState, getReasonTaskIsIncompatibleWithConfigurationCache, getRequiredServices, getServices, getSharedResources, getStandardOutputCapture, getTaskActions, getTaskIdentity, getTemporaryDirFactory, hasTaskActions, injectIntoNewInstance, isCompatibleWithConfigurationCache, isEnabled, isHasCustomActions, notCompatibleWithConfigurationCache, prependParallelSafeAction, restoreOnlyIf, restoreTaskActions, setImpliesSubProjectsMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.gradle.api.Task
doNotTrackState, notCompatibleWithConfigurationCache
-
Constructor Details
-
DetectShadowApisTask
@Inject public DetectShadowApisTask()Creates the task. Instantiated by Gradle infrastructure viaInject.
-
-
Method Details
-
getControllerDirs
@InputFiles @PathSensitive(RELATIVE) public abstract org.gradle.api.file.ConfigurableFileCollection getControllerDirs()Directories to search recursively for@RestControllerclasses.- Returns:
- mutable file collection of controller source directories
-
getRootDocument
@InputFile @PathSensitive(RELATIVE) public abstract org.gradle.api.file.RegularFileProperty getRootDocument()The root OpenAPI document describing the API.- Returns:
- mutable file property for the root OpenAPI document
-
getOpenApiDir
@Optional @InputDirectory @PathSensitive(RELATIVE) public abstract org.gradle.api.file.DirectoryProperty getOpenApiDir()Directory where OpenAPI descriptions are stored, tracked so that changes to any document reachable fromgetRootDocument()invalidate the task's cached result.- Returns:
- mutable directory property for the OpenAPI description directory
-
getFailOnShadow
Whether the build should fail when shadow APIs are found.- Returns:
- mutable boolean property controlling whether the build fails on shadow APIs
-
getReportDir
@OutputDirectory public abstract org.gradle.api.file.DirectoryProperty getReportDir()Directory the AsciiDoc report is written to.- Returns:
- mutable directory property for the report output directory
-
getReportFileName
Name of the generated AsciiDoc report file (without path).- Returns:
- mutable string property for the report file name
-
getSystemUnderTestVersion
Version of the system under test whose@RestControllerclasses were scanned, printed in the generated report as e.g.System Under Test version: v1.0.0.- Returns:
- mutable string property for the system-under-test version
-
getTrackContractHistory
Whether to persist, across builds, a history of when each endpoint first reached each stage of its contract lifecycle - declared, implemented, verified.- Returns:
- mutable boolean property controlling whether contract progress history is tracked
-
getContractHistoryFile
@Internal public abstract org.gradle.api.file.RegularFileProperty getContractHistoryFile()File that the persisted contract progress history is read from and, whengetUpdateContractHistory()istrue, written back to. Deliberately not declared as an@InputFile/@OutputFile: the file legitimately may not exist yet (treated as an empty history, not an error) and is only conditionally written back, so it's read and written directly ingenerate()instead of through Gradle's file-content-based up-to-date checking. Its configured path - as opposed to the file's content - is still tracked as a plain input viagetContractHistoryFilePath(), so that renaming or relocating it is itself enough to invalidate this task's up-to-date state.- Returns:
- mutable file property for the contract history file
-
getContractHistoryFilePath
The absolute path ofgetContractHistoryFile(), tracked as a plain@Inputvalue - not the file's content, whichgetContractHistoryFile()itself is deliberately excluded from up-to-date checking for. Without this, renaming or relocatingcontractHistoryFilein the build script - with no other configured input having changed - would leave this taskUP-TO-DATEand silently skip writing history to the newly configured location.- Returns:
- the contract history file's absolute path, or
nullif unset
-
getUpdateContractHistory
WhethergetContractHistoryFile()is written back to disk after being updated with the current run's endpoints. Only consulted whengetTrackContractHistory()istrue; the history file is always read regardless.- Returns:
- mutable boolean property controlling whether the contract history file is written back
-
getUpdateContractHistoryOverride
@Input @Optional public abstract org.gradle.api.provider.Property<Boolean> getUpdateContractHistoryOverride()Single-run override ofgetUpdateContractHistory(), settable only from the command line via--updateContractHistory/--no-updateContractHistory- never wired from the DSL, and unset by default. When present, takes precedence overgetUpdateContractHistory()for this run only, without changing the build script - typically used from CI to advance the committed history only on the branch(es) whose pipeline should, since the plugin itself has no notion of which branch is currently checked out.Tracked as
@Input, not@Internal: without that, passing a different value on the command line between two otherwise-identical runs would leave the taskUP-TO-DATEand silently skip re-executing with the new override.- Returns:
- mutable, normally-unset boolean property overriding
getUpdateContractHistory()for a single run
-
applyUpdateContractHistoryOverride
public void applyUpdateContractHistoryOverride(boolean value) CLI entry point forgetUpdateContractHistoryOverride(). Not meant to be called directly - Gradle invokes it when--updateContractHistory/--no-updateContractHistoryis passed on the command line.Deliberately not named
setUpdateContractHistoryOverride- a method matching thegetUpdateContractHistoryOverride()/setUpdateContractHistoryOverride(...)JavaBean getter/setter naming convention makes Gradle's task class generator treat the pair as a plainbooleanproperty and rejectgetUpdateContractHistoryOverride()for being abstract, even though it is a perfectly ordinary managedProperty<Boolean>.- Parameters:
value- the value to overridegetUpdateContractHistory()with for this run
-
getFailOnShadowOverride
@Input @Optional public abstract org.gradle.api.provider.Property<Boolean> getFailOnShadowOverride()Single-run override ofgetFailOnShadow(), settable only from the command line via--failOnShadow/--no-failOnShadow- never wired from the DSL, and unset by default. When present, takes precedence overgetFailOnShadow()for this run only, without changing the build script - applies equally to a full-project scan and to agetScanForShadows()single-controller scan.Tracked as
@Input, not@Internal- seegetUpdateContractHistoryOverride()for why.- Returns:
- mutable, normally-unset boolean property overriding
getFailOnShadow()for a single run
-
applyFailOnShadowOverride
public void applyFailOnShadowOverride(boolean value) CLI entry point forgetFailOnShadowOverride(). Not meant to be called directly - Gradle invokes it when--failOnShadow/--no-failOnShadowis passed on the command line. SeeapplyUpdateContractHistoryOverride(boolean)for why this is deliberately not namedsetFailOnShadowOverride.- Parameters:
value- the value to overridegetFailOnShadow()with for this run
-
getScanForShadows
The name or path of a single@RestControllerclass to scan for shadow APIs, settable only from the command line via--scanForShadows=<name-or-path>- never wired from the DSL, and unset by default. When present,generate()scans only this controller instead of every file undergetControllerDirs(), and prints its findings to the console instead of writinggetReportDir()'s AsciiDoc report - seescanSingleController(String).Two forms are accepted:
- A path ending in
.java- scanned directly, regardless ofgetControllerDirs(). Fails clearly if the file does not exist. - A bare class name (e.g.
OrderController) - every<name>.javafile found anywhere undergetControllerDirs()is scanned; there may be more than one, e.g. same-named controllers in different packages, in which case every match is scanned and their findings combined. Fails clearly if no file named<name>.javais found.
Tracked as
@Input, not@Internal- seegetUpdateContractHistoryOverride()for why.- Returns:
- mutable, normally-unset string property naming or pathing a single controller to scan
- A path ending in
-
getProjectDirectory
@Internal public abstract org.gradle.api.file.DirectoryProperty getProjectDirectory()The project directory, used only to resolve a relativegetScanForShadows()path against - never against this process's own working directory, which need not be the project directory at all (e.g. when Gradle is invoked with--project-dirfrom elsewhere) and, unlike the project directory, isn't necessarily stable in a configuration-cache-compatible way. Wired once byShadowApiDetectorPluginat configuration time; not itself part of the public DSL.- Returns:
- directory property for the project directory
-
applyScanForShadows
CLI entry point forgetScanForShadows(). Not meant to be called directly - Gradle invokes it when--scanForShadows=<value>is passed on the command line. SeeapplyUpdateContractHistoryOverride(boolean)for why this is deliberately not namedsetScanForShadows.- Parameters:
value- the controller name or.javapath to scan
-
generate
public void generate()Task action: either scans a single controller named or pathed bygetScanForShadows()and prints its findings to the console (seescanSingleController(String)), or - when that property is unset - scans every@RestControllerclass undergetControllerDirs(), loads the configured OpenAPI documentation, and writes the shadow API report. Either way, fails the build if any shadow API was found and the effectivegetFailOnShadow()(accounting forgetFailOnShadowOverride()) istrue.
-