Skip to content

Commit 3af230c

Browse files
committed
RecordOutput实现switch条件类型支持
1 parent 9249bab commit 3af230c

9 files changed

+253
-21
lines changed

nop-record/src/main/java/io/nop/record/RecordErrors.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ public interface RecordErrors {
2525

2626
String ARG_MAX_LENGTH = "maxLength";
2727

28+
String ARG_CASE_VALUE = "caseValue";
29+
30+
String ARG_TYPE_NAME = "typeName";
31+
2832
ErrorCode ERR_RECORD_NO_ENOUGH_DATA =
2933
define("nop.err.record.no-enough-data", "缺少数据,无法读取");
3034

@@ -41,4 +45,16 @@ public interface RecordErrors {
4145

4246
ErrorCode ERR_RECORD_DECODE_LENGTH_IS_TOO_LONG = define("nop.err.record.decode-length-is-too-long",
4347
ARG_LENGTH, ARG_MAX_LENGTH);
48+
49+
ErrorCode ERR_RECORD_UNKNOWN_FIELD = define("nop.err.record.unknown-field",
50+
"未定义的字段:{fieldName}", ARG_FIELD_NAME);
51+
52+
ErrorCode ERR_RECORD_NO_SWITCH_ON_FIELD = define("nop.err.record.no-switch-on-field",
53+
"条件类型无法确定类型值:{fieldName}", ARG_FIELD_NAME);
54+
55+
ErrorCode ERR_RECORD_NO_MATCH_FOR_CASE_VALUE = define("nop.err.record.no-match-for-case-value",
56+
"字段[{fieldName}]的条件类型没有找到匹配类型:{caseValue}", ARG_FIELD_NAME, ARG_CASE_VALUE);
57+
58+
ErrorCode ERR_RECORD_CASE_VALUE_MAP_TO_UNKNOWN_TYPE = define("nop.err.record.case-value-map-to-unknown-type",
59+
"字段[{fieldName}]的条件类型映射到未定义的类型:{caseValue}=>{typeName}", ARG_FIELD_NAME, ARG_CASE_VALUE, ARG_TYPE_NAME);
4460
}
Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package io.nop.record.model;
22

3+
import io.nop.api.core.exceptions.NopException;
4+
import io.nop.api.core.util.ISourceLocationGetter;
35
import io.nop.commons.text.SimpleTextTemplate;
46
import io.nop.core.lang.eval.IEvalFunction;
57

68
import java.util.List;
79

8-
public interface IRecordFieldsMeta {
10+
import static io.nop.record.RecordErrors.ARG_FIELD_NAME;
11+
import static io.nop.record.RecordErrors.ERR_RECORD_UNKNOWN_FIELD;
12+
13+
public interface IRecordFieldsMeta extends ISourceLocationGetter {
914

1015
List<RecordFieldMeta> getFields();
1116

@@ -15,5 +20,15 @@ public interface IRecordFieldsMeta {
1520

1621
SimpleTextTemplate getNormalizedTemplate();
1722

18-
RecordFieldMeta requireField(String fieldName);
23+
default RecordFieldMeta requireField(String fieldName) {
24+
25+
RecordFieldMeta field = getField(fieldName);
26+
if (field == null)
27+
throw new NopException(ERR_RECORD_UNKNOWN_FIELD)
28+
.source(this)
29+
.param(ARG_FIELD_NAME, fieldName);
30+
return field;
31+
}
32+
33+
RecordFieldMeta getField(String fieldName);
1934
}

nop-record/src/main/java/io/nop/record/model/RecordFieldMeta.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@
1212
import io.nop.record.codec.IFieldBinaryCodec;
1313
import io.nop.record.codec.IFieldTextCodec;
1414
import io.nop.record.model._gen._RecordFieldMeta;
15-
import io.nop.xlang.expr.simple.SimpleExprParser;
15+
16+
import java.nio.charset.Charset;
17+
import java.nio.charset.StandardCharsets;
1618

1719
public class RecordFieldMeta extends _RecordFieldMeta implements IRecordFieldsMeta {
1820
private IFieldTextCodec resolvedTextCodec;
1921
private IFieldBinaryCodec resolvedBinaryCodec;
2022

2123
private SimpleTextTemplate normalizedTemplate;
2224

25+
private Charset charsetObj;
26+
2327
public RecordFieldMeta() {
2428

2529
}
@@ -31,6 +35,18 @@ public SimpleTextTemplate getNormalizedTemplate() {
3135
return this.normalizedTemplate;
3236
}
3337

38+
public Charset getCharsetObj() {
39+
if (charsetObj == null) {
40+
String charset = getCharset();
41+
if (charset == null) {
42+
charsetObj = StandardCharsets.UTF_8;
43+
} else {
44+
charsetObj = Charset.forName(charset);
45+
}
46+
}
47+
return charsetObj;
48+
}
49+
3450
public String getPropOrFieldName() {
3551
String propName = getProp();
3652
if (propName == null)

nop-record/src/main/java/io/nop/record/model/RecordFieldSwitch.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,16 @@
99

1010
import io.nop.record.model._gen._RecordFieldSwitch;
1111

12-
public class RecordFieldSwitch extends _RecordFieldSwitch{
13-
public RecordFieldSwitch(){
12+
public class RecordFieldSwitch extends _RecordFieldSwitch {
13+
public RecordFieldSwitch() {
1414

1515
}
16+
17+
public String getTypeByCaseValue(String caseValue) {
18+
RecordFieldSwitchCase caseMeta = getCase(caseValue);
19+
if (caseMeta != null) {
20+
return caseMeta.getType();
21+
}
22+
return getDefault();
23+
}
1624
}

nop-record/src/main/java/io/nop/record/model/RecordObjectMeta.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,25 @@
77
*/
88
package io.nop.record.model;
99

10-
import io.nop.commons.util.StringHelper;
10+
import io.nop.commons.text.SimpleTextTemplate;
1111
import io.nop.record.model._gen._RecordObjectMeta;
1212

1313
public class RecordObjectMeta extends _RecordObjectMeta implements IRecordFieldsMeta {
14-
private String normalizedTemplate;
14+
private SimpleTextTemplate normalizedTemplate;
1515

1616
public RecordObjectMeta() {
1717

1818
}
1919

20-
public String getNormalizedTemplate() {
20+
public SimpleTextTemplate getNormalizedTemplate() {
2121
if (normalizedTemplate == null && getTemplate() != null) {
22-
this.normalizedTemplate = StringHelper.normalizeTemplate(getTemplate());
22+
this.normalizedTemplate = SimpleTextTemplate.normalize(getTemplate());
2323
}
2424
return this.normalizedTemplate;
2525
}
26+
27+
@Override
28+
public RecordFieldMeta requireField(String fieldName) {
29+
return null;
30+
}
2631
}

nop-record/src/main/java/io/nop/record/output/IRecordBinaryOutput.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
import io.nop.commons.bytes.ByteString;
1111

1212
import java.io.Closeable;
13+
import java.io.Flushable;
1314
import java.nio.ByteBuffer;
1415

15-
public interface IRecordBinaryOutput extends Closeable {
16+
public interface IRecordBinaryOutput extends Closeable, Flushable {
1617
void writeBytes(byte[] bytes);
1718

1819
void writeBytesPart(byte[] str, int start, int end);

nop-record/src/main/java/io/nop/record/resource/AbstractModelBasedRecordOutput.java

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,25 @@
1818
import io.nop.record.codec.impl.DefaultFieldCodecContext;
1919
import io.nop.record.model.IRecordFieldsMeta;
2020
import io.nop.record.model.RecordFieldMeta;
21+
import io.nop.record.model.RecordFieldSwitch;
2122
import io.nop.record.model.RecordFileMeta;
2223
import io.nop.record.model.RecordObjectMeta;
2324
import io.nop.record.model.RecordPaginationMeta;
25+
import io.nop.record.model.RecordTypeMeta;
2426
import org.slf4j.Logger;
2527
import org.slf4j.LoggerFactory;
2628

2729
import java.io.IOException;
30+
import java.nio.charset.Charset;
2831
import java.util.Collection;
2932
import java.util.Map;
3033

34+
import static io.nop.record.RecordErrors.ARG_CASE_VALUE;
35+
import static io.nop.record.RecordErrors.ARG_FIELD_NAME;
36+
import static io.nop.record.RecordErrors.ARG_TYPE_NAME;
37+
import static io.nop.record.RecordErrors.ERR_RECORD_NO_MATCH_FOR_CASE_VALUE;
38+
import static io.nop.record.RecordErrors.ERR_RECORD_NO_SWITCH_ON_FIELD;
39+
3140
public abstract class AbstractModelBasedRecordOutput<T> implements IRecordOutput<T> {
3241
static final Logger LOG = LoggerFactory.getLogger(AbstractModelBasedRecordOutput.class);
3342

@@ -135,7 +144,7 @@ public void writeObject(RecordObjectMeta recordMeta, Object record, String name)
135144
if (!runIfExpr(recordMeta.getIfExpr(), record, name))
136145
return;
137146

138-
writeTemplateOrFields(recordMeta, record);
147+
writeTemplateOrFields(recordMeta, null, record);
139148

140149
if (recordMeta.getAfterWrite() != null)
141150
recordMeta.getAfterWrite().call1(null, record, context.getEvalScope());
@@ -158,10 +167,10 @@ protected void writeField(RecordFieldMeta field, Object record) throws IOExcepti
158167
if (record instanceof Collection) {
159168
Collection<?> c = (Collection<?>) record;
160169
for (Object o : c) {
161-
writeVirtualField(field, o);
170+
writeSwitch(field, o);
162171
}
163172
} else {
164-
writeVirtualField(field, record);
173+
writeSwitch(field, record);
165174
}
166175
}
167176

@@ -177,6 +186,46 @@ boolean runIfExpr(IEvalFunction expr, Object record, String name) {
177186
return true;
178187
}
179188

189+
protected void writeSwitch(RecordFieldMeta field, Object record) throws IOException {
190+
if (field.getSwitch() != null) {
191+
RecordFieldSwitch switchMeta = field.getSwitch();
192+
String onField = switchMeta.getOnField();
193+
String onValue = null;
194+
if (onField != null) {
195+
onValue = ConvertHelper.toString(getPropByName(record, onField));
196+
} else if (switchMeta.getOn() != null) {
197+
onValue = ConvertHelper.toString(switchMeta.getOn().call1(null, record, context.getEvalScope()));
198+
}
199+
200+
if (onValue == null)
201+
throw new NopException(ERR_RECORD_NO_SWITCH_ON_FIELD)
202+
.source(field)
203+
.param(ARG_FIELD_NAME, field.getName());
204+
205+
String caseType = switchMeta.getTypeByCaseValue(onValue);
206+
if (caseType == null)
207+
throw new NopException(ERR_RECORD_NO_MATCH_FOR_CASE_VALUE)
208+
.source(field)
209+
.param(ARG_FIELD_NAME, field.getName())
210+
.param(ARG_CASE_VALUE, onValue);
211+
212+
RecordTypeMeta typeMeta = fileMeta.getType(caseType);
213+
if (typeMeta == null)
214+
throw new NopException(ERR_RECORD_NO_MATCH_FOR_CASE_VALUE)
215+
.source(field)
216+
.param(ARG_FIELD_NAME, field.getName())
217+
.param(ARG_CASE_VALUE, onValue)
218+
.param(ARG_TYPE_NAME, caseType);
219+
220+
Object value = getProp(field, record);
221+
writeTemplateOrFields(typeMeta, field.getCharsetObj(), value);
222+
223+
return;
224+
}
225+
226+
writeVirtualField(field, record);
227+
}
228+
180229
protected void writeVirtualField(RecordFieldMeta field, Object record) throws IOException {
181230
if (field.isVirtual()) {
182231
if (field.getFields() != null) {
@@ -186,15 +235,15 @@ protected void writeVirtualField(RecordFieldMeta field, Object record) throws IO
186235
}
187236
} else if (field.getFields() != null) {
188237
Object value = getProp(field, record);
189-
writeTemplateOrFields(field, value);
238+
writeTemplateOrFields(field, field.getCharsetObj(), value);
190239
} else {
191240
writeField0(field, record);
192241
}
193242
if (field.getAfterWrite() != null)
194243
field.getAfterWrite().call1(null, record, context.getEvalScope());
195244
}
196245

197-
protected void writeTemplateOrFields(IRecordFieldsMeta fields, Object record) throws IOException {
246+
protected void writeTemplateOrFields(IRecordFieldsMeta fields, Charset charset, Object record) throws IOException {
198247
SimpleTextTemplate template = fields.getNormalizedTemplate();
199248
if (template != null) {
200249
for (Object part : template.getParts()) {
@@ -203,7 +252,7 @@ protected void writeTemplateOrFields(IRecordFieldsMeta fields, Object record) th
203252
RecordFieldMeta field = fields.requireField(name);
204253
writeField(field, record);
205254
} else {
206-
writeString(part.toString());
255+
writeString(part.toString(), charset);
207256
}
208257
}
209258
} else {
@@ -215,7 +264,7 @@ protected void writeTemplateOrFields(IRecordFieldsMeta fields, Object record) th
215264

216265
abstract protected void writeOffset(int offset) throws IOException;
217266

218-
abstract protected void writeString(String str) throws IOException;
267+
abstract protected void writeString(String str, Charset charset) throws IOException;
219268

220269
abstract protected void writeField0(RecordFieldMeta field, Object record) throws IOException;
221270

@@ -227,6 +276,10 @@ protected Object getProp(RecordFieldMeta field, Object record) {
227276
return null;
228277

229278
String propName = field.getPropOrFieldName();
279+
return getPropByName(record, propName);
280+
}
281+
282+
protected Object getPropByName(Object record, String propName) {
230283
if (record instanceof IVariableScope)
231284
return ((IVariableScope) record).getValueByPropPath(propName);
232285

0 commit comments

Comments
 (0)