Yes, definitely use a @DataBoundSetter, it will get called automatically
when the configuration is saved after the @DataBoundConstructor is called.

On Thu, Jun 4, 2020 at 3:00 PM 'Gavin Mogan' via Jenkins Developers <
[email protected]> wrote:

> You should be able to make @DataBoundSetter and make a setter
>
> I think I remember people saying that you need to at least leave the old
> constructor in place for legacy freestyle jobs. I know that's why I prefer
> setters.
>
> On Thu., Jun. 4, 2020, 1:43 p.m. John Westcott, <
> [email protected]> wrote:
>
>> In the Jenkins Ansible Tower plugin I had a checkbox for importing logs.
>> In order to satisfy a new requirement I would like to change this into a
>> select menu. So I modified my code to switch from a true/false checkbox
>> into a select menu which has values of true, false, full and vars as
>> options.
>> My plugin supported both Freestyle and Pipeline Jenkins jobs.
>> After changing my code all existing freestyle jobs made the conversion
>> seamlessly an old boolean true or false values mapped into the string
>> values “true” and “false” without any issues.
>>
>> However, groovy scripts using the pipeline portion of the plugin are
>> throwing stack exceptions because the grooy scripts specify boolean values
>> like :
>> importTowerLogs = true,
>>
>> These values are not mapping to strings and Jenkins is putting out an
>> exception when running the pipeline:
>>
>> java.lang.ClassCastException: 
>> org.jenkinsci.plugins.ansible_tower.AnsibleTowerStep.importTowerLogs expects 
>> class java.lang.String but received class java.lang.Boolean
>>      at 
>> org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:492)
>>      at 
>> org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
>>
>>      at 
>> org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:409)
>>
>>           at 
>> org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:492)
>>
>>
>> My old @DataBoundConstructor looked like:
>>
>> @DataBoundConstructor
>> public AnsibleTowerStep(@Nonnull String towerServer, Boolean 
>> importTowerLogs, Boolean param2, ...) {
>>
>>
>> My new constructor needs to be:
>>
>> @DataBoundConstructor
>> public AnsibleTowerStep(
>>         @Nonnull String towerServer, String importTowerLogs, Boolean param2, 
>> ...) {
>>
>>
>> I tried having two @DataBoundConstructors, one for the old Boolean and
>> one for the String, but this caused an exception when compiling the plugin:
>>
>> [ERROR] Failed to execute goal
>> org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile
>> (default-compile) on project ansible-tower: Compilation failure
>> [ERROR] javax.annotation.processing.FilerException: Attempt to reopen a
>> file for path
>> /Users/jowestco/IdeaProjects/ansible-tower-plugin/target/classes/org/jenkinsci/plugins/ansible_tower/AnsibleTowerStep.stapler
>> [ERROR] at
>> com.sun.tools.javac.processing.JavacFiler.checkFileReopening(JavacFiler.java:535)
>> [ERROR] at
>> com.sun.tools.javac.processing.JavacFiler.createResource(JavacFiler.java:431)
>> [ERROR] at
>> org.kohsuke.stapler.jsr269.AbstractProcessorImpl.createResource(AbstractProcessorImpl.java:81)
>>
>>
>>
>> After that I tried to have a constructor (not decorated with
>> @DataBoundConstructor) that would take a Boolean instead of a String and
>> would call my DataBoundConstructor like:
>>
>> public AnsibleTowerStep(@Nonnull String towerServer, Boolean 
>> importTowerLogs, Boolean param2, ...) { this(towerServer, 
>> importTowerLogs.toString(), param2…); }
>>
>> But the pipelines were unable to find and use this constructor and threw
>> the same stack trace as above.
>>
>> As another solution, I also tried to change the constructor to just an
>> Object like:
>>
>> @DataBoundConstructor
>> public AnsibleTowerStep(@Nonnull String towerServer, Object importTowerLogs, 
>> Boolean param2, ...) {
>>
>> With this the groovy scripts worked and I was able to use
>> importTowerLogs.toString() to get a string for either a boolean or string
>> object. Unfortunately, with this solution, the pipeline syntax generator
>> would raise an exception that it couldn’t convert a string param into an
>> object..
>>
>> Does anyone have any other ideas on how I may be able to achieve what I
>> am trying to do seamlessly (change a boolean field to a string)? Or do I
>> need to tell my users that the new version of my plugin requires changing
>> groovy scripts from 'importTowerLogs = true’ to ‘importTowerLogs = ‘true”’?
>> If making users update groovy scripts is my only solution, what are the
>> recommend way(s) to warn users about this change? Obviously I will put it
>> in the release nodes and spike it out somewhere in my README.md file as
>> well; but is there anything else I can/should do? i.e. can I mark the new
>> version of the plugin as using an incomparable syntax with the old version?
>>
>> Thanks in advance,
>>
>> -John
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Jenkins Developers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/jenkinsci-dev/DDE53530-48EF-4910-A085-2A8F695BB525%40redhat.com
>> <https://groups.google.com/d/msgid/jenkinsci-dev/DDE53530-48EF-4910-A085-2A8F695BB525%40redhat.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> You received this message because you are subscribed to the Google Groups
> "Jenkins Developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/jenkinsci-dev/CAG%3D_DusrOaR%2BJ-S2WdDgg-bT-VHce%3DbuvHasuzRgLVvbu70A6w%40mail.gmail.com
> <https://groups.google.com/d/msgid/jenkinsci-dev/CAG%3D_DusrOaR%2BJ-S2WdDgg-bT-VHce%3DbuvHasuzRgLVvbu70A6w%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Website: http://earl-of-code.com

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-dev/CAPiUgVdMVoF4sC7VNMcPfpg2yQEW0Cc_yHYazHgK5Va3DDywqw%40mail.gmail.com.

Reply via email to