From 0f1dbc175d20ba72b6200d8df02f61e7d258ca9b Mon Sep 17 00:00:00 2001 From: John Blum Date: Mon, 27 Apr 2020 14:27:45 -0700 Subject: [PATCH] Introduce the MemberDepartedEvent class extending MembershipEvent to signal when a peer member departs from the distributed system (cluster). --- .../event/support/MemberDepartedEvent.java | 81 +++++++++++++++++++ .../support/MemberDepartedEventUnitTests.java | 69 ++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 apache-geode-extensions/src/main/java/org/springframework/geode/distributed/event/support/MemberDepartedEvent.java create mode 100644 apache-geode-extensions/src/test/java/org/springframework/geode/distributed/event/support/MemberDepartedEventUnitTests.java diff --git a/apache-geode-extensions/src/main/java/org/springframework/geode/distributed/event/support/MemberDepartedEvent.java b/apache-geode-extensions/src/main/java/org/springframework/geode/distributed/event/support/MemberDepartedEvent.java new file mode 100644 index 00000000..ffec983d --- /dev/null +++ b/apache-geode-extensions/src/main/java/org/springframework/geode/distributed/event/support/MemberDepartedEvent.java @@ -0,0 +1,81 @@ +/* + * Copyright 2020 the original author or authors. + * + * 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 + * + * https://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.springframework.geode.distributed.event.support; + +import org.apache.geode.distributed.DistributedMember; +import org.apache.geode.distributed.DistributedSystem; +import org.apache.geode.distributed.internal.DistributionManager; + +import org.springframework.geode.distributed.event.MembershipEvent; + +/** + * {@link MembershipEvent} fired when a {@link DistributedMember} departs from the {@link DistributedSystem}. + * + * @author John Blum + * @see org.apache.geode.distributed.DistributedMember + * @see org.apache.geode.distributed.DistributedSystem + * @see org.springframework.geode.distributed.event.MembershipEvent + * @since 1.3.0 + */ +public class MemberDepartedEvent extends MembershipEvent { + + private boolean crashed = false; + + /** + * Constructs a new instance of {@link MemberDepartedEvent} initialized with the given {@link DistributionManager}. + * + * @param distributionManager {@link DistributionManager} used as the {@link #getSource() source} of this event; + * must not be {@literal null}. + * @throws IllegalArgumentException if {@link DistributionManager} is {@literal null}. + * @see org.apache.geode.distributed.internal.DistributionManager + */ + public MemberDepartedEvent(DistributionManager distributionManager) { + super(distributionManager); + } + + /** + * Determines whether the peer member crashed when it departed from the {@link DistributedSystem} (cluster). + * + * @return a boolean value indicating whether the peer member crashed when it departed + * from the {@link DistributedSystem} (cluster). + */ + public boolean isCrashed() { + return this.crashed; + } + + /** + * Builder method used to configure the {@link #isCrashed()} property indicating whether the peer member crashed + * when it departed from the {@link DistributedSystem}. + * + * @param crashed boolean value indicating whether the peer member crashed. + * @return this {@link MemberDepartedEvent}. + * @see #isCrashed() + */ + public MemberDepartedEvent crashed(boolean crashed) { + + this.crashed = crashed; + + return this; + } + + /** + * @inheritDoc + */ + @Override + public final Type getType() { + return Type.MEMBER_DEPARTED; + } +} diff --git a/apache-geode-extensions/src/test/java/org/springframework/geode/distributed/event/support/MemberDepartedEventUnitTests.java b/apache-geode-extensions/src/test/java/org/springframework/geode/distributed/event/support/MemberDepartedEventUnitTests.java new file mode 100644 index 00000000..1c937d2e --- /dev/null +++ b/apache-geode-extensions/src/test/java/org/springframework/geode/distributed/event/support/MemberDepartedEventUnitTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2020 the original author or authors. + * + * 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 + * + * https://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.springframework.geode.distributed.event.support; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoInteractions; + +import org.junit.Test; + +import org.apache.geode.distributed.internal.DistributionManager; + +import org.springframework.geode.distributed.event.MembershipEvent; + +/** + * Unit Tests for {@link MemberDepartedEvent}. + * + * @author John Blum + * @see org.junit.Test + * @see org.mockito.Mockito + * @see org.springframework.geode.distributed.event.MembershipEvent + * @see org.springframework.geode.distributed.event.support.MemberDepartedEvent + * @since 1.3.0 + */ +public class MemberDepartedEventUnitTests { + + @Test + public void constructMemberDepartedEvent() { + + DistributionManager mockDistributionManager = mock(DistributionManager.class); + + MemberDepartedEvent event = new MemberDepartedEvent(mockDistributionManager); + + assertThat(event).isNotNull(); + assertThat(event.getDistributionManager()).isEqualTo(mockDistributionManager); + assertThat(event.isCrashed()).isFalse(); + assertThat(event.getType()).isEqualTo(MembershipEvent.Type.MEMBER_DEPARTED); + + verifyNoInteractions(mockDistributionManager); + } + + @Test + public void setAndGetCrashed() { + + DistributionManager mockDistributionManager = mock(DistributionManager.class); + + MemberDepartedEvent event = new MemberDepartedEvent(mockDistributionManager); + + assertThat(event).isNotNull(); + assertThat(event.isCrashed()).isFalse(); + assertThat(event.crashed(true)).isEqualTo(event); + assertThat(event.isCrashed()).isTrue(); + assertThat(event.crashed(false)).isEqualTo(event); + assertThat(event.isCrashed()).isFalse(); + } +}