Skip to content

Commit 9761fbc

Browse files
committed
standardize semantics of all mergers,enhance mergeFactory and testcase
1 parent 9d4b6cb commit 9761fbc

File tree

14 files changed

+296
-111
lines changed

14 files changed

+296
-111
lines changed

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/ArrayMerger.java

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.dubbo.rpc.cluster.merger;
1818

19+
import org.apache.dubbo.common.utils.ArrayUtils;
1920
import org.apache.dubbo.rpc.cluster.Merger;
2021

2122
import java.lang.reflect.Array;
@@ -25,34 +26,48 @@ public class ArrayMerger implements Merger<Object[]> {
2526
public static final ArrayMerger INSTANCE = new ArrayMerger();
2627

2728
@Override
28-
public Object[] merge(Object[]... others) {
29-
if (others.length == 0) {
30-
return null;
29+
public Object[] merge(Object[]... items) {
30+
if (ArrayUtils.isEmpty(items)) {
31+
return new Object[0];
3132
}
33+
34+
int i = 0;
35+
while (i < items.length && items[i] == null) {
36+
i++;
37+
}
38+
39+
if (i == items.length) {
40+
return new Object[0];
41+
}
42+
43+
Class<?> type = items[i].getClass().getComponentType();
44+
3245
int totalLen = 0;
33-
for (int i = 0; i < others.length; i++) {
34-
Object item = others[i];
35-
if (item != null && item.getClass().isArray()) {
36-
totalLen += Array.getLength(item);
37-
} else {
38-
throw new IllegalArgumentException((i + 1) + "th argument is not an array");
46+
for (; i < items.length; i++) {
47+
if (items[i] == null) {
48+
continue;
49+
}
50+
Class<?> itemType = items[i].getClass().getComponentType();
51+
if (itemType != type) {
52+
throw new IllegalArgumentException("Arguments' types are different");
3953
}
54+
totalLen += items[i].length;
4055
}
4156

4257
if (totalLen == 0) {
43-
return null;
58+
return new Object[0];
4459
}
4560

46-
Class<?> type = others[0].getClass().getComponentType();
47-
4861
Object result = Array.newInstance(type, totalLen);
62+
4963
int index = 0;
50-
for (Object array : others) {
51-
for (int i = 0; i < Array.getLength(array); i++) {
52-
Array.set(result, index++, Array.get(array, i));
64+
for (Object[] array : items) {
65+
if (array != null) {
66+
for (int j = 0; j < array.length; j++) {
67+
Array.set(result, index++, array[j]);
68+
}
5369
}
5470
}
5571
return (Object[]) result;
5672
}
57-
5873
}

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/BooleanArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class BooleanArrayMerger implements Merger<boolean[]> {
2324

2425
@Override
2526
public boolean[] merge(boolean[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new boolean[0];
29+
}
2630
int totalLen = 0;
2731
for (boolean[] array : items) {
28-
totalLen += array.length;
32+
if (array != null) {
33+
totalLen += array.length;
34+
}
2935
}
3036
boolean[] result = new boolean[totalLen];
3137
int index = 0;
3238
for (boolean[] array : items) {
33-
for (boolean item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (boolean item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/ByteArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class ByteArrayMerger implements Merger<byte[]> {
2324

2425
@Override
2526
public byte[] merge(byte[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new byte[0];
29+
}
2630
int total = 0;
2731
for (byte[] array : items) {
28-
total += array.length;
32+
if (array != null) {
33+
total += array.length;
34+
}
2935
}
3036
byte[] result = new byte[total];
3137
int index = 0;
3238
for (byte[] array : items) {
33-
for (byte item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (byte item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/CharArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class CharArrayMerger implements Merger<char[]> {
2324

2425
@Override
2526
public char[] merge(char[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new char[0];
29+
}
2630
int total = 0;
2731
for (char[] array : items) {
28-
total += array.length;
32+
if (array != null) {
33+
total += array.length;
34+
}
2935
}
3036
char[] result = new char[total];
3137
int index = 0;
3238
for (char[] array : items) {
33-
for (char item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (char item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/DoubleArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class DoubleArrayMerger implements Merger<double[]> {
2324

2425
@Override
2526
public double[] merge(double[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new double[0];
29+
}
2630
int total = 0;
2731
for (double[] array : items) {
28-
total += array.length;
32+
if (array != null) {
33+
total += array.length;
34+
}
2935
}
3036
double[] result = new double[total];
3137
int index = 0;
3238
for (double[] array : items) {
33-
for (double item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (double item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/FloatArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class FloatArrayMerger implements Merger<float[]> {
2324

2425
@Override
2526
public float[] merge(float[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new float[0];
29+
}
2630
int total = 0;
2731
for (float[] array : items) {
28-
total += array.length;
32+
if (array != null) {
33+
total += array.length;
34+
}
2935
}
3036
float[] result = new float[total];
3137
int index = 0;
3238
for (float[] array : items) {
33-
for (float item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (float item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/IntArrayMerger.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class IntArrayMerger implements Merger<int[]> {
2324

2425
@Override
2526
public int[] merge(int[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new int[0];
29+
}
2630
int totalLen = 0;
27-
for (int[] item : items) {
28-
totalLen += item.length;
31+
for (int[] array : items) {
32+
if (array != null) {
33+
totalLen += array.length;
34+
}
2935
}
3036
int[] result = new int[totalLen];
3137
int index = 0;
32-
for (int[] item : items) {
33-
for (int i : item) {
34-
result[index++] = i;
38+
for (int[] array : items) {
39+
if (array != null) {
40+
for (int item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/ListMerger.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,20 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
import java.util.ArrayList;
24+
import java.util.Collections;
2325
import java.util.List;
2426

2527
public class ListMerger implements Merger<List<?>> {
2628

2729
@Override
2830
public List<Object> merge(List<?>... items) {
31+
if (ArrayUtils.isEmpty(items)) {
32+
return Collections.emptyList();
33+
}
2934
List<Object> result = new ArrayList<Object>();
3035
for (List<?> item : items) {
3136
if (item != null) {

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/LongArrayMerger.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,29 @@
1717

1818
package org.apache.dubbo.rpc.cluster.merger;
1919

20+
import org.apache.dubbo.common.utils.ArrayUtils;
2021
import org.apache.dubbo.rpc.cluster.Merger;
2122

2223
public class LongArrayMerger implements Merger<long[]> {
2324

2425
@Override
2526
public long[] merge(long[]... items) {
27+
if (ArrayUtils.isEmpty(items)) {
28+
return new long[0];
29+
}
2630
int total = 0;
2731
for (long[] array : items) {
28-
total += array.length;
32+
if (array != null) {
33+
total += array.length;
34+
}
2935
}
3036
long[] result = new long[total];
3137
int index = 0;
3238
for (long[] array : items) {
33-
for (long item : array) {
34-
result[index++] = item;
39+
if (array != null) {
40+
for (long item : array) {
41+
result[index++] = item;
42+
}
3543
}
3644
}
3745
return result;

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/merger/MapMerger.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@
1616
*/
1717
package org.apache.dubbo.rpc.cluster.merger;
1818

19+
import org.apache.dubbo.common.utils.ArrayUtils;
1920
import org.apache.dubbo.rpc.cluster.Merger;
2021

22+
import java.util.Collections;
2123
import java.util.HashMap;
2224
import java.util.Map;
2325

2426
public class MapMerger implements Merger<Map<?, ?>> {
2527

2628
@Override
2729
public Map<?, ?> merge(Map<?, ?>... items) {
28-
if (items.length == 0) {
29-
return null;
30+
if (ArrayUtils.isEmpty(items)) {
31+
return Collections.emptyMap();
3032
}
3133
Map<Object, Object> result = new HashMap<Object, Object>();
3234
for (Map<?, ?> item : items) {

0 commit comments

Comments
 (0)