提交 a759bc73 编写于 作者: E Elias Ricken de Medeiros 提交者: mergify[bot]

Publish process model as part of ProcessDeployedEvent (#2549)

Related to https://github.com/Activiti/Activiti/issues/2389
上级 2f4a8013
......@@ -16,16 +16,24 @@
package org.activiti.spring;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.activiti.api.process.model.ProcessDefinition;
import org.activiti.api.process.model.events.ProcessDeployedEvent;
import org.activiti.api.process.runtime.events.listener.ProcessRuntimeEventListener;
import org.activiti.api.runtime.event.impl.ProcessDeployedEvents;
import org.activiti.api.runtime.event.impl.ProcessDeployedEventImpl;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.runtime.api.model.impl.APIProcessDefinitionConverter;
import org.apache.commons.io.IOUtils;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationListener;
public class ProcessDeployedEventProducer implements ApplicationListener<ApplicationReadyEvent> {
......@@ -33,26 +41,40 @@ public class ProcessDeployedEventProducer implements ApplicationListener<Applica
private RepositoryService repositoryService;
private APIProcessDefinitionConverter converter;
private List<ProcessRuntimeEventListener<ProcessDeployedEvent>> listeners;
private ApplicationEventPublisher eventPublisher;
public ProcessDeployedEventProducer(RepositoryService repositoryService,
APIProcessDefinitionConverter converter,
List<ProcessRuntimeEventListener<ProcessDeployedEvent>> listeners) {
List<ProcessRuntimeEventListener<ProcessDeployedEvent>> listeners,
ApplicationEventPublisher eventPublisher) {
this.repositoryService = repositoryService;
this.converter = converter;
this.listeners = listeners;
this.eventPublisher = eventPublisher;
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
if (!WebApplicationType.NONE.equals(event.getSpringApplication().getWebApplicationType())) {
List<ProcessDefinition> processDefinitions = converter.from(repositoryService.createProcessDefinitionQuery().list());
List<ProcessDeployedEvent> processDeployedEvents = new ArrayList<>();
for (ProcessDefinition processDefinition : processDefinitions) {
ProcessDeployedEventImpl processDeployedEvent = new ProcessDeployedEventImpl(processDefinition);
for (ProcessRuntimeEventListener<ProcessDeployedEvent> listener : listeners) {
listener.onEvent(processDeployedEvent);
try (InputStream inputStream = repositoryService.getProcessModel(processDefinition.getId())) {
String xmlModel = IOUtils.toString(inputStream,
StandardCharsets.UTF_8);
ProcessDeployedEventImpl processDeployedEvent = new ProcessDeployedEventImpl(processDefinition, xmlModel);
processDeployedEvents.add(processDeployedEvent);
for (ProcessRuntimeEventListener<ProcessDeployedEvent> listener : listeners) {
listener.onEvent(processDeployedEvent);
}
} catch (IOException e) {
throw new ActivitiException("Error occurred while getting process model '" + processDefinition.getId() + "' : ",
e);
}
}
if (!processDeployedEvents.isEmpty()) {
eventPublisher.publishEvent(new ProcessDeployedEvents(processDeployedEvents));
}
}
}
}
......@@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
......@@ -158,11 +159,13 @@ public class ProcessEngineAutoConfiguration extends AbstractProcessEngineAutoCon
@ConditionalOnMissingBean
public ProcessDeployedEventProducer processDeployedEventProducer(RepositoryService repositoryService,
APIProcessDefinitionConverter converter,
@Autowired(required = false) List<ProcessRuntimeEventListener<ProcessDeployedEvent>> listeners) {
@Autowired(required = false) List<ProcessRuntimeEventListener<ProcessDeployedEvent>> listeners,
ApplicationEventPublisher eventPublisher) {
return new ProcessDeployedEventProducer(repositoryService,
converter,
Optional.ofNullable(listeners)
.orElse(Collections.emptyList()));
converter,
Optional.ofNullable(listeners)
.orElse(Collections.emptyList()),
eventPublisher);
}
}
......@@ -16,6 +16,7 @@
package org.activiti.spring;
import java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.List;
......@@ -32,8 +33,10 @@ import org.mockito.Mock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationEventPublisher;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
......@@ -57,13 +60,17 @@ public class ProcessDeployedEventProducerTest {
@Mock
private ProcessRuntimeEventListener<ProcessDeployedEvent> secondListener;
@Mock
private ApplicationEventPublisher eventPublisher;
@Before
public void setUp() {
initMocks(this);
producer = new ProcessDeployedEventProducer(repositoryService,
converter,
Arrays.asList(firstListener,
secondListener));
secondListener),
eventPublisher);
}
@Test
......@@ -77,9 +84,11 @@ public class ProcessDeployedEventProducerTest {
given(definitionQuery.list()).willReturn(internalProcessDefinitions);
List<org.activiti.api.process.model.ProcessDefinition> apiProcessDefinitions = Arrays.asList(mock(org.activiti.api.process.model.ProcessDefinition.class),
mock(org.activiti.api.process.model.ProcessDefinition.class));
List<org.activiti.api.process.model.ProcessDefinition> apiProcessDefinitions = Arrays.asList(buildAPIProcessDefinition("id1"),
buildAPIProcessDefinition("id2"));
given(converter.from(internalProcessDefinitions)).willReturn(apiProcessDefinitions);
given(repositoryService.getProcessModel("id1")).willReturn(new ByteArrayInputStream("content1".getBytes()));
given(repositoryService.getProcessModel("id2")).willReturn(new ByteArrayInputStream("content2".getBytes()));
//when
producer.onApplicationEvent(buildApplicationReadyEvent(WebApplicationType.SERVLET));
......@@ -93,11 +102,23 @@ public class ProcessDeployedEventProducerTest {
List<ProcessDeployedEvent> allValues = captor.getAllValues();
assertThat(allValues)
.extracting(ProcessDeployedEvent::getEntity)
.containsExactly(apiProcessDefinitions.get(0),//firstListener
apiProcessDefinitions.get(1),//firstListener
apiProcessDefinitions.get(0),//secondListener
apiProcessDefinitions.get(1));//secondListener
.extracting(ProcessDeployedEvent::getEntity,
ProcessDeployedEvent::getProcessModelContent)
.containsExactly(tuple(apiProcessDefinitions.get(0),
"content1"),//firstListener
tuple(apiProcessDefinitions.get(1),
"content2"),//firstListener
tuple(apiProcessDefinitions.get(0),
"content1"),//secondListener
tuple(apiProcessDefinitions.get(1),
"content2"));//secondListener
}
private org.activiti.api.process.model.ProcessDefinition buildAPIProcessDefinition(String processDefinitionId) {
org.activiti.api.process.model.ProcessDefinition processDefinition = mock(org.activiti.api.process.model.ProcessDefinition.class);
given(processDefinition.getId()).willReturn(processDefinitionId);
return processDefinition;
}
private ApplicationReadyEvent buildApplicationReadyEvent(WebApplicationType applicationType) {
......
......@@ -17,7 +17,9 @@
package org.activiti.spring.boot.process;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.api.process.model.ProcessDefinition;
import org.activiti.api.process.model.events.ProcessDeployedEvent;
......@@ -28,14 +30,19 @@ import org.springframework.boot.test.context.TestComponent;
public class DeployedProcessesListener implements ProcessRuntimeEventListener<ProcessDeployedEvent> {
private List<ProcessDefinition> deployedProcesses = new ArrayList<>();
private Map<String, String> processModelContents = new HashMap<>();
@Override
public void onEvent(ProcessDeployedEvent event) {
deployedProcesses.add(event.getEntity());
processModelContents.put(event.getProcessDefinitionKey(), event.getProcessModelContent());
}
public List<ProcessDefinition> getDeployedProcesses() {
return deployedProcesses;
}
public Map<String, String> getProcessModelContents() {
return processModelContents;
}
}
......@@ -16,6 +16,7 @@
package org.activiti.spring.boot.process;
import java.io.File;
import java.util.List;
import org.activiti.api.process.model.ProcessDefinition;
......@@ -49,6 +50,9 @@ public class ProcessDeployedEventIT {
.contains(CATEGORIZE_PROCESS,
CATEGORIZE_HUMAN_PROCESS,
ONE_STEP_PROCESS);
assertThat(listener.getProcessModelContents().get(CATEGORIZE_PROCESS))
.isNotEmpty()
.isXmlEqualToContentOf(new File("src/test/resources/processes/categorize-image.bpmn20.xml"));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册