Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Fixed JENKINS-14591] migrate parameter options to extensible behavior
Rename config to 'row header' and 'column header' options. Provide different
options based on existing behavior and requests from users:

   * No column header
   * Simple headers
   * Headers with parameters
   * Header with all build variables
  • Loading branch information
Dan Alvizu committed Feb 5, 2016
1 parent d3dd54e commit 08373d6
Show file tree
Hide file tree
Showing 36 changed files with 1,395 additions and 307 deletions.
1 change: 1 addition & 0 deletions pom.xml
Expand Up @@ -241,6 +241,7 @@
<goals>
<goal>check</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>
Expand Down
Expand Up @@ -10,7 +10,6 @@
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.kohsuke.stapler.bind.JavaScriptMethod;
Expand Down Expand Up @@ -167,10 +166,6 @@ public boolean isManualTrigger() {
return pipelineBuild.isManualTrigger();
}

public Map<String, String> getParameters() {
return pipelineBuild.getBuildParameters();
}

public ArrayList<String> getParameterList() {
return parameters;
}
Expand All @@ -179,4 +174,8 @@ public Integer getProjectId() {
return projectId;
}

public AbstractBuild<?, ?> getCurrentBuild() {
return pipelineBuild.getCurrentBuild();
}

}
Expand Up @@ -24,6 +24,11 @@
*/
package au.com.centrumsystems.hudson.plugin.buildpipeline;

import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.NullColumnHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.PipelineHeaderExtension;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.BuildVariablesHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.SimpleColumnHeader;
import au.com.centrumsystems.hudson.plugin.buildpipeline.extension.SimpleRowHeader;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;

Expand Down Expand Up @@ -60,6 +65,7 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -119,12 +125,32 @@ public class BuildPipelineView extends View {
/** alwaysAllowManualTrigger. */
private boolean alwaysAllowManualTrigger = true;

/** showPipelineParameters. */
/**
* Whether to show pipeline parameter in the revision box
* @deprecated - replaced with revisionBoxParameterProvider, keep in place
* to migrate data
*/
@Deprecated
private boolean showPipelineParameters = true;

/** showPipelineParametersInHeaders */
/**
* What to show as a row header for pipelines
*/
private PipelineHeaderExtension rowHeaders;

/**
* Whether to show pipeline parameters in the header box
* @deprecated - replaced with headerBoxParameterProvider, keep in place
* to migrate data
*/
@Deprecated
private boolean showPipelineParametersInHeaders;

/**
* What to show as a column headers for jobs in the pipeline
*/
private PipelineHeaderExtension columnHeaders;

/**
* @deprecated
*
Expand All @@ -141,13 +167,6 @@ public class BuildPipelineView extends View {
/** showPipelineDefinitionHeader. */
private boolean showPipelineDefinitionHeader;

/*
* Keep feature flag properties in one place so that it is easy to refactor them out later.
*/
/* Feature flags - START */

/* Feature flags - END */

/** A Logger object is used to log messages */
private static final Logger LOGGER = Logger.getLogger(BuildPipelineView.class.getName());

Expand Down Expand Up @@ -213,27 +232,35 @@ public BuildPipelineView(final String name, final String buildViewTitle,
* URL for the custom CSS file.
* @param selectedJob
* the first job name in the pipeline. it can be set to null when gridBuilder is passed.
* @param columnHeaders
* see {@link #columnHeaders}
* @param rowHeaders
* see {@link #rowHeaders}
*/
@DataBoundConstructor
public BuildPipelineView(final String name, final String buildViewTitle, final ProjectGridBuilder gridBuilder,
final String noOfDisplayedBuilds,
final boolean triggerOnlyLatestJob, final boolean alwaysAllowManualTrigger, final boolean showPipelineParameters,
final boolean showPipelineParametersInHeaders, final boolean showPipelineDefinitionHeader,
final int refreshFrequency, final String cssUrl, final String selectedJob) {
final int refreshFrequency, final String cssUrl, final String selectedJob,
final PipelineHeaderExtension columnHeaders,
final PipelineHeaderExtension rowHeaders) {
this(name, buildViewTitle, gridBuilder, noOfDisplayedBuilds, triggerOnlyLatestJob, cssUrl);
this.alwaysAllowManualTrigger = alwaysAllowManualTrigger;
this.showPipelineParameters = showPipelineParameters;
this.showPipelineParametersInHeaders = showPipelineParametersInHeaders;
this.showPipelineDefinitionHeader = showPipelineDefinitionHeader;
this.selectedJob = selectedJob;
this.columnHeaders = columnHeaders;
this.rowHeaders = rowHeaders;
//not exactly understanding the lifecycle here, but I want a default of 3
//(this is what the class variable is set to 3, if it's 0, set it to default, refresh of 0 does not make sense anyway)
if (refreshFrequency < 1) {
this.refreshFrequency = 3;
} else {
this.refreshFrequency = refreshFrequency;
}

//for remote api support
if (this.gridBuilder == null) {
if (this.selectedJob != null) {
Expand All @@ -249,6 +276,12 @@ public BuildPipelineView(final String name, final String buildViewTitle, final P
}

/**
* Migrate old data, set new fields
*
* @see
* <a href="https://wiki.jenkins-ci.org/display/JENKINS/Hint+on+retaining+backward+compatibility">
* Jenkins wiki entry on the subject</a>
*
* @return
* must be always 'this'
*/
Expand All @@ -257,7 +290,28 @@ protected Object readResolve() {
if (selectedJob != null) {
gridBuilder = new DownstreamProjectGridBuilder(selectedJob);
}
} else {
// safe to assume an existing install, check if we need to migrate
// header config
if (columnHeaders == null) {
if (!showPipelineDefinitionHeader) {
columnHeaders = new NullColumnHeader();
} else if (showPipelineParametersInHeaders) {
columnHeaders = new BuildVariablesHeader();
} else {
columnHeaders = new SimpleColumnHeader();
}
}
if (rowHeaders == null) {
if (showPipelineParameters) {
rowHeaders = new BuildVariablesHeader();
} else {
rowHeaders = new SimpleRowHeader();
}
}
}


return this;
}

Expand Down Expand Up @@ -296,6 +350,22 @@ public boolean isProjectParameterized() {
return getGridBuilder().startsWithParameters(this);
}

public PipelineHeaderExtension getColumnHeaders() {
return columnHeaders;
}

public void setColumnHeaders(PipelineHeaderExtension columnHeaders) {
this.columnHeaders = columnHeaders;
}

public PipelineHeaderExtension getRowHeaders() {
return rowHeaders;
}

public void setRowHeaders(PipelineHeaderExtension rowHeaders) {
this.rowHeaders = rowHeaders;
}

/**
* Checks whether the user has Configure permission for the current project.
*
Expand Down Expand Up @@ -490,8 +560,8 @@ private int triggerBuild(final AbstractProject<?, ?> triggerProject, final Abstr
final List<AbstractBuildParameters> configs = retrieveUpstreamProjectTriggerConfig(triggerProject, upstreamBuild);

if (configs == null) {
LOGGER.log(Level.SEVERE, "No upstream trigger found for this project" + triggerProject.getFullDisplayName());
throw new IllegalStateException("No upstream trigger found for this project" + triggerProject.getFullDisplayName());
LOGGER.log(Level.SEVERE, "No upstream trigger found for this project: " + triggerProject.getFullDisplayName());
throw new IllegalStateException("No upstream trigger found for this project: " + triggerProject.getFullDisplayName());
}

for (final AbstractBuildParameters config : configs) {
Expand Down Expand Up @@ -533,10 +603,16 @@ private List<AbstractBuildParameters> retrieveUpstreamProjectTriggerConfig(final

final BuildPipelineTrigger manualTrigger = upstreamProjectPublishersList.get(BuildPipelineTrigger.class);
if (manualTrigger != null) {
LOGGER.fine("Found Manual Trigger (BuildPipelineTrigger) found in upstream project publisher list ");
final Set<String> downstreamProjectsNames =
Sets.newHashSet(Splitter.on(",").trimResults().split(manualTrigger.getDownstreamProjectNames()));
LOGGER.fine("Downstream project names: " + downstreamProjectsNames);
// defect: requires full name in the trigger. But downstream is just fine!
if (downstreamProjectsNames.contains(project.getFullName())) {
configs = manualTrigger.getConfigs();
} else {
LOGGER.warning("Upstream project had a Manual Trigger for projects [" + downstreamProjectsNames
+ "], but that did not include our project [" + project.getFullName() + "]");
}
}

Expand Down Expand Up @@ -678,6 +754,52 @@ public ListBoxModel doFillNoOfDisplayedBuildsItems() {
return options;
}

/**
* @param condition
* if true, return it as part of the returned list
* @return
* a filtered and ordered list of descriptors matching the condition
*/
public List<Descriptor<PipelineHeaderExtension>> filter(Function<PipelineHeaderExtension, Boolean> condition) {
final List<Descriptor<PipelineHeaderExtension>> result = new ArrayList<Descriptor<PipelineHeaderExtension>>();
final List<PipelineHeaderExtension> applicableExtensions = new ArrayList<PipelineHeaderExtension>();
for (PipelineHeaderExtension extension : PipelineHeaderExtension.all()) {
if (condition.apply(extension)) {
applicableExtensions.add(extension);
}
}
Collections.sort(applicableExtensions);
for (PipelineHeaderExtension extension : applicableExtensions) {
result.add(extension.getDescriptor());
}
return result;
}

/**
* @return a list of PipelineHeaderExtension descriptors which can be used as a row header
*/
public List<Descriptor<PipelineHeaderExtension>> getRowHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtension, Boolean>() {
@Override
public Boolean apply(PipelineHeaderExtension extension) {
return extension.appliesToRows();
}
});
}

/**
* @return a list of PipelineHeaderExtension descriptors which can be used as column headers
*/
public List<Descriptor<PipelineHeaderExtension>> getColumnHeaderDescriptors() {
return filter(new Function<PipelineHeaderExtension, Boolean>() {

@Override
public Boolean apply(PipelineHeaderExtension extension) {
return extension.appliesToColumns();
}
});
}

/**
* Display Console Output Link Style Items in the Edit View Page
*
Expand All @@ -692,6 +814,21 @@ public ListBoxModel doFillConsoleOutputLinkStyleItems() {
}
}

/**
* Because java 6
*
*/
public interface Function<F, T> {
/**
*
* @param input
* an input
* @return
* a result
*/
T apply(F input);
}

public String getBuildViewTitle() {
return buildViewTitle;
}
Expand Down Expand Up @@ -756,30 +893,6 @@ public void setAlwaysAllowManualTrigger(final boolean alwaysAllowManualTrigger)
this.alwaysAllowManualTrigger = alwaysAllowManualTrigger;
}

public boolean isShowPipelineParameters() {
return showPipelineParameters;
}

public String getShowPipelineParameters() {
return Boolean.toString(showPipelineParameters);
}

public void setShowPipelineParameters(final boolean showPipelineParameters) {
this.showPipelineParameters = showPipelineParameters;
}

public boolean isShowPipelineParametersInHeaders() {
return showPipelineParametersInHeaders;
}

public String getShowPipelineParametersInHeaders() {
return Boolean.toString(showPipelineParametersInHeaders);
}

public void setShowPipelineParametersInHeaders(final boolean showPipelineParametersInHeaders) {
this.showPipelineParametersInHeaders = showPipelineParametersInHeaders;
}

public int getRefreshFrequency() {
return refreshFrequency;
}
Expand Down
Expand Up @@ -36,7 +36,6 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import au.com.centrumsystems.hudson.plugin.util.BuildUtil;
Expand Down Expand Up @@ -513,12 +512,6 @@ public String getFormattedStartDate() {
return formattedStartTime;
}

/**
* @return a map including build parameters
*/
public Map<String, String> getBuildParameters() {
return BuildUtil.getUnsensitiveParameters(currentBuild);
}

public boolean isProjectDisabled() {
return getProject().isDisabled();
Expand Down

0 comments on commit 08373d6

Please sign in to comment.