Skip to content

Commit 9fd5b4f

Browse files
authored
refactor: 优化命令;迁移常用utils (jetlinks#101)
1 parent 84ae30b commit 9fd5b4f

File tree

5 files changed

+40
-156
lines changed

5 files changed

+40
-156
lines changed

jetlinks-sdk-api/src/main/java/org/jetlinks/sdk/server/commons/cmd/DeleteByIdCommand.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public class DeleteByIdCommand<T> extends OperationByIdCommand<T, DeleteByIdComm
2727
public DeleteByIdCommand() {
2828
}
2929

30+
public DeleteByIdCommand(Class<T> type) {
31+
withConverter(CommandUtils.createConverter(ResolvableType.forClass(type)));
32+
}
33+
3034
/**
3135
* 使用指定的类型创建命令,执行命令后会将执行结果转换为指定类型
3236
*

jetlinks-sdk-api/src/main/java/org/jetlinks/sdk/server/commons/cmd/QueryListCommand.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,9 @@
77
import org.jetlinks.core.metadata.FunctionMetadata;
88
import org.jetlinks.core.metadata.PropertyMetadata;
99
import org.jetlinks.core.metadata.SimpleFunctionMetadata;
10-
import org.jetlinks.core.metadata.SimplePropertyMetadata;
11-
import org.jetlinks.core.metadata.types.ArrayType;
12-
import org.jetlinks.core.metadata.types.ObjectType;
13-
import org.jetlinks.core.metadata.types.StringType;
1410
import org.springframework.core.ResolvableType;
1511
import reactor.core.publisher.Flux;
1612

17-
import java.util.Arrays;
1813
import java.util.List;
1914
import java.util.function.Consumer;
2015
import java.util.function.Function;
@@ -41,6 +36,14 @@ public QueryListCommand() {
4136

4237
}
4338

39+
public QueryListCommand(Class<T> type) {
40+
withConverter(CommandUtils.createConverter(ResolvableType.forClass(type)));
41+
}
42+
43+
public QueryListCommand(Function<Object, T> converter) {
44+
withConverter(converter);
45+
}
46+
4447

4548
public static <T> FunctionMetadata metadata(Class<T> elementType) {
4649
return CommandMetadataResolver.resolve(QueryListCommand.class, elementType);

jetlinks-sdk-api/src/main/java/org/jetlinks/sdk/server/commons/cmd/SaveCommand.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ public class SaveCommand<T> extends BatchDataCommand<T, SaveCommand<T>> {
2222
public SaveCommand() {
2323
}
2424

25+
public SaveCommand(Class<T> type) {
26+
withConverter(CommandUtils.createConverter(ResolvableType.forClass(type)));
27+
}
28+
29+
public SaveCommand(Function<Object, T> converter) {
30+
withConverter(converter);
31+
}
32+
2533
public static <T> SaveCommand<T> of(Class<T> type) {
2634
return of(CommandUtils.createConverter(ResolvableType.forClass(type)));
2735
}

jetlinks-sdk-api/src/main/java/org/jetlinks/sdk/server/template/SaveByTemplateCommand.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.jetlinks.sdk.server.template;
22

3+
import io.swagger.v3.oas.annotations.media.Schema;
34
import lombok.Getter;
45
import lombok.Setter;
56
import lombok.extern.slf4j.Slf4j;
@@ -29,6 +30,7 @@
2930
* @since 1.0.1
3031
*/
3132
@Slf4j
33+
@Schema(title = "根据模板保存数据")
3234
public class SaveByTemplateCommand extends AbstractConvertCommand<Flux<SaveByTemplateResult>, SaveByTemplateCommand> {
3335

3436

@@ -41,14 +43,21 @@ public final SaveByTemplateCommand withTemplate(List<EntityTemplateInfo> entityI
4143
return castSelf();
4244
}
4345

44-
public final List<EntityTemplateInfo> templateList() {
46+
@Schema(title = "模板数据")
47+
public final List<EntityTemplateInfo> getData() {
4548
return ConverterUtils.convertToList(readable().get(PARAMETER_KEY), EntityTemplateInfo::of);
4649
}
4750

51+
@Deprecated
52+
public final List<EntityTemplateInfo> templateList() {
53+
return getData();
54+
}
55+
4856
public final <E> List<E> templateList(Function<EntityTemplateInfo, E> converter) {
4957
return ConverterUtils.convertToList(readable().get(PARAMETER_KEY), f -> converter.apply(EntityTemplateInfo.of(f)));
5058
}
5159

60+
@Schema(title = "是否抛出错误")
5261
public boolean isThrowError() {
5362
return CastUtils.castBoolean(readable().getOrDefault("throwError", true));
5463
}
@@ -100,7 +109,7 @@ public <T> Flux<SaveByTemplateResult> execute(Function<EntityTemplateInfo, Mono<
100109
Function<Flux<DataContext<T>>, Mono<Void>> handler,
101110
int converterParallel) {
102111
return Flux
103-
.fromIterable(templateList())
112+
.fromIterable(getData())
104113
.flatMap(info -> converter
105114
.apply(info)
106115
.map(data -> DataContext.simple(info, data))

jetlinks-sdk-api/src/main/java/org/jetlinks/sdk/server/utils/ConverterUtils.java

Lines changed: 9 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,15 @@
22

33
import com.fasterxml.jackson.databind.ObjectReader;
44
import io.netty.buffer.ByteBuf;
5-
import io.netty.buffer.ByteBufAllocator;
6-
import io.netty.buffer.ByteBufUtil;
7-
import io.netty.buffer.Unpooled;
85
import lombok.SneakyThrows;
9-
import org.apache.commons.collections4.MapUtils;
106
import org.hswebframework.ezorm.core.param.Term;
117
import org.hswebframework.web.api.crud.entity.TermExpressionParser;
128
import org.hswebframework.web.bean.FastBeanCopier;
139
import org.springframework.core.io.buffer.DataBuffer;
14-
import org.springframework.core.io.buffer.NettyDataBuffer;
15-
import org.springframework.core.io.buffer.NettyDataBufferFactory;
1610
import org.springframework.http.HttpHeaders;
17-
import org.springframework.util.MultiValueMap;
1811

19-
import java.lang.reflect.Array;
20-
import java.nio.ByteBuffer;
21-
import java.util.*;
12+
import java.util.List;
13+
import java.util.Map;
2214
import java.util.function.Function;
2315
import java.util.stream.Collectors;
2416

@@ -32,11 +24,7 @@ public class ConverterUtils {
3224
* @return 转换结果
3325
*/
3426
public static Object tryConvertToList(Object value, Function<Object, Object> converter) {
35-
List<Object> list = convertToList(value, converter);
36-
if (list.size() == 1) {
37-
return converter.apply(list.get(0));
38-
}
39-
return list;
27+
return org.jetlinks.core.utils.ConverterUtils.tryConvertToList(value, converter);
4028
}
4129

4230
/**
@@ -48,40 +36,7 @@ public static Object tryConvertToList(Object value, Function<Object, Object> con
4836
* @return 转换后的List
4937
*/
5038
public static <T> List<T> convertToList(Object value, Function<Object, T> converter) {
51-
if (value == null) {
52-
return Collections.emptyList();
53-
}
54-
55-
if (value instanceof String) {
56-
String[] arr = ((String) value).split(",");
57-
if (arr.length == 1) {
58-
return Collections.singletonList(converter.apply(arr[0]));
59-
}
60-
List<T> list = new ArrayList<>(arr.length);
61-
for (String s : arr) {
62-
list.add(converter.apply(s));
63-
}
64-
return list;
65-
}
66-
67-
if (value instanceof Collection) {
68-
List<T> list = new ArrayList<>(((Collection<?>) value).size());
69-
for (Object o : ((Collection<?>) value)) {
70-
list.add(converter.apply(o));
71-
}
72-
return list;
73-
}
74-
75-
if (value.getClass().isArray()) {
76-
int len = Array.getLength(value);
77-
List<T> list = new ArrayList<>(len);
78-
for (int i = 0; i < len; i++) {
79-
list.add(converter.apply(Array.get(value, i)));
80-
}
81-
return list;
82-
}
83-
84-
return Collections.singletonList(converter.apply(value));
39+
return org.jetlinks.core.utils.ConverterUtils.convertToList(value, converter);
8540
}
8641

8742
/**
@@ -106,28 +61,7 @@ public static List<Object> convertToList(Object value) {
10661
*/
10762
@SneakyThrows
10863
public static String[] convertMapToTags(Map<String, Object> map) {
109-
if (MapUtils.isEmpty(map)) {
110-
return new String[0];
111-
}
112-
String[] tags = new String[map.size() * 2];
113-
int index = 0;
114-
for (Map.Entry<String, Object> entry : map.entrySet()) {
115-
String key = entry.getKey();
116-
Object value = entry.getValue();
117-
if (value == null) {
118-
continue;
119-
}
120-
String strValue = value instanceof String
121-
? String.valueOf(value)
122-
: ObjectMappers.JSON_MAPPER.writeValueAsString(value);
123-
124-
tags[index++] = key;
125-
tags[index++] = strValue;
126-
}
127-
if (tags.length > index) {
128-
return Arrays.copyOf(tags, index);
129-
}
130-
return tags;
64+
return org.jetlinks.core.utils.ConverterUtils.convertMapToTags(map);
13165
}
13266

13367
static final ObjectReader termReader = ObjectMappers.JSON_MAPPER.readerForListOf(Term.class);
@@ -171,98 +105,24 @@ public static List<Term> convertTerms(Object value) {
171105
}
172106
}
173107

174-
private static final NettyDataBufferFactory factory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
175-
176108
public static DataBuffer convertDataBuffer(Object obj) {
177-
if (obj == null) {
178-
return null;
179-
}
180-
if (obj instanceof DataBuffer) {
181-
return ((DataBuffer) obj);
182-
}
183-
return factory.wrap(convertNettyBuffer(obj));
109+
return org.jetlinks.core.utils.ConverterUtils.convertDataBuffer(obj);
184110
}
185111

186112
public static <T> ByteBuf convertNettyBuffer(T obj,
187113
Function<T, ByteBuf> fallback) {
188-
if (obj == null) {
189-
return null;
190-
}
191-
if (obj instanceof ByteBuf) {
192-
return ((ByteBuf) obj);
193-
}
194-
195-
if (obj instanceof byte[]) {
196-
return Unpooled.wrappedBuffer(((byte[]) obj));
197-
}
198-
199-
if (obj instanceof NettyDataBuffer) {
200-
return ((NettyDataBuffer) obj).getNativeBuffer();
201-
}
202-
203-
if (obj instanceof DataBuffer) {
204-
return Unpooled.wrappedBuffer(((DataBuffer) obj).asByteBuffer());
205-
}
206-
207-
if (obj instanceof ByteBuffer) {
208-
return Unpooled.wrappedBuffer(((ByteBuffer) obj));
209-
}
210-
211-
if (obj instanceof String) {
212-
String str = String.valueOf(obj);
213-
// hex
214-
if (str.startsWith("0x")) {
215-
return Unpooled.wrappedBuffer(ByteBufUtil.decodeHexDump(str, 2, str.length() - 2));
216-
}
217-
//data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
218-
if (str.startsWith("data:")) {
219-
return Unpooled.wrappedBuffer(
220-
Base64
221-
.getDecoder()
222-
.decode(str.substring(str.indexOf(",") + 1)));
223-
}
224-
// base64
225-
byte[] strBytes = str.getBytes();
226-
if (org.apache.commons.codec.binary.Base64.isBase64(strBytes)) {
227-
try {
228-
return Unpooled.wrappedBuffer(
229-
Base64
230-
.getDecoder()
231-
.decode(strBytes));
232-
} catch (Throwable ignore) {
233-
}
234-
}
235-
return Unpooled.wrappedBuffer(strBytes);
236-
}
237-
238-
return fallback.apply(obj);
114+
return org.jetlinks.core.utils.ConverterUtils.convertNettyBuffer(obj, fallback);
239115
}
240116

241117
public static ByteBuf convertNettyBuffer(Object obj) {
242-
return convertNettyBuffer(obj, val -> Unpooled.wrappedBuffer(String.valueOf(val).getBytes()));
118+
return org.jetlinks.core.utils.ConverterUtils.convertNettyBuffer(obj);
243119
}
244120

245121

246122
@SuppressWarnings("all")
247123
public static HttpHeaders convertHttpHeaders(Object headers) {
248-
if (headers instanceof HttpHeaders) {
249-
return (HttpHeaders) headers;
250-
}
251-
if (headers instanceof MultiValueMap) {
252-
return new HttpHeaders((MultiValueMap) headers);
253-
}
254-
if (headers instanceof Map<?, ?>) {
255-
Map<?, ?> httpHeaders = (Map<?, ?>) headers;
256-
HttpHeaders newHeader = new HttpHeaders();
257-
for (Map.Entry<?, ?> entry : httpHeaders.entrySet()) {
258-
newHeader.put(String.valueOf(entry.getKey()),
259-
convertToList(entry.getValue(), String::valueOf));
260-
}
261-
return newHeader;
262-
}
263-
return org.jetlinks.core.utils.ConverterUtils.convert(headers,HttpHeaders.class);
124+
return org.jetlinks.core.utils.ConverterUtils.convertHttpHeaders(headers);
264125
}
265126

266127

267-
268128
}

0 commit comments

Comments
 (0)