Skip to content

Commit 4f4014d

Browse files
committed
Polishing.
Hide actual converters by making these private classes, expose factory method to construct converters. Avoid stream API usage on converter code paths. Remove unused imports. Clean up tests. Original pull request: #993. See #992
1 parent 221d113 commit 4f4014d

File tree

5 files changed

+67
-36
lines changed

5 files changed

+67
-36
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/AggregateReferenceConverters.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.jdbc.core.convert;
1717

18+
import java.util.Arrays;
19+
import java.util.Collection;
1820
import java.util.Collections;
1921
import java.util.Set;
2022

@@ -32,20 +34,31 @@
3234
* content of the {@link AggregateReference}.
3335
*
3436
* @author Jens Schauder
35-
* @since 2.6
37+
* @author Mark Paluch
38+
* @since 2.3
3639
*/
3740
class AggregateReferenceConverters {
41+
3842
/**
39-
* Prevent instantiation.
43+
* Returns the converters to be registered.
44+
*
45+
* @return a collection of converters. Guaranteed to be not {@literal null}.
4046
*/
41-
private AggregateReferenceConverters() {}
47+
public static Collection<GenericConverter> getConvertersToRegister(ConversionService conversionService) {
48+
49+
return Arrays.asList(new AggregateReferenceToSimpleTypeConverter(conversionService),
50+
new SimpleTypeToAggregateReferenceConverter(conversionService));
51+
}
4252

4353
/**
4454
* Converts from an AggregateReference to its id, leaving the conversion of the id to the ultimate target type to the
4555
* delegate {@link ConversionService}.
4656
*/
4757
@WritingConverter
48-
static class AggregateReferenceToSimpleTypeConverter implements GenericConverter {
58+
private static class AggregateReferenceToSimpleTypeConverter implements GenericConverter {
59+
60+
private static final Set<ConvertiblePair> CONVERTIBLE_TYPES = Collections
61+
.singleton(new ConvertiblePair(AggregateReference.class, Object.class));
4962

5063
private final ConversionService delegate;
5164

@@ -55,7 +68,7 @@ static class AggregateReferenceToSimpleTypeConverter implements GenericConverter
5568

5669
@Override
5770
public Set<ConvertiblePair> getConvertibleTypes() {
58-
return Collections.singleton(new ConvertiblePair(AggregateReference.class, Object.class));
71+
return CONVERTIBLE_TYPES;
5972
}
6073

6174
@Override
@@ -90,7 +103,10 @@ public Object convert(@Nullable Object source, TypeDescriptor sourceDescriptor,
90103
* {@link ConversionService}.
91104
*/
92105
@ReadingConverter
93-
static class SimpleTypeToAggregateReferenceConverter implements GenericConverter {
106+
private static class SimpleTypeToAggregateReferenceConverter implements GenericConverter {
107+
108+
private static final Set<ConvertiblePair> CONVERTIBLE_TYPES = Collections
109+
.singleton(new ConvertiblePair(Object.class, AggregateReference.class));
94110

95111
private final ConversionService delegate;
96112

@@ -100,7 +116,7 @@ static class SimpleTypeToAggregateReferenceConverter implements GenericConverter
100116

101117
@Override
102118
public Set<ConvertiblePair> getConvertibleTypes() {
103-
return Collections.singleton(new ConvertiblePair(Object.class, AggregateReference.class));
119+
return CONVERTIBLE_TYPES;
104120
}
105121

106122
@Override

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BasicJdbcConverter.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import java.sql.JDBCType;
2020
import java.sql.ResultSet;
2121
import java.sql.SQLException;
22+
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Optional;
2425

2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
28+
2729
import org.springframework.context.ApplicationContext;
2830
import org.springframework.context.ApplicationContextAware;
2931
import org.springframework.core.ResolvableType;
@@ -224,7 +226,7 @@ public Object readValue(@Nullable Object value, TypeInformation<?> type) {
224226
if (getConversions().hasCustomReadTarget(value.getClass(), type.getType())) {
225227

226228
TypeDescriptor sourceDescriptor = TypeDescriptor.valueOf(value.getClass());
227-
TypeDescriptor targetDescriptor = typeInformationToTypeDescriptor(type);
229+
TypeDescriptor targetDescriptor = createTypeDescriptor(type);
228230

229231
return getConversionService().convert(value, sourceDescriptor,
230232
targetDescriptor);
@@ -241,11 +243,15 @@ public Object readValue(@Nullable Object value, TypeInformation<?> type) {
241243
return super.readValue(value, type);
242244
}
243245

244-
private static TypeDescriptor typeInformationToTypeDescriptor(TypeInformation<?> type) {
246+
private static TypeDescriptor createTypeDescriptor(TypeInformation<?> type) {
245247

246-
Class<?>[] generics = type.getTypeArguments().stream().map(TypeInformation::getType).toArray(Class[]::new);
248+
List<TypeInformation<?>> typeArguments = type.getTypeArguments();
249+
Class<?>[] generics = new Class[typeArguments.size()];
250+
for (int i = 0; i < typeArguments.size(); i++) {
251+
generics[i] = typeArguments.get(i).getType();
252+
}
247253

248-
return new TypeDescriptor(ResolvableType.forClassWithGenerics(type.getType(), generics), null, null);
254+
return new TypeDescriptor(ResolvableType.forClassWithGenerics(type.getType(), generics), type.getType(), null);
249255
}
250256

251257
/*

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcCustomConversions.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import java.util.Collections;
2121
import java.util.List;
2222

23-
import org.springframework.core.convert.ConversionService;
24-
import org.springframework.core.convert.converter.Converter;
2523
import org.springframework.core.convert.converter.GenericConverter.ConvertiblePair;
2624
import org.springframework.core.convert.support.DefaultConversionService;
2725
import org.springframework.data.convert.CustomConversions;
@@ -46,9 +44,8 @@ public class JdbcCustomConversions extends CustomConversions {
4644

4745
List<Object> converters = new ArrayList<>(Jsr310TimestampBasedConverters.getConvertersToRegister());
4846

49-
ConversionService conversionService = DefaultConversionService.getSharedInstance();
50-
converters.add(new AggregateReferenceConverters.AggregateReferenceToSimpleTypeConverter(conversionService));
51-
converters.add(new AggregateReferenceConverters.SimpleTypeToAggregateReferenceConverter(conversionService));
47+
converters
48+
.addAll(AggregateReferenceConverters.getConvertersToRegister(DefaultConversionService.getSharedInstance()));
5249

5350
STORE_CONVERTERS = Collections.unmodifiableCollection(converters);
5451

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/AggregateReferenceConvertersUnitTests.java

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,69 +15,83 @@
1515
*/
1616
package org.springframework.data.jdbc.core.convert;
1717

18+
import static org.assertj.core.api.Assertions.*;
19+
20+
import org.junit.jupiter.api.BeforeEach;
1821
import org.junit.jupiter.api.Test;
22+
1923
import org.springframework.core.ResolvableType;
2024
import org.springframework.core.convert.TypeDescriptor;
25+
import org.springframework.core.convert.support.ConfigurableConversionService;
2126
import org.springframework.core.convert.support.DefaultConversionService;
2227
import org.springframework.data.jdbc.core.mapping.AggregateReference;
2328

24-
import static org.assertj.core.api.Assertions.*;
25-
2629
/**
2730
* Tests for converters from an to {@link org.springframework.data.jdbc.core.mapping.AggregateReference}.
2831
*
2932
* @author Jens Schauder
33+
* @author Mark Paluch
3034
*/
3135
class AggregateReferenceConvertersUnitTests {
3236

33-
AggregateReferenceConverters.SimpleTypeToAggregateReferenceConverter simpleToAggregate = new AggregateReferenceConverters.SimpleTypeToAggregateReferenceConverter(DefaultConversionService.getSharedInstance());
34-
AggregateReferenceConverters.AggregateReferenceToSimpleTypeConverter aggregateToSimple = new AggregateReferenceConverters.AggregateReferenceToSimpleTypeConverter(DefaultConversionService.getSharedInstance());
37+
ConfigurableConversionService conversionService;
38+
39+
@BeforeEach
40+
void setUp() {
41+
conversionService = new DefaultConversionService();
42+
AggregateReferenceConverters.getConvertersToRegister(DefaultConversionService.getSharedInstance())
43+
.forEach(it -> conversionService.addConverter(it));
44+
}
3545

36-
@Test // #992
46+
@Test // GH-992
3747
void convertsFromSimpleValue() {
3848

3949
ResolvableType aggregateReferenceWithIdTypeInteger = ResolvableType.forClassWithGenerics(AggregateReference.class, String.class, Integer.class);
40-
final Object converted = simpleToAggregate.convert(23, TypeDescriptor.forObject(23), new TypeDescriptor(aggregateReferenceWithIdTypeInteger, null, null));
50+
Object converted = conversionService.convert(23, TypeDescriptor.forObject(23),
51+
new TypeDescriptor(aggregateReferenceWithIdTypeInteger, null, null));
4152

4253
assertThat(converted).isEqualTo(AggregateReference.to(23));
4354
}
4455

45-
@Test // #992
56+
@Test // GH-992
4657
void convertsFromSimpleValueThatNeedsSeparateConversion() {
4758

4859
ResolvableType aggregateReferenceWithIdTypeInteger = ResolvableType.forClassWithGenerics(AggregateReference.class, String.class, Long.class);
49-
final Object converted = simpleToAggregate.convert(23, TypeDescriptor.forObject(23), new TypeDescriptor(aggregateReferenceWithIdTypeInteger, null, null));
60+
Object converted = conversionService.convert(23, TypeDescriptor.forObject(23),
61+
new TypeDescriptor(aggregateReferenceWithIdTypeInteger, null, null));
5062

5163
assertThat(converted).isEqualTo(AggregateReference.to(23L));
5264
}
5365

54-
@Test // #992
66+
@Test // GH-992
5567
void convertsFromSimpleValueWithMissingTypeInformation() {
5668

57-
final Object converted = simpleToAggregate.convert(23, TypeDescriptor.forObject(23), TypeDescriptor.valueOf(AggregateReference.class));
69+
Object converted = conversionService.convert(23, TypeDescriptor.forObject(23),
70+
TypeDescriptor.valueOf(AggregateReference.class));
5871

5972
assertThat(converted).isEqualTo(AggregateReference.to(23));
6073
}
6174

62-
@Test // #992
75+
@Test // GH-992
6376
void convertsToSimpleValue() {
6477

65-
final AggregateReference<Object, Integer> source = AggregateReference.to(23);
78+
AggregateReference<Object, Integer> source = AggregateReference.to(23);
6679

67-
final Object converted = aggregateToSimple.convert(source, TypeDescriptor.forObject(source), TypeDescriptor.valueOf(Integer.class));
80+
Object converted = conversionService.convert(source, TypeDescriptor.forObject(source),
81+
TypeDescriptor.valueOf(Integer.class));
6882

6983
assertThat(converted).isEqualTo(23);
7084
}
7185

72-
@Test // #992
86+
@Test // GH-992
7387
void convertsToSimpleValueThatNeedsSeparateConversion() {
7488

75-
final AggregateReference<Object, Integer> source = AggregateReference.to(23);
89+
AggregateReference<Object, Integer> source = AggregateReference.to(23);
7690

77-
final Object converted = aggregateToSimple.convert(source, TypeDescriptor.forObject(source), TypeDescriptor.valueOf(Long.class));
91+
Object converted = conversionService.convert(source, TypeDescriptor.forObject(source),
92+
TypeDescriptor.valueOf(Long.class));
7893

7994
assertThat(converted).isEqualTo(23L);
8095
}
8196

82-
83-
}
97+
}

spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/BasicRelationalConverter.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import java.util.Optional;
2020
import java.util.function.Function;
2121

22-
import org.springframework.core.ResolvableType;
2322
import org.springframework.core.convert.ConversionService;
24-
import org.springframework.core.convert.TypeDescriptor;
2523
import org.springframework.core.convert.support.ConfigurableConversionService;
2624
import org.springframework.core.convert.support.DefaultConversionService;
2725
import org.springframework.data.convert.CustomConversions;

0 commit comments

Comments
 (0)