Flowable源码地址:https://github.com/flowable/flowable-engine
DeploymentBuilder 部署生成器接口类
-
用于创建新部署的生成器。
-
生成器实例可以通过{@link org.flowable.engine.RepositoryService#createDeployment()}获得。
-
在调用{@link#deploy()}操作之前,可以将多个资源添加到一个部署中。
-
部署后,无法对返回的部署进行更多更改,并且可以释放生成器实例。
package org.flowable.engine.repository;
import java.io.InputStream;
import java.util.Date;
import java.util.zip.ZipInputStream;
import org.flowable.bpmn.model.BpmnModel;
/**
* @author Tom Baeyens
* @author Joram Barrez
*/
public interface DeploymentBuilder {
DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);
DeploymentBuilder addClasspathResource(String resource);
DeploymentBuilder addString(String resourceName, String text);
DeploymentBuilder addBytes(String resourceName, byte[] bytes);
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel);
/**
* 如果调用,则不会对BPMN 2.0 XSD进行XML模式验证.
*
* 一般不推荐.
*/
DeploymentBuilder disableSchemaValidation();
/**
* 如果调用,则不会根据流程定义验证流程定义在引擎上是否可执行.
*
* 一般不推荐.
*/
DeploymentBuilder disableBpmnValidation();
/**
* 为部署提供给定的名称.
*/
DeploymentBuilder name(String name);
/**
* 为部署提供给定的类别.
*/
DeploymentBuilder category(String category);
/**
* 为部署提供给定的密钥.
*/
DeploymentBuilder key(String key);
/**
* 为部署提供给定的父部署id.
*/
DeploymentBuilder parentDeploymentId(String parentDeploymentId);
/**
* 为部署提供给定的租户id.
*/
DeploymentBuilder tenantId(String tenantId);
/**
* 如果已设置,则此部署将与以前的任何部署进行比较。这意味着每个(未生成的)资源都将与此部署提供的资源进行比较.
*/
DeploymentBuilder enableDuplicateFiltering();
/**
*设置激活此部署中包含的流程定义的日期。这意味着所有流程定义都将像往常一样部署,但它们将从给定的日期开始激活.
*/
DeploymentBuilder activateProcessDefinitionsOn(Date date);
/**
* 允许将影响部署的属性添加到此{@link DeploymentBuilder}.
*/
DeploymentBuilder deploymentProperty(String propertyKey, Object propertyValue);
/**
* 将所有提供的源部署到流程引擎.
*/
Deployment deploy();
}
DeploymentBuilderImpl 部署生成器实现类
public class DeploymentBuilderImpl implements DeploymentBuilder, Serializable {
private static final long serialVersionUID = 1L;
protected static final String DEFAULT_ENCODING = "UTF-8";
protected transient RepositoryServiceImpl repositoryService;
protected transient ResourceEntityManager resourceEntityManager;
protected DeploymentEntity deployment;
protected boolean isBpmn20XsdValidationEnabled = true;
protected boolean isProcessValidationEnabled = true;
protected boolean isDuplicateFilterEnabled;
protected Date processDefinitionsActivationDate;
protected Map<String, Object> deploymentProperties = new HashMap<>();
public DeploymentBuilderImpl(RepositoryServiceImpl repositoryService) {
this.repositoryService = repositoryService;
this.deployment = CommandContextUtil.getProcessEngineConfiguration().getDeploymentEntityManager().create();
this.resourceEntityManager = CommandContextUtil.getProcessEngineConfiguration().getResourceEntityManager();
}
@Override
public DeploymentBuilder addInputStream(String resourceName, InputStream inputStream) {
if (inputStream == null) {
throw new FlowableIllegalArgumentException("inputStream for resource '" + resourceName + "' is null");
}
byte[] bytes = IoUtil.readInputStream(inputStream, resourceName);
ResourceEntity resource = resourceEntityManager.create();
resource.setName(resourceName);
resource.setBytes(bytes);
deployment.addResource(resource);
return this;
}
@Override
public DeploymentBuilder addClasspathResource(String resource) {
InputStream inputStream = ReflectUtil.getResourceAsStream(resource);
if (inputStream == null) {
throw new FlowableIllegalArgumentException("resource '" + resource + "' not found");
}
return addInputStream(resource, inputStream);
}
@Override
public DeploymentBuilder addString(String resourceName, String text) {
if (text == null) {
throw new FlowableIllegalArgumentException("text is null");
}
ResourceEntity resource = resourceEntityManager.create();
resource.setName(resourceName);
try {
resource.setBytes(text.getBytes(DEFAULT_ENCODING));
} catch (UnsupportedEncodingException e) {
throw new FlowableException("Unable to get process bytes.", e);
}
deployment.addResource(resource);
return this;
}
@Override
public DeploymentBuilder addBytes(String resourceName, byte[] bytes) {
if (bytes == null) {
throw new FlowableIllegalArgumentException("bytes is null");
}
ResourceEntity resource = resourceEntityManager.create();
resource.setName(resourceName);
resource.setBytes(bytes);
deployment.addResource(resource);
return this;
}
@Override
public DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream) {
try {
ZipEntry entry = zipInputStream.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
String entryName = entry.getName();
byte[] bytes = IoUtil.readInputStream(zipInputStream, entryName);
ResourceEntity resource = resourceEntityManager.create();
resource.setName(entryName);
resource.setBytes(bytes);
deployment.addResource(resource);
}
entry = zipInputStream.getNextEntry();
}
} catch (Exception e) {
throw new FlowableException("problem reading zip input stream", e);
}
return this;
}
@Override
public DeploymentBuilder addBpmnModel(String resourceName, BpmnModel bpmnModel) {
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
String bpmn20Xml = new String(bpmnXMLConverter.convertToXML(bpmnModel), StandardCharsets.UTF_8);
addString(resourceName, bpmn20Xml);
return this;
}
@Override
public DeploymentBuilder name(String name) {
deployment.setName(name);
return this;
}
@Override
public DeploymentBuilder category(String category) {
deployment.setCategory(category);
return this;
}
@Override
public DeploymentBuilder key(String key) {
deployment.setKey(key);
return this;
}
@Override
public DeploymentBuilder parentDeploymentId(String parentDeploymentId) {
deployment.setParentDeploymentId(parentDeploymentId);
return this;
}
@Override
public DeploymentBuilder disableBpmnValidation() {
this.isProcessValidationEnabled = false;
return this;
}
@Override
public DeploymentBuilder disableSchemaValidation() {
this.isBpmn20XsdValidationEnabled = false;
return this;
}
@Override
public DeploymentBuilder tenantId(String tenantId) {
deployment.setTenantId(tenantId);
return this;
}
@Override
public DeploymentBuilder enableDuplicateFiltering() {
this.isDuplicateFilterEnabled = true;
return this;
}
@Override
public DeploymentBuilder activateProcessDefinitionsOn(Date date) {
this.processDefinitionsActivationDate = date;
return this;
}
@Override
public DeploymentBuilder deploymentProperty(String propertyKey, Object propertyValue) {
deploymentProperties.put(propertyKey, propertyValue);
return this;
}
@Override
public Deployment deploy() {
return repositoryService.deploy(this);
}
// getters and setters
// //////////////////////////////////////////////////////
public DeploymentEntity getDeployment() {
return deployment;
}
public boolean isProcessValidationEnabled() {
return isProcessValidationEnabled;
}
public boolean isBpmn20XsdValidationEnabled() {
return isBpmn20XsdValidationEnabled;
}
public boolean isDuplicateFilterEnabled() {
return isDuplicateFilterEnabled;
}
public Date getProcessDefinitionsActivationDate() {
return processDefinitionsActivationDate;
}
public Map<String, Object> getDeploymentProperties() {
return deploymentProperties;
}
}