Skip to content

Commit 14abef3

Browse files
committed
JENKINS-71731: added support for directive generator
1 parent 2bfcbe7 commit 14abef3

12 files changed

+89
-91
lines changed

README.md

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -91,58 +91,41 @@ pipeline {
9191
properties([
9292
parameters([
9393
multiselect(
94-
decisionTree: [$class : 'de.westemeyer.plugins.multiselect.MultiselectDecisionTree',
95-
variableDescriptions: ([
96-
[$class : 'de.westemeyer.plugins.multiselect.MultiselectVariableDescriptor',
97-
label : "Sport",
98-
variableName: "SELECTED_SPORT"
99-
],
100-
[$class : 'de.westemeyer.plugins.multiselect.MultiselectVariableDescriptor',
101-
label : "Team",
102-
variableName: "SELECTED_TEAM"
103-
]
104-
]),
105-
itemList : ([
106-
[$class : 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
107-
value : "Tennis",
108-
children: ([
109-
[$class: 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
110-
value : "Tennisclub Rumeln-Kaldenhausen e. V."
111-
],
112-
[$class: 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
113-
label : "Alternative label",
114-
value : "Oppumer TC"
115-
]
116-
])
117-
],
118-
[$class : 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
119-
value : "Football",
120-
children: ([
121-
[$class: 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
122-
value : "Rumelner TV"
123-
],
124-
[$class: 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
125-
value : "FC Rumeln"
126-
]
127-
])
128-
],
129-
[$class : 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
130-
value : "Wakeboard",
131-
children: ([
132-
[$class: 'de.westemeyer.plugins.multiselect.MultiselectDecisionItem',
133-
value : "WSC Duisburg Rheinhausen"
134-
]
135-
])
136-
]
137-
]),
94+
decisionTree: [
95+
variableDescriptions: [
96+
[
97+
label : 'Sport',
98+
variableName: 'SELECTED_SPORT'
99+
],
100+
[
101+
label : 'Team',
102+
variableName: 'SELECTED_TEAM'
103+
]
104+
],
105+
itemList: [
106+
[children: [
107+
[value: 'Tennisclub Rumeln-Kaldenhausen e. V.'],
108+
[label: 'Alternative label', value: 'Oppumer TC']
109+
],
110+
value : 'Tennis'
111+
],
112+
[children: [
113+
[value: 'Rumelner TV'],
114+
[value: 'FC Rumeln']
115+
],
116+
value : 'Football'],
117+
[children: [
118+
[value: 'WSC Duisburg Rheinhausen']
119+
],
120+
value : 'Wakeboard']
121+
]
138122
],
139123
description: 'Please select your favourite team!',
140124
name: 'Favourite team'
141125
)
142126
])
143127
])
144128
}
145-
146129
}
147130
}
148131

images/sample_pipeline_config.png

-179 KB
Loading

src/main/java/de/westemeyer/plugins/multiselect/MultiselectDecisionItem.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,11 @@ public class MultiselectDecisionItem implements Serializable {
3030

3131
/**
3232
* Create a new decision item with label and value.
33-
* @param parent parent item to traverse tree backwards
3433
* @param label label for display in selection list
3534
* @param value value for use in variable
3635
*/
3736
@DataBoundConstructor
38-
public MultiselectDecisionItem(MultiselectDecisionItem parent, String label, String value) {
39-
this.parent = parent;
37+
public MultiselectDecisionItem(String label, String value) {
4038
this.label = label;
4139
this.value = value;
4240
}
@@ -55,7 +53,7 @@ public void visitSubTree(MultiselectDecisionItemVisitor visitor, Queue<Multisele
5553
/**
5654
* Static visitor pattern implementation to walk through the tree collecting information.
5755
* @param visitor visitor object or lambda collecting information
58-
* @param items item list (column entries) to iterate
56+
* @param items item list (column entries) to iterate
5957
* @param columns column descriptions to go along with the items
6058
* @throws Exception if an error occurs in visitor
6159
*/
@@ -75,8 +73,8 @@ public static void visitSubTree(MultiselectDecisionItemVisitor visitor, List<Mul
7573
/**
7674
* Visitor pattern implementation to walk through the tree collecting information. Select the column items
7775
* by their column index (no iteration involved).
78-
* @param visitor visitor object or lambda collecting information
79-
* @param columns column descriptions to go along with the items
76+
* @param visitor visitor object or lambda collecting information
77+
* @param columns column descriptions to go along with the items
8078
* @param itemPath indices of items in columns to select and walk through
8179
*/
8280
public void visitSelectedItems(MultiselectDecisionItemVisitor visitor, Queue<MultiselectVariableDescriptor> columns, Queue<Integer> itemPath) {
@@ -87,9 +85,9 @@ public void visitSelectedItems(MultiselectDecisionItemVisitor visitor, Queue<Mul
8785
/**
8886
* Static visitor pattern implementation to walk through the tree collecting information. Select the column items
8987
* by their column index (no iteration involved).
90-
* @param visitor visitor object or lambda collecting information
91-
* @param items item list (column entries) to iterate
92-
* @param columns column descriptions to go along with the items
88+
* @param visitor visitor object or lambda collecting information
89+
* @param items item list (column entries) to iterate
90+
* @param columns column descriptions to go along with the items
9391
* @param itemPath indices of items in columns to select and walk through
9492
*/
9593
public static void visitSelectedItems(MultiselectDecisionItemVisitor visitor, List<MultiselectDecisionItem> items, Queue<MultiselectVariableDescriptor> columns, Queue<Integer> itemPath) {
@@ -102,7 +100,7 @@ public static void visitSelectedItems(MultiselectDecisionItemVisitor visitor, Li
102100
MultiselectDecisionItem subItem = items.get(index);
103101

104102
// apply visitor function/lambda, removing first item from queue at the same time
105-
if(visitor.visit(subItem, columns.poll())) {
103+
if (visitor.visit(subItem, columns.poll())) {
106104
// recursion with copy of remaining items in queue
107105
subItem.visitSelectedItems(visitor, new ArrayDeque<>(columns), itemPath);
108106
}

src/main/java/de/westemeyer/plugins/multiselect/MultiselectParameterDefinition.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class MultiselectParameterDefinition extends ParameterDefinition {
5050

5151
/** Configuration format for a parameter definition. */
5252
@CheckForNull
53-
private MultiselectConfigurationFormat format;
53+
private MultiselectConfigurationFormat format = MultiselectConfigurationFormat.CSV;
5454

5555
/** UUID to be used to distinguish JavaScript values for multiple parameters from each other. */
5656
private String uuid = UUIDGenerator.generateUUID(15);
@@ -303,15 +303,11 @@ public boolean equals(Object o) {
303303
if (!(o instanceof MultiselectParameterDefinition)) {
304304
return false;
305305
}
306-
if (!super.equals(o)) {
307-
return false;
308-
}
309-
MultiselectParameterDefinition that = (MultiselectParameterDefinition) o;
310-
return Objects.equals(decisionTree, that.decisionTree) && format == that.format && Objects.equals(uuid, that.uuid);
306+
return super.equals(o);
311307
}
312308

313309
@Override
314310
public int hashCode() {
315-
return Objects.hash(super.hashCode(), decisionTree, format, uuid);
311+
return Objects.hash(decisionTree, uuid);
316312
}
317313
}

src/main/java/de/westemeyer/plugins/multiselect/MultiselectParameterValue.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import hudson.model.ParameterValue;
66
import hudson.model.Run;
77
import hudson.util.VariableResolver;
8+
import org.kohsuke.stapler.DataBoundConstructor;
89
import org.kohsuke.stapler.DataBoundSetter;
910

1011
import java.util.Map;
@@ -34,6 +35,7 @@ public MultiselectParameterValue(String name) {
3435
* @param name name of parameter
3536
* @param selectedValues selected values in select boxes
3637
*/
38+
@DataBoundConstructor
3739
public MultiselectParameterValue(String name, Map<String, String> selectedValues) {
3840
this(name);
3941
this.selectedValues = selectedValues;

src/main/java/de/westemeyer/plugins/multiselect/MultiselectVariableDescriptor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@ public class MultiselectVariableDescriptor implements Serializable {
3232
* Create new variable description object.
3333
* @param label variable label
3434
* @param variableName variable name
35-
* @param columnIndex index of this column
3635
*/
3736
@DataBoundConstructor
38-
public MultiselectVariableDescriptor(String label, String variableName, int columnIndex) {
37+
public MultiselectVariableDescriptor(String label, String variableName) {
3938
this.label = label;
4039
this.variableName = variableName;
41-
this.columnIndex = columnIndex;
4240
}
4341

4442
/**

src/main/java/de/westemeyer/plugins/multiselect/parser/CsvParser.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ public MultiselectDecisionTree analyzeConfiguration(InputStream config) {
121121
String variable = get(variableNames, i);
122122

123123
// create descriptor and add it to the list of variable descriptors
124-
variableDescriptions.add(new MultiselectVariableDescriptor(label, variable, i));
124+
MultiselectVariableDescriptor variableDescriptor = new MultiselectVariableDescriptor(label, variable);
125+
variableDescriptor.setColumnIndex(i);
126+
variableDescriptions.add(variableDescriptor);
125127
}
126128
}
127129

@@ -196,8 +198,10 @@ private void addItems(ValueConstructionHelper rootHelper, List<String> headers,
196198
// if no value helper has been found...
197199
if (valueHelper == null) {
198200
// ... create a new one
201+
MultiselectDecisionItem decisionItem = new MultiselectDecisionItem(title, value);
202+
decisionItem.setParent(currentHelper.getDecisionItem());
199203
valueHelper = new ValueConstructionHelper(
200-
new MultiselectDecisionItem(currentHelper.getDecisionItem(), title, value));
204+
decisionItem);
201205

202206
// ... and add it to lookup table of current helper
203207
currentHelper.addValueHelper(value, valueHelper);

src/test/java/de/westemeyer/plugins/multiselect/MultiselectDecisionItemTest.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package de.westemeyer.plugins.multiselect;
22

3+
import edu.umd.cs.findbugs.annotations.NonNull;
34
import org.junit.jupiter.api.Test;
45

56
import java.util.ArrayDeque;
67
import java.util.Collections;
78
import java.util.Queue;
89

9-
import static org.junit.jupiter.api.Assertions.*;
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertFalse;
12+
import static org.junit.jupiter.api.Assertions.assertNotNull;
13+
import static org.junit.jupiter.api.Assertions.assertNull;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
1015
import static org.mockito.ArgumentMatchers.any;
11-
import static org.mockito.Mockito.*;
16+
import static org.mockito.Mockito.mock;
17+
import static org.mockito.Mockito.times;
18+
import static org.mockito.Mockito.verify;
1219

1320
class MultiselectDecisionItemTest {
1421
/** Input to be used in tests. */
@@ -29,10 +36,15 @@ void getDisplayLabel() {
2936
assertEquals(ALTERNATIVE_TEAM_NAME, item.getDisplayLabel());
3037
item = INPUT.getItemByCoordinates(0, 0, 0, 0);
3138
assertEquals(WSC_DUISBURG_RHEINHAUSEN, item.getDisplayLabel());
32-
item = new MultiselectDecisionItem(null, null, null);
39+
item = createItem(null, null);
3340
assertNull(item.getDisplayLabel());
3441
}
3542

43+
@NonNull
44+
private static MultiselectDecisionItem createItem(String label, String value) {
45+
return new MultiselectDecisionItem(label, value);
46+
}
47+
3648
@Test
3749
void getParent() {
3850
MultiselectDecisionItem item = INPUT.getItemByCoordinates(0, 0);
@@ -43,8 +55,8 @@ void getParent() {
4355

4456
@Test
4557
void nvl() {
46-
assertEquals("MultiselectDecisionItem{label='', value='null', children=[]}", new MultiselectDecisionItem(null, null, null).toString());
47-
assertEquals("MultiselectDecisionItem{label='label', value='null', children=[]}", new MultiselectDecisionItem(null, "label", null).toString());
58+
assertEquals("MultiselectDecisionItem{label='', value='null', children=[]}", createItem(null, null).toString());
59+
assertEquals("MultiselectDecisionItem{label='label', value='null', children=[]}", createItem("label", null).toString());
4860
}
4961

5062
@Test
@@ -94,7 +106,7 @@ void testToString() {
94106

95107
@Test
96108
void testSetter() {
97-
MultiselectDecisionItem item = new MultiselectDecisionItem(null, "Hello", "Value");
109+
MultiselectDecisionItem item = createItem("Hello", "Value");
98110
assertEquals("Hello", item.getLabel());
99111
item.setLabel("Hullo");
100112
assertEquals("Hullo", item.getLabel());
@@ -103,7 +115,7 @@ void testSetter() {
103115
@Test
104116
void visitSubTree() throws Exception {
105117
MultiselectDecisionItemVisitor visitor = (item, column) -> false;
106-
MultiselectVariableDescriptor descriptor = new MultiselectVariableDescriptor("", "", 0);
118+
MultiselectVariableDescriptor descriptor = new MultiselectVariableDescriptor("", "");
107119
Queue<MultiselectVariableDescriptor> descriptors = new ArrayDeque<>();
108120
descriptors.add(descriptor);
109121
MultiselectDecisionItem item = mock(MultiselectDecisionItem.class);

src/test/java/de/westemeyer/plugins/multiselect/MultiselectDecisionTreeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void serializationRoundTripTest() throws Exception {
131131
}
132132

133133
private MultiselectDecisionItem createItem(String label, String value, MultiselectDecisionItem... children) {
134-
MultiselectDecisionItem item = new MultiselectDecisionItem(null, null, null);
134+
MultiselectDecisionItem item = new MultiselectDecisionItem(null, null);
135135
if (label != null) {
136136
item.setLabel(label);
137137
}
@@ -145,7 +145,7 @@ private MultiselectDecisionItem createItem(String label, String value, Multisele
145145
}
146146

147147
private MultiselectVariableDescriptor createDescriptor(String label, String variable) {
148-
MultiselectVariableDescriptor descriptor = new MultiselectVariableDescriptor(null, null, 0);
148+
MultiselectVariableDescriptor descriptor = new MultiselectVariableDescriptor(null, null);
149149
descriptor.setLabel(label);
150150
descriptor.setVariableName(variable);
151151
return descriptor;

src/test/java/de/westemeyer/plugins/multiselect/MultiselectParameterDefinitionTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,14 @@ void testEquals() {
192192
MultiselectParameterDefinition actual = new MultiselectParameterDefinition(NAME, DESCRIPTION, INPUT, CSV);
193193
actual.setUuid(value.getUuid());
194194
assertEquals(value, actual);
195+
actual.setDecisionTree(new MultiselectDecisionTree());
196+
assertNotEquals(value, actual);
195197
}
196198

197199
@Test
198200
void testHashCode() {
199201
MultiselectParameterDefinition value = new MultiselectParameterDefinition(NAME, DESCRIPTION);
200202
value.setUuid("FDcYsiejIswOtJc");
201-
assertEquals(-993358548, value.hashCode());
203+
assertEquals(-234521635, value.hashCode());
202204
}
203205
}

0 commit comments

Comments
 (0)