From 24f731083cd2be0c8d76e0196609f367ae37adaf Mon Sep 17 00:00:00 2001 From: Zackkogan Date: Mon, 2 Apr 2018 22:49:53 -0400 Subject: [PATCH 1/2] Implement Shadow Writes Adds code for shadow writes. --- .../petclinic/newDataStore/NewOwnerStore.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java b/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java index 48beb2900..cbe9c272a 100644 --- a/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java +++ b/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java @@ -37,4 +37,16 @@ public class NewOwnerStore { public Map getNewOwnerStore() { return this.ownerStore; } + + public void save(Owner owner){ + //actual write to datastore + owners.save(owner); + //shadow write to new datastore + ownerStore.put(owner.getId(), convertToStaticOwner(owner)); + } + + //this is for testing to introduce inconsistencies + public void testPutInOldDatastoreOnly(Owner owner){ + owners.save(owner); + } } From f4796d5d578c865cdd7c6a3fea3fb61be09a2871 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 2 Apr 2018 23:13:21 -0400 Subject: [PATCH 2/2] Added Consistency Checking Mechanism Consistency checker was added wih tester --- .../petclinic/newDataStore/NewOwnerStore.java | 42 +++++++++++++++---- .../samples/petclinic/owner/StaticOwner.java | 9 ++++ .../newDataStore/NewOwnerStoreTest.java | 21 +++++++--- 3 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java b/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java index 48beb2900..b9ab49c3e 100644 --- a/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java +++ b/src/main/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStore.java @@ -5,6 +5,7 @@ package org.springframework.samples.petclinic.newDataStore; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.springframework.samples.petclinic.owner.Owner; import org.springframework.samples.petclinic.owner.OwnerRepository; @@ -17,19 +18,13 @@ public class NewOwnerStore { public Map ownerStore; private final OwnerRepository owners; + private Collection ownerRepositoryData; public NewOwnerStore(OwnerRepository owners) { this.owners = owners; this.ownerStore = new HashMap<>(); } - public void populateStore() { - Collection ownerRepositoryData = this.owners.findAll(); - for(Owner owner : ownerRepositoryData) { - ownerStore.put(owner.getId(), convertToStaticOwner(owner)); - } - } - public StaticOwner convertToStaticOwner(Owner ownerEntity) { return new StaticOwner(ownerEntity.getAddress(), ownerEntity.getCity(), ownerEntity.getTelephone()); } @@ -37,4 +32,37 @@ public class NewOwnerStore { public Map getNewOwnerStore() { return this.ownerStore; } + + public void forklift() { + Collection ownerRepositoryData = this.owners.findAll(); + for(Owner owner : ownerRepositoryData) { + ownerStore.put(owner.getId(), convertToStaticOwner(owner)); + } + } + + public int checkConsistency() { + int inconsistencies = 0; + + ownerRepositoryData = this.owners.findAll(); + + Iterator iterator = ownerRepositoryData.iterator(); + + for (Integer id: ownerStore.keySet()){ + + if(iterator.hasNext()) { + Owner oldOwner = iterator.next(); + if(id != oldOwner.getId() || !ownerStore.get(id).equals(oldOwner)) { + inconsistencies++; + violation(id, convertToStaticOwner(oldOwner), ownerStore.get(id)); + } + } + } + return inconsistencies; + } + + private void violation(int i, StaticOwner expected, StaticOwner actual) + { + System.out.println("Consistency Violation! \nā€ + ā€œi = ā€ + i + ā€œ\n\t expected = " + + expected.toString() + "\n\t actual = " + actual.toString()); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/owner/StaticOwner.java b/src/main/java/org/springframework/samples/petclinic/owner/StaticOwner.java index 0f9ab2a4a..95afafd6d 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/StaticOwner.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/StaticOwner.java @@ -30,4 +30,13 @@ public class StaticOwner { return telephone; } + public boolean equals (Owner ownerToCompareTo) { + if((this.address != ownerToCompareTo.getAddress())|| (this.city != ownerToCompareTo.getCity()) || + (this.telephone != ownerToCompareTo.getTelephone())) { + return false; + } + else { + return true; + } + } } diff --git a/src/test/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStoreTest.java b/src/test/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStoreTest.java index 7c7c26ca1..2faebb633 100644 --- a/src/test/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStoreTest.java +++ b/src/test/java/org/springframework/samples/petclinic/newDataStore/NewOwnerStoreTest.java @@ -5,6 +5,7 @@ package org.springframework.samples.petclinic.newDataStore; import java.util.Iterator; import java.util.Map; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -25,11 +26,17 @@ public class NewOwnerStoreTest { NewOwnerStore testOwnerStore; - @Test - public void testPopulation() { + Map ownerStore; + + @Before + public void setup() { testOwnerStore = new NewOwnerStore(owner); - testOwnerStore.populateStore(); - Map ownerStore = testOwnerStore.getNewOwnerStore(); + testOwnerStore.forklift(); + ownerStore = testOwnerStore.getNewOwnerStore(); + } + + @Test + public void testForklift() { for (Integer id: ownerStore.keySet()){ @@ -37,8 +44,10 @@ public class NewOwnerStoreTest { String value = ownerStore.get(id).getAddress(); System.out.println(key + " " + value); } - - } + @Test + public void consistencyCheck () { + System.out.println(testOwnerStore.checkConsistency()); + } }