Skip to content

Commit 22ed0a1

Browse files
committed
DATAGEODE-326 - Fix possible NullPointerException.
Additionally, added the nullSafeType(:Class) and nullSafeType(:Class, defaultType:Class) methods. Added the getOrder(:Object) method. Applied the Spring @nonnull and @nullable annotations appropriately.
1 parent 9e2abf7 commit 22ed0a1

File tree

2 files changed

+92
-14
lines changed

2 files changed

+92
-14
lines changed

spring-data-geode/src/main/java/org/springframework/data/gemfire/util/SpringUtils.java

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,15 @@
5656
* @author John Blum
5757
* @see java.lang.Class
5858
* @see java.lang.Object
59+
* @see java.util.function.Function
60+
* @see java.util.stream.Stream
5961
* @see org.springframework.beans.factory.BeanFactory
62+
* @see org.springframework.beans.factory.FactoryBean
6063
* @see org.springframework.beans.factory.config.BeanDefinition
6164
* @see org.springframework.beans.factory.config.RuntimeBeanReference
65+
* @see org.springframework.core.Ordered
66+
* @see org.springframework.core.annotation.AnnotationAwareOrderComparator
67+
* @see org.springframework.core.annotation.Order
6268
* @since 1.8.0
6369
*/
6470
@SuppressWarnings("unused")
@@ -77,7 +83,7 @@ public abstract class SpringUtils {
7783
* @see java.lang.Class
7884
* @see java.lang.String
7985
*/
80-
public static boolean isMatchingBean(BeanFactory beanFactory, String beanName, Class<?> beanType) {
86+
public static boolean isMatchingBean(@NonNull BeanFactory beanFactory, String beanName, Class<?> beanType) {
8187
return beanFactory.containsBean(beanName) && beanFactory.isTypeMatch(beanName, beanType);
8288
}
8389

@@ -90,11 +96,12 @@ public static boolean isMatchingBean(BeanFactory beanFactory, String beanName, C
9096
* @return the given {@link BeanDefinition}.
9197
* @see org.springframework.beans.factory.config.BeanDefinition
9298
*/
99+
@NonNull
93100
public static BeanDefinition addDependsOn(@NonNull BeanDefinition beanDefinition, @Nullable String... beanNames) {
94101

95102
List<String> dependsOnList = new ArrayList<>();
96103

97-
Collections.addAll(dependsOnList, nullSafeArray(beanDefinition.getDependsOn(), String.class));
104+
Collections.addAll(dependsOnList, ArrayUtils.nullSafeArray(beanDefinition.getDependsOn(), String.class));
98105
dependsOnList.addAll(Arrays.asList(nullSafeArray(beanNames, String.class)));
99106
beanDefinition.setDependsOn(dependsOnList.toArray(new String[0]));
100107

@@ -169,6 +176,7 @@ public static <T> List<T> getBeansOfTypeOrdered(@NonNull ConfigurableListableBea
169176
}
170177

171178
// No Javadoc
179+
@NonNull
172180
private static <T> List<OrderedBeanWrapper<T>> orderUnorderedBeans(@NonNull ConfigurableListableBeanFactory beanFactory,
173181
@NonNull Map<String, T> beansOfType, @NonNull Set<String> unorderedBeanNames) {
174182

@@ -200,18 +208,30 @@ private static <T> OrderedBeanWrapper<T> toOrderedBeanWrapper(@NonNull Map.Entry
200208

201209
T bean = beanEntry.getValue();
202210

203-
Integer order = bean instanceof Ordered
204-
? ((Ordered) bean).getOrder()
205-
: Optional.ofNullable(bean)
206-
.map(Object::getClass)
207-
.map(OrderUtils::getOrder)
208-
.orElse(null);
211+
Integer order = getOrder(bean);
212+
213+
if (order == null) {
214+
order = bean != null ? OrderUtils.getOrder(bean.getClass()) : null;
215+
}
209216

210217
return order != null
211218
? DefaultOrderedBeanWrapper.from(beanEntry.getKey(), bean, order)
212219
: null;
213220
}
214221

222+
/**
223+
* Null-safe operation to return the {@link Integer order} of the given {@link Object} if it is {@link Ordered}
224+
* or {@literal null} if the given {@link Object} is not {@link Ordered}.
225+
*
226+
* @param target {@link Object} to evaluate; may be {@literal null}.
227+
* @return the {@link Integer order} of the given {@link Object} if {@link Ordered},
228+
* otherwise return {@literal null}.
229+
* @see org.springframework.core.Ordered
230+
*/
231+
public static @Nullable Integer getOrder(@Nullable Object target) {
232+
return target instanceof Ordered ? ((Ordered) target).getOrder() : null;
233+
}
234+
215235
/**
216236
* Returns bean of the given {@link Class type} in an ordered {@link Stream}.
217237
*
@@ -223,7 +243,8 @@ private static <T> OrderedBeanWrapper<T> toOrderedBeanWrapper(@NonNull Map.Entry
223243
* @see java.util.stream.Stream
224244
* @see java.lang.Class
225245
*/
226-
public static <T> Stream<T> getOrderedStreamOfBeansByType(BeanFactory beanFactory, Class<T> beanType) {
246+
public static <T> Stream<T> getOrderedStreamOfBeansByType(@NonNull BeanFactory beanFactory,
247+
@NonNull Class<T> beanType) {
227248

228249
Assert.notNull(beanFactory, "BeanFactory must not be null");
229250
Assert.notNull(beanType,"Bean type must not be null");
@@ -295,6 +316,14 @@ public static String nullSafeSimpleName(Class<?> type) {
295316
return type != null ? type.getSimpleName() : null;
296317
}
297318

319+
public static Class<?> nullSafeType(Object target) {
320+
return nullSafeType(target, null);
321+
}
322+
323+
public static Class<?> nullSafeType(Object target, Class<?> defaultType) {
324+
return target != null ? target.getClass() : defaultType;
325+
}
326+
298327
public static boolean safeDoOperation(VoidReturningThrowableOperation operation) {
299328

300329
try {

spring-data-geode/src/test/java/org/springframework/data/gemfire/util/SpringUtilsUnitTests.java

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import static org.springframework.data.gemfire.util.RuntimeExceptionFactory.newIllegalStateException;
3232
import static org.springframework.data.gemfire.util.RuntimeExceptionFactory.newRuntimeException;
3333

34+
import java.sql.Time;
3435
import java.util.Collections;
3536
import java.util.concurrent.atomic.AtomicBoolean;
3637
import java.util.concurrent.atomic.AtomicReference;
@@ -50,6 +51,7 @@
5051
import org.springframework.beans.factory.config.BeanDefinition;
5152
import org.springframework.beans.factory.config.RuntimeBeanReference;
5253
import org.springframework.dao.InvalidDataAccessApiUsageException;
54+
import org.springframework.data.gemfire.test.model.Person;
5355
import org.springframework.data.gemfire.util.SpringUtils.ValueReturningThrowableOperation;
5456

5557
/**
@@ -216,7 +218,6 @@ public void getPropertyValueWithNullBeanDefinitionReturnsNull() {
216218
}
217219

218220
@Test
219-
@SuppressWarnings("all")
220221
public void setBeanDefinitionPropertyReference() {
221222

222223
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
@@ -236,7 +237,6 @@ public void setBeanDefinitionPropertyReference() {
236237
}
237238

238239
@Test
239-
@SuppressWarnings("all")
240240
public void setBeanDefinitionPropertyValue() {
241241

242242
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
@@ -336,7 +336,6 @@ public void equalsIgnoreNullIsTrue() {
336336
}
337337

338338
@Test
339-
@SuppressWarnings("all")
340339
public void equalsIgnoreNullIsFalse() {
341340

342341
assertThat(SpringUtils.equalsIgnoreNull(null, "null")).isFalse();
@@ -358,7 +357,6 @@ public void nullOrEqualsWithNonNullObjectAndNullIsFalse() {
358357
}
359358

360359
@Test
361-
@SuppressWarnings("all")
362360
public void nullOrEqualsWithNullIsTrue() {
363361
assertThat(SpringUtils.nullOrEquals(null, "test")).isTrue();
364362
}
@@ -374,7 +372,6 @@ public void nullSafeEqualsWithEqualObjectsIsTrue() {
374372
}
375373

376374
@Test
377-
@SuppressWarnings("all")
378375
public void nullSafeEqualsWithNullObjectsIsFalse() {
379376
assertThat(SpringUtils.nullSafeEquals(null, "test")).isFalse();
380377
assertThat(SpringUtils.nullSafeEquals("test", null)).isFalse();
@@ -385,6 +382,58 @@ public void nullSafeEqualsWithUnequalObjectsIsFalse() {
385382
assertThat(SpringUtils.nullSafeEquals("test", "mock")).isFalse();
386383
}
387384

385+
@Test
386+
public void nullSafeNameWithType() {
387+
388+
assertThat(SpringUtils.nullSafeName(Boolean.class)).isEqualTo(Boolean.class.getName());
389+
assertThat(SpringUtils.nullSafeName(Integer.class)).isEqualTo(Integer.class.getName());
390+
assertThat(SpringUtils.nullSafeName(Double.class)).isEqualTo(Double.class.getName());
391+
assertThat(SpringUtils.nullSafeName(String.class)).isEqualTo(String.class.getName());
392+
assertThat(SpringUtils.nullSafeName(Time.class)).isEqualTo(Time.class.getName());
393+
assertThat(SpringUtils.nullSafeName(Person.class)).isEqualTo(Person.class.getName());
394+
}
395+
396+
@Test
397+
public void nullSafeNameWithNull() {
398+
assertThat(SpringUtils.nullSafeName(null)).isNull();
399+
}
400+
401+
@Test
402+
public void nullSafeSimpleNameWithType() {
403+
404+
assertThat(SpringUtils.nullSafeSimpleName(Boolean.class)).isEqualTo(Boolean.class.getSimpleName());
405+
assertThat(SpringUtils.nullSafeSimpleName(Integer.class)).isEqualTo(Integer.class.getSimpleName());
406+
assertThat(SpringUtils.nullSafeSimpleName(Double.class)).isEqualTo(Double.class.getSimpleName());
407+
assertThat(SpringUtils.nullSafeSimpleName(String.class)).isEqualTo(String.class.getSimpleName());
408+
assertThat(SpringUtils.nullSafeSimpleName(Time.class)).isEqualTo(Time.class.getSimpleName());
409+
assertThat(SpringUtils.nullSafeSimpleName(Person.class)).isEqualTo(Person.class.getSimpleName());
410+
}
411+
412+
@Test
413+
public void nullSafeSimpleNameWithNull() {
414+
assertThat(SpringUtils.nullSafeSimpleName(null)).isNull();
415+
}
416+
417+
@Test
418+
public void nullSafeTypeWithObject() {
419+
assertThat(SpringUtils.nullSafeType(new Object())).isEqualTo(Object.class);
420+
}
421+
422+
@Test
423+
public void nullSafeTypeWithObjectAndDefaultType() {
424+
assertThat(SpringUtils.nullSafeType("test", Person.class)).isEqualTo(String.class);
425+
}
426+
427+
@Test
428+
public void nullSafeTypeWithNull() {
429+
assertThat(SpringUtils.nullSafeType(null)).isNull();
430+
}
431+
432+
@Test
433+
public void nullSafeTypeWithNullAndDefaultType() {
434+
assertThat(SpringUtils.nullSafeType(null, Person.class)).isEqualTo(Person.class);
435+
}
436+
388437
@Test
389438
public void safeDoOperationWithNonThrowingOperation() {
390439

0 commit comments

Comments
 (0)