package com.jfeng.protocol.template.engine;
import com.jfeng.protocol.annotation.SelectDisplayType;
import com.jfeng.protocol.buildin.car.none4.NoneRoad4;
import com.jfeng.protocol.comm.ByteOrderEnum;
import com.jfeng.protocol.comm.Protocolable;
import com.jfeng.protocol.template.*;
import com.jfeng.protocol.template.parse.TemplateParser;
import com.jfeng.protocol.template.result.ByteResult;
import com.jfeng.protocol.template.result.TemplateResult;
import com.jfeng.protocol.util.ByteUtils;
import com.jfeng.protocol.util.ExpressUtils;
import com.jfeng.protocol.util.StringUtils;
import io.netty.buffer.ByteBufUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
/**
* 模板执行引擎(调试)
*/
public class TemplateEngine {
private Logger logger = LoggerFactory.getLogger(TemplateEngine.class);
public TemplateResult autoDecode(String value) throws Exception {
byte[] bytes = ByteBufUtil.decodeHexDump(value);
Class<?> protocolTemplate = null;
for (Protocolable protocolable : ServiceLoader.load(Protocolable.class)) {
if (protocolable.accept(bytes)) {
protocolTemplate = protocolable.getClass();
}
}
return decode(bytes, protocolTemplate);
}
public TemplateResult decode(String value, Class<?> protocolTemplate) throws Exception {
return this.decode(ByteBufUtil.decodeHexDump(value), protocolTemplate);
}
public TemplateResult decode(byte[] value, Class<?> protocolTemplate) throws Exception {
return this.decode(value, TemplateParser.parse(protocolTemplate));
}
public TemplateResult decode(byte[] value, ContainTemplate<TemplateItem> rootTemplate) throws Exception {
TemplateResult parent = new TemplateResult(rootTemplate, value.length);
Context context = new Context(value);
for (TemplateItem child : rootTemplate.children) {
TemplateResult childResult = decode(parent, context, child);
parent.addChild(childResult);
if (context.isStop()) {
break;
}
}
parent.handleLength();
parent.handleDisplay();
return parent;
}
/**
* 计算当前限制长度,有很多变长字段受限于上级长度,当上级也是变长时,则需要递归上级获取最终长度
* 递归的最终限制长度会是value.length
*
* @param parent 上级容器解析结果
* @param offset 当前偏移量
* @param limitLength 当前允许的最大长度
* @return
*/
public int getLimitCapacity(TemplateResult parent, int offset, int limitLength) {
if (limitLength > 0) {
return offset + limitLength;
} else if (parent != null && parent.length > 0) {
return parent.offset + parent.length;
} else {
return getLimitCapacity(parent.parent, offset, limitLength);
}
}
/**
* 解析单个模板对象
*
* @param parentResult 上级解析结果,两种情况用到该字段:1、当字段的数据来自另一个属性 2、需要在上级解析结果中插入额外信息
* @param context 执行上行文,保存当前游标
* @param template 模板
* @return 模板对应的解析结果
* @throws Exception
*/
public TemplateResult decode(TemplateResult parentResult, Context context, TemplateItem template) throws Exception {
int actualLength = calcLength(template, context.value, context.offset, parentResult);
int limit = getLimitCapacity(parentResult, context.offset, actualLength);
//1.before //TODO 提取通用操作
if (actualLength > 0) {
if (template.aopProcess != null) {
template.aopProcess.beforeProcess(context.value, context.offset, actualLength);
}
}
if (template.itemType == TemplateType.DATA) {
DataTemplate dataTemplate = ((DataTemplate) template);
try {
if (dataTemplate.isBit()) {
byte[] bitStore = ByteUtils.buildBitStore(context.currentParent, dataTemplate.byteOrder == ByteOrderEnum.BIG_EDIAN);
String value = dataTemplate.decode(bitStore, context.bitOffset, actualLength);
TemplateResult result = new TemplateResult(parentResult, dataTemplate, value, context.bitOffset, actualLength);
context.increaseBit(actualLength);
return result;
} else {
String value = dataTemplate.decode(context.value, context.offset, actualLength);
TemplateResult result = new TemplateResult(parentResult, dataTemplate, value, context.offset, actualLength);
context.increase(actualLength);
return result;
}
} catch (Exception e) {
logger.warn("解析报错", e);
context.stop();
return TemplateResult.fail(dataTemplate, e.getMessage());
}
} else if (template.itemType == TemplateType.LOOP) {
LoopTemplate loopTemplate = (LoopTemplate) template;
int num = loopTemplate.getNum(parentResult);
TemplateResult result = new TemplateResult(parentResult, loopTemplate,
num == Integer.MAX_VALUE ? "(N/A)" : String.valueOf(num),
context.offset);
for (int i = 0; i < num; i++) {
if (context.isStop(limit)) {
break;
}
if (loopTemplate.loopType == LoopType.CUSTOM
&& loopTemplate.loopPredicate.test(String.valueOf(context.value[context.offset]))) {
break;
}
TemplateResult eachElement = new TemplateResult(result, loopTemplate, "", context.offset);
eachElement.name = loopTemplate.name + " " + (i + 1);
eachElement.display = loopTemplate.autoGenerateElementContain;
for (TemplateItem child : loopTemplate.children) {
if (context.isStop(limit)) {
break;
}
eachElement.addChild(decode(eachElement, context, child));
}
eachElement.handleLength();
result.addChild(eachElement);
}
result.handleLength();
return result;
} else if (template.itemType == TemplateType.SELECT) {
SelectTemplate selectTemplate = ((SelectTemplate) template);
String selectedKey = StringUtils.isNotEmpty(selectTemplate.compareKey)
? parentResult.searchChild(selectTemplate.compareKey)
: "";
ConditionTemplate matchCondition = null;
for (ConditionTemplate child : selectTemplate.children) {
if (context.isStop()) {
break;
}
String conditionKey = StringUtils.isNotEmpty(child.compareKey) ? parentResult.searchChild(child.compareKey) : "";
if (StringUtils.isEmpty(selectedKey) && StringUtils.isEmpty(conditionKey)) {
context.stop = true;
return TemplateResult.fail(selectTemplate, "未找到需要比较的值");
}
if (child.operator.test(StringUtils.isNotEmpty(conditionKey) ? conditionKey : selectedKey)) {
matchCondition = child;
break;
}
}
if (matchCondition == null) {
if (selectTemplate.throwExceptionIfNotFound) {
context.stop();
return TemplateResult.fail(selectTemplate, "未找到符合条件的解析�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于Java实现的32960、808、DLT-645、DLT698.45等多种协议解析器源码.zip (324个子文件)
bootstrap.min.css 160KB
all.min.css 100KB
bootstrap-treeview.min.css 204B
index.html 18KB
dlt645_2007_cmd.html 2KB
none4_cmd.html 2KB
tbox_param.html 1KB
favicon.ico 4KB
TemplateEngine.java 26KB
TemplateParser.java 13KB
IOUtils.java 13KB
StandardTemplateEngine.java 13KB
MapTemplateEngine.java 12KB
ByteUtils.java 12KB
CustomInfo.java 11KB
CustomInfo.java 10KB
Sz_RealData.java 10KB
AdditionalData.java 9KB
CrcCode16AopProcess.java 8KB
TemplateEngineEncodeTest.java 8KB
Jbt.java 7KB
ClassUtils.java 7KB
SzProtocol.java 7KB
TemplateEngineDecodeTest.java 7KB
ExpressUtils.java 7KB
GBT_32960_2016.java 7KB
ParamInfo.java 7KB
TemplateResult.java 6KB
AlarmInfo.java 6KB
ParamQueryResp.java 6KB
ProtocolConformance.java 6KB
IndexController.java 6KB
ConsoleFormat.java 6KB
ShanZhongUdp.java 5KB
DateTimeUtils.java 5KB
Utils.java 5KB
NoneRoad4.java 5KB
FunctionConformance.java 5KB
JsonUtils.java 5KB
DeviceDataVersion2.java 5KB
TemplateEngineShanzhongDecodeTest.java 5KB
TotalCarData.java 5KB
PerformanceUtils.java 4KB
FuelCellInfo.java 4KB
DeviceDataVersion1.java 4KB
DLT645_07.java 4KB
ParamSetting.java 4KB
Terminal0106.java 4KB
NoneRoad4Nation.java 4KB
TBox.java 4KB
ExtremumInfo.java 4KB
DriveMotor.java 4KB
PrintVisitor.java 4KB
VoltageInfo.java 3KB
Terminal02E8.java 3KB
ShanzhongTcp.java 3KB
WorkParamFrame.java 3KB
Terminal0181.java 3KB
CarLock.java 3KB
QueryParamResp.java 3KB
TemplateEngineNationDecodeTest.java 3KB
DataStream.java 3KB
ParamControl.java 3KB
McuFrame.java 3KB
Terminal0390.java 3KB
ResultPrinter.java 3KB
Header.java 3KB
WorkParamNewFrame.java 3KB
StringCodec.java 2KB
GpsInfo.java 2KB
DataTemplate.java 2KB
CarControl.java 2KB
ConnectResp.java 2KB
RespError.java 2KB
MapTemplateEngineTest.java 2KB
RealInfoReport02.java 2KB
ConnectReq.java 2KB
TempInfo.java 2KB
ResultJsonFilter.java 2KB
MessageHeader.java 2KB
Terminal02E7.java 2KB
HighFrequencyCollectResp.java 2KB
StringUtils.java 2KB
DateTimeCodec.java 2KB
DateTimeUtils2.java 2KB
TaskLocation.java 2KB
ConnectMechanismInfo.java 2KB
Ip.java 2KB
LoopTemplate.java 2KB
Terminal0270.java 2KB
DateTimeCodec.java 2KB
LinkResponse.java 2KB
CarLogin01.java 2KB
Data.java 2KB
Tcp.java 2KB
DoubleCodec.java 2KB
RealData.java 2KB
SelectTemplate.java 2KB
UnsignedIntegerCodec.java 2KB
IntegerCodec.java 2KB
共 324 条
- 1
- 2
- 3
- 4
TD程序员
- 粉丝: 2421
- 资源: 437
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页