Skip to content

Commit

Permalink
Improve parameters handling
Browse files Browse the repository at this point in the history
  • Loading branch information
quilicicf committed Jun 3, 2022
1 parent 9b07f4f commit f1eb49c
Show file tree
Hide file tree
Showing 15 changed files with 1,092 additions and 754 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package org.jenkinsci.plugins.ParameterizedRemoteTrigger.parameters2;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.joining;

import javax.annotation.Nonnull;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Objects;

import org.jenkinsci.Symbol;
import org.jenkinsci.plugins.ParameterizedRemoteTrigger.BuildContext;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import hudson.AbortException;
import hudson.Extension;
import hudson.FilePath;

public class FileParameters extends JobParameters {

private static final long serialVersionUID = 3614172320192170597L;

@Extension
public static final FileParametersDescriptor DESCRIPTOR = new FileParametersDescriptor();

private String filePath;

@DataBoundConstructor
public FileParameters() {
this.filePath = null;
}

public FileParameters(String filePath) {
this.filePath = filePath;
}

@DataBoundSetter
public void setFilePath(final String filePath) {
this.filePath = filePath;
}

public String getFilePath() {
return filePath;
}

@Override
public String toString() {
return "(" + getClass().getSimpleName() + ") " + filePath;
}

@Override
public FileParametersDescriptor getDescriptor() {
return DESCRIPTOR;
}

@Override
public Map<String, String> getParametersMap(final BuildContext context) throws AbortException {
final String parametersAsString = readParametersFile(context);
return JobParameters.parseStringParameters(parametersAsString);
}

private String readParametersFile(final BuildContext context) throws AbortException {
if (context.workspace == null) {
throw new AbortException("Workspace is null but parameter file is used. Looks like this step was started with \"agent: none\"");
}

BufferedReader reader = null;
try {
final FilePath absoluteFilePath = context.workspace.child(getFilePath());
context.logger.printf("Loading parameters from file %s%n", absoluteFilePath.getRemote());

reader = new BufferedReader(new InputStreamReader(absoluteFilePath.read(), UTF_8));
return reader.lines().collect(joining("\n"));

} catch (final InterruptedException | IOException e) {
context.logger.printf("[WARNING] Failed loading parameters: %s%n", e.getMessage());
return "";

} finally {
try {
if (reader != null) {
reader.close();
}
} catch (final IOException ex) {
ex.printStackTrace();
}
}
}

@Symbol("FileParameters")
public static class FileParametersDescriptor extends ParametersDescriptor {
@Nonnull
@Override
public String getDisplayName() {
return "File parameters";
}
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final FileParameters that = (FileParameters) o;
return Objects.equals(filePath, that.filePath);
}

@Override
public int hashCode() {
return Objects.hash(filePath);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package org.jenkinsci.plugins.ParameterizedRemoteTrigger.parameters2;

import static java.util.stream.Collectors.toMap;

import java.io.Serializable;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Predicate;

import org.jenkinsci.plugins.ParameterizedRemoteTrigger.BuildContext;

import hudson.AbortException;
import hudson.DescriptorExtensionList;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import jenkins.model.Jenkins;

public abstract class JobParameters extends AbstractDescribableImpl<JobParameters> implements Serializable, Cloneable {

private static final DescriptorExtensionList<JobParameters, ParametersDescriptor> ALL =
DescriptorExtensionList.createDescriptorList(Jenkins.getInstance(), JobParameters.class);

public static DescriptorExtensionList<JobParameters, ParametersDescriptor> all() {
return ALL;
}

public static JobParameters migrateOldParameters(final String parameters, final String parameterFile) {
if (parameterFile != null) {
return new FileParameters(parameterFile);
}

if (parameters != null) {
return new StringParameters(parameters);
}

return new MapParameters();
}

public static Map<String, String> parseStringParameters(final String parametersAsString) {
return Arrays.stream(parametersAsString.split("\\n"))
.filter(not(JobParameters::isBlankLine))
.filter(not(JobParameters::isCommentedLine))
.filter(JobParameters::containsEqualSign)
.map(JobParameters::splitParameterLine)
.collect(toMap(Entry::getKey, Entry::getValue));
}

private static <T> Predicate<T> not(Predicate<T> t) {
return t.negate();
}

private static boolean isBlankLine(String line) {
return line.trim().isEmpty();
}

private static boolean isCommentedLine(String line) {
return line.trim().startsWith("#");
}

private static boolean containsEqualSign(String line) {
return line.contains("=");
}

private static Entry<String, String> splitParameterLine(String line) {
final int firstIndexOfEqualSign = line.indexOf("=");
return new AbstractMap.SimpleEntry<>(
line.substring(0, firstIndexOfEqualSign),
line.substring(firstIndexOfEqualSign + 1)
);
}

public static abstract class ParametersDescriptor extends Descriptor<JobParameters> { }

public abstract Map<String, String> getParametersMap(final BuildContext context) throws AbortException;

@Override
public JobParameters clone() throws CloneNotSupportedException {
return (JobParameters) super.clone();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package org.jenkinsci.plugins.ParameterizedRemoteTrigger.parameters2;

import javax.annotation.Nonnull;
import java.io.Serializable;
import java.util.Objects;

import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import hudson.Extension;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;

public class MapParameter extends AbstractDescribableImpl<MapParameter> implements Cloneable, Serializable {

@Extension
public static final MapParameterDescriptor DESCRIPTOR = new MapParameterDescriptor();

private String name;
private String value;

@DataBoundConstructor
public MapParameter() {
this("", "");
}

public MapParameter(String name, String value) {
this.name = name;
this.value = value;
}

@DataBoundSetter
public void setName(String name) {
this.name = name;
}

@DataBoundSetter
public void setValue(String value) {
this.value = value;
}

public String getName() {
return name;
}

public String getValue() {
return value;
}

@Override
public MapParameter clone() throws CloneNotSupportedException {
return (MapParameter) super.clone();
}

@Override
public Descriptor<MapParameter> getDescriptor() {
return DESCRIPTOR;
}

@Symbol("MapParameter")
public static class MapParameterDescriptor extends Descriptor<MapParameter> {
@Nonnull
@Override
public String getDisplayName() {
return "Map parameter";
}
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final MapParameter that = (MapParameter) o;
return Objects.equals(name, that.name) && Objects.equals(value, that.value);
}

@Override
public int hashCode() {
return Objects.hash(name, value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package org.jenkinsci.plugins.ParameterizedRemoteTrigger.parameters2;

import static java.util.stream.Collectors.toMap;

import edu.umd.cs.findbugs.annotations.NonNull;

import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.jenkinsci.Symbol;
import org.jenkinsci.plugins.ParameterizedRemoteTrigger.BuildContext;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import hudson.Extension;

public class MapParameters extends JobParameters {

private static final long serialVersionUID = 3614172320192170597L;

@Extension
public static final MapParametersDescriptor DESCRIPTOR = new MapParametersDescriptor();

private final List<MapParameter> parameters = new ArrayList<>();

@DataBoundConstructor
public MapParameters() {}

public MapParameters(@NonNull Map<String, String> parametersMap) {
setParametersMap(parametersMap);
}

@DataBoundSetter
public void setParameters(final List<MapParameter> parameters) {
this.parameters.clear();
if (parameters != null) {
this.parameters.addAll(parameters);
}
}

public void setParametersMap(final Map<String, String> parametersMap) {
this.parameters.clear();
if (parametersMap != null) {
parametersMap
.entrySet()
.stream()
.map(entry -> new MapParameter(entry.getKey(), entry.getValue()))
.forEach(parameters::add);
}
}

public List<MapParameter> getParameters() {
return parameters;
}

@Override
public String toString() {
return "(" + getClass().getSimpleName() + ") " + parameters;
}

@Override
public MapParametersDescriptor getDescriptor() {
return DESCRIPTOR;
}

@Override
public Map<String, String> getParametersMap(final BuildContext context) {
return parameters
.stream()
.collect(toMap(MapParameter::getName, MapParameter::getValue));
}

@Symbol("MapParameters")
public static class MapParametersDescriptor extends ParametersDescriptor {
@Nonnull
@Override
public String getDisplayName() {
return "Map parameters";
}
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final MapParameters that = (MapParameters) o;
return Objects.equals(parameters, that.parameters);
}

@Override
public int hashCode() {
return Objects.hash(parameters);
}
}
Loading

0 comments on commit f1eb49c

Please sign in to comment.