Java 11 support for #984 #987 (l) (#1190)

* Java 11 support: lazy-loading pattern

* Java 11 support: layers pattern

* Java 11 support: leader-election/lazy-loading patterns
This commit is contained in:
Zhang WH 2020-03-23 02:02:45 +08:00 committed by GitHub
parent 0ad67c8726
commit 67edeb806d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 238 additions and 243 deletions

View File

@ -93,7 +93,7 @@ public class App {
initializeData(cakeBakingService); initializeData(cakeBakingService);
// create view and render it // create view and render it
CakeViewImpl cakeView = new CakeViewImpl(cakeBakingService); var cakeView = new CakeViewImpl(cakeBakingService);
cakeView.render(); cakeView.render();
} }
@ -111,17 +111,16 @@ public class App {
cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350)); cakeBakingService.saveNewTopping(new CakeToppingInfo("candies", 350));
cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350)); cakeBakingService.saveNewTopping(new CakeToppingInfo("cherry", 350));
CakeInfo cake1 = var cake1 = new CakeInfo(new CakeToppingInfo("candies", 0), List.of(
new CakeInfo(new CakeToppingInfo("candies", 0), List.of( new CakeLayerInfo("chocolate", 0),
new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("banana", 0),
new CakeLayerInfo("banana", 0), new CakeLayerInfo("strawberry", 0)));
new CakeLayerInfo("strawberry", 0)));
try { try {
cakeBakingService.bakeNewCake(cake1); cakeBakingService.bakeNewCake(cake1);
} catch (CakeBakingException e) { } catch (CakeBakingException e) {
e.printStackTrace(); e.printStackTrace();
} }
CakeInfo cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), List.of( var cake2 = new CakeInfo(new CakeToppingInfo("cherry", 0), List.of(
new CakeLayerInfo("vanilla", 0), new CakeLayerInfo("vanilla", 0),
new CakeLayerInfo("lemon", 0), new CakeLayerInfo("lemon", 0),
new CakeLayerInfo("strawberry", 0))); new CakeLayerInfo("strawberry", 0)));

View File

@ -57,7 +57,7 @@ public class CakeInfo {
* Calculate calories. * Calculate calories.
*/ */
public int calculateTotalCalories() { public int calculateTotalCalories() {
int total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0; var total = cakeToppingInfo != null ? cakeToppingInfo.calories : 0;
total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum(); total += cakeLayerInfos.stream().mapToInt(c -> c.calories).sum();
return total; return total;
} }

View File

@ -60,65 +60,63 @@ public class CakeBakingServiceImpl implements CakeBakingService {
@Override @Override
public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException { public void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException {
List<CakeTopping> allToppings = getAvailableToppingEntities(); var allToppings = getAvailableToppingEntities();
List<CakeTopping> matchingToppings = var matchingToppings =
allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name)) allToppings.stream().filter(t -> t.getName().equals(cakeInfo.cakeToppingInfo.name))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (matchingToppings.isEmpty()) { if (matchingToppings.isEmpty()) {
throw new CakeBakingException(String.format("Topping %s is not available", throw new CakeBakingException(String.format("Topping %s is not available",
cakeInfo.cakeToppingInfo.name)); cakeInfo.cakeToppingInfo.name));
} }
List<CakeLayer> allLayers = getAvailableLayerEntities(); var allLayers = getAvailableLayerEntities();
Set<CakeLayer> foundLayers = new HashSet<>(); Set<CakeLayer> foundLayers = new HashSet<>();
for (CakeLayerInfo info : cakeInfo.cakeLayerInfos) { for (var info : cakeInfo.cakeLayerInfos) {
Optional<CakeLayer> found = var found = allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst();
allLayers.stream().filter(layer -> layer.getName().equals(info.name)).findFirst();
if (!found.isPresent()) { if (!found.isPresent()) {
throw new CakeBakingException(String.format("Layer %s is not available", info.name)); throw new CakeBakingException(String.format("Layer %s is not available", info.name));
} else { } else {
foundLayers.add(found.get()); foundLayers.add(found.get());
} }
} }
CakeToppingDao toppingBean = context.getBean(CakeToppingDao.class); var toppingBean = context.getBean(CakeToppingDao.class);
Optional<CakeTopping> topping = toppingBean.findById( var topping = toppingBean.findById(matchingToppings.iterator().next().getId());
matchingToppings.iterator().next().getId()); var cakeBean = context.getBean(CakeDao.class);
CakeDao cakeBean = context.getBean(CakeDao.class);
if (topping.isPresent()) { if (topping.isPresent()) {
Cake cake = new Cake(); var cake = new Cake();
cake.setTopping(topping.get()); cake.setTopping(topping.get());
cake.setLayers(foundLayers); cake.setLayers(foundLayers);
cakeBean.save(cake); cakeBean.save(cake);
topping.get().setCake(cake); topping.get().setCake(cake);
toppingBean.save(topping.get()); toppingBean.save(topping.get());
CakeLayerDao layerBean = context.getBean(CakeLayerDao.class); var layerBean = context.getBean(CakeLayerDao.class);
for (CakeLayer layer : foundLayers) { for (var layer : foundLayers) {
layer.setCake(cake); layer.setCake(cake);
layerBean.save(layer); layerBean.save(layer);
} }
} else { } else {
throw new CakeBakingException(String.format("Topping %s is not available", throw new CakeBakingException(String.format("Topping %s is not available",
cakeInfo.cakeToppingInfo.name)); cakeInfo.cakeToppingInfo.name));
} }
} }
@Override @Override
public void saveNewTopping(CakeToppingInfo toppingInfo) { public void saveNewTopping(CakeToppingInfo toppingInfo) {
CakeToppingDao bean = context.getBean(CakeToppingDao.class); var bean = context.getBean(CakeToppingDao.class);
bean.save(new CakeTopping(toppingInfo.name, toppingInfo.calories)); bean.save(new CakeTopping(toppingInfo.name, toppingInfo.calories));
} }
@Override @Override
public void saveNewLayer(CakeLayerInfo layerInfo) { public void saveNewLayer(CakeLayerInfo layerInfo) {
CakeLayerDao bean = context.getBean(CakeLayerDao.class); var bean = context.getBean(CakeLayerDao.class);
bean.save(new CakeLayer(layerInfo.name, layerInfo.calories)); bean.save(new CakeLayer(layerInfo.name, layerInfo.calories));
} }
private List<CakeTopping> getAvailableToppingEntities() { private List<CakeTopping> getAvailableToppingEntities() {
CakeToppingDao bean = context.getBean(CakeToppingDao.class); var bean = context.getBean(CakeToppingDao.class);
List<CakeTopping> result = new ArrayList<>(); List<CakeTopping> result = new ArrayList<>();
Iterator<CakeTopping> iterator = bean.findAll().iterator(); var iterator = bean.findAll().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
CakeTopping topping = iterator.next(); var topping = iterator.next();
if (topping.getCake() == null) { if (topping.getCake() == null) {
result.add(topping); result.add(topping);
} }
@ -128,11 +126,11 @@ public class CakeBakingServiceImpl implements CakeBakingService {
@Override @Override
public List<CakeToppingInfo> getAvailableToppings() { public List<CakeToppingInfo> getAvailableToppings() {
CakeToppingDao bean = context.getBean(CakeToppingDao.class); var bean = context.getBean(CakeToppingDao.class);
List<CakeToppingInfo> result = new ArrayList<>(); List<CakeToppingInfo> result = new ArrayList<>();
Iterator<CakeTopping> iterator = bean.findAll().iterator(); var iterator = bean.findAll().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
CakeTopping next = iterator.next(); var next = iterator.next();
if (next.getCake() == null) { if (next.getCake() == null) {
result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories())); result.add(new CakeToppingInfo(next.getId(), next.getName(), next.getCalories()));
} }
@ -141,11 +139,11 @@ public class CakeBakingServiceImpl implements CakeBakingService {
} }
private List<CakeLayer> getAvailableLayerEntities() { private List<CakeLayer> getAvailableLayerEntities() {
CakeLayerDao bean = context.getBean(CakeLayerDao.class); var bean = context.getBean(CakeLayerDao.class);
List<CakeLayer> result = new ArrayList<>(); List<CakeLayer> result = new ArrayList<>();
Iterator<CakeLayer> iterator = bean.findAll().iterator(); var iterator = bean.findAll().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
CakeLayer next = iterator.next(); var next = iterator.next();
if (next.getCake() == null) { if (next.getCake() == null) {
result.add(next); result.add(next);
} }
@ -155,11 +153,11 @@ public class CakeBakingServiceImpl implements CakeBakingService {
@Override @Override
public List<CakeLayerInfo> getAvailableLayers() { public List<CakeLayerInfo> getAvailableLayers() {
CakeLayerDao bean = context.getBean(CakeLayerDao.class); var bean = context.getBean(CakeLayerDao.class);
List<CakeLayerInfo> result = new ArrayList<>(); List<CakeLayerInfo> result = new ArrayList<>();
Iterator<CakeLayer> iterator = bean.findAll().iterator(); var iterator = bean.findAll().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
CakeLayer next = iterator.next(); var next = iterator.next();
if (next.getCake() == null) { if (next.getCake() == null) {
result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories())); result.add(new CakeLayerInfo(next.getId(), next.getName(), next.getCalories()));
} }
@ -169,19 +167,19 @@ public class CakeBakingServiceImpl implements CakeBakingService {
@Override @Override
public List<CakeInfo> getAllCakes() { public List<CakeInfo> getAllCakes() {
CakeDao cakeBean = context.getBean(CakeDao.class); var cakeBean = context.getBean(CakeDao.class);
List<CakeInfo> result = new ArrayList<>(); List<CakeInfo> result = new ArrayList<>();
Iterator<Cake> iterator = cakeBean.findAll().iterator(); var iterator = cakeBean.findAll().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Cake cake = iterator.next(); var cake = iterator.next();
CakeToppingInfo cakeToppingInfo = var cakeToppingInfo =
new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), cake new CakeToppingInfo(cake.getTopping().getId(), cake.getTopping().getName(), cake
.getTopping().getCalories()); .getTopping().getCalories());
List<CakeLayerInfo> cakeLayerInfos = new ArrayList<>(); List<CakeLayerInfo> cakeLayerInfos = new ArrayList<>();
for (CakeLayer layer : cake.getLayers()) { for (var layer : cake.getLayers()) {
cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories())); cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories()));
} }
CakeInfo cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos); var cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos);
result.add(cakeInfo); result.add(cakeInfo);
} }
return result; return result;

View File

@ -45,31 +45,31 @@ public class CakeTest {
@Test @Test
public void testSetId() { public void testSetId() {
final Cake cake = new Cake(); final var cake = new Cake();
assertNull(cake.getId()); assertNull(cake.getId());
final Long expectedId = 1234L; final var expectedId = 1234L;
cake.setId(expectedId); cake.setId(expectedId);
assertEquals(expectedId, cake.getId()); assertEquals(expectedId, cake.getId());
} }
@Test @Test
public void testSetTopping() { public void testSetTopping() {
final Cake cake = new Cake(); final var cake = new Cake();
assertNull(cake.getTopping()); assertNull(cake.getTopping());
final CakeTopping expectedTopping = new CakeTopping("DummyTopping", 1000); final var expectedTopping = new CakeTopping("DummyTopping", 1000);
cake.setTopping(expectedTopping); cake.setTopping(expectedTopping);
assertEquals(expectedTopping, cake.getTopping()); assertEquals(expectedTopping, cake.getTopping());
} }
@Test @Test
public void testSetLayers() { public void testSetLayers() {
final Cake cake = new Cake(); final var cake = new Cake();
assertNotNull(cake.getLayers()); assertNotNull(cake.getLayers());
assertTrue(cake.getLayers().isEmpty()); assertTrue(cake.getLayers().isEmpty());
final Set<CakeLayer> expectedLayers = Set.of( final var expectedLayers = Set.of(
new CakeLayer("layer1", 1000), new CakeLayer("layer1", 1000),
new CakeLayer("layer2", 2000), new CakeLayer("layer2", 2000),
new CakeLayer("layer3", 3000)); new CakeLayer("layer3", 3000));
@ -79,7 +79,7 @@ public class CakeTest {
@Test @Test
public void testAddLayer() { public void testAddLayer() {
final Cake cake = new Cake(); final var cake = new Cake();
assertNotNull(cake.getLayers()); assertNotNull(cake.getLayers());
assertTrue(cake.getLayers().isEmpty()); assertTrue(cake.getLayers().isEmpty());
@ -90,7 +90,7 @@ public class CakeTest {
cake.setLayers(initialLayers); cake.setLayers(initialLayers);
assertEquals(initialLayers, cake.getLayers()); assertEquals(initialLayers, cake.getLayers());
final CakeLayer newLayer = new CakeLayer("layer3", 3000); final var newLayer = new CakeLayer("layer3", 3000);
cake.addLayer(newLayer); cake.addLayer(newLayer);
final Set<CakeLayer> expectedLayers = new HashSet<>(); final Set<CakeLayer> expectedLayers = new HashSet<>();
@ -102,18 +102,18 @@ public class CakeTest {
@Test @Test
public void testToString() { public void testToString() {
final CakeTopping topping = new CakeTopping("topping", 20); final var topping = new CakeTopping("topping", 20);
topping.setId(2345L); topping.setId(2345L);
final CakeLayer layer = new CakeLayer("layer", 100); final var layer = new CakeLayer("layer", 100);
layer.setId(3456L); layer.setId(3456L);
final Cake cake = new Cake(); final var cake = new Cake();
cake.setId(1234L); cake.setId(1234L);
cake.setTopping(topping); cake.setTopping(topping);
cake.addLayer(layer); cake.addLayer(layer);
final String expected = "id=1234 topping=id=2345 name=topping calories=20 " final var expected = "id=1234 topping=id=2345 name=topping calories=20 "
+ "layers=[id=3456 name=layer calories=100]"; + "layers=[id=3456 name=layer calories=100]";
assertEquals(expected, cake.toString()); assertEquals(expected, cake.toString());

View File

@ -38,15 +38,15 @@ public class CakeBakingExceptionTest {
@Test @Test
public void testConstructor() { public void testConstructor() {
final CakeBakingException exception = new CakeBakingException(); final var exception = new CakeBakingException();
assertNull(exception.getMessage()); assertNull(exception.getMessage());
assertNull(exception.getCause()); assertNull(exception.getCause());
} }
@Test @Test
public void testConstructorWithMessage() { public void testConstructorWithMessage() {
final String expectedMessage = "message"; final var expectedMessage = "message";
final CakeBakingException exception = new CakeBakingException(expectedMessage); final var exception = new CakeBakingException(expectedMessage);
assertEquals(expectedMessage, exception.getMessage()); assertEquals(expectedMessage, exception.getMessage());
assertNull(exception.getCause()); assertNull(exception.getCause());
} }

View File

@ -44,19 +44,19 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testLayers() { public void testLayers() {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final List<CakeLayerInfo> initialLayers = service.getAvailableLayers(); final var initialLayers = service.getAvailableLayers();
assertNotNull(initialLayers); assertNotNull(initialLayers);
assertTrue(initialLayers.isEmpty()); assertTrue(initialLayers.isEmpty());
service.saveNewLayer(new CakeLayerInfo("Layer1", 1000)); service.saveNewLayer(new CakeLayerInfo("Layer1", 1000));
service.saveNewLayer(new CakeLayerInfo("Layer2", 2000)); service.saveNewLayer(new CakeLayerInfo("Layer2", 2000));
final List<CakeLayerInfo> availableLayers = service.getAvailableLayers(); final var availableLayers = service.getAvailableLayers();
assertNotNull(availableLayers); assertNotNull(availableLayers);
assertEquals(2, availableLayers.size()); assertEquals(2, availableLayers.size());
for (final CakeLayerInfo layer : availableLayers) { for (final var layer : availableLayers) {
assertNotNull(layer.id); assertNotNull(layer.id);
assertNotNull(layer.name); assertNotNull(layer.name);
assertNotNull(layer.toString()); assertNotNull(layer.toString());
@ -67,19 +67,19 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testToppings() { public void testToppings() {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final List<CakeToppingInfo> initialToppings = service.getAvailableToppings(); final var initialToppings = service.getAvailableToppings();
assertNotNull(initialToppings); assertNotNull(initialToppings);
assertTrue(initialToppings.isEmpty()); assertTrue(initialToppings.isEmpty());
service.saveNewTopping(new CakeToppingInfo("Topping1", 1000)); service.saveNewTopping(new CakeToppingInfo("Topping1", 1000));
service.saveNewTopping(new CakeToppingInfo("Topping2", 2000)); service.saveNewTopping(new CakeToppingInfo("Topping2", 2000));
final List<CakeToppingInfo> availableToppings = service.getAvailableToppings(); final var availableToppings = service.getAvailableToppings();
assertNotNull(availableToppings); assertNotNull(availableToppings);
assertEquals(2, availableToppings.size()); assertEquals(2, availableToppings.size());
for (final CakeToppingInfo topping : availableToppings) { for (final var topping : availableToppings) {
assertNotNull(topping.id); assertNotNull(topping.id);
assertNotNull(topping.name); assertNotNull(topping.name);
assertNotNull(topping.toString()); assertNotNull(topping.toString());
@ -90,20 +90,20 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testBakeCakes() throws CakeBakingException { public void testBakeCakes() throws CakeBakingException {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final List<CakeInfo> initialCakes = service.getAllCakes(); final var initialCakes = service.getAllCakes();
assertNotNull(initialCakes); assertNotNull(initialCakes);
assertTrue(initialCakes.isEmpty()); assertTrue(initialCakes.isEmpty());
final CakeToppingInfo topping1 = new CakeToppingInfo("Topping1", 1000); final var topping1 = new CakeToppingInfo("Topping1", 1000);
final CakeToppingInfo topping2 = new CakeToppingInfo("Topping2", 2000); final var topping2 = new CakeToppingInfo("Topping2", 2000);
service.saveNewTopping(topping1); service.saveNewTopping(topping1);
service.saveNewTopping(topping2); service.saveNewTopping(topping2);
final CakeLayerInfo layer1 = new CakeLayerInfo("Layer1", 1000); final var layer1 = new CakeLayerInfo("Layer1", 1000);
final CakeLayerInfo layer2 = new CakeLayerInfo("Layer2", 2000); final var layer2 = new CakeLayerInfo("Layer2", 2000);
final CakeLayerInfo layer3 = new CakeLayerInfo("Layer3", 2000); final var layer3 = new CakeLayerInfo("Layer3", 2000);
service.saveNewLayer(layer1); service.saveNewLayer(layer1);
service.saveNewLayer(layer2); service.saveNewLayer(layer2);
service.saveNewLayer(layer3); service.saveNewLayer(layer3);
@ -111,10 +111,10 @@ public class CakeBakingServiceImplTest {
service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2))); service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, layer2)));
service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer3))); service.bakeNewCake(new CakeInfo(topping2, Collections.singletonList(layer3)));
final List<CakeInfo> allCakes = service.getAllCakes(); final var allCakes = service.getAllCakes();
assertNotNull(allCakes); assertNotNull(allCakes);
assertEquals(2, allCakes.size()); assertEquals(2, allCakes.size());
for (final CakeInfo cakeInfo : allCakes) { for (final var cakeInfo : allCakes) {
assertNotNull(cakeInfo.id); assertNotNull(cakeInfo.id);
assertNotNull(cakeInfo.cakeToppingInfo); assertNotNull(cakeInfo.cakeToppingInfo);
assertNotNull(cakeInfo.cakeLayerInfos); assertNotNull(cakeInfo.cakeLayerInfos);
@ -127,14 +127,14 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testBakeCakeMissingTopping() { public void testBakeCakeMissingTopping() {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final CakeLayerInfo layer1 = new CakeLayerInfo("Layer1", 1000); final var layer1 = new CakeLayerInfo("Layer1", 1000);
final CakeLayerInfo layer2 = new CakeLayerInfo("Layer2", 2000); final var layer2 = new CakeLayerInfo("Layer2", 2000);
service.saveNewLayer(layer1); service.saveNewLayer(layer1);
service.saveNewLayer(layer2); service.saveNewLayer(layer2);
final CakeToppingInfo missingTopping = new CakeToppingInfo("Topping1", 1000); final var missingTopping = new CakeToppingInfo("Topping1", 1000);
assertThrows(CakeBakingException.class, () -> { assertThrows(CakeBakingException.class, () -> {
service.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2))); service.bakeNewCake(new CakeInfo(missingTopping, List.of(layer1, layer2)));
}); });
@ -142,19 +142,19 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testBakeCakeMissingLayer() { public void testBakeCakeMissingLayer() {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final List<CakeInfo> initialCakes = service.getAllCakes(); final var initialCakes = service.getAllCakes();
assertNotNull(initialCakes); assertNotNull(initialCakes);
assertTrue(initialCakes.isEmpty()); assertTrue(initialCakes.isEmpty());
final CakeToppingInfo topping1 = new CakeToppingInfo("Topping1", 1000); final var topping1 = new CakeToppingInfo("Topping1", 1000);
service.saveNewTopping(topping1); service.saveNewTopping(topping1);
final CakeLayerInfo layer1 = new CakeLayerInfo("Layer1", 1000); final var layer1 = new CakeLayerInfo("Layer1", 1000);
service.saveNewLayer(layer1); service.saveNewLayer(layer1);
final CakeLayerInfo missingLayer = new CakeLayerInfo("Layer2", 2000); final var missingLayer = new CakeLayerInfo("Layer2", 2000);
assertThrows(CakeBakingException.class, () -> { assertThrows(CakeBakingException.class, () -> {
service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer))); service.bakeNewCake(new CakeInfo(topping1, List.of(layer1, missingLayer)));
}); });
@ -162,19 +162,19 @@ public class CakeBakingServiceImplTest {
@Test @Test
public void testBakeCakesUsedLayer() throws CakeBakingException { public void testBakeCakesUsedLayer() throws CakeBakingException {
final CakeBakingServiceImpl service = new CakeBakingServiceImpl(); final var service = new CakeBakingServiceImpl();
final List<CakeInfo> initialCakes = service.getAllCakes(); final var initialCakes = service.getAllCakes();
assertNotNull(initialCakes); assertNotNull(initialCakes);
assertTrue(initialCakes.isEmpty()); assertTrue(initialCakes.isEmpty());
final CakeToppingInfo topping1 = new CakeToppingInfo("Topping1", 1000); final var topping1 = new CakeToppingInfo("Topping1", 1000);
final CakeToppingInfo topping2 = new CakeToppingInfo("Topping2", 2000); final var topping2 = new CakeToppingInfo("Topping2", 2000);
service.saveNewTopping(topping1); service.saveNewTopping(topping1);
service.saveNewTopping(topping2); service.saveNewTopping(topping2);
final CakeLayerInfo layer1 = new CakeLayerInfo("Layer1", 1000); final var layer1 = new CakeLayerInfo("Layer1", 1000);
final CakeLayerInfo layer2 = new CakeLayerInfo("Layer2", 2000); final var layer2 = new CakeLayerInfo("Layer2", 2000);
service.saveNewLayer(layer1); service.saveNewLayer(layer1);
service.saveNewLayer(layer2); service.saveNewLayer(layer2);

View File

@ -68,18 +68,18 @@ public class CakeViewImplTest {
@Test @Test
public void testRender() { public void testRender() {
final List<CakeLayerInfo> layers = List.of( final var layers = List.of(
new CakeLayerInfo("layer1", 1000), new CakeLayerInfo("layer1", 1000),
new CakeLayerInfo("layer2", 2000), new CakeLayerInfo("layer2", 2000),
new CakeLayerInfo("layer3", 3000)); new CakeLayerInfo("layer3", 3000));
final CakeInfo cake = new CakeInfo(new CakeToppingInfo("topping", 1000), layers); final var cake = new CakeInfo(new CakeToppingInfo("topping", 1000), layers);
final List<CakeInfo> cakes = List.of(cake); final var cakes = List.of(cake);
final CakeBakingService bakingService = mock(CakeBakingService.class); final var bakingService = mock(CakeBakingService.class);
when(bakingService.getAllCakes()).thenReturn(cakes); when(bakingService.getAllCakes()).thenReturn(cakes);
final CakeViewImpl cakeView = new CakeViewImpl(bakingService); final var cakeView = new CakeViewImpl(bakingService);
assertEquals(0, appender.getLogSize()); assertEquals(0, appender.getLogSize());

View File

@ -46,18 +46,18 @@ public class App {
public static void main(String[] args) { public static void main(String[] args) {
// Simple lazy loader - not thread safe // Simple lazy loader - not thread safe
HolderNaive holderNaive = new HolderNaive(); var holderNaive = new HolderNaive();
Heavy heavy = holderNaive.getHeavy(); var heavy = holderNaive.getHeavy();
LOGGER.info("heavy={}", heavy); LOGGER.info("heavy={}", heavy);
// Thread safe lazy loader, but with heavy synchronization on each access // Thread safe lazy loader, but with heavy synchronization on each access
HolderThreadSafe holderThreadSafe = new HolderThreadSafe(); var holderThreadSafe = new HolderThreadSafe();
Heavy another = holderThreadSafe.getHeavy(); var another = holderThreadSafe.getHeavy();
LOGGER.info("another={}", another); LOGGER.info("another={}", another);
// The most efficient lazy loader utilizing Java 8 features // The most efficient lazy loader utilizing Java 8 features
Java8Holder java8Holder = new Java8Holder(); var java8Holder = new Java8Holder();
Heavy next = java8Holder.getHeavy(); var next = java8Holder.getHeavy();
LOGGER.info("next={}", next); LOGGER.info("next={}", next);
} }
} }

View File

@ -36,7 +36,7 @@ public class HolderNaiveTest extends AbstractHolderTest {
@Override @Override
Heavy getInternalHeavyValue() throws Exception { Heavy getInternalHeavyValue() throws Exception {
final Field holderField = HolderNaive.class.getDeclaredField("heavy"); final var holderField = HolderNaive.class.getDeclaredField("heavy");
holderField.setAccessible(true); holderField.setAccessible(true);
return (Heavy) holderField.get(this.holder); return (Heavy) holderField.get(this.holder);
} }

View File

@ -36,7 +36,7 @@ public class HolderThreadSafeTest extends AbstractHolderTest {
@Override @Override
Heavy getInternalHeavyValue() throws Exception { Heavy getInternalHeavyValue() throws Exception {
final Field holderField = HolderThreadSafe.class.getDeclaredField("heavy"); final var holderField = HolderThreadSafe.class.getDeclaredField("heavy");
holderField.setAccessible(true); holderField.setAccessible(true);
return (Heavy) holderField.get(this.holder); return (Heavy) holderField.get(this.holder);
} }

View File

@ -38,16 +38,16 @@ public class Java8HolderTest extends AbstractHolderTest {
@Override @Override
Heavy getInternalHeavyValue() throws Exception { Heavy getInternalHeavyValue() throws Exception {
final Field holderField = Java8Holder.class.getDeclaredField("heavy"); final var holderField = Java8Holder.class.getDeclaredField("heavy");
holderField.setAccessible(true); holderField.setAccessible(true);
final Supplier<Heavy> supplier = (Supplier<Heavy>) holderField.get(this.holder); final var supplier = (Supplier<Heavy>) holderField.get(this.holder);
final Class<? extends Supplier> supplierClass = supplier.getClass(); final var supplierClass = supplier.getClass();
// This is a little fishy, but I don't know another way to test this: // This is a little fishy, but I don't know another way to test this:
// The lazy holder is at first a lambda, but gets replaced with a new supplier after loading ... // The lazy holder is at first a lambda, but gets replaced with a new supplier after loading ...
if (supplierClass.isLocalClass()) { if (supplierClass.isLocalClass()) {
final Field instanceField = supplierClass.getDeclaredField("heavyInstance"); final var instanceField = supplierClass.getDeclaredField("heavyInstance");
instanceField.setAccessible(true); instanceField.setAccessible(true);
return (Heavy) instanceField.get(supplier); return (Heavy) instanceField.get(supplier);
} else { } else {

View File

@ -51,13 +51,13 @@ public abstract class AbstractMessageManager implements MessageManager {
*/ */
protected Instance findNextInstance(int currentId) { protected Instance findNextInstance(int currentId) {
Instance result = null; Instance result = null;
List<Integer> candidateList = instanceMap.keySet() var candidateList = instanceMap.keySet()
.stream() .stream()
.filter((i) -> i > currentId && instanceMap.get(i).isAlive()) .filter((i) -> i > currentId && instanceMap.get(i).isAlive())
.sorted() .sorted()
.collect(Collectors.toList()); .collect(Collectors.toList());
if (candidateList.isEmpty()) { if (candidateList.isEmpty()) {
int index = instanceMap.keySet() var index = instanceMap.keySet()
.stream() .stream()
.filter((i) -> instanceMap.get(i).isAlive()) .filter((i) -> instanceMap.get(i).isAlive())
.sorted() .sorted()
@ -65,7 +65,7 @@ public abstract class AbstractMessageManager implements MessageManager {
.get(0); .get(0);
result = instanceMap.get(index); result = instanceMap.get(index);
} else { } else {
int index = candidateList.get(0); var index = candidateList.get(0);
result = instanceMap.get(index); result = instanceMap.get(index);
} }
return result; return result;

View File

@ -66,7 +66,7 @@ public class Message {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
Message message = (Message) o; var message = (Message) o;
return type == message.type && Objects.equals(content, message.content); return type == message.type && Objects.equals(content, message.content);
} }

View File

@ -43,13 +43,13 @@ public class BullyApp {
public static void main(String[] args) { public static void main(String[] args) {
Map<Integer, Instance> instanceMap = new HashMap<>(); Map<Integer, Instance> instanceMap = new HashMap<>();
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
BullyInstance instance1 = new BullyInstance(messageManager, 1, 1); var instance1 = new BullyInstance(messageManager, 1, 1);
BullyInstance instance2 = new BullyInstance(messageManager, 2, 1); var instance2 = new BullyInstance(messageManager, 2, 1);
BullyInstance instance3 = new BullyInstance(messageManager, 3, 1); var instance3 = new BullyInstance(messageManager, 3, 1);
BullyInstance instance4 = new BullyInstance(messageManager, 4, 1); var instance4 = new BullyInstance(messageManager, 4, 1);
BullyInstance instance5 = new BullyInstance(messageManager, 5, 1); var instance5 = new BullyInstance(messageManager, 5, 1);
instanceMap.put(1, instance1); instanceMap.put(1, instance1);
instanceMap.put(2, instance2); instanceMap.put(2, instance2);
@ -59,11 +59,11 @@ public class BullyApp {
instance4.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, "")); instance4.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, ""));
final Thread thread1 = new Thread(instance1); final var thread1 = new Thread(instance1);
final Thread thread2 = new Thread(instance2); final var thread2 = new Thread(instance2);
final Thread thread3 = new Thread(instance3); final var thread3 = new Thread(instance3);
final Thread thread4 = new Thread(instance4); final var thread4 = new Thread(instance4);
final Thread thread5 = new Thread(instance5); final var thread5 = new Thread(instance5);
thread1.start(); thread1.start();
thread2.start(); thread2.start();

View File

@ -51,8 +51,8 @@ public class BullyMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendHeartbeatMessage(int leaderId) { public boolean sendHeartbeatMessage(int leaderId) {
Instance leaderInstance = instanceMap.get(leaderId); var leaderInstance = instanceMap.get(leaderId);
boolean alive = leaderInstance.isAlive(); var alive = leaderInstance.isAlive();
return alive; return alive;
} }
@ -65,13 +65,12 @@ public class BullyMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendElectionMessage(int currentId, String content) { public boolean sendElectionMessage(int currentId, String content) {
List<Integer> candidateList = findElectionCandidateInstanceList(currentId); var candidateList = findElectionCandidateInstanceList(currentId);
if (candidateList.isEmpty()) { if (candidateList.isEmpty()) {
return true; return true;
} else { } else {
Message electionMessage = new Message(MessageType.ELECTION_INVOKE, ""); var electionMessage = new Message(MessageType.ELECTION_INVOKE, "");
candidateList.stream() candidateList.stream().forEach((i) -> instanceMap.get(i).onMessage(electionMessage));
.forEach((i) -> instanceMap.get(i).onMessage(electionMessage));
return false; return false;
} }
} }
@ -85,7 +84,7 @@ public class BullyMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendLeaderMessage(int currentId, int leaderId) { public boolean sendLeaderMessage(int currentId, int leaderId) {
Message leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId)); var leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
instanceMap.keySet() instanceMap.keySet()
.stream() .stream()
.filter((i) -> i != currentId) .filter((i) -> i != currentId)
@ -100,8 +99,8 @@ public class BullyMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public void sendHeartbeatInvokeMessage(int currentId) { public void sendHeartbeatInvokeMessage(int currentId) {
Instance nextInstance = this.findNextInstance(currentId); var nextInstance = this.findNextInstance(currentId);
Message heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, ""); var heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
nextInstance.onMessage(heartbeatInvokeMessage); nextInstance.onMessage(heartbeatInvokeMessage);
} }

View File

@ -43,13 +43,13 @@ public class RingApp {
public static void main(String[] args) { public static void main(String[] args) {
Map<Integer, Instance> instanceMap = new HashMap<>(); Map<Integer, Instance> instanceMap = new HashMap<>();
MessageManager messageManager = new RingMessageManager(instanceMap); var messageManager = new RingMessageManager(instanceMap);
RingInstance instance1 = new RingInstance(messageManager, 1, 1); var instance1 = new RingInstance(messageManager, 1, 1);
RingInstance instance2 = new RingInstance(messageManager, 2, 1); var instance2 = new RingInstance(messageManager, 2, 1);
RingInstance instance3 = new RingInstance(messageManager, 3, 1); var instance3 = new RingInstance(messageManager, 3, 1);
RingInstance instance4 = new RingInstance(messageManager, 4, 1); var instance4 = new RingInstance(messageManager, 4, 1);
RingInstance instance5 = new RingInstance(messageManager, 5, 1); var instance5 = new RingInstance(messageManager, 5, 1);
instanceMap.put(1, instance1); instanceMap.put(1, instance1);
instanceMap.put(2, instance2); instanceMap.put(2, instance2);
@ -59,11 +59,11 @@ public class RingApp {
instance2.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, "")); instance2.onMessage(new Message(MessageType.HEARTBEAT_INVOKE, ""));
final Thread thread1 = new Thread(instance1); final var thread1 = new Thread(instance1);
final Thread thread2 = new Thread(instance2); final var thread2 = new Thread(instance2);
final Thread thread3 = new Thread(instance3); final var thread3 = new Thread(instance3);
final Thread thread4 = new Thread(instance4); final var thread4 = new Thread(instance4);
final Thread thread5 = new Thread(instance5); final var thread5 = new Thread(instance5);
thread1.start(); thread1.start();
thread2.start(); thread2.start();

View File

@ -62,7 +62,7 @@ public class RingInstance extends AbstractInstance {
@Override @Override
protected void handleHeartbeatInvokeMessage() { protected void handleHeartbeatInvokeMessage() {
try { try {
boolean isLeaderAlive = messageManager.sendHeartbeatMessage(this.leaderId); var isLeaderAlive = messageManager.sendHeartbeatMessage(this.leaderId);
if (isLeaderAlive) { if (isLeaderAlive) {
LOGGER.info("Instance " + localId + "- Leader is alive. Start next heartbeat in 5 second."); LOGGER.info("Instance " + localId + "- Leader is alive. Start next heartbeat in 5 second.");
Thread.sleep(HEARTBEAT_INTERVAL); Thread.sleep(HEARTBEAT_INTERVAL);
@ -84,15 +84,14 @@ public class RingInstance extends AbstractInstance {
*/ */
@Override @Override
protected void handleElectionMessage(Message message) { protected void handleElectionMessage(Message message) {
String content = message.getContent(); var content = message.getContent();
LOGGER.info("Instance " + localId + " - Election Message: " + content); LOGGER.info("Instance " + localId + " - Election Message: " + content);
List<Integer> candidateList = var candidateList = Arrays.stream(content.trim().split(","))
Arrays.stream(content.trim().split(",")) .map(Integer::valueOf)
.map(Integer::valueOf) .sorted()
.sorted() .collect(Collectors.toList());
.collect(Collectors.toList());
if (candidateList.contains(localId)) { if (candidateList.contains(localId)) {
int newLeaderId = candidateList.get(0); var newLeaderId = candidateList.get(0);
LOGGER.info("Instance " + localId + " - New leader should be " + newLeaderId + "."); LOGGER.info("Instance " + localId + " - New leader should be " + newLeaderId + ".");
messageManager.sendLeaderMessage(localId, newLeaderId); messageManager.sendLeaderMessage(localId, newLeaderId);
} else { } else {
@ -107,7 +106,7 @@ public class RingInstance extends AbstractInstance {
*/ */
@Override @Override
protected void handleLeaderMessage(Message message) { protected void handleLeaderMessage(Message message) {
int newLeaderId = Integer.valueOf(message.getContent()); var newLeaderId = Integer.valueOf(message.getContent());
if (this.leaderId != newLeaderId) { if (this.leaderId != newLeaderId) {
LOGGER.info("Instance " + localId + " - Update leaderID"); LOGGER.info("Instance " + localId + " - Update leaderID");
this.leaderId = newLeaderId; this.leaderId = newLeaderId;

View File

@ -49,8 +49,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendHeartbeatMessage(int leaderId) { public boolean sendHeartbeatMessage(int leaderId) {
Instance leaderInstance = instanceMap.get(leaderId); var leaderInstance = instanceMap.get(leaderId);
boolean alive = leaderInstance.isAlive(); var alive = leaderInstance.isAlive();
return alive; return alive;
} }
@ -64,8 +64,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendElectionMessage(int currentId, String content) { public boolean sendElectionMessage(int currentId, String content) {
Instance nextInstance = this.findNextInstance(currentId); var nextInstance = this.findNextInstance(currentId);
Message electionMessage = new Message(MessageType.ELECTION, content); var electionMessage = new Message(MessageType.ELECTION, content);
nextInstance.onMessage(electionMessage); nextInstance.onMessage(electionMessage);
return true; return true;
} }
@ -79,8 +79,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public boolean sendLeaderMessage(int currentId, int leaderId) { public boolean sendLeaderMessage(int currentId, int leaderId) {
Instance nextInstance = this.findNextInstance(currentId); var nextInstance = this.findNextInstance(currentId);
Message leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId)); var leaderMessage = new Message(MessageType.LEADER, String.valueOf(leaderId));
nextInstance.onMessage(leaderMessage); nextInstance.onMessage(leaderMessage);
return true; return true;
} }
@ -92,8 +92,8 @@ public class RingMessageManager extends AbstractMessageManager {
*/ */
@Override @Override
public void sendHeartbeatInvokeMessage(int currentId) { public void sendHeartbeatInvokeMessage(int currentId) {
Instance nextInstance = this.findNextInstance(currentId); var nextInstance = this.findNextInstance(currentId);
Message heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, ""); var heartbeatInvokeMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
nextInstance.onMessage(heartbeatInvokeMessage); nextInstance.onMessage(heartbeatInvokeMessage);
} }

View File

@ -34,14 +34,14 @@ public class MessageTest {
@Test @Test
public void testGetType() { public void testGetType() {
Message message = new Message(MessageType.HEARTBEAT, ""); var message = new Message(MessageType.HEARTBEAT, "");
assertEquals(MessageType.HEARTBEAT, message.getType()); assertEquals(MessageType.HEARTBEAT, message.getType());
} }
@Test @Test
public void testGetContent() { public void testGetContent() {
String content = "test"; var content = "test";
Message message = new Message(MessageType.HEARTBEAT, content); var message = new Message(MessageType.HEARTBEAT, content);
assertEquals(content, message.getContent()); assertEquals(content, message.getContent());
} }

View File

@ -39,29 +39,29 @@ public class BullyMessageManagerTest {
@Test @Test
public void testSendHeartbeatMessage() { public void testSendHeartbeatMessage() {
Instance instance1 = new BullyInstance(null, 1, 1); var instance1 = new BullyInstance(null, 1, 1);
Map<Integer, Instance> instanceMap = Map.of(1, instance1); Map<Integer, Instance> instanceMap = Map.of(1, instance1);
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
assertTrue(messageManager.sendHeartbeatMessage(1)); assertTrue(messageManager.sendHeartbeatMessage(1));
} }
@Test @Test
public void testSendElectionMessageNotAccepted() { public void testSendElectionMessageNotAccepted() {
try { try {
Instance instance1 = new BullyInstance(null, 1, 1); var instance1 = new BullyInstance(null, 1, 1);
Instance instance2 = new BullyInstance(null, 1, 2); var instance2 = new BullyInstance(null, 1, 2);
Instance instance3 = new BullyInstance(null, 1, 3); var instance3 = new BullyInstance(null, 1, 3);
Instance instance4 = new BullyInstance(null, 1, 4); var instance4 = new BullyInstance(null, 1, 4);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4);
instance1.setAlive(false); instance1.setAlive(false);
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
boolean result = messageManager.sendElectionMessage(3, "3"); var result = messageManager.sendElectionMessage(3, "3");
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message message2 = ((Queue<Message>) messageQueueField.get(instance2)).poll(); var message2 = ((Queue<Message>) messageQueueField.get(instance2)).poll();
int instance4QueueSize = ((Queue<Message>) messageQueueField.get(instance4)).size(); var instance4QueueSize = ((Queue<Message>) messageQueueField.get(instance4)).size();
Message expectedMessage = new Message(MessageType.ELECTION_INVOKE, ""); var expectedMessage = new Message(MessageType.ELECTION_INVOKE, "");
assertEquals(message2, expectedMessage); assertEquals(message2, expectedMessage);
assertEquals(instance4QueueSize, 0); assertEquals(instance4QueueSize, 0);
assertEquals(result, false); assertEquals(result, false);
@ -72,34 +72,34 @@ public class BullyMessageManagerTest {
@Test @Test
public void testElectionMessageAccepted() { public void testElectionMessageAccepted() {
Instance instance1 = new BullyInstance(null, 1, 1); var instance1 = new BullyInstance(null, 1, 1);
Instance instance2 = new BullyInstance(null, 1, 2); var instance2 = new BullyInstance(null, 1, 2);
Instance instance3 = new BullyInstance(null, 1, 3); var instance3 = new BullyInstance(null, 1, 3);
Instance instance4 = new BullyInstance(null, 1, 4); var instance4 = new BullyInstance(null, 1, 4);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4);
instance1.setAlive(false); instance1.setAlive(false);
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
boolean result = messageManager.sendElectionMessage(2, "2"); var result = messageManager.sendElectionMessage(2, "2");
assertEquals(result, true); assertEquals(result, true);
} }
@Test @Test
public void testSendLeaderMessage() { public void testSendLeaderMessage() {
try { try {
Instance instance1 = new BullyInstance(null, 1, 1); var instance1 = new BullyInstance(null, 1, 1);
Instance instance2 = new BullyInstance(null, 1, 2); var instance2 = new BullyInstance(null, 1, 2);
Instance instance3 = new BullyInstance(null, 1, 3); var instance3 = new BullyInstance(null, 1, 3);
Instance instance4 = new BullyInstance(null, 1, 4); var instance4 = new BullyInstance(null, 1, 4);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3, 4, instance4);
instance1.setAlive(false); instance1.setAlive(false);
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
messageManager.sendLeaderMessage(2, 2); messageManager.sendLeaderMessage(2, 2);
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message message3 = ((Queue<Message>) messageQueueField.get(instance3)).poll(); var message3 = ((Queue<Message>) messageQueueField.get(instance3)).poll();
Message message4 = ((Queue<Message>) messageQueueField.get(instance4)).poll(); var message4 = ((Queue<Message>) messageQueueField.get(instance4)).poll();
Message expectedMessage = new Message(MessageType.LEADER, "2"); var expectedMessage = new Message(MessageType.LEADER, "2");
assertEquals(message3, expectedMessage); assertEquals(message3, expectedMessage);
assertEquals(message4, expectedMessage); assertEquals(message4, expectedMessage);
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
@ -110,17 +110,17 @@ public class BullyMessageManagerTest {
@Test @Test
public void testSendHeartbeatInvokeMessage() { public void testSendHeartbeatInvokeMessage() {
try { try {
Instance instance1 = new BullyInstance(null, 1, 1); var instance1 = new BullyInstance(null, 1, 1);
Instance instance2 = new BullyInstance(null, 1, 2); var instance2 = new BullyInstance(null, 1, 2);
Instance instance3 = new BullyInstance(null, 1, 3); var instance3 = new BullyInstance(null, 1, 3);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3);
MessageManager messageManager = new BullyMessageManager(instanceMap); var messageManager = new BullyMessageManager(instanceMap);
messageManager.sendHeartbeatInvokeMessage(2); messageManager.sendHeartbeatInvokeMessage(2);
Message message = new Message(MessageType.HEARTBEAT_INVOKE, ""); var message = new Message(MessageType.HEARTBEAT_INVOKE, "");
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message messageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll(); var messageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll();
assertEquals(messageSent.getType(), message.getType()); assertEquals(messageSent.getType(), message.getType());
assertEquals(messageSent.getContent(), message.getContent()); assertEquals(messageSent.getContent(), message.getContent());
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {

View File

@ -41,11 +41,11 @@ public class BullyinstanceTest {
@Test @Test
public void testOnMessage() { public void testOnMessage() {
try { try {
final BullyInstance bullyInstance = new BullyInstance(null, 1, 1); final var bullyInstance = new BullyInstance(null, 1, 1);
Message bullyMessage = new Message(MessageType.HEARTBEAT, ""); var bullyMessage = new Message(MessageType.HEARTBEAT, "");
bullyInstance.onMessage(bullyMessage); bullyInstance.onMessage(bullyMessage);
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
assertEquals(bullyMessage, ((Queue<Message>) messageQueueField.get(bullyInstance)).poll()); assertEquals(bullyMessage, ((Queue<Message>) messageQueueField.get(bullyInstance)).poll());
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
@ -57,9 +57,9 @@ public class BullyinstanceTest {
@Test @Test
public void testIsAlive() { public void testIsAlive() {
try { try {
final BullyInstance bullyInstance = new BullyInstance(null, 1, 1); final var bullyInstance = new BullyInstance(null, 1, 1);
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field aliveField = instanceClass.getDeclaredField("alive"); var aliveField = instanceClass.getDeclaredField("alive");
aliveField.setAccessible(true); aliveField.setAccessible(true);
aliveField.set(bullyInstance, false); aliveField.set(bullyInstance, false);
assertFalse(bullyInstance.isAlive()); assertFalse(bullyInstance.isAlive());
@ -70,7 +70,7 @@ public class BullyinstanceTest {
@Test @Test
public void testSetAlive() { public void testSetAlive() {
final BullyInstance bullyInstance = new BullyInstance(null, 1, 1); final var bullyInstance = new BullyInstance(null, 1, 1);
bullyInstance.setAlive(false); bullyInstance.setAlive(false);
assertFalse(bullyInstance.isAlive()); assertFalse(bullyInstance.isAlive());
} }

View File

@ -41,11 +41,11 @@ public class RingInstanceTest {
@Test @Test
public void testOnMessage() { public void testOnMessage() {
try { try {
final RingInstance ringInstance = new RingInstance(null, 1, 1); final var ringInstance = new RingInstance(null, 1, 1);
Message ringMessage = new Message(MessageType.HEARTBEAT, ""); var ringMessage = new Message(MessageType.HEARTBEAT, "");
ringInstance.onMessage(ringMessage); ringInstance.onMessage(ringMessage);
Class ringInstanceClass = AbstractInstance.class; var ringInstanceClass = AbstractInstance.class;
Field messageQueueField = ringInstanceClass.getDeclaredField("messageQueue"); var messageQueueField = ringInstanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
assertEquals(ringMessage, ((Queue<Message>) messageQueueField.get(ringInstance)).poll()); assertEquals(ringMessage, ((Queue<Message>) messageQueueField.get(ringInstance)).poll());
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
@ -56,9 +56,9 @@ public class RingInstanceTest {
@Test @Test
public void testIsAlive() { public void testIsAlive() {
try { try {
final RingInstance ringInstance = new RingInstance(null, 1, 1); final var ringInstance = new RingInstance(null, 1, 1);
Class ringInstanceClass = AbstractInstance.class; var ringInstanceClass = AbstractInstance.class;
Field aliveField = ringInstanceClass.getDeclaredField("alive"); var aliveField = ringInstanceClass.getDeclaredField("alive");
aliveField.setAccessible(true); aliveField.setAccessible(true);
aliveField.set(ringInstance, false); aliveField.set(ringInstance, false);
assertFalse(ringInstance.isAlive()); assertFalse(ringInstance.isAlive());
@ -69,7 +69,7 @@ public class RingInstanceTest {
@Test @Test
public void testSetAlive() { public void testSetAlive() {
final RingInstance ringInstance = new RingInstance(null, 1, 1); final var ringInstance = new RingInstance(null, 1, 1);
ringInstance.setAlive(false); ringInstance.setAlive(false);
assertFalse(ringInstance.isAlive()); assertFalse(ringInstance.isAlive());
} }

View File

@ -39,27 +39,27 @@ public class RingMessageManagerTest {
@Test @Test
public void testSendHeartbeatMessage() { public void testSendHeartbeatMessage() {
Instance instance1 = new RingInstance(null, 1, 1); var instance1 = new RingInstance(null, 1, 1);
Map<Integer, Instance> instanceMap = Map.of(1, instance1); Map<Integer, Instance> instanceMap = Map.of(1, instance1);
MessageManager messageManager = new RingMessageManager(instanceMap); var messageManager = new RingMessageManager(instanceMap);
assertTrue(messageManager.sendHeartbeatMessage(1)); assertTrue(messageManager.sendHeartbeatMessage(1));
} }
@Test @Test
public void testSendElectionMessage() { public void testSendElectionMessage() {
try { try {
Instance instance1 = new RingInstance(null, 1, 1); var instance1 = new RingInstance(null, 1, 1);
Instance instance2 = new RingInstance(null, 1, 2); var instance2 = new RingInstance(null, 1, 2);
Instance instance3 = new RingInstance(null, 1, 3); var instance3 = new RingInstance(null, 1, 3);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3);
MessageManager messageManager = new RingMessageManager(instanceMap); var messageManager = new RingMessageManager(instanceMap);
String messageContent = "2"; var messageContent = "2";
messageManager.sendElectionMessage(2, messageContent); messageManager.sendElectionMessage(2, messageContent);
Message ringMessage = new Message(MessageType.ELECTION, messageContent); var ringMessage = new Message(MessageType.ELECTION, messageContent);
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll(); var ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll();
assertEquals(ringMessageSent.getType(), ringMessage.getType()); assertEquals(ringMessageSent.getType(), ringMessage.getType());
assertEquals(ringMessageSent.getContent(), ringMessage.getContent()); assertEquals(ringMessageSent.getContent(), ringMessage.getContent());
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
@ -70,18 +70,18 @@ public class RingMessageManagerTest {
@Test @Test
public void testSendLeaderMessage() { public void testSendLeaderMessage() {
try { try {
Instance instance1 = new RingInstance(null, 1, 1); var instance1 = new RingInstance(null, 1, 1);
Instance instance2 = new RingInstance(null, 1, 2); var instance2 = new RingInstance(null, 1, 2);
Instance instance3 = new RingInstance(null, 1, 3); var instance3 = new RingInstance(null, 1, 3);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3);
MessageManager messageManager = new RingMessageManager(instanceMap); var messageManager = new RingMessageManager(instanceMap);
String messageContent = "3"; var messageContent = "3";
messageManager.sendLeaderMessage(2, 3); messageManager.sendLeaderMessage(2, 3);
Message ringMessage = new Message(MessageType.LEADER, messageContent); var ringMessage = new Message(MessageType.LEADER, messageContent);
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll(); var ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll();
assertEquals(ringMessageSent, ringMessage); assertEquals(ringMessageSent, ringMessage);
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
fail("Error to access private field."); fail("Error to access private field.");
@ -91,17 +91,17 @@ public class RingMessageManagerTest {
@Test @Test
public void testSendHeartbeatInvokeMessage() { public void testSendHeartbeatInvokeMessage() {
try { try {
Instance instance1 = new RingInstance(null, 1, 1); var instance1 = new RingInstance(null, 1, 1);
Instance instance2 = new RingInstance(null, 1, 2); var instance2 = new RingInstance(null, 1, 2);
Instance instance3 = new RingInstance(null, 1, 3); var instance3 = new RingInstance(null, 1, 3);
Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3); Map<Integer, Instance> instanceMap = Map.of(1, instance1, 2, instance2, 3, instance3);
MessageManager messageManager = new RingMessageManager(instanceMap); var messageManager = new RingMessageManager(instanceMap);
messageManager.sendHeartbeatInvokeMessage(2); messageManager.sendHeartbeatInvokeMessage(2);
Message ringMessage = new Message(MessageType.HEARTBEAT_INVOKE, ""); var ringMessage = new Message(MessageType.HEARTBEAT_INVOKE, "");
Class instanceClass = AbstractInstance.class; var instanceClass = AbstractInstance.class;
Field messageQueueField = instanceClass.getDeclaredField("messageQueue"); var messageQueueField = instanceClass.getDeclaredField("messageQueue");
messageQueueField.setAccessible(true); messageQueueField.setAccessible(true);
Message ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll(); var ringMessageSent = ((Queue<Message>) messageQueueField.get(instance3)).poll();
assertEquals(ringMessageSent.getType(), ringMessage.getType()); assertEquals(ringMessageSent.getType(), ringMessage.getType());
assertEquals(ringMessageSent.getContent(), ringMessage.getContent()); assertEquals(ringMessageSent.getContent(), ringMessage.getContent());
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {