ProcessExtensionsAutoConfiguration
Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
目录

概述
ProcessExtensionsAutoConfiguration的是一个非常常见的需求。
需求:
设计思路
实现思路分析
ProcessExtensionsAutoConfiguration
@Configuration
@EnableCaching
public class ProcessExtensionsAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DeploymentResourceLoader<ProcessExtensionModel> deploymentResourceLoader() {
return new DeploymentResourceLoader<>();
}
@Bean
@ConditionalOnMissingBean
public ProcessExtensionResourceReader processExtensionResourceReader(ObjectMapper objectMapper,
Map<String, VariableType> variableTypeMap) {
return new ProcessExtensionResourceReader(objectMapper, variableTypeMap);
}
@Bean
@ConditionalOnMissingBean
public ProcessExtensionService processExtensionService(ProcessExtensionResourceReader processExtensionResourceReader,
DeploymentResourceLoader<ProcessExtensionModel> deploymentResourceLoader) {
return new ProcessExtensionService(
deploymentResourceLoader,
processExtensionResourceReader);
}
@Bean
InitializingBean initRepositoryServiceForProcessExtensionService(RepositoryService repositoryService,
ProcessExtensionService processExtensionService) {
return () -> processExtensionService.setRepositoryService(repositoryService);
}
@Bean
InitializingBean initRepositoryServiceForDeploymentResourceLoader(RepositoryService repositoryService,
DeploymentResourceLoader deploymentResourceLoader) {
return () -> deploymentResourceLoader.setRepositoryService(repositoryService);
}
@Bean
@ConditionalOnMissingBean(name = "variableTypeMap")
public Map<String, VariableType> variableTypeMap(ObjectMapper objectMapper,
DateFormatterProvider dateFormatterProvider) {
Map<String, VariableType> variableTypeMap = new HashMap<>();
variableTypeMap.put("boolean", new JavaObjectVariableType(Boolean.class));
variableTypeMap.put("string", new JavaObjectVariableType(String.class));
variableTypeMap.put("integer", new JavaObjectVariableType(Integer.class));
variableTypeMap.put("json", new JsonObjectVariableType(objectMapper));
variableTypeMap.put("file", new JsonObjectVariableType(objectMapper));
variableTypeMap.put("folder", new JsonObjectVariableType(objectMapper));
variableTypeMap.put("date", new DateVariableType(Date.class, dateFormatterProvider));
variableTypeMap.put("datetime", new DateVariableType(Date.class, dateFormatterProvider));
variableTypeMap.put("array", new JsonObjectVariableType(objectMapper));
return variableTypeMap;
}
@Bean
public VariableValidationService variableValidationService(Map<String, VariableType> variableTypeMap) {
return new VariableValidationService(variableTypeMap);
}
@Bean
public VariableParsingService variableParsingService(Map<String, VariableType> variableTypeMap) {
return new VariableParsingService(variableTypeMap);
}
@Bean
@ConditionalOnMissingBean
public CachingProcessExtensionService cachingProcessExtensionService(ProcessExtensionService processExtensionService) {
return new CachingProcessExtensionService(processExtensionService);
}
2.AssignmentDefinition
public class AssignmentDefinition {
public enum AssignmentEnum {
ASSIGNEE("assignee"),
CANDIDATES("candidates");
private String assignment;
private AssignmentEnum(String assignment) {
this.assignment = assignment;
}
}
public enum AssignmentType {
STATIC("static"),
IDENTITY("identity"),
EXPRESSION("expression");
private String type;
private AssignmentType(String type) {
this.type = type;
}
}
public enum AssignmentMode {
SEQUENTIAL("sequential"),
MANUAL("manual");
private String mode;
private AssignmentMode(String mode) {
this.mode = mode;
}
}
3.ConstantDefinition
public class ConstantDefinition {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
4.Extension
public class Extension {
private static final ProcessVariablesMapping EMPTY_PROCESS_VARIABLES_MAPPING = new ProcessVariablesMapping();
private Map<String, VariableDefinition> properties = new HashMap<>();
private Map<String, ProcessVariablesMapping> mappings = new HashMap<>();
private Map<String, ProcessConstantsMapping> constants = new HashMap<>();
private TemplatesDefinition templates = new TemplatesDefinition();
private Map<String, AssignmentDefinition> assignments = new HashMap<>();
public Map<String, VariableDefinition> getProperties() {
return properties;
}
public void setProperties(Map<String, VariableDefinition> properties) {
this.properties = properties;
}
public Map<String, ProcessVariablesMapping> getMappings() {
return mappings;
}
public void setMappings(Map<String, ProcessVariablesMapping> mappings) {
this.mappings = mappings;
}
public Map<String, ProcessConstantsMapping> getConstants() {
return constants;
}
public void setConstants(Map<String, ProcessConstantsMapping> constants) {
this.constants = constants;
}
public ProcessConstantsMapping getConstantForFlowElement(String flowElementUUID) {
ProcessConstantsMapping processConstantsMapping = constants.get(flowElementUUID);
return processConstantsMapping != null ? processConstantsMapping : new ProcessConstantsMapping();
}
public ProcessVariablesMapping getMappingForFlowElement(String flowElementUUID) {
ProcessVariablesMapping processVariablesMapping = mappings.get(flowElementUUID);
return processVariablesMapping != null ? processVariablesMapping : EMPTY_PROCESS_VARIABLES_MAPPING;
}
public Optional<TemplateDefinition> findAssigneeTemplateForTask(String taskUUID) {
return templates.findAssigneeTemplateForTask(taskUUID);
}
public Optional<TemplateDefinition> findCandidateTemplateForTask(String taskUUID) {
return templates.findCandidateTemplateForTask(taskUUID);
}
public VariableDefinition getProperty(String propertyUUID) {
return properties != null ? properties.get(propertyUUID) : null;
}
public VariableDefinition getPropertyByName(String name) {
if (properties != null) {
for (Map.Entry<String, VariableDefinition> variableDefinition : properties.entrySet()) {
if (variableDefinition.getValue() != null) {
if (Objects.equals(variableDefinition.getValue().getName(), name)) {
return variableDefinition.getValue();
}
}
}
}
return null;
}
public boolean hasMapping(String taskId) {
return mappings.get(taskId) != null;
}
public boolean shouldMapAllInputs(String elementId) {
ProcessVariablesMapping processVariablesMapping = mappings.get(elementId);
return processVariablesMapping.getMappingType() != null &&
(processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL_INPUTS) ||
processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL));
}
public boolean shouldMapAllOutputs(String elementId) {
ProcessVariablesMapping processVariablesMapping = mappings.get(elementId);
return processVariablesMapping.getMappingType() != null &&
(processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL_OUTPUTS) ||
processVariablesMapping.getMappingType().equals(MappingType.MAP_ALL));
}
public TemplatesDefinition getTemplates() {
return templates;
}
public void setTemplates(TemplatesDefinition templates) {
this.templates = templates;
}
public Map<String, AssignmentDefinition> getAssignments() {
return assignments;
}
public void setAssignments(Map<String, AssignmentDefinition> assignments) {
this.assignments = assignments;
}
}
5.VariableParsingService
public class VariableParsingService {
private static final Logger logger = LoggerFactory.getLogger(VariableParsingService.class);
public VariableParsingService(Map<String, VariableType> variableTypeMap) {
this.variableTypeMap = variableTypeMap;
}
private Map<String, VariableType> variableTypeMap;
public Object parse(VariableDefinition variableDefinition) throws ActivitiException{
if(variableDefinition.getType()!=null) {
VariableType type = variableTypeMap.get(variableDefinition.getType());
return type.parseFromValue(variableDefinition.getValue());
}
return variableDefinition.getValue();
}
}
VariableValidationService
public VariableValidationService(Map<String, VariableType> variableTypeMap) {
this.variableTypeMap = variableTypeMap;
}
private Map<String, VariableType> variableTypeMap;
public boolean validate(Object var, VariableDefinition variableDefinition){
return validateWithErrors(var,variableDefinition).isEmpty();
}
public List<ActivitiException> validateWithErrors(Object var, VariableDefinition variableDefinition){
List<ActivitiException> errors = new ArrayList<>();
if(variableDefinition.getType()!=null) {
VariableType type = variableTypeMap.get(variableDefinition.getType());
//if type is not in the map then assume to be json
if(type==null){
type = variableTypeMap.get("json");
}
type.validate(var,
errors);
} else{
errors.add(new ActivitiException(variableDefinition.getName()+" has no type"));
logger.error(variableDefinition.getName()+" has no type");
}
ProcessExtensionResourceFinderDescriptor
public class ProcessExtensionResourceFinderDescriptor implements ResourceFinderDescriptor {
private boolean checkResources;
private String locationPrefix;
private List<String> locationSuffixes;
public ProcessExtensionResourceFinderDescriptor(boolean checkResources,
String locationPrefix,
String locationSuffix) {
this.checkResources = checkResources;
this.locationPrefix = locationPrefix;
locationSuffixes = new ArrayList<>();
locationSuffixes.add(locationSuffix);
}
@Override
public List<String> getLocationSuffixes() {
return locationSuffixes;
}
@Override
public String getLocationPrefix() {
return locationPrefix;
}
@Override
public boolean shouldLookUpResources() {
return checkResources;
}
@Override
public String getMsgForEmptyResources() {
return "No process extensions were found for auto-deployment in the location '" + locationPrefix + "'";
}
@Override
public String getMsgForResourcesFound(List<String> processExtensionFiles) {
return "The following process extension files will be deployed: " + processExtensionFiles;
}
@Override
public void validate(List<Resource> resources) {
}
参考资料和推荐阅读
[1].暂无
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~
854

被折叠的 条评论
为什么被折叠?



