package org.smartboot.flow.spring.extension;
import org.smartboot.flow.core.attribute.AttributeHolder;
import org.smartboot.flow.core.attribute.Attributes;
import org.smartboot.flow.core.parser.DefinitionVisitor;
import org.smartboot.flow.core.parser.ParserContext;
import org.smartboot.flow.core.parser.definition.AdapterDefinition;
import org.smartboot.flow.core.parser.definition.ChooseDefinition;
import org.smartboot.flow.core.parser.definition.ElementDefinition;
import org.smartboot.flow.core.parser.definition.EngineDefinition;
import org.smartboot.flow.core.parser.definition.IfElementDefinition;
import org.smartboot.flow.core.parser.definition.PipelineComponentDefinition;
import org.smartboot.flow.core.parser.definition.PipelineDefinition;
import org.smartboot.flow.core.parser.definition.ScriptDefinition;
import org.smartboot.flow.core.script.ScriptCondition;
import org.smartboot.flow.core.util.AssertUtil;
import org.smartboot.flow.core.util.AuxiliaryUtils;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap;
import org.springframework.beans.factory.support.RootBeanDefinition;
import java.util.List;
/**
* @author qinluo
* @date 2022/11/17 0:01
* @since 1.0.0
*/
public class BeanDefinitionVisitor implements DefinitionVisitor {
private final ParserContext context;
/**
* Temporary def register.
*/
private final BeanDefinitionRegister register;
public BeanDefinitionVisitor(BeanDefinitionRegistry registry, ParserContext context) {
this.context = context;
this.register = new BeanDefinitionRegister(registry);
}
@Override
public void visit(ElementDefinition ed) {
if (ed instanceof ScriptDefinition) {
ScriptDefinition sed = (ScriptDefinition)ed;
Class<?> javaType = sed.getJavaType();
// Maybe a ref.
if (javaType == null) {
BeanDefinition beanDefinition = register.getBeanDefinition(sed.getName());
String beanClassName = beanDefinition.getBeanClassName();
Class<?> defJavaType = AuxiliaryUtils.asClass(beanClassName);
AssertUtil.notNull(defJavaType, "bean " + sed.getName() + " javaType must be subclass of ScriptCondition");
AssertUtil.isTrue(ScriptCondition.class.isAssignableFrom(defJavaType), "bean " + sed.getName() + " javaType must be subclass of ScriptCondition");
// Register script content.
beanDefinition.getPropertyValues().add("script", sed.getScript());
} else {
RootBeanDefinition definition = new RootBeanDefinition();
definition.setBeanClass(javaType);
PropertyValue script = new PropertyValue("script", sed.getScript());
PropertyValue name = new PropertyValue("name", sed.getName());
definition.getPropertyValues().addPropertyValue(name);
definition.getPropertyValues().addPropertyValue(script);
register.registerBeanDefinition(ed.getIdentifier(), definition, true);
}
} else {
ed.visit(this);
}
}
@Override
public void visit(EngineDefinition ed) {
RootBeanDefinition definition = new RootBeanDefinition();
PropertyValue name = new PropertyValue("name", ed.getName());
PropertyValue pipeline = new PropertyValue("pipeline", new RuntimeBeanReference(ed.getPipeline()));
definition.setBeanClass(ed.resolveType());
definition.getPropertyValues().addPropertyValue(name);
definition.getPropertyValues().addPropertyValue(pipeline);
register.registerBeanDefinition(ed.getIdentifier(), definition, true);
}
@Override
public void visit(PipelineDefinition ed) {
RootBeanDefinition definition = new RootBeanDefinition();
PropertyValue name = new PropertyValue("name", ed.getName());
ManagedList<Object> components = new ManagedList<>();
definition.setBeanClass(ed.resolveType());
definition.getPropertyValues().addPropertyValue(name);
definition.getPropertyValues().add("components", components);
ed.getChildren().forEach(p -> p.visit(this));
for (ElementDefinition elementDef : ed.getChildren()) {
// Fire sub visit.
elementDef.visit(this);
BeanDefinition beanDefinition = register.getBeanDefinition(elementDef.getIdentifier());
AssertUtil.notNull(beanDefinition, elementDef.getIdentifier() + " not exist");
components.add(beanDefinition);
}
register.registerBeanDefinition(ed.getIdentifier(), definition, !isAnonymous(ed.getIdentifier()));
}
@Override
public void visit(PipelineComponentDefinition ed) {
RootBeanDefinition definition = new RootBeanDefinition();
PropertyValue name = new PropertyValue("name", ed.getName());
PropertyValue pipeline = new PropertyValue("pipeline", new RuntimeBeanReference(ed.getPipeline()));
definition.setBeanClass(ed.resolveType());
definition.getPropertyValues().addPropertyValue(name);
if (isAnonymous(ed.getPipeline())) {
context.getRegistered(ed.getPipeline()).visit(this);
definition.getPropertyValues().add("pipeline", register.getBeanDefinition(ed.getPipeline()));
} else {
definition.getPropertyValues().addPropertyValue(pipeline);
}
appendAttributes(ed, definition);
register.registerBeanDefinition(ed.getIdentifier(), definition);
}
private boolean isAnonymous(String name) {
return name.contains("anonymous-pipeline");
}
private void appendAttributes(ElementDefinition ed, RootBeanDefinition definition) {
List<AttributeHolder> attributes = ed.getAttributes();
for (AttributeHolder holder : attributes) {
Attributes attribute = holder.getAttribute();
if (attribute == Attributes.NAME || attribute == Attributes.DEGRADE_CALLBACK) {
continue;
}
PropertyValue value = new PropertyValue(attribute.getName(), holder.getValue());
definition.getPropertyValues().addPropertyValue(value);
}
definition.getPropertyValues().add("attributes", ed.getAttributes());
}
@Override
public void visitBasic(ElementDefinition ed) {
RootBeanDefinition definition = new RootBeanDefinition();
PropertyValue name = new PropertyValue("name", ed.getName());
definition.setBeanClass(ed.resolveType());
definition.getPropertyValues().addPropertyValue(name);
if (isType(ed.getExecute())) {
RootBeanDefinition conditionDef = new RootBeanDefinition();
conditionDef.setBeanClassName(ed.getExecute());
definition.getPropertyValues().add("executable", conditionDef);
} else {
AssertUtil.notBlank(ed.getExecute(), "component element ref must not be null!");
definition.getPropertyValues().add("executable", new RuntimeBeanReference(ed.getExecute()));
}
AttributeHolder degradeCallback = ed.getAttributes().stream()
.filter(p -> p.getAttribute() == Attributes.DEGRADE_CALLBACK).findFirst().orElse(null);
if (degradeCallback != null) {
String callback = String.valueOf(degradeCallback.getValue());
if (isType(callback)) {
RootBeanDefinition conditionDef = new RootBeanDefinition();
conditionDef.setBeanClassName(callback);
definition.getPropertyValues().add("degradeCallback", conditionDef);
没有合适的资源?快使用搜索试试~ 我知道了~
smart-flow-master.zip
共154个文件
java:136个
xml:9个
smart-flow-script:3个
2 下载量 162 浏览量
2023-01-08
13:17:09
上传
评论
收藏 155KB ZIP 举报
温馨提示
smart-flow 是一个轻量、灵活的业务流程编排框架,支持业务流程中常见的条件分支控制、子流程、业务组件异步和降级等功能。
资源推荐
资源详情
资源评论
收起资源包目录
smart-flow-master.zip (154个子文件)
spring.factories 206B
spring.handlers 91B
BeanDefinitionVisitor.java 13KB
BuilderDefinitionVisitor.java 11KB
PlantumlComponent.java 8KB
EngineContext.java 7KB
HttpManager.java 7KB
DefaultParser.java 5KB
FlowEngine.java 5KB
AbstractElementParser.java 5KB
ChooseComponent.java 4KB
ComponentModel.java 4KB
Pipeline.java 4KB
IfComponent.java 4KB
Invoker.java 3KB
DefaultEngineManager.java 3KB
ChooseElementParser.java 3KB
MetricExecutionListener.java 3KB
Component.java 3KB
IfElementParser.java 3KB
HttpReporter.java 3KB
Attributes.java 3KB
PlantumlEngineVisitor.java 3KB
AdapterComponent.java 3KB
PipelineBuilder.java 3KB
ParserContext.java 3KB
Node.java 3KB
IfComponentBuilder.java 3KB
AttributeValueResolver.java 3KB
ChooseBuilder.java 3KB
ExecutionListeners.java 3KB
RegisteredComponentVisitor.java 3KB
ScriptDetector.java 3KB
ElementDefinition.java 3KB
PipelineComponent.java 2KB
ExecutableAdapter.java 2KB
EngineExecutorManager.java 2KB
EngineModel.java 2KB
ElementUtils.java 2KB
AsyncCallResult.java 2KB
PlantumlPipeline.java 2KB
ComponentVisitor.java 2KB
EngineManager.java 2KB
AbstractReporter.java 2KB
ScriptDefinition.java 2KB
PipelineElementParser.java 2KB
GroovyScriptCondition.java 2KB
Tracer.java 2KB
ComponentElementParser.java 2KB
QlExpressScriptCondition.java 2KB
Key.java 1KB
HostUtils.java 1KB
ChooseDefinition.java 1KB
OgnlScriptCondition.java 1KB
RegisteredPipelineVisitor.java 1KB
PipelineModel.java 1KB
BeanDefinitionRegister.java 1KB
DefaultObjectCreator.java 1KB
AssertUtil.java 1KB
InvokeListeners.java 1KB
EngineBuilder.java 1KB
AdapterElementParser.java 1KB
ProxyParser.java 1KB
RegisterEngineVisitor.java 1KB
EngineElementParser.java 1KB
Metrics.java 1KB
DefinitionVisitor.java 1KB
IfElementDefinition.java 1KB
ChangeModel.java 1KB
ExecutableBuilder.java 1KB
AbstractComponentBuilder.java 1KB
FlowHttpManageConfiguration.java 1KB
EngineVisitor.java 1KB
AbstractExecutorSelector.java 1KB
ElementParserRegistry.java 1KB
AdapterBuilder.java 1KB
FlowHttpReportConfiguration.java 1KB
EngineDefinition.java 1KB
PipelineComponentDefinition.java 1KB
ScriptElementParser.java 1KB
AdapterDefinition.java 1KB
RequestModel.java 1KB
PipelineDefinition.java 1022B
HttpReportModel.java 1012B
AuxiliaryUtils.java 986B
MetricsManager.java 968B
AdapterContext.java 954B
DefaultIdentifierManager.java 948B
SpringIdentifierManager.java 940B
PipelineVisitor.java 935B
ScriptCondition.java 913B
Color.java 810B
ExecutionListenerSupport.java 764B
NamedThreadFactory.java 755B
Adapter.java 748B
Pair.java 731B
AbstractExecutable.java 722B
ParseConstants.java 695B
DefaultExecutorSelector.java 692B
ExecutionListenerRegistry.java 686B
共 154 条
- 1
- 2
资源评论
m0_72731342
- 粉丝: 2
- 资源: 1832
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功