Skip to content

Commit 7d59d71

Browse files
author
Chun-Han Hsiao
committed
Support constructor based so we can map Records as destinations
1 parent f54d5f3 commit 7d59d71

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<properties>
1717
<maven.compiler.source>17</maven.compiler.source>
1818
<maven.compiler.target>17</maven.compiler.target>
19-
<modelmapper.version>3.1.1</modelmapper.version>
19+
<modelmapper.version>3.2.6</modelmapper.version>
2020
<testng.version>7.7.0</testng.version>
2121
</properties>
2222
<licenses>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.modelmapper.record;
2+
3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.RecordComponent;
5+
import java.util.stream.IntStream;
6+
import org.modelmapper.ConstructorParam;
7+
import org.modelmapper.spi.ConstructorInjector;
8+
9+
import java.util.List;
10+
11+
public class RecordConstructorInjector implements ConstructorInjector {
12+
13+
@Override
14+
public List<ConstructorParam> getParameters(Class<?> type) {
15+
if (!isApplicable(type)) {
16+
throw new IllegalArgumentException(
17+
String.format("Type %s is not a Record type.", type.getName()));
18+
}
19+
Constructor<?> constructor = type.getDeclaredConstructors()[0];
20+
RecordComponent[] components = type.getRecordComponents();
21+
return IntStream.range(0, components.length)
22+
.mapToObj(index -> new ConstructorParam(constructor, index, components[index].getName(),
23+
components[index].getType()))
24+
.toList();
25+
}
26+
27+
@Override
28+
public boolean isApplicable(Class<?> type) {
29+
return Record.class.isAssignableFrom(type);
30+
}
31+
}

src/main/java/org/modelmapper/record/RecordModule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ public class RecordModule implements Module {
77
@Override
88
public void setupModule(ModelMapper modelMapper) {
99
modelMapper.getConfiguration().addValueReader(new RecordValueReader());
10+
modelMapper.getConfiguration().addConstructorInjector(
11+
new RecordConstructorInjector());
1012
}
1113
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.modelmapper.record;
2+
3+
import static org.testng.Assert.assertEquals;
4+
import static org.testng.Assert.assertNull;
5+
6+
import org.modelmapper.ModelMapper;
7+
import org.modelmapper.config.Configuration.AccessLevel;
8+
import org.testng.annotations.BeforeMethod;
9+
import org.testng.annotations.Test;
10+
11+
/**
12+
* Tests the mapping of a POJO to a Record.
13+
*/
14+
@Test
15+
public class RecordConstructorInjectorTest {
16+
private ModelMapper modelMapper;
17+
18+
record UserRecord(String userId, String userName) {
19+
}
20+
21+
static class User {
22+
String userId;
23+
String userName;
24+
}
25+
26+
@BeforeMethod
27+
public void setup() {
28+
modelMapper = new ModelMapper()
29+
.registerModule(new RecordModule());
30+
modelMapper.getConfiguration()
31+
.setFieldMatchingEnabled(true)
32+
.setFieldAccessLevel(AccessLevel.PACKAGE_PRIVATE)
33+
.setMethodAccessLevel(AccessLevel.PACKAGE_PRIVATE);
34+
}
35+
36+
public void shouldMapToRecord() {
37+
User user = new User();
38+
user.userId = "id";
39+
user.userName = "name";
40+
41+
UserRecord record = modelMapper.map(user, UserRecord.class);
42+
assertEquals(record.userId, "id");
43+
assertEquals(record.userName, "name");
44+
}
45+
}

0 commit comments

Comments
 (0)