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/main/java/hudson/tasks/BatchFile.java
>
> https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/tasks/Shell.java
>
> https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/tasks/CommandInterpreter.java
>
> /B
>
>
> On Wed, Nov 16, 2016 at 8:41 AM, Kul Bhushan Srivastava <[email protected] 
> <javascript:>> 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] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/jenkinsci-dev/76d6ddbf-14a2-405d-8197-f2dd549e8248%40googlegroups.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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to