11package com .alipay .rdf .file .codec ;
22
3- import java .util .List ;
4- import java .util .Map ;
5-
63import com .alipay .rdf .file .condition .RowConditionExecutor ;
7- import com .alipay .rdf .file .exception .RdfErrorEnum ;
8- import com .alipay .rdf .file .exception .RdfFileException ;
4+ import com .alipay .rdf .file .loader .ExtensionLoader ;
95import com .alipay .rdf .file .loader .ProtocolLoader ;
106import com .alipay .rdf .file .loader .TemplateLoader ;
117import com .alipay .rdf .file .meta .FileColumnMeta ;
1612import com .alipay .rdf .file .processor .ProcessExecutor .BizData ;
1713import com .alipay .rdf .file .processor .ProcessorTypeEnum ;
1814import com .alipay .rdf .file .protocol .RowDefinition ;
19- import com .alipay .rdf .file .spi .RdfFileFunctionSpi .CodecType ;
20- import com .alipay .rdf .file .spi .RdfFileFunctionSpi .FuncContext ;
2115import com .alipay .rdf .file .spi .RdfFileProcessorSpi ;
16+ import com .alipay .rdf .file .spi .RdfFileRowCodecSpi ;
17+ import com .alipay .rdf .file .spi .RdfFileRowCodecSpi .RowCodecContext ;
2218import com .alipay .rdf .file .spi .RdfFileRowSplitSpi .SplitContext ;
2319import com .alipay .rdf .file .util .BeanMapWrapper ;
2420import com .alipay .rdf .file .util .RdfFileConstants ;
2521import com .alipay .rdf .file .util .RdfFileUtil ;
2622
23+ import java .util .List ;
24+ import java .util .Map ;
25+
2726/**
2827 * Copyright (C) 2013-2018 Ant Financial Services Group
29- *
28+ *
3029 * 针对字段水平codec
31- *
30+ *
3231 * 抽离的目的在于方便,对单行数据进行编码解码, 特别是在测试或者排查问题的时候
33- *
32+ *
3433 * @author hongwei.quhw
3534 * @version $Id: RowColumnHorizontalCodec.java, v 0.1 2017年8月1日 下午8:49:41 hongwei.quhw Exp $
3635 */
@@ -41,113 +40,54 @@ public static String serialize(BeanMapWrapper bmw, FileConfig fileConfig, RowDef
4140 Map <ProcessorTypeEnum , List <RdfFileProcessorSpi >> processors ,
4241 FileDataTypeEnum rowType ) {
4342 ProcessExecutor .execute (ProcessorTypeEnum .BEFORE_SERIALIZE_ROW , processors , fileConfig ,
44- new BizData (RdfFileConstants .DATA , bmw ),
45- new BizData (RdfFileConstants .ROW_TYPE , rowType ));
46-
47- FileMeta fileMeta = TemplateLoader .load (fileConfig );
48- List <FileColumnMeta > columnMetas = RowConditionExecutor .serializeRow (fileConfig , bmw ,
49- rowType );
50- StringBuffer line = new StringBuffer ();
51- String split = RdfFileUtil .getRowSplit (fileConfig );
52-
53- if (null != split && fileMeta .isStartWithSplit (rowType )) {
54- line .append (split );
55- }
56-
57- for (int i = 0 ; i < columnMetas .size (); i ++) {
58- FileColumnMeta columnMeta = columnMetas .get (i );
59- FuncContext ctx = new FuncContext ();
60- try {
61- ctx .codecType = CodecType .SERIALIZE ;
62- ctx .field = bmw .getProperty (columnMeta .getName ());
63- ctx .columnMeta = columnMeta ;
64- ctx .fileConfig = fileConfig ;
65- line .append (rd .getOutput ().execute (ctx ));
66-
67- if (null != split
68- && (i < columnMetas .size () - 1 || fileMeta .isEndWithSplit (rowType ))) {
69- line .append (split );
70- }
71- } catch (RdfFileException e ) {
72- throw new RdfFileException (
73- "rdf-file#RowColumnHorizontalCodec.serialize serialize row=" + bmw .getBean ()
74- + ", fileConfig=" + fileConfig + ", 将数据序列到文件出错. 错误列信息: columnMeta=" + columnMeta + ", field=" + ctx .field + ", errorMsg="
75- + e .getMessage (),
76- e , e .getErrorEnum ());
77- } catch (Throwable e ) {
78- throw new RdfFileException (
79- "rdf-file#RowColumnHorizontalCodec.serialize row=" + bmw .getBean ()
80- + ", fileConfig=" + fileConfig + ", 将数据序列到文件出错. 错误列信息: columnMeta=" + columnMeta + ", field=" + ctx .field ,
81- e , RdfErrorEnum .SERIALIZE_ERROR );
82- }
83- }
84-
85- String data = line .toString ();
43+ new BizData (RdfFileConstants .DATA , bmw ),
44+ new BizData (RdfFileConstants .ROW_TYPE , rowType ));
45+ // 条件模板处理
46+ List <FileColumnMeta > columnMetas = RowConditionExecutor .serializeRow (fileConfig , bmw , rowType );
47+
48+ RowCodecContext ctx = new RowCodecContext (bmw , fileConfig , columnMetas , rd );
49+ RdfFileRowCodecSpi rowCodec = ExtensionLoader .getExtensionLoader (RdfFileRowCodecSpi .class ).getExtension (RdfFileUtil .getRowCodecMode (fileConfig ));
50+ // 字段编码
51+ String line = rowCodec .serialize (ctx );
52+ // 行编码后置处理
53+ line = rowCodec .postSerialize (line , ctx );
54+ // 行整体格式化处理
55+ line = RowFormatCodec .serialize (fileConfig , line , rowType );
8656
8757 ProcessExecutor .execute (ProcessorTypeEnum .AFTER_SERIALIZE_ROW , processors , fileConfig ,
88- new BizData (RdfFileConstants .DATA , data ),
89- new BizData (RdfFileConstants .ROW_TYPE , rowType ));
58+ new BizData (RdfFileConstants .DATA , line ),
59+ new BizData (RdfFileConstants .ROW_TYPE , rowType ));
9060
91- return data ;
61+ return line ;
9262 }
9363
9464 public static <T > T deserialize (BeanMapWrapper bmw , FileConfig fileConfig , String line ,
9565 RowDefinition rd ,
9666 Map <ProcessorTypeEnum , List <RdfFileProcessorSpi >> processors ,
9767 FileDataTypeEnum rowType ) {
9868 ProcessExecutor .execute (ProcessorTypeEnum .BEFORE_DESERIALIZE_ROW , processors , fileConfig ,
99- new BizData (RdfFileConstants .DATA , line ),
100- new BizData (RdfFileConstants .ROW_TYPE , rowType ));
69+ new BizData (RdfFileConstants .DATA , line ),
70+ new BizData (RdfFileConstants .ROW_TYPE , rowType ));
71+ // 行格式化处理
72+ line = RowFormatCodec .deserialize (fileConfig , line , rowType );
10173
10274 FileMeta fileMeta = TemplateLoader .load (fileConfig );
103-
104- boolean startWithSplit = fileMeta .isStartWithSplit (rowType );
105- boolean endWithSplit = fileMeta .isEndWithSplit (rowType );
106-
107- String [] column = ProtocolLoader .loadProtocol (fileMeta .getProtocol ()).getRowSplit ()
108- .split (new SplitContext (line , fileConfig , rowType ));
109-
110- List <FileColumnMeta > columnMetas = RowConditionExecutor .deserializeRow (fileConfig , column ,
111- rowType , line );
112-
113- int splitLength = startWithSplit ? columnMetas .size () + 1 : columnMetas .size ();
114- splitLength = endWithSplit ? splitLength + 1 : splitLength ;
115-
116- if (column .length != splitLength ) {
117- throw new RdfFileException ("rdf-file#RowColumnHorizontalCodec.deserialize fileConfig="
118- + fileConfig + ", line=[" + line + "],模板定义列数=" + splitLength
119- + ", 实际列数=" + column .length ,
120- RdfErrorEnum .DESERIALIZE_ERROR );
121- }
122-
123- int statIndex = fileMeta .isStartWithSplit (rowType ) ? 1 : 0 ;
124- int endIndex = fileMeta .isEndWithSplit (rowType ) ? column .length - 1 : column .length ;
125-
126- for (int i = statIndex ; i < endIndex ; i ++) {
127- FileColumnMeta columnMeta = columnMetas .get (i - statIndex );
128- FuncContext ctx = new FuncContext ();
129- try {
130- ctx .codecType = CodecType .DESERIALIZE ;
131- ctx .field = column [i ];
132- ctx .columnMeta = columnMeta ;
133- ctx .fileConfig = fileConfig ;
134- bmw .setProperty (columnMeta .getName (), rd .getOutput ().execute (ctx ));
135- } catch (RdfFileException e ) {
136- throw new RdfFileException (
137- "rdf-file#RowColumnHorizontalCodec.deserialize line=" + line + ", fileConfig="
138- + fileConfig + ", 将数据反序列到对象出错. 错误列信息:field=" + ctx .field + ", columnMeta=" + columnMeta + ", errorMsg="
139- + e .getMessage (),
140- e , e .getErrorEnum ());
141- } catch (Throwable e ) {
142- throw new RdfFileException ("rdf-file#RowColumnHorizontalCodec.deserialize line="
143- + line + ", fileConfig=" + fileConfig + ", 将数据反序列到对象出错. 错误列信息:field=" + ctx .field + ", columnMeta=" + columnMeta ,
144- e , RdfErrorEnum .DESERIALIZE_ERROR );
145- }
146- }
75+ RowCodecContext ctx = new RowCodecContext (bmw , fileConfig , null , rd , null );
76+ RdfFileRowCodecSpi rowCodec = ExtensionLoader .getExtensionLoader (RdfFileRowCodecSpi .class ).getExtension (RdfFileUtil .getRowCodecMode (fileConfig ));
77+ // 行前置处理
78+ line =rowCodec .preDeserialize (line , ctx );
79+
80+ String [] columnValues = ProtocolLoader .loadProtocol (fileMeta .getProtocol ()).getRowSplit ().split (new SplitContext (line , fileConfig , rowType ));
81+ // 条件模板处理
82+ List <FileColumnMeta > columnMetas = RowConditionExecutor .deserializeRow (fileConfig , columnValues , rowType , line );
83+ ctx .columnMetas = columnMetas ;
84+ ctx .columnValues = columnValues ;
85+ // 行字段解析
86+ rowCodec .deserialize (line , ctx );
14787
14888 ProcessExecutor .execute (ProcessorTypeEnum .AFTER_DESERIALIZE_ROW , processors , fileConfig ,
149- new BizData (RdfFileConstants .DATA , bmw ),
150- new BizData (RdfFileConstants .ROW_TYPE , rowType ));
89+ new BizData (RdfFileConstants .DATA , bmw ),
90+ new BizData (RdfFileConstants .ROW_TYPE , rowType ));
15191
15292 return (T ) bmw .getBean ();
15393
0 commit comments