Skip to content

Commit ebe4bbe

Browse files
committed
Update BeanAdapter.
1 parent 4f40159 commit ebe4bbe

3 files changed

Lines changed: 45 additions & 34 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
subprojects {
1616
group = 'org.httprpc'
17-
version = '5.7'
17+
version = '5.7.1'
1818

1919
repositories {
2020
mavenCentral()

kilo-client/src/main/java/org/httprpc/kilo/beans/BeanAdapter.java

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -914,27 +914,31 @@ private static Object toEnum(String value, Class<?> type) {
914914
}
915915

916916
private static Object toRecord(Map<?, ?> map, Class<?> type) {
917-
var recordComponents = type.getRecordComponents();
917+
var properties = getProperties(type);
918918

919-
var parameterTypes = new Class<?>[recordComponents.length];
920-
var arguments = new Object[recordComponents.length];
919+
var n = properties.size();
921920

922-
for (var i = 0; i < recordComponents.length; i++) {
923-
var recordComponent = recordComponents[i];
921+
var parameterTypes = new Class<?>[n];
922+
var arguments = new Object[n];
924923

925-
parameterTypes[i] = recordComponent.getType();
924+
var i = 0;
926925

927-
var accessor = recordComponent.getAccessor();
926+
for (var entry : properties.entrySet()) {
927+
var key = entry.getKey();
928928

929-
var key = getKey(accessor, recordComponent.getName());
929+
var accessor = entry.getValue().accessor;
930930

931931
var value = map.get(key);
932932

933933
if (accessor.getAnnotation(Required.class) != null && value == null) {
934934
throw new RequiredValueException(key, type);
935935
}
936936

937-
arguments[i] = coerceGeneric(value, recordComponent.getGenericType());
937+
parameterTypes[i] = accessor.getReturnType();
938+
939+
arguments[i] = coerceGeneric(value, accessor.getGenericReturnType());
940+
941+
i++;
938942
}
939943

940944
Constructor<?> constructor;
@@ -970,14 +974,14 @@ private static Object toBean(Map<?, ?> map, Class<?> type) {
970974
}
971975

972976
for (var entry : getProperties(type).entrySet()) {
977+
var key = entry.getKey();
978+
973979
var property = entry.getValue();
974980

975981
if (property.mutator == null) {
976982
continue;
977983
}
978984

979-
var key = entry.getKey();
980-
981985
var value = map.get(key);
982986

983987
if (property.accessor.getAnnotation(Required.class) != null && value == null) {
@@ -996,7 +1000,7 @@ private static Object toBean(Map<?, ?> map, Class<?> type) {
9961000
}
9971001

9981002
/**
999-
* Returns the properties for a given type, sorted by name.
1003+
* Returns the properties for a given type.
10001004
*
10011005
* @param type
10021006
* The bean type.
@@ -1009,18 +1013,23 @@ public static Map<String, Property> getProperties(Class<?> type) {
10091013
}
10101014

10111015
private static Map<String, Property> computeProperties(Class<?> type) {
1012-
var accessors = new HashMap<String, Method>();
1013-
var mutatorMap = new HashMap<String, List<Method>>();
1014-
1016+
Map<String, Property> properties;
10151017
if (type.isRecord()) {
1018+
properties = new LinkedHashMap<>();
1019+
10161020
var recordComponents = type.getRecordComponents();
10171021

10181022
for (var i = 0; i < recordComponents.length; i++) {
10191023
var recordComponent = recordComponents[i];
10201024

1021-
accessors.put(recordComponent.getName(), recordComponent.getAccessor());
1025+
var accessor = recordComponent.getAccessor();
1026+
1027+
properties.put(getKey(accessor, recordComponent.getName()), new Property(accessor, null));
10221028
}
10231029
} else {
1030+
var accessors = new HashMap<String, Method>();
1031+
var mutatorLists = new HashMap<String, List<Method>>();
1032+
10241033
var methods = type.getMethods();
10251034

10261035
for (var i = 0; i < methods.length; i++) {
@@ -1039,24 +1048,26 @@ private static Map<String, Property> computeProperties(Class<?> type) {
10391048
if (method.getParameterCount() == 0) {
10401049
accessors.put(propertyName, method);
10411050
} else {
1042-
mutatorMap.computeIfAbsent(propertyName, key -> new LinkedList<>()).add(method);
1051+
mutatorLists.computeIfAbsent(propertyName, key -> new LinkedList<>()).add(method);
10431052
}
10441053
}
1045-
}
10461054

1047-
return immutableMapOf(sortedMapOf(mapAll(accessors.entrySet(), entry -> {
1048-
var propertyName = entry.getKey();
1055+
properties = sortedMapOf(mapAll(accessors.entrySet(), entry -> {
1056+
var propertyName = entry.getKey();
1057+
1058+
var accessor = entry.getValue();
10491059

1050-
var accessor = entry.getValue();
1060+
var propertyType = accessor.getReturnType();
10511061

1052-
var propertyType = accessor.getReturnType();
1062+
var mutatorList = coalesce(mutatorLists.get(propertyName), () -> emptyListOf(Method.class));
10531063

1054-
var mutatorList = coalesce(mutatorMap.get(propertyName), () -> emptyListOf(Method.class));
1064+
var mutator = firstOf(filter(mutatorList, method -> method.getParameterTypes()[0] == propertyType));
10551065

1056-
var mutator = firstOf(filter(mutatorList, method -> method.getParameterTypes()[0] == propertyType));
1066+
return entry(getKey(accessor, propertyName), new Property(accessor, mutator));
1067+
}));
1068+
}
10571069

1058-
return entry(getKey(accessor, propertyName), new Property(accessor, mutator));
1059-
})));
1070+
return immutableMapOf(properties);
10601071
}
10611072

10621073
private static String getPropertyName(Method method) {

kilo-server/src/main/java/org/httprpc/kilo/WebService.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ private enum Verb {
740740

741741
private static class Resource {
742742
Map<String, Resource> resources = new TreeMap<>();
743-
Map<Verb, List<Method>> handlers = new TreeMap<>();
743+
Map<Verb, List<Method>> handlerLists = new TreeMap<>();
744744
}
745745

746746
private Resource root = null;
@@ -885,7 +885,7 @@ public void init() throws ServletException {
885885
}
886886
}
887887

888-
resource.handlers.computeIfAbsent(verb, key -> new LinkedList<>()).add(handler);
888+
resource.handlerLists.computeIfAbsent(verb, key -> new LinkedList<>()).add(handler);
889889
}
890890

891891
sort(root);
@@ -900,8 +900,8 @@ public void init() throws ServletException {
900900
}
901901

902902
private static void sort(Resource root) {
903-
for (var handlers : root.handlers.values()) {
904-
handlers.sort(handlerComparator);
903+
for (var handlerList : root.handlerLists.values()) {
904+
handlerList.sort(handlerComparator);
905905
}
906906

907907
for (var resource : root.resources.values()) {
@@ -1070,7 +1070,7 @@ private void invoke(HttpServletRequest request, HttpServletResponse response) th
10701070
return;
10711071
}
10721072

1073-
var handlerList = resource.handlers.get(verb);
1073+
var handlerList = resource.handlerLists.get(verb);
10741074

10751075
if (handlerList == null) {
10761076
response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
@@ -1487,7 +1487,7 @@ public ServiceDescriptor getServiceDescriptor() {
14871487
}
14881488

14891489
private void describeResource(String path, Resource resource) {
1490-
if (!resource.handlers.isEmpty()) {
1490+
if (!resource.handlerLists.isEmpty()) {
14911491
var endpoint = new EndpointDescriptor(path);
14921492

14931493
var keyCount = 0;
@@ -1500,7 +1500,7 @@ private void describeResource(String path, Resource resource) {
15001500
}
15011501
}
15021502

1503-
for (var entry : resource.handlers.entrySet()) {
1503+
for (var entry : resource.handlerLists.entrySet()) {
15041504
for (var handler : entry.getValue()) {
15051505
var operation = new OperationDescriptor(entry.getKey().toString(), handler);
15061506

0 commit comments

Comments
 (0)