package com.hj212.format.segment.core;
import static com.hj212.format.segment.core.SegmentToken.*;
import static com.hj212.format.segment.core.feature.SegmentParserFeature.*;
import java.io.Closeable;
import java.io.IOException;
import java.io.PushbackReader;
import java.io.Reader;
import java.nio.CharBuffer;
import java.util.Optional;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicReference;
import com.hj212.format.segment.base.cfger.Configurator;
import com.hj212.format.segment.base.cfger.Configured;
import com.hj212.stream.reader.core.ReaderStream;
/**
* Created by xiaoyao9184 on 2018/1/3.
*/
@SuppressWarnings("incomplete-switch")
public class SegmentParser
implements Closeable, Configured<SegmentParser> {
// private ParseContext context;
protected PushbackReader reader;
private int parserFeature;
private SegmentToken currentToken;
private Stack<String> path;
public SegmentParser(Reader reader){
this.reader = new PushbackReader(reader,3);
this.path = new Stack<>();
}
//TODO config
// public SegmentParser(PackParser packParser) throws IOException, SegmentFormatException {
// super(null);
// char[] sc = packParser.readSegmentOnly();
// CharArrayReader reader = new CharArrayReader(sc);
// super.reader = reader;
// }
/**
* 读取KEY
* @return KEY
* @throws IOException
*/
public String readKey() throws IOException {
return readPathKey(false);
}
/**
* 读取一部分KEY
* @return 部分KEY
* @throws IOException
*/
public String readPathKey() throws IOException {
return readPathKey(true);
}
/**
* 读取KEY
* @param supportSubKey true:遇到‘-’结束
* @return KEY
* @throws IOException
*/
private String readPathKey(boolean supportSubKey) throws IOException {
//当前Token
switch (currentToken){
case END_KEY:
throw new IOException("Cant read key after END_KEY token!");
case END_OBJECT_VALUE:
//“&&”字符串后面跟着“,”“;”认为是相同的,需要读出来,
// 避免被认为是当前是孤立KEY
ReaderStream.of(reader)
.next()
.when(END_SUB_ENTRY::isSame)
.then(() -> currentToken = END_SUB_ENTRY)
.when(END_ENTRY::isSame)
.then(() -> currentToken = END_ENTRY)
.done()
.match();
break;
}
CharBuffer buffer = CharBuffer.allocate(10);
//之后的Token
int len = ReaderStream.of(reader)
.next()
.when(NOT_AVAILABLE::isSame)
.then(() -> currentToken = NOT_AVAILABLE)
//perfect
.when(c -> supportSubKey && END_PART_KEY.isSame(c))
.then(() -> currentToken = END_PART_KEY)
.when(END_KEY::isSame)
.then()
.next(2)
.when(START_OBJECT_VALUE::isSame)
.then(() -> currentToken = START_OBJECT_VALUE)
.done()
.back()
.then(() -> currentToken = END_KEY)
.when(END_SUB_ENTRY::isSame)
.then(() -> {
//Missing '=' core value
if(!ALLOW_ISOLATED_KEY.enabledIn(parserFeature)){
throw new IOException("Missing '=' between key and (null)value");
}
//NULL Value
currentToken = SegmentToken.END_SUB_ENTRY;
})
.when(END_ENTRY::isSame)
.then(() -> {
//Missing '=' core value
if(!ALLOW_ISOLATED_KEY.enabledIn(parserFeature)){
throw new IOException("Missing '=' between key and (null)value");
}
//NULL Value
currentToken = SegmentToken.END_ENTRY;
})
//key&&
//也许是缺少= START_OBJECT_VALUE
//也许是NullValue END_OBJECT_VALUE
.when(START_OBJECT_VALUE::isStart)
.then()
.next()
.when(START_OBJECT_VALUE::isStart)
.then(() -> {
if(path.empty()){
//Missing '='
if(!ALLOW_KEY_NOT_CLOSED.enabledIn(parserFeature)){
throw new IOException("Missing '=' between key and (object)value");
}
//Object Value
currentToken = SegmentToken.START_OBJECT_VALUE;
}else{
//NULL Value
currentToken = SegmentToken.END_OBJECT_VALUE;
}
})
.done()
.back()
.then(() -> {
if(!IGNORE_INVAILD_SYMBOL.enabledIn(parserFeature)){
throw new IOException("Invaild symbol '&' in key");
}
//Ignore Invaild symbol
})
.done()
.read(buffer);
if(currentToken == END_OBJECT_VALUE){
path.pop();
}
if(len == 0){
return null;
}
buffer.rewind();
String result = buffer.toString().substring(0,len);
if(currentToken == START_OBJECT_VALUE){
path.push(result);
}
return result;
// mode = SegmentMode.KEY;
// StringWriter sw = new StringWriter();
// int i;
// while((i = reader.next()) != -1) {
// char c = (char)i;
//
// if(supportSubKey &&
// END_PART_KEY.isSame(c)){
// //End of Main Key
// currentToken = END_PART_KEY;
// break;
// }else if(SegmentToken.END_KEY.isSame(c)){
// //End of Key
// reader.mark(-0);
// char[] c2 = new char[2];
// reader.next(c2);
// if(SegmentToken.START_OBJECT_VALUE.isSame(c2)){
// currentToken = SegmentToken.START_OBJECT_VALUE;
// break;
// }
// reader.reset();
// currentToken = SegmentToken.END_KEY;
// break;
// }else if(SegmentToken.END_SUB_ENTRY.isStart(c)){
// //Missing '=' core value
// if(!ALLOW_ISOLATED_KEY.enabledIn(parserFeature)){
//
// }
// //NULL Value
// currentToken = SegmentToken.END_SUB_ENTRY;
// break;
// }else if(SegmentToken.END_ENTRY.isStart(c)){
// //Missing '=' core value
// if(!ALLOW_ISOLATED_KEY.enabledIn(parserFeature)){
//
// }
// //NULL Value
// currentToken = SegmentToken.END_ENTRY;
// break;
// }else if(SegmentToken.END_OBJECT_VALUE.isStart(c)){
// int finalI = i;
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
hj212.zip (98个子文件)
hj212
stream
reader
base
MapEntryStepGenerator.java 3KB
lambda
RunnableWithThrowable.java 651B
SupplierWithThrowable.java 640B
core
SingleCharMatch.java 5KB
NoneReadMatch.java 373B
ReaderMatch.java 2KB
MultipleCharMatch.java 5KB
ReaderStream.java 5KB
format
segment
base
cfger
Configured.java 259B
Feature.java 542B
Configurator.java 245B
MultipleConfiguratorAdapter.java 3KB
core
SegmentToken.java 820B
SegmentGenerator.java 6KB
feature
SegmentGeneratorFeature.java 845B
SegmentParserFeature.java 999B
SegmentParser.java 16KB
ser
MapSegmentSerializer.java 2KB
MapValueSegmentSerializer.java 1KB
StringMapSegmentSerializer.java 969B
SegmentSerializer.java 411B
deser
StringSegmentDeserializer.java 1KB
SegmentDeserializer.java 394B
MapSegmentDeserializer.java 2KB
StringMapSegmentDeserializer.java 2KB
MapValueSegmentDeserializer.java 1KB
exception
SegmentFormatException.java 2KB
hbt212
model
Pack.java 1KB
Pollution.java 8KB
CpData.java 11KB
DataFlag.java 1KB
Device.java 1KB
Data.java 4KB
mixin
CpDataSerializationMixin.java 3KB
CpDataDeserializationMixin.java 3KB
DataSerializationMixin.java 938B
DataMixin.java 610B
DataDeserializationMixin.java 1KB
LiveSide.java 1KB
verify
CpDataElement.java 3KB
T212MapV2005.java 2KB
PacketElement.java 443B
MNElement.java 367B
T212MapV2017.java 2KB
T212Map.java 4KB
groups
ModeGroup.java 312B
VersionGroup.java 333B
T212MapLevelGroup.java 371B
TypeGroup.java 701B
T212DataLevelMap.java 2KB
T212MapEntry.java 3KB
T212CpDataLevelMap.java 9KB
DataElement.java 1KB
base
Converter.java 179B
parser
ReaderParser.java 549B
Parser.java 367B
PushBackReaderParser.java 589B
core
converter
DataReverseConverter.java 6KB
DataConverter.java 7KB
T212Parser.java 5KB
T212Generator.java 4KB
feature
GeneratorFeature.java 724B
ParserFeature.java 793B
VerifyFeature.java 1KB
T212Mapper.java 14KB
validator
FieldPattern.java 1KB
T212MapFieldMissingValidator.java 2KB
FieldMissing.java 1KB
clazz
T212MapCValidator.java 975B
FieldC.java 1KB
T212MapNValidator.java 973B
FieldValidDate.java 1KB
FieldValidator.java 5KB
T212MapFieldValidator.java 1KB
FieldN.java 1KB
T212MapValidDateValidator.java 1KB
T212MapValueRangeValidator.java 2KB
field
CValidator.java 692B
ValidDate.java 1KB
ValidDateValidator.java 1KB
N.java 2KB
NValidator.java 3KB
C.java 1KB
ValueRange.java 1KB
T212Factory.java 7KB
ser
DataSerializer.java 4KB
T212Serializer.java 414B
T212CpMapPathValueSegmentSerializer.java 2KB
CpDataLevelMapDataSerializer.java 3KB
PackLevelSerializer.java 2KB
deser
PackLevelDeserializer.java 2KB
CpDataLevelMapDeserializer.java 11KB
T212Deserializer.java 400B
DataLevelMapDeserializer.java 10KB
DataDeserializer.java 6KB
VerifyUtil.java 3KB
cfger
T212Configurator.java 13KB
exception
T212FormatException.java 3KB
共 98 条
- 1
houzhanwublog
- 粉丝: 240
- 资源: 157
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页