Abstract classes cannot be instanciated, so you can't annotate the
constructor with DataBoundConstructor since the class can't be directly
instanciated but will need to be subclassed.

/B

On Wed, Nov 16, 2016 at 3:59 PM, Kul Bhushan Srivastava <[email protected]>
wrote:

> Thanks Robert.
>
> I am facing maven compilation issue. Saying @DataBoundConstructor cannot
> be used inside abstract class.
>
> Please suggest.
>
> My Java File:
>
> import org.kohsuke.stapler.DataBoundConstructor;
> import hudson.Extension;
> import hudson.FilePath;
> import hudson.Launcher;
> import hudson.tasks.Messages;
> import hudson.Proc;
> import hudson.Util;
> import hudson.EnvVars;
> import hudson.model.AbstractBuild;
> import hudson.model.BuildListener;
> import hudson.model.Node;
> import hudson.model.Result;
> import hudson.model.TaskListener;
> import hudson.remoting.ChannelClosedException;
> import hudson.model.AbstractProject;
> import hudson.tasks.BuildStepDescriptor;
> import hudson.tasks.Builder;
> import hudson.tasks.CommandInterpreter;
> import java.io.IOException;
> import java.util.Map;
> import java.util.logging.Level;
> import java.util.logging.Logger;
> import javax.annotation.Nonnull;
>
> public abstract class BuildStepCreator extends Builder {
>
>     private String text1, text2, text3;
>
>     public String getText1(){
>         return text1;
>     }
>     public String getText2(){
>         return text2;
>     }
>     public String getText3(){
>         return text3;
>     }
>
>
>     @DataBoundConstructor
>     public BuildStepCreator(OptionalTextBlock1 enableText1,
> OptionalTextBlock2 enableText2, OptionalTextBlock3 enableText3) {
>         this.text1 = (enableText1 != null) ? enableText1.text1 : null;
>         this.text2 = (enableText2 != null) ? enableText2.text2 : null;
>         this.text3 = (enableText3 != null) ? enableText3.text3 : null;
>     }
>
>     public static class OptionalTextBlock1 {
>         private String text1;
>         @DataBoundConstructor
>         public OptionalTextBlock1(String text1) {
>             this.text1 = text1;
>         }
>     }
>     public static class OptionalTextBlock2 {
>         private String text2;
>         @DataBoundConstructor
>         public OptionalTextBlock2(String text2) {
>             this.text2 = text2;
>         }
>     }
>     public static class OptionalTextBlock3 {
>         private String text3;
>         @DataBoundConstructor
>         public OptionalTextBlock3(String text3) {
>             this.text3 = text3;
>         }
>     }
>
>     @Extension
>     public static final class DescriptorImpl extends
> BuildStepDescriptor<Builder>{
>
>         /*public FormValidation doCheckTask(@QueryParameter String value){
>             try{
>                 if(value.equalsIgnoreCase(null) ||
> value.equalsIgnoreCase("")){
>                     return FormValidation.error("Invalid Details.");
>                 }
>             }catch(Exception e){
>                 return FormValidation.error("Error validating the form
> details.");
>             }
>             return FormValidation.ok();
>         }
>
>         public FormValidation doCheckGoal(@QueryParameter String value){
>             try{
>                 Integer.parseInt(value);
>             }catch(Exception e){
>                 return FormValidation.error("Please provide integer in the
> Goal.");
>             }
>             return FormValidation.ok();
>         }*/
>
>         @Override
>         public boolean isApplicable(Class<? extends AbstractProject>
> jobType) {
>             // TODO Auto-generated method stub
>             return true;
>         }
>
>         @Override
>         public String getDisplayName() {
>             // TODO Auto-generated method stub
>             return "Job Orchestration";
>         }
>     }
>
>     /*@Override
>     public boolean perform(hudson.model.AbstractBuild build,
> hudson.Launcher launcher, hudson.model.BuildListener listener) {
>         listener.getLogger().println("OptionalBlockSampleBuilder " +
> text1);
>         return true;
>     }*/
>
>     @Override
>     public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
> BuildListener listener) throws InterruptedException {
>         return perform(build,launcher,(TaskListener)listener);
>     }
>
>     /**
>      * Determines whether a non-zero exit code from the process should
> change the build
>      * status to {@link Result#UNSTABLE} instead of default {@link
> Result#FAILURE}.
>      *
>      * Changing to {@link Result#UNSTABLE} does not abort the build, next
> steps are continued.
>      *
>      */
>     protected boolean isErrorlevelForUnstableBuild(int exitCode) {
>         return false;
>     }
>
>     public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
> TaskListener listener) throws InterruptedException{
>         FilePath ws = build.getWorkspace();
>         if (ws == null) {
>             Node node = build.getBuiltOn();
>             if (node == null) {
>                 throw new NullPointerException("no such build node: " +
> build.getBuiltOnStr());
>             }
>             throw new NullPointerException("no workspace from node " +
> node + " which is computer " + node.toComputer() + " and has channel " +
> node.getChannel());
>         }
>         FilePath script=null;
>         int r = -1;
>         try {
>             try {
>                 script = createScriptFile(ws);
>             } catch (IOException e) {
>                 Util.displayIOException(e,listener);
>                 e.printStackTrace(listener.fatalError(Messages.
> CommandInterpreter_UnableToProduceScript()));
>                 return false;
>             }
>
>             try {
>                 EnvVars envVars = build.getEnvironment(listener);
>                 // on Windows environment variables are converted to all
> upper case,
>                 // but no such conversions are done on Unix, so to make
> this cross-platform,
>                 // convert variables to all upper cases.
>                 for(Map.Entry<String,String> e : build.getBuildVariables().
> entrySet())
>                     envVars.put(e.getKey(),e.getValue());
>
>                 r = join(launcher.launch().cmds(buildCommandLine(script)).
> envs(envVars).stdout(listener).pwd(ws).start());
>
>                 if(isErrorlevelForUnstableBuild(r)) {
>                     build.setResult(Result.UNSTABLE);
>                     r = 0;
>                 }
>             } catch (IOException e) {
>                 Util.displayIOException(e, listener);
>                 e.printStackTrace(listener.fatalError(Messages.
> CommandInterpreter_CommandFailed()));
>             }
>             return r==0;
>         } finally {
>             try {
>                 if(script!=null)
>                     script.delete();
>             } catch (IOException e) {
>                 if (r==-1 && e.getCause() instanceof
> ChannelClosedException) {
>                     // JENKINS-5073
>                     // r==-1 only when the execution of the command
> resulted in IOException,
>                     // and we've already reported that error. A common
> error there is channel
>                     // losing a connection, and in that case we don't want
> to confuse users
>                     // by reporting the 2nd problem. Technically the 1st
> exception may not be
>                     // a channel closed error, but that's rare enough, and
> JENKINS-5073 is common enough
>                     // that this suppressing of the error would be
> justified
>                     LOGGER.log(Level.FINE, "Script deletion failed", e);
>                 } else {
>                     Util.displayIOException(e,listener);
>                     e.printStackTrace( listener.fatalError(Messages.
> CommandInterpreter_UnableToDelete(script)) );
>                 }
>             } catch (Exception e) {
>                 e.printStackTrace( listener.fatalError(Messages.
> CommandInterpreter_UnableToDelete(script)) );
>             }
>         }
>     }
>
>     /**
>      * Reports the exit code from the process.
>      *
>      * This allows subtypes to treat the exit code differently (for
> example by treating non-zero exit code
>      * as if it's zero, or to set the status to {@link Result#UNSTABLE}).
> Any non-zero exit code will cause
>      * the build step to fail. Use {@link #isErrorlevelForUnstableBuild(int
> exitCode)} to redefine the default
>      * behaviour.
>      *
>      * @since 1.549
>      */
>     protected int join(Proc p) throws IOException, InterruptedException {
>         return p.join();
>     }
>
>     /**
>      * Creates a script file in a temporary name in the specified
> directory.
>      */
>     public FilePath createScriptFile(@Nonnull FilePath dir) throws
> IOException, InterruptedException {
>         return dir.createTextTempFile("hudson", getFileExtension(),
> getContents(), false);
>     }
>
>     public abstract String[] buildCommandLine(FilePath script);
>
>     protected abstract String getContents();
>
>     protected abstract String getFileExtension();
>
>     private static final Logger LOGGER = Logger.getLogger(
> CommandInterpreter.class.getName());
>
> }
>
> On Wednesday, 16 November 2016 17:15:12 UTC+5:30, Robert Sandell wrote:
>>
>> Here are the classes involved in "execute script" step.
>>
>> https://github.com/jenkinsci/jenkins/blob/master/core/src/ma
>> in/java/hudson/tasks/BatchFile.java
>> https://github.com/jenkinsci/jenkins/blob/master/core/src/ma
>> in/java/hudson/tasks/Shell.java
>> https://github.com/jenkinsci/jenkins/blob/master/core/src/ma
>> in/java/hudson/tasks/CommandInterpreter.java
>>
>> /B
>>
>>
>> On Wed, Nov 16, 2016 at 8:41 AM, Kul Bhushan Srivastava <
>> [email protected]> wrote:
>>
>>> If anyone can guide how the windows bactch command execution are handled
>>> from backend JAVA API. Then I may create one of my own.
>>>
>>> On Monday, 14 November 2016 13:37:49 UTC+5:30, Kul Bhushan Srivastava
>>> wrote:
>>>>
>>>>
>>>
>>> --
>>> 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/ms
>>> gid/jenkinsci-dev/76d6ddbf-14a2-405d-8197-f2dd549e8248%40goo
>>> glegroups.com
>>> <https://groups.google.com/d/msgid/jenkinsci-dev/76d6ddbf-14a2-405d-8197-f2dd549e8248%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>>
>> --
>> Robert Sandell
>> *Software Engineer*
>> *CloudBees Inc.*
>>
> --
> 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/39ff5e49-dcf3-4098-a505-de706522682e%
> 40googlegroups.com
> <https://groups.google.com/d/msgid/jenkinsci-dev/39ff5e49-dcf3-4098-a505-de706522682e%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Robert Sandell
*Software Engineer*
*CloudBees Inc.*

-- 
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/CALzHZS0TFftMNLNSaQU86LB%2B%2BJwhFsAJ3qaQr0jPPxTKqA1b8w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to