package com.constellio.model.services.workflows.bpmn; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.Namespace; import org.jdom2.input.SAXBuilder; import com.constellio.data.dao.managers.config.ConfigManagerRuntimeException; import com.constellio.data.io.services.facades.FileService; import com.constellio.model.conf.FoldersLocator; import com.constellio.model.entities.workflows.definitions.WorkflowConfiguration; import com.constellio.model.entities.workflows.definitions.WorkflowDefinition; public class WorkflowBPMNDefinitionsService { private FoldersLocator foldersLocator; private FileService fileService; public WorkflowBPMNDefinitionsService(FoldersLocator foldersLocator, FileService fileService) { this.foldersLocator = foldersLocator; this.fileService = fileService; } public List<String> getAvailableWorkflowDefinitions() { List<String> bpmnFiles = new ArrayList<>(); for (File bpmnFile : foldersLocator.getBPMNsFolder().listFiles()) { if (bpmnFile.getName().endsWith(".bpmn20.xml")) { bpmnFiles.add(bpmnFile.getName()); } } return bpmnFiles; } public List<String> getAvailableWorkflowDefinitionMappingKeys(String bpmnFileName) { List<String> mappingKeys = new ArrayList<>(); File bpmnFile = getBPMNFile(bpmnFileName); Document document = getDocumentFromFile(bpmnFile); Namespace activitiNamespace = document.getRootElement().getNamespace("activiti"); Element rootElement = document.getRootElement(); getMappingKeys(rootElement, mappingKeys, activitiNamespace); return mappingKeys; } private void getMappingKeys(Element element, List<String> mappingKeys, Namespace activitiNamespace) { String groupsString = element.getAttributeValue("candidateGroups", activitiNamespace); if (groupsString != null) { for (String groupName : groupsString.split(",")) { mappingKeys.add(groupName); } } for (Element childElement : element.getChildren()) { getMappingKeys(childElement, mappingKeys, activitiNamespace); } } public WorkflowDefinition getWorkflowDefinition(String bpmnFileName, Map<String, String> mapping, WorkflowConfiguration workflowConfiguration) { File bpmnFile = getBPMNFile(bpmnFileName); Document document = getDocumentFromFile(bpmnFile); return newBPMNParser(document, mapping, workflowConfiguration).build(); } BPMNParser newBPMNParser(Document document, Map<String, String> mapping, WorkflowConfiguration workflowConfiguration) { return new BPMNParser(document, mapping, workflowConfiguration); } File getBPMNFile(String bpmnFileName) { return new File(foldersLocator.getBPMNsFolder(), bpmnFileName); } Document getDocumentFromFile(File file) { SAXBuilder builder = new SAXBuilder(); try { return builder.build(file); } catch (JDOMException e) { throw new ConfigManagerRuntimeException("JDOM2 Exception", e); } catch (IOException e) { throw new ConfigManagerRuntimeException.CannotCompleteOperation("build Document JDOM2 from file", e); } } }