Skip to content

Commit

Permalink
Add previous value to update event (Activiti#3468)
Browse files Browse the repository at this point in the history
* Add previous value to update event

closes Activiti#3467

* Add and refactor integration test, fix logic for extracting previous value before update, cleanups
  • Loading branch information
zoltanpalfi authored Oct 23, 2020
1 parent 58ec3c2 commit 00c858b
Show file tree
Hide file tree
Showing 21 changed files with 438 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@

public interface VariableUpdatedEvent extends VariableEvent {

<T> T getPreviousValue();
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@ public VariableCreatedEventImpl() {

public VariableCreatedEventImpl(VariableInstance entity) {
super(entity);
setProcessInstanceId(entity.getProcessInstanceId());
}

@Override
public VariableEvent.VariableEvents getEventType() {
return VariableEvent.VariableEvents.VARIABLE_CREATED;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,25 @@
import org.activiti.api.model.shared.event.VariableUpdatedEvent;
import org.activiti.api.model.shared.model.VariableInstance;

public class VariableUpdatedEventImpl extends VariableEventImpl implements VariableUpdatedEvent {
public class VariableUpdatedEventImpl<T> extends VariableEventImpl implements VariableUpdatedEvent {

private T previousValue;

public VariableUpdatedEventImpl() {
}

public VariableUpdatedEventImpl(VariableInstance entity) {
public VariableUpdatedEventImpl(VariableInstance entity, T previousValue) {
super(entity);
this.previousValue = previousValue;
}

@Override
public VariableEvents getEventType() {
return VariableEvents.VARIABLE_UPDATED;
}

@Override
public T getPreviousValue() {
return previousValue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,12 @@ public class VariableInstanceImpl<T> implements VariableInstance {
public VariableInstanceImpl() {
}

public VariableInstanceImpl(String name,
String type,
T value,
String processInstanceId) {
public VariableInstanceImpl(String name, String type, T value, String processInstanceId, String taskId) {
this.name = name;
this.type = type;
this.processInstanceId = processInstanceId;
this.value = value;
this.taskId = taskId;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,8 @@ public Optional<VariableCreatedEvent> from(ActivitiVariableEvent internalEvent)
VariableInstanceImpl<Object> variableInstance = new VariableInstanceImpl<>(internalEvent.getVariableName(),
internalEvent.getVariableType().getTypeName(),
internalEvent.getVariableValue(),
internalEvent.getProcessInstanceId());
variableInstance.setTaskId(internalEvent.getTaskId());

VariableCreatedEventImpl variableCreatedEvent = new VariableCreatedEventImpl(variableInstance);
variableCreatedEvent.setProcessInstanceId(internalEvent.getProcessInstanceId());

return Optional.of(variableCreatedEvent);
internalEvent.getProcessInstanceId(),
internalEvent.getTaskId());
return Optional.of(new VariableCreatedEventImpl(variableInstance));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public Optional<VariableDeletedEvent> from(ActivitiVariableEvent internalEvent)
VariableInstanceImpl<Object> variableInstance = new VariableInstanceImpl<>(internalEvent.getVariableName(),
internalEvent.getVariableType().getTypeName(),
internalEvent.getVariableValue(),
internalEvent.getProcessInstanceId());
variableInstance.setTaskId(internalEvent.getTaskId());
internalEvent.getProcessInstanceId(),
internalEvent.getTaskId());
return Optional.of(new VariableDeletedEventImpl(variableInstance));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,19 @@
import org.activiti.api.model.shared.event.VariableUpdatedEvent;
import org.activiti.api.runtime.event.impl.VariableUpdatedEventImpl;
import org.activiti.api.runtime.model.impl.VariableInstanceImpl;
import org.activiti.engine.delegate.event.ActivitiVariableEvent;
import org.activiti.engine.delegate.event.ActivitiVariableUpdatedEvent;

import java.util.Optional;

public class ToVariableUpdatedConverter implements EventConverter<VariableUpdatedEvent, ActivitiVariableEvent> {
public class ToVariableUpdatedConverter implements EventConverter<VariableUpdatedEvent, ActivitiVariableUpdatedEvent> {

@Override
public Optional<VariableUpdatedEvent> from(ActivitiVariableEvent internalEvent) {
public Optional<VariableUpdatedEvent> from(ActivitiVariableUpdatedEvent internalEvent) {
VariableInstanceImpl<Object> variableInstance = new VariableInstanceImpl<>(internalEvent.getVariableName(),
internalEvent.getVariableType().getTypeName(),
internalEvent.getVariableValue(),
internalEvent.getProcessInstanceId());
variableInstance.setTaskId(internalEvent.getTaskId());
return Optional.of(new VariableUpdatedEventImpl(variableInstance));
internalEvent.getProcessInstanceId(),
internalEvent.getTaskId());
return Optional.of(new VariableUpdatedEventImpl<>(variableInstance, internalEvent.getVariablePreviousValue()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import org.activiti.api.runtime.shared.events.VariableEventListener;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiVariableEvent;
import org.activiti.engine.delegate.event.ActivitiVariableUpdatedEvent;
import org.activiti.runtime.api.event.impl.ToVariableUpdatedConverter;

public class VariableUpdatedListenerDelegate implements ActivitiEventListener {
Expand All @@ -43,8 +43,8 @@ public VariableUpdatedListenerDelegate(

@Override
public void onEvent(ActivitiEvent event) {
if (event instanceof ActivitiVariableEvent) {
ActivitiVariableEvent internalEvent = (ActivitiVariableEvent) event;
if (event instanceof ActivitiVariableUpdatedEvent) {
ActivitiVariableUpdatedEvent internalEvent = (ActivitiVariableUpdatedEvent) event;
if (variableEventFilter.shouldEmmitEvent(internalEvent)) {
converter.from(internalEvent)
.ifPresent(convertedEvent -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@ public class APIVariableInstanceConverter

@Override
public VariableInstance from(org.activiti.engine.impl.persistence.entity.VariableInstance internalVariableInstance) {
VariableInstanceImpl<Object> variableInstance = new VariableInstanceImpl<>(internalVariableInstance.getName(),
return new VariableInstanceImpl<>(internalVariableInstance.getName(),
internalVariableInstance.getTypeName(),
internalVariableInstance.getValue(),
internalVariableInstance.getProcessInstanceId());
variableInstance.setTaskId(internalVariableInstance.getTaskId());
return variableInstance;
internalVariableInstance.getProcessInstanceId(),
internalVariableInstance.getTaskId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright 2010-2020 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.runtime.api.event.impl;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

import java.util.Optional;
import org.activiti.api.model.shared.event.VariableCreatedEvent;
import org.activiti.api.model.shared.event.VariableEvent.VariableEvents;
import org.activiti.api.model.shared.model.VariableInstance;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiVariableEventImpl;
import org.activiti.engine.impl.variable.StringType;
import org.activiti.engine.impl.variable.VariableType;
import org.junit.jupiter.api.Test;

class ToVariableCreatedConverterTest {

private ToVariableCreatedConverter converter = new ToVariableCreatedConverter();

@Test
void should_convertToVariableCreatedEvent() {
ActivitiVariableEventImpl internalEvent = new ActivitiVariableEventImpl(ActivitiEventType.VARIABLE_CREATED);
internalEvent.setVariableName("variableName");
internalEvent.setProcessInstanceId("processInstanceId");
internalEvent.setTaskId("taskId");
VariableType variableType = new StringType(100);
internalEvent.setVariableType(variableType);
Object value = mock(Object.class);
internalEvent.setVariableValue(value);

Optional<VariableCreatedEvent> result = converter.from(internalEvent);

assertThat(result).isPresent();
VariableCreatedEvent actualEvent = result.get();
assertThat(actualEvent.getEventType()).isEqualTo(VariableEvents.VARIABLE_CREATED);
assertThat(actualEvent.getProcessInstanceId()).isEqualTo("processInstanceId");
VariableInstance actualEntity = actualEvent.getEntity();
assertThat(actualEntity.getName()).isEqualTo("variableName");
assertThat(actualEntity.getProcessInstanceId()).isEqualTo("processInstanceId");
assertThat(actualEntity.getTaskId()).isEqualTo("taskId");
assertThat(actualEntity.getType()).isEqualTo("string");
Object actualValue = actualEntity.getValue();
assertThat(actualValue).isSameAs(value);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Copyright 2010-2020 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.runtime.api.event.impl;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

import java.util.Optional;
import org.activiti.api.model.shared.event.VariableDeletedEvent;
import org.activiti.api.model.shared.event.VariableEvent.VariableEvents;
import org.activiti.api.model.shared.model.VariableInstance;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiVariableEventImpl;
import org.activiti.engine.impl.variable.BooleanType;
import org.activiti.engine.impl.variable.VariableType;
import org.junit.jupiter.api.Test;

class ToVariableDeletedConverterTest {

private ToVariableDeletedConverter converter = new ToVariableDeletedConverter();

@Test
void should_convertToVariableDeletedEvent() {
ActivitiVariableEventImpl internalEvent = new ActivitiVariableEventImpl(ActivitiEventType.VARIABLE_DELETED);
internalEvent.setVariableName("variableName");
internalEvent.setProcessInstanceId("processInstanceId");
internalEvent.setTaskId("taskId");
VariableType variableType = new BooleanType();
internalEvent.setVariableType(variableType);
Object value = mock(Object.class);
internalEvent.setVariableValue(value);

Optional<VariableDeletedEvent> result = converter.from(internalEvent);

assertThat(result).isPresent();
VariableDeletedEvent actualEvent = result.get();
assertThat(actualEvent.getEventType()).isEqualTo(VariableEvents.VARIABLE_DELETED);
VariableInstance actualEntity = actualEvent.getEntity();
assertThat(actualEntity.getName()).isEqualTo("variableName");
assertThat(actualEntity.getProcessInstanceId()).isEqualTo("processInstanceId");
assertThat(actualEntity.getTaskId()).isEqualTo("taskId");
assertThat(actualEntity.getType()).isEqualTo("boolean");
Object actualValue = actualEntity.getValue();
assertThat(actualValue).isSameAs(value);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright 2010-2020 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.runtime.api.event.impl;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

import java.util.Optional;
import org.activiti.api.model.shared.event.VariableEvent.VariableEvents;
import org.activiti.api.model.shared.event.VariableUpdatedEvent;
import org.activiti.api.model.shared.model.VariableInstance;
import org.activiti.engine.delegate.event.impl.ActivitiVariableUpdatedEventImpl;
import org.activiti.engine.impl.variable.IntegerType;
import org.activiti.engine.impl.variable.VariableType;
import org.junit.jupiter.api.Test;

class ToVariableUpdatedConverterTest {

private ToVariableUpdatedConverter converter = new ToVariableUpdatedConverter();

@Test
void should_convertToVariableUpdatedEvent() {
ActivitiVariableUpdatedEventImpl internalEvent = new ActivitiVariableUpdatedEventImpl();
internalEvent.setVariableName("variableName");
internalEvent.setProcessInstanceId("processInstanceId");
internalEvent.setTaskId("taskId");
VariableType variableType = new IntegerType();
internalEvent.setVariableType(variableType);
Object value = mock(Object.class);
internalEvent.setVariableValue(value);
Object previousValue = mock(Object.class);
internalEvent.setVariablePreviousValue(previousValue);

Optional<VariableUpdatedEvent> result = converter.from(internalEvent);

assertThat(result).isPresent();
VariableUpdatedEvent actualEvent = result.get();
assertThat(actualEvent.getEventType()).isEqualTo(VariableEvents.VARIABLE_UPDATED);
VariableInstance actualEntity = actualEvent.getEntity();
assertThat(actualEntity.getName()).isEqualTo("variableName");
assertThat(actualEntity.getProcessInstanceId()).isEqualTo("processInstanceId");
assertThat(actualEntity.getTaskId()).isEqualTo("taskId");
assertThat(actualEntity.getType()).isEqualTo("integer");
Object actualValue = actualEntity.getValue();
Object actualPreviousValue = actualEvent.getPreviousValue();
assertThat(actualPreviousValue).isSameAs(previousValue);
assertThat(actualValue).isSameAs(value);
assertThat(previousValue).isNotSameAs(value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@
import org.activiti.api.model.shared.event.VariableUpdatedEvent;
import org.activiti.api.runtime.shared.events.VariableEventListener;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.impl.ActivitiVariableEventImpl;
import org.activiti.engine.delegate.event.impl.ActivitiVariableUpdatedEventImpl;
import org.activiti.runtime.api.event.impl.ToVariableUpdatedConverter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -60,12 +59,10 @@ public void setUp() {
@Test
public void onEvent_should_callListenersWhenItsVariableEventAndItsNotFiltered() {
//given
ActivitiVariableEventImpl internalEvent = new ActivitiVariableEventImpl(
ActivitiEventType.VARIABLE_UPDATED);
ActivitiVariableUpdatedEventImpl internalEvent = new ActivitiVariableUpdatedEventImpl();
given(variableEventFilter.shouldEmmitEvent(internalEvent)).willReturn(true);
VariableUpdatedEvent apiEvent = mock(VariableUpdatedEvent.class);
given(converter.from(internalEvent)).willReturn(Optional.of(
apiEvent));
given(converter.from(internalEvent)).willReturn(Optional.of(apiEvent));

//when
variableUpdatedListenerDelegate.onEvent(internalEvent);
Expand All @@ -91,12 +88,10 @@ public void onEvent_shouldNot_callListenersWhenItsNotAVariableEvent() {
@Test
public void onEvent_shouldNot_callListenersWhenItsFiltered() {
//given
ActivitiVariableEventImpl internalEvent = new ActivitiVariableEventImpl(
ActivitiEventType.VARIABLE_UPDATED);
ActivitiVariableUpdatedEventImpl internalEvent = new ActivitiVariableUpdatedEventImpl();
given(variableEventFilter.shouldEmmitEvent(internalEvent)).willReturn(false);
VariableUpdatedEvent apiEvent = mock(VariableUpdatedEvent.class);
given(converter.from(internalEvent)).willReturn(Optional.of(
apiEvent));
given(converter.from(internalEvent)).willReturn(Optional.of(apiEvent));

//when
variableUpdatedListenerDelegate.onEvent(internalEvent);
Expand Down
Loading

0 comments on commit 00c858b

Please sign in to comment.