Skip to content

Commit 497438a

Browse files
committed
Add assertions to reject null values in JobParameter
Resolves #3913
1 parent 6c619b9 commit 497438a

File tree

9 files changed

+55
-201
lines changed

9 files changed

+55
-201
lines changed

spring-batch-core/src/main/java/org/springframework/batch/core/JobParameter.java

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2006-2013 the original author or authors.
2+
* Copyright 2006-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,9 @@
1919
import java.io.Serializable;
2020
import java.util.Date;
2121

22+
import org.springframework.lang.NonNull;
23+
import org.springframework.util.Assert;
24+
2225
/**
2326
* Domain representation of a parameter to a batch job. Only the following types
2427
* can be parameters: String, Long, Date, and Double. The identifying flag is
@@ -28,10 +31,10 @@
2831
* @author Lucas Ward
2932
* @author Dave Syer
3033
* @author Michael Minella
34+
* @author Mahmoud Ben Hassine
3135
* @since 2.0
3236
*
3337
*/
34-
@SuppressWarnings("serial")
3538
public class JobParameter implements Serializable {
3639

3740
private final Object parameter;
@@ -42,61 +45,57 @@ public class JobParameter implements Serializable {
4245

4346
/**
4447
* Construct a new JobParameter as a String.
45-
* @param parameter {@link String} instance.
48+
* @param parameter {@link String} instance. Must not be {@code null}.
4649
* @param identifying true if JobParameter should be identifying.
4750
*/
48-
public JobParameter(String parameter, boolean identifying) {
49-
this.parameter = parameter;
50-
parameterType = ParameterType.STRING;
51-
this.identifying = identifying;
51+
public JobParameter(@NonNull String parameter, boolean identifying) {
52+
this(parameter, identifying, ParameterType.STRING);
5253
}
5354

5455
/**
5556
* Construct a new JobParameter as a Long.
5657
*
57-
* @param parameter {@link Long} instance.
58+
* @param parameter {@link Long} instance. Must not be {@code null}.
5859
* @param identifying true if JobParameter should be identifying.
5960
*/
60-
public JobParameter(Long parameter, boolean identifying) {
61-
this.parameter = parameter;
62-
parameterType = ParameterType.LONG;
63-
this.identifying = identifying;
61+
public JobParameter(@NonNull Long parameter, boolean identifying) {
62+
this(parameter, identifying, ParameterType.LONG);
6463
}
6564

6665
/**
6766
* Construct a new JobParameter as a Date.
6867
*
69-
* @param parameter {@link Date} instance.
68+
* @param parameter {@link Date} instance. Must not be {@code null}.
7069
* @param identifying true if JobParameter should be identifying.
7170
*/
72-
public JobParameter(Date parameter, boolean identifying) {
73-
this.parameter = parameter;
74-
parameterType = ParameterType.DATE;
75-
this.identifying = identifying;
71+
public JobParameter(@NonNull Date parameter, boolean identifying) {
72+
this(parameter, identifying, ParameterType.DATE);
7673
}
7774

7875
/**
7976
* Construct a new JobParameter as a Double.
8077
*
81-
* @param parameter {@link Double} instance.
78+
* @param parameter {@link Double} instance. Must not be {@code null}.
8279
* @param identifying true if JobParameter should be identifying.
8380
*/
84-
public JobParameter(Double parameter, boolean identifying) {
81+
public JobParameter(@NonNull Double parameter, boolean identifying) {
82+
this(parameter, identifying, ParameterType.DOUBLE);
83+
}
84+
85+
private JobParameter(Object parameter, boolean identifying, ParameterType parameterType) {
86+
Assert.notNull(parameter, "parameter must not be null");
8587
this.parameter = parameter;
86-
parameterType = ParameterType.DOUBLE;
88+
this.parameterType = parameterType;
8789
this.identifying = identifying;
8890
}
8991

90-
9192
/**
9293
* Construct a new JobParameter as a String.
9394
*
9495
* @param parameter {@link String} instance.
9596
*/
9697
public JobParameter(String parameter) {
97-
this.parameter = parameter;
98-
parameterType = ParameterType.STRING;
99-
this.identifying = true;
98+
this(parameter, true);
10099
}
101100

102101
/**
@@ -105,9 +104,7 @@ public JobParameter(String parameter) {
105104
* @param parameter {@link Long} instance.
106105
*/
107106
public JobParameter(Long parameter) {
108-
this.parameter = parameter;
109-
parameterType = ParameterType.LONG;
110-
this.identifying = true;
107+
this(parameter, true);
111108
}
112109

113110
/**
@@ -116,9 +113,7 @@ public JobParameter(Long parameter) {
116113
* @param parameter {@link Date} instance.
117114
*/
118115
public JobParameter(Date parameter) {
119-
this.parameter = parameter;
120-
parameterType = ParameterType.DATE;
121-
this.identifying = true;
116+
this(parameter, true);
122117
}
123118

124119
/**
@@ -127,9 +122,7 @@ public JobParameter(Date parameter) {
127122
* @param parameter {@link Double} instance.
128123
*/
129124
public JobParameter(Double parameter) {
130-
this.parameter = parameter;
131-
parameterType = ParameterType.DOUBLE;
132-
this.identifying = true;
125+
this(parameter, true);
133126
}
134127

135128
public boolean isIdentifying() {
@@ -140,13 +133,7 @@ public boolean isIdentifying() {
140133
* @return the value contained within this JobParameter.
141134
*/
142135
public Object getValue() {
143-
144-
if (parameter != null && parameter.getClass().isInstance(Date.class)) {
145-
return new Date(((Date) parameter).getTime());
146-
}
147-
else {
148-
return parameter;
149-
}
136+
return parameter;
150137
}
151138

152139
/**
@@ -158,7 +145,7 @@ public ParameterType getType() {
158145

159146
@Override
160147
public boolean equals(Object obj) {
161-
if (obj instanceof JobParameter == false) {
148+
if (!(obj instanceof JobParameter)) {
162149
return false;
163150
}
164151

@@ -167,18 +154,17 @@ public boolean equals(Object obj) {
167154
}
168155

169156
JobParameter rhs = (JobParameter) obj;
170-
return parameter==null ? rhs.parameter==null && parameterType==rhs.parameterType: parameter.equals(rhs.parameter);
157+
return parameterType == rhs.parameterType && parameter.equals(rhs.parameter);
171158
}
172159

173160
@Override
174161
public String toString() {
175-
return parameter == null ? null : (parameterType == ParameterType.DATE ? "" + ((Date) parameter).getTime()
176-
: parameter.toString());
162+
return parameterType == ParameterType.DATE ? "" + ((Date) parameter).getTime() : parameter.toString();
177163
}
178164

179165
@Override
180166
public int hashCode() {
181-
return 7 + 21 * (parameter == null ? parameterType.hashCode() : parameter.hashCode());
167+
return 7 + 21 * parameter.hashCode();
182168
}
183169

184170
/**

spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersBuilder.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2006-2019 the original author or authors.
2+
* Copyright 2006-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,6 +23,8 @@
2323
import java.util.Properties;
2424

2525
import org.springframework.batch.core.explore.JobExplorer;
26+
import org.springframework.lang.NonNull;
27+
import org.springframework.lang.Nullable;
2628
import org.springframework.util.Assert;
2729

2830
/**
@@ -103,10 +105,10 @@ public JobParametersBuilder(JobParameters jobParameters, JobExplorer jobExplorer
103105
* Add a new identifying String parameter for the given key.
104106
*
105107
* @param key - parameter accessor.
106-
* @param parameter - runtime parameter
108+
* @param parameter - runtime parameter. Must not be {@code null}.
107109
* @return a reference to this object.
108110
*/
109-
public JobParametersBuilder addString(String key, String parameter) {
111+
public JobParametersBuilder addString(String key, @NonNull String parameter) {
110112
this.parameterMap.put(key, new JobParameter(parameter, true));
111113
return this;
112114
}
@@ -115,11 +117,11 @@ public JobParametersBuilder addString(String key, String parameter) {
115117
* Add a new String parameter for the given key.
116118
*
117119
* @param key - parameter accessor.
118-
* @param parameter - runtime parameter
120+
* @param parameter - runtime parameter. Must not be {@code null}.
119121
* @param identifying - indicates if the parameter is used as part of identifying a job instance
120122
* @return a reference to this object.
121123
*/
122-
public JobParametersBuilder addString(String key, String parameter, boolean identifying) {
124+
public JobParametersBuilder addString(String key, @NonNull String parameter, boolean identifying) {
123125
this.parameterMap.put(key, new JobParameter(parameter, identifying));
124126
return this;
125127
}
@@ -128,10 +130,10 @@ public JobParametersBuilder addString(String key, String parameter, boolean iden
128130
* Add a new identifying {@link Date} parameter for the given key.
129131
*
130132
* @param key - parameter accessor.
131-
* @param parameter - runtime parameter
133+
* @param parameter - runtime parameter. Must not be {@code null}.
132134
* @return a reference to this object.
133135
*/
134-
public JobParametersBuilder addDate(String key, Date parameter) {
136+
public JobParametersBuilder addDate(String key, @NonNull Date parameter) {
135137
this.parameterMap.put(key, new JobParameter(parameter, true));
136138
return this;
137139
}
@@ -140,11 +142,11 @@ public JobParametersBuilder addDate(String key, Date parameter) {
140142
* Add a new {@link Date} parameter for the given key.
141143
*
142144
* @param key - parameter accessor.
143-
* @param parameter - runtime parameter
145+
* @param parameter - runtime parameter. Must not be {@code null}.
144146
* @param identifying - indicates if the parameter is used as part of identifying a job instance
145147
* @return a reference to this object.
146148
*/
147-
public JobParametersBuilder addDate(String key, Date parameter, boolean identifying) {
149+
public JobParametersBuilder addDate(String key, @NonNull Date parameter, boolean identifying) {
148150
this.parameterMap.put(key, new JobParameter(parameter, identifying));
149151
return this;
150152
}
@@ -153,10 +155,10 @@ public JobParametersBuilder addDate(String key, Date parameter, boolean identify
153155
* Add a new identifying Long parameter for the given key.
154156
*
155157
* @param key - parameter accessor.
156-
* @param parameter - runtime parameter
158+
* @param parameter - runtime parameter. Must not be {@code null}.
157159
* @return a reference to this object.
158160
*/
159-
public JobParametersBuilder addLong(String key, Long parameter) {
161+
public JobParametersBuilder addLong(String key, @NonNull Long parameter) {
160162
this.parameterMap.put(key, new JobParameter(parameter, true));
161163
return this;
162164
}
@@ -165,11 +167,11 @@ public JobParametersBuilder addLong(String key, Long parameter) {
165167
* Add a new Long parameter for the given key.
166168
*
167169
* @param key - parameter accessor.
168-
* @param parameter - runtime parameter
170+
* @param parameter - runtime parameter. Must not be {@code null}.
169171
* @param identifying - indicates if the parameter is used as part of identifying a job instance
170172
* @return a reference to this object.
171173
*/
172-
public JobParametersBuilder addLong(String key, Long parameter, boolean identifying) {
174+
public JobParametersBuilder addLong(String key, @NonNull Long parameter, boolean identifying) {
173175
this.parameterMap.put(key, new JobParameter(parameter, identifying));
174176
return this;
175177
}
@@ -178,10 +180,10 @@ public JobParametersBuilder addLong(String key, Long parameter, boolean identify
178180
* Add a new identifying Double parameter for the given key.
179181
*
180182
* @param key - parameter accessor.
181-
* @param parameter - runtime parameter
183+
* @param parameter - runtime parameter. Must not be {@code null}.
182184
* @return a reference to this object.
183185
*/
184-
public JobParametersBuilder addDouble(String key, Double parameter) {
186+
public JobParametersBuilder addDouble(String key, @NonNull Double parameter) {
185187
this.parameterMap.put(key, new JobParameter(parameter, true));
186188
return this;
187189
}
@@ -190,11 +192,11 @@ public JobParametersBuilder addDouble(String key, Double parameter) {
190192
* Add a new Double parameter for the given key.
191193
*
192194
* @param key - parameter accessor.
193-
* @param parameter - runtime parameter
195+
* @param parameter - runtime parameter. Must not be {@code null}.
194196
* @param identifying - indicates if the parameter is used as part of identifying a job instance
195197
* @return a reference to this object.
196198
*/
197-
public JobParametersBuilder addDouble(String key, Double parameter, boolean identifying) {
199+
public JobParametersBuilder addDouble(String key, @NonNull Double parameter, boolean identifying) {
198200
this.parameterMap.put(key, new JobParameter(parameter, identifying));
199201
return this;
200202
}

spring-batch-core/src/test/java/org/springframework/batch/core/DefaultJobKeyGeneratorTests.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2013 the original author or authors.
2+
* Copyright 2013-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -54,17 +54,6 @@ public void testCreateJobKey() {
5454
assertEquals(32, key.length());
5555
}
5656

57-
@Test
58-
public void testCreateJobKeyWithNullParameter() {
59-
JobParameters jobParameters1 = new JobParametersBuilder().addString(
60-
"foo", "bar").addString("bar", null).toJobParameters();
61-
JobParameters jobParameters2 = new JobParametersBuilder().addString(
62-
"foo", "bar").addString("bar", "").toJobParameters();
63-
String key1 = jobKeyGenerator.generateKey(jobParameters1);
64-
String key2 = jobKeyGenerator.generateKey(jobParameters2);
65-
assertEquals(key1, key2);
66-
}
67-
6857
@Test
6958
public void testCreateJobKeyOrdering() {
7059
JobParameters jobParameters1 = new JobParametersBuilder().addString(

spring-batch-core/src/test/java/org/springframework/batch/core/JobParameterTests.java

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2008-2013 the original author or authors.
2+
* Copyright 2008-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -37,10 +37,9 @@ public void testStringParameter(){
3737
assertEquals("test", jobParameter.getValue());
3838
}
3939

40-
@Test
40+
@Test(expected = IllegalArgumentException.class)
4141
public void testNullStringParameter(){
4242
jobParameter = new JobParameter((String)null, true);
43-
assertEquals(null, jobParameter.getValue());
4443
}
4544

4645
@Test
@@ -62,10 +61,9 @@ public void testDateParameter(){
6261
assertEquals(new Date(0L), jobParameter.getValue());
6362
}
6463

65-
@Test
64+
@Test(expected = IllegalArgumentException.class)
6665
public void testNullDateParameter(){
6766
jobParameter = new JobParameter((Date)null, true);
68-
assertEquals(null, jobParameter.getValue());
6967
}
7068

7169
@Test
@@ -89,25 +87,4 @@ public void testHashcode(){
8987
assertEquals(testParameter.hashCode(), jobParameter.hashCode());
9088
}
9189

92-
@Test
93-
public void testEqualsWithNull(){
94-
jobParameter = new JobParameter((String)null, true);
95-
JobParameter testParameter = new JobParameter((String)null, true);
96-
assertTrue(jobParameter.equals(testParameter));
97-
}
98-
99-
@Test
100-
public void testEqualsWithNullAndDifferentType(){
101-
jobParameter = new JobParameter((String)null, true);
102-
JobParameter testParameter = new JobParameter((Date)null, true);
103-
assertFalse(jobParameter.equals(testParameter));
104-
}
105-
106-
@Test
107-
public void testHashcodeWithNull(){
108-
jobParameter = new JobParameter((String)null, true);
109-
JobParameter testParameter = new JobParameter((String)null, true);
110-
assertEquals(testParameter.hashCode(), jobParameter.hashCode());
111-
}
112-
11390
}

0 commit comments

Comments
 (0)