Writing a plugin for computing sha1sum for the cla...
# community-support
s
Writing a plugin for computing sha1sum for the class files, here i'm taking few input properties.. but i'm facing difficulties while running the program.. though i'm passing properties.. inside task execution, its giving always null.. those properties are not being set..
Copy code
package com.myorg.plugins

import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.TaskAction

import java.security.MessageDigest

class ChecksumPluginV3 implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create("checksumConfig", ChecksumPluginExtension3)
        project.tasks.register("computeFileChecksums", ChecksumTask3)
        /*project.tasks.register("computeFileChecksums", ChecksumTask3) { task ->

            task.inputFiles.set(extension.inputFiles)
            task.hashAlgorithms.set(extension.hashAlgorithms)
            task.outputDir.set(extension.outputDir)
            task.outputFormat.set(extension.outputFormat)
        }*/


     
    }
}


abstract class ChecksumTask3 extends DefaultTask {

    @Input
    @Optional
    List<String> inputFiles

    @Input
    @Optional
    List<String> hashAlgorithms

    @Input
    @Optional
    String outputDir

    @Input
    @Optional
    String outputFormat

    @TaskAction
    void computeChecksums() {
        def projectDir = getProject().projectDir

        println("inputFiles: ${inputFiles}")
        println("outputDir: ${outputDir}")
        println("hashAlgorithms: ${hashAlgorithms}")
        println("outputFormat: ${outputFormat}")


        
    }

}

abstract class ChecksumPluginExtension3 {
    abstract List<String> inputFiles
    abstract List<String> hashAlgorithms
    abstract String outputDir
    abstract String outputFormat
}
I'm always getting null inside task:
Copy code
inputFiles: null
outputDir: null
hashAlgorithms: null
outputFormat: null
I'm under assumption that if extension and task variables have same names, those will be automatically mapped by gradle.. correct me if i'm wrong
I'm running test case like this:
Copy code
// Configure the extension
project.getExtensions().configure(ChecksumPluginExtension3.class, extension -> {
    extension.setInputFiles(Collections.singletonList("src/test/resources/testfile.txt"));
    extension.setHashAlgorithms(Collections.singletonList("SHA-1"));
    extension.setOutputDir("build/checksums");
    extension.setOutputFormat("text");
});

// Execute the task
task.getActions().forEach(action -> action.execute(task));
If i enable this:
Copy code
project.tasks.register("computeFileChecksums", ChecksumTask3) { task ->

            task.inputFiles.set(extension.inputFiles)
            task.hashAlgorithms.set(extension.hashAlgorithms)
            task.outputDir.set(extension.outputDir)
            task.outputFormat.set(extension.outputFormat)
        }
I'm getting NPE at
Copy code
task.inputFiles.set(extension.inputFiles)
Trace:
Copy code
Caused by: java.lang.NullPointerException: Cannot invoke method set() on null object
	at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:44)
I tried changing like this too:
Copy code
project.tasks.register("computeFileChecksums", ChecksumTask3) { task ->
            task.inputFiles = extension.inputFiles
            task.hashAlgorithms = extension.hashAlgorithms
            task.outputDir = extension.outputDir
            task.outputFormat = extension.outputFormat
        }
but still getting like this:
Copy code
inputFiles: null
outputDir: null
hashAlgorithms: null
outputFormat: null
n
You should use lazy properties in both your extension and task implementations and wire those together. https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_properties
👆 2
v
Besides that, no, there is no auto-name-based mapping in any way. That also would not make much sense, how would Gradle know which extension should match which task. And you should also fix up your types. Neither
String
nor
@Input
is appropriate for input files or output directory. Former should probably be a `ConfigurableFileCollection`with
@InputFiles
and latter a
DirectoryProperty
with
@OutputDirectory
.
👍 1