Skip to content

Commit 77be06a

Browse files
authored
Support primitive type/classes in HubConnection.on() (#25773)
* Support primitive type/classes in HubConnection.on() * Small refactor * Spacing
1 parent 8496266 commit 77be06a

File tree

3 files changed

+60
-66
lines changed

3 files changed

+60
-66
lines changed

src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java

Lines changed: 32 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -751,12 +751,7 @@ private <T> Single<T> invoke(Type returnType, Class<?> returnClass, String metho
751751
// run continuations on a separate thread
752752
Subject<Object> pendingCall = irq.getPendingCall();
753753
pendingCall.subscribe(result -> {
754-
// Primitive types can't be cast with the Class cast function
755-
if (returnClass.isPrimitive()) {
756-
subject.onSuccess((T)result);
757-
} else {
758-
subject.onSuccess((T)returnClass.cast(result));
759-
}
754+
subject.onSuccess(Utils.<T>cast(returnClass, result));
760755
}, error -> subject.onError(error));
761756

762757
// Make sure the actual send is after setting up the callbacks otherwise there is a race
@@ -813,12 +808,7 @@ private <T> Observable<T> stream(Type returnType, Class<?> returnClass, String m
813808
ReplaySubject<T> subject = ReplaySubject.create();
814809
Subject<Object> pendingCall = irq.getPendingCall();
815810
pendingCall.subscribe(result -> {
816-
// Primitive types can't be cast with the Class cast function
817-
if (returnClass.isPrimitive()) {
818-
subject.onNext((T)result);
819-
} else {
820-
subject.onNext((T)returnClass.cast(result));
821-
}
811+
subject.onNext(Utils.<T>cast(returnClass, result));
822812
}, error -> subject.onError(error),
823813
() -> subject.onComplete());
824814

@@ -907,7 +897,7 @@ public Subscription on(String target, Action callback) {
907897
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
908898
*/
909899
public <T1> Subscription on(String target, Action1<T1> callback, Class<T1> param1) {
910-
ActionBase action = params -> callback.invoke(param1.cast(params[0]));
900+
ActionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]));
911901
return registerHandler(target, action, param1);
912902

913903
}
@@ -926,7 +916,7 @@ public <T1> Subscription on(String target, Action1<T1> callback, Class<T1> param
926916
*/
927917
public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Class<T1> param1, Class<T2> param2) {
928918
ActionBase action = params -> {
929-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]));
919+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]));
930920
};
931921
return registerHandler(target, action, param1, param2);
932922
}
@@ -948,7 +938,7 @@ public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Class<T
948938
public <T1, T2, T3> Subscription on(String target, Action3<T1, T2, T3> callback,
949939
Class<T1> param1, Class<T2> param2, Class<T3> param3) {
950940
ActionBase action = params -> {
951-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]));
941+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]));
952942
};
953943
return registerHandler(target, action, param1, param2, param3);
954944
}
@@ -972,7 +962,8 @@ public <T1, T2, T3> Subscription on(String target, Action3<T1, T2, T3> callback,
972962
public <T1, T2, T3, T4> Subscription on(String target, Action4<T1, T2, T3, T4> callback,
973963
Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4) {
974964
ActionBase action = params -> {
975-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]), param4.cast(params[3]));
965+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
966+
Utils.<T4>cast(param4, params[3]));
976967
};
977968
return registerHandler(target, action, param1, param2, param3, param4);
978969
}
@@ -998,8 +989,8 @@ public <T1, T2, T3, T4> Subscription on(String target, Action4<T1, T2, T3, T4> c
998989
public <T1, T2, T3, T4, T5> Subscription on(String target, Action5<T1, T2, T3, T4, T5> callback,
999990
Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5) {
1000991
ActionBase action = params -> {
1001-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]), param4.cast(params[3]),
1002-
param5.cast(params[4]));
992+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
993+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]));
1003994
};
1004995
return registerHandler(target, action, param1, param2, param3, param4, param5);
1005996
}
@@ -1027,8 +1018,8 @@ public <T1, T2, T3, T4, T5> Subscription on(String target, Action5<T1, T2, T3, T
10271018
public <T1, T2, T3, T4, T5, T6> Subscription on(String target, Action6<T1, T2, T3, T4, T5, T6> callback,
10281019
Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5, Class<T6> param6) {
10291020
ActionBase action = params -> {
1030-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]), param4.cast(params[3]),
1031-
param5.cast(params[4]), param6.cast(params[5]));
1021+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1022+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]));
10321023
};
10331024
return registerHandler(target, action, param1, param2, param3, param4, param5, param6);
10341025
}
@@ -1058,8 +1049,8 @@ public <T1, T2, T3, T4, T5, T6> Subscription on(String target, Action6<T1, T2, T
10581049
public <T1, T2, T3, T4, T5, T6, T7> Subscription on(String target, Action7<T1, T2, T3, T4, T5, T6, T7> callback,
10591050
Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5, Class<T6> param6, Class<T7> param7) {
10601051
ActionBase action = params -> {
1061-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]), param4.cast(params[3]),
1062-
param5.cast(params[4]), param6.cast(params[5]), param7.cast(params[6]));
1052+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1053+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]));
10631054
};
10641055
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7);
10651056
}
@@ -1091,8 +1082,9 @@ public <T1, T2, T3, T4, T5, T6, T7> Subscription on(String target, Action7<T1, T
10911082
public <T1, T2, T3, T4, T5, T6, T7, T8> Subscription on(String target, Action8<T1, T2, T3, T4, T5, T6, T7, T8> callback,
10921083
Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5, Class<T6> param6, Class<T7> param7, Class<T8> param8) {
10931084
ActionBase action = params -> {
1094-
callback.invoke(param1.cast(params[0]), param2.cast(params[1]), param3.cast(params[2]), param4.cast(params[3]),
1095-
param5.cast(params[4]), param6.cast(params[5]), param7.cast(params[6]), param8.cast(params[7]));
1085+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1086+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]),
1087+
Utils.<T8>cast(param8, params[7]));
10961088
};
10971089
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7, param8);
10981090
}
@@ -1108,9 +1100,10 @@ public <T1, T2, T3, T4, T5, T6, T7, T8> Subscription on(String target, Action8<T
11081100
* @param <T1> The first argument type.
11091101
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
11101102
*/
1111-
@SuppressWarnings("unchecked")
11121103
public <T1> Subscription on(String target, Action1<T1> callback, Type param1) {
1113-
ActionBase action = params -> callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]));
1104+
ActionBase action = params -> {
1105+
callback.invoke(Utils.<T1>cast(param1, params[0]));
1106+
};
11141107
return registerHandler(target, action, param1);
11151108
}
11161109

@@ -1127,10 +1120,9 @@ public <T1> Subscription on(String target, Action1<T1> callback, Type param1) {
11271120
* @param <T2> The second parameter type.
11281121
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
11291122
*/
1130-
@SuppressWarnings("unchecked")
11311123
public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Type param1, Type param2) {
11321124
ActionBase action = params -> {
1133-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]));
1125+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]));
11341126
};
11351127
return registerHandler(target, action, param1, param2);
11361128
}
@@ -1150,12 +1142,10 @@ public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Type pa
11501142
* @param <T3> The third parameter type.
11511143
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
11521144
*/
1153-
@SuppressWarnings("unchecked")
11541145
public <T1, T2, T3> Subscription on(String target, Action3<T1, T2, T3> callback,
11551146
Type param1, Type param2, Type param3) {
11561147
ActionBase action = params -> {
1157-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1158-
(T3)Utils.typeToClass(param3).cast(params[2]));
1148+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]));
11591149
};
11601150
return registerHandler(target, action, param1, param2, param3);
11611151
}
@@ -1177,12 +1167,11 @@ public <T1, T2, T3> Subscription on(String target, Action3<T1, T2, T3> callback,
11771167
* @param <T4> The fourth parameter type.
11781168
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
11791169
*/
1180-
@SuppressWarnings("unchecked")
11811170
public <T1, T2, T3, T4> Subscription on(String target, Action4<T1, T2, T3, T4> callback,
11821171
Type param1, Type param2, Type param3, Type param4) {
11831172
ActionBase action = params -> {
1184-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1185-
(T3)Utils.typeToClass(param3).cast(params[2]), (T4)Utils.typeToClass(param4).cast(params[3]));
1173+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1174+
Utils.<T4>cast(param4, params[3]));
11861175
};
11871176
return registerHandler(target, action, param1, param2, param3, param4);
11881177
}
@@ -1206,13 +1195,11 @@ public <T1, T2, T3, T4> Subscription on(String target, Action4<T1, T2, T3, T4> c
12061195
* @param <T5> The fifth parameter type.
12071196
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
12081197
*/
1209-
@SuppressWarnings("unchecked")
12101198
public <T1, T2, T3, T4, T5> Subscription on(String target, Action5<T1, T2, T3, T4, T5> callback,
12111199
Type param1, Type param2, Type param3, Type param4, Type param5) {
12121200
ActionBase action = params -> {
1213-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1214-
(T3)Utils.typeToClass(param3).cast(params[2]), (T4)Utils.typeToClass(param4).cast(params[3]),
1215-
(T5)Utils.typeToClass(param5).cast(params[4]));
1201+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1202+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]));
12161203
};
12171204
return registerHandler(target, action, param1, param2, param3, param4, param5);
12181205
}
@@ -1238,13 +1225,11 @@ public <T1, T2, T3, T4, T5> Subscription on(String target, Action5<T1, T2, T3, T
12381225
* @param <T6> The sixth parameter type.
12391226
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
12401227
*/
1241-
@SuppressWarnings("unchecked")
12421228
public <T1, T2, T3, T4, T5, T6> Subscription on(String target, Action6<T1, T2, T3, T4, T5, T6> callback,
12431229
Type param1, Type param2, Type param3, Type param4, Type param5, Type param6) {
12441230
ActionBase action = params -> {
1245-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1246-
(T3)Utils.typeToClass(param3).cast(params[2]), (T4)Utils.typeToClass(param4).cast(params[3]),
1247-
(T5)Utils.typeToClass(param5).cast(params[4]), (T6)Utils.typeToClass(param6).cast(params[5]));
1231+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1232+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]));
12481233
};
12491234
return registerHandler(target, action, param1, param2, param3, param4, param5, param6);
12501235
}
@@ -1272,14 +1257,11 @@ public <T1, T2, T3, T4, T5, T6> Subscription on(String target, Action6<T1, T2, T
12721257
* @param <T7> The seventh parameter type.
12731258
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
12741259
*/
1275-
@SuppressWarnings("unchecked")
12761260
public <T1, T2, T3, T4, T5, T6, T7> Subscription on(String target, Action7<T1, T2, T3, T4, T5, T6, T7> callback,
12771261
Type param1, Type param2, Type param3, Type param4, Type param5, Type param6, Type param7) {
12781262
ActionBase action = params -> {
1279-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1280-
(T3)Utils.typeToClass(param3).cast(params[2]), (T4)Utils.typeToClass(param4).cast(params[3]),
1281-
(T5)Utils.typeToClass(param5).cast(params[4]), (T6)Utils.typeToClass(param6).cast(params[5]),
1282-
(T7)Utils.typeToClass(param7).cast(params[6]));
1263+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1264+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]));
12831265
};
12841266
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7);
12851267
}
@@ -1309,15 +1291,13 @@ public <T1, T2, T3, T4, T5, T6, T7> Subscription on(String target, Action7<T1, T
13091291
* @param <T8> The eighth parameter type.
13101292
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
13111293
*/
1312-
@SuppressWarnings("unchecked")
13131294
public <T1, T2, T3, T4, T5, T6, T7, T8> Subscription on(String target, Action8<T1, T2, T3, T4, T5, T6, T7, T8> callback,
13141295
Type param1, Type param2, Type param3, Type param4, Type param5, Type param6, Type param7,
13151296
Type param8) {
13161297
ActionBase action = params -> {
1317-
callback.invoke((T1)Utils.typeToClass(param1).cast(params[0]), (T2)Utils.typeToClass(param2).cast(params[1]),
1318-
(T3)Utils.typeToClass(param3).cast(params[2]), (T4)Utils.typeToClass(param4).cast(params[3]),
1319-
(T5)Utils.typeToClass(param5).cast(params[4]), (T6)Utils.typeToClass(param6).cast(params[5]),
1320-
(T7)Utils.typeToClass(param7).cast(params[6]), (T8)Utils.typeToClass(param8).cast(params[7]));
1298+
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
1299+
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]),
1300+
Utils.<T8>cast(param8, params[7]));
13211301
};
13221302
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7, param8);
13231303
}

src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Utils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,18 @@ public static Class<?> typeToClass(Type type) {
4343
throw new UnsupportedOperationException("Cannot handle type class: " + type.getClass());
4444
}
4545
}
46+
47+
@SuppressWarnings("unchecked")
48+
public static <T> T cast(Class<?> returnClass, Object obj) {
49+
// Primitive types can't be cast with the Class cast function
50+
if (returnClass.isPrimitive()) {
51+
return (T) obj;
52+
} else {
53+
return (T)returnClass.cast(obj);
54+
}
55+
}
56+
57+
public static <T> T cast(Type returnType, Object obj) {
58+
return cast(typeToClass(returnType), obj);
59+
}
4660
}

0 commit comments

Comments
 (0)