Fixed remaining failing tests by implementing the replacing of objects
in the filter as required
This commit is contained in:
parent
6fe7cce9fe
commit
1430c9217b
|
@ -118,9 +118,6 @@ public class ObjectFilter {
|
|||
if (ObjectFilter.logger.isDebugEnabled())
|
||||
ObjectFilter.logger.debug("add object " + objectToAdd + " with key " + key);
|
||||
|
||||
// add the key to the set
|
||||
this.keySet.add(key);
|
||||
|
||||
// BEWARE: you fix a bug here, be sure to update BOTH tables on the logic.
|
||||
ObjectCache cached = this.cache.get(objectToAdd);
|
||||
if (cached == null) {
|
||||
|
@ -148,11 +145,30 @@ public class ObjectFilter {
|
|||
case MODIFY:
|
||||
throw new IllegalStateException("Stale State exception: Invalid + after +=");
|
||||
case REMOVE:
|
||||
// replace key if necessary
|
||||
replaceKey(cached.getObject(), objectToAdd);
|
||||
|
||||
// update operation's object
|
||||
cached.setObject(objectToAdd);
|
||||
cached.setOperation(Operation.MODIFY);
|
||||
break;
|
||||
} // switch
|
||||
}// else of object not in cache
|
||||
|
||||
// register the key
|
||||
this.keySet.add(key);
|
||||
}
|
||||
|
||||
private void replaceKey(Object oldObject, Object newObject) {
|
||||
if (oldObject != newObject) {
|
||||
if (ObjectFilter.logger.isDebugEnabled()) {
|
||||
String msg = "Replacing key for object as they are not the same reference: old: {0} / new: {1}";
|
||||
msg = MessageFormat.format(msg, oldObject, newObject);
|
||||
ObjectFilter.logger.warn(msg);
|
||||
}
|
||||
ObjectCache objectCache = this.cache.remove(oldObject);
|
||||
this.cache.put(newObject, objectCache);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -184,9 +200,6 @@ public class ObjectFilter {
|
|||
if (ObjectFilter.logger.isDebugEnabled())
|
||||
ObjectFilter.logger.debug("update object " + objectToUpdate + " with key " + key);
|
||||
|
||||
// add the key to the keyset
|
||||
this.keySet.add(key);
|
||||
|
||||
// BEWARE: you fix a bug here, be sure to update BOTH tables on the logic.
|
||||
ObjectCache cached = this.cache.get(objectToUpdate);
|
||||
if (cached == null) {
|
||||
|
@ -209,15 +222,20 @@ public class ObjectFilter {
|
|||
Operation op = cached.getOperation();
|
||||
switch (op) {
|
||||
case ADD:
|
||||
cached.setObject(objectToUpdate);
|
||||
break;
|
||||
case MODIFY:
|
||||
// replace key if necessary
|
||||
replaceKey(cached.getObject(), objectToUpdate);
|
||||
|
||||
// update operation's object
|
||||
cached.setObject(objectToUpdate);
|
||||
break;
|
||||
case REMOVE:
|
||||
throw new IllegalStateException("Stale State exception: Invalid += after -");
|
||||
} // switch
|
||||
}// else of object not in cache
|
||||
|
||||
// register the key
|
||||
this.keySet.add(key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -249,9 +267,6 @@ public class ObjectFilter {
|
|||
if (ObjectFilter.logger.isDebugEnabled())
|
||||
ObjectFilter.logger.debug("remove object " + objectToRemove + " with key " + key);
|
||||
|
||||
// add the key to the keyset
|
||||
this.keySet.add(key);
|
||||
|
||||
// BEWARE: you fix a bug here, be sure to update BOTH tables on the logic.
|
||||
ObjectCache cached = this.cache.get(objectToRemove);
|
||||
if (cached == null) {
|
||||
|
@ -277,6 +292,10 @@ public class ObjectFilter {
|
|||
this.cache.remove(objectToRemove);
|
||||
break;
|
||||
case MODIFY:
|
||||
// replace key if necessary
|
||||
replaceKey(cached.getObject(), objectToRemove);
|
||||
|
||||
// update operation's object
|
||||
cached.setObject(objectToRemove);
|
||||
cached.setOperation(Operation.REMOVE);
|
||||
break;
|
||||
|
@ -284,6 +303,9 @@ public class ObjectFilter {
|
|||
throw new IllegalStateException("Stale State exception: Invalid - after -");
|
||||
} // switch
|
||||
}
|
||||
|
||||
// register the key
|
||||
this.keySet.add(key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -19,13 +19,14 @@
|
|||
*/
|
||||
package ch.eitchnet.utils.objectfilter;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
/**
|
||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||
*
|
||||
|
@ -208,7 +209,7 @@ public class ObjectFilterTest {
|
|||
filter.update("different_key", myObj);
|
||||
fail("Should have failed because of different key for already registered object");
|
||||
} catch (RuntimeException e) {
|
||||
String msg = "Invalid key provided for object with transaction ID -1 and operation MODIFY: existing key is java.lang.Object, new key is different_key. Object may be present in the same filter instance only once, registered using one key only. Object";
|
||||
String msg = "Object may be present in the same filter instance only once, registered using one key only";
|
||||
assertTrue("Encountered exception: " + e.getMessage(), e.getMessage().contains(msg));
|
||||
}
|
||||
|
||||
|
@ -216,8 +217,79 @@ public class ObjectFilterTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void shouldReplaceInstanceIfObjectIsEqual() {
|
||||
fail("Not yet implemented");
|
||||
public void shouldReplaceOnAddAfterRemove() {
|
||||
|
||||
TestObject obj1 = new TestObject(1);
|
||||
TestObject obj2 = new TestObject(1);
|
||||
assertEquals("Test objects are not equal!", obj1, obj2);
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.remove(Object.class.getName(), obj1);
|
||||
filter.add(Object.class.getName(), obj2);
|
||||
|
||||
testAssertions(filter, 1, 1, 0, 1, 0);
|
||||
|
||||
List<Object> updated = filter.getUpdated(Object.class.getName());
|
||||
Object updatedObj = updated.get(0);
|
||||
String msg = "registered object is not the last operation's object";
|
||||
assertTrue(msg, obj2 == updatedObj);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReplaceOnUpdateAfterAdd() {
|
||||
|
||||
TestObject obj1 = new TestObject(1);
|
||||
TestObject obj2 = new TestObject(1);
|
||||
assertEquals("Test objects are not equal!", obj1, obj2);
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.add(Object.class.getName(), obj1);
|
||||
filter.update(Object.class.getName(), obj2);
|
||||
|
||||
testAssertions(filter, 1, 1, 1, 0, 0);
|
||||
|
||||
List<Object> added = filter.getAdded(Object.class.getName());
|
||||
Object addedObj = added.get(0);
|
||||
String msg = "registered object is not the last operation's object";
|
||||
assertTrue(msg, obj2 == addedObj);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReplaceOnUpdateAfterUpdate() {
|
||||
|
||||
TestObject obj1 = new TestObject(1);
|
||||
TestObject obj2 = new TestObject(1);
|
||||
assertEquals("Test objects are not equal!", obj1, obj2);
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.update(Object.class.getName(), obj1);
|
||||
filter.update(Object.class.getName(), obj2);
|
||||
|
||||
testAssertions(filter, 1, 1, 0, 1, 0);
|
||||
|
||||
List<Object> updated = filter.getUpdated(Object.class.getName());
|
||||
Object updatedObj = updated.get(0);
|
||||
String msg = "registered object is not the last operation's object";
|
||||
assertTrue(msg, obj2 == updatedObj);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReplaceOnRemoveAfterModify() {
|
||||
|
||||
TestObject obj1 = new TestObject(1);
|
||||
TestObject obj2 = new TestObject(1);
|
||||
assertEquals("Test objects are not equal!", obj1, obj2);
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.update(Object.class.getName(), obj1);
|
||||
filter.remove(Object.class.getName(), obj2);
|
||||
|
||||
testAssertions(filter, 1, 1, 0, 0, 1);
|
||||
|
||||
List<Object> removed = filter.getRemoved(Object.class.getName());
|
||||
Object removedObj = removed.get(0);
|
||||
String msg = "registered object is not the last operation's object";
|
||||
assertTrue(msg, obj2 == removedObj);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -231,6 +303,89 @@ public class ObjectFilterTest {
|
|||
testAssertions(filter, 0, 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldClear() {
|
||||
|
||||
Object myObj1 = new Object();
|
||||
Object myObj2 = new Object();
|
||||
Object myObj3 = new Object();
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.add(myObj1);
|
||||
filter.update(myObj2);
|
||||
filter.remove(myObj3);
|
||||
|
||||
filter.clearCache();
|
||||
|
||||
testAssertions(filter, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetAll() {
|
||||
|
||||
Object myObj1 = new Object();
|
||||
Object myObj2 = new Object();
|
||||
Object myObj3 = new Object();
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.add(myObj1);
|
||||
filter.update(myObj2);
|
||||
filter.remove(myObj3);
|
||||
|
||||
testAssertions(filter, 3, 1, 1, 1, 1);
|
||||
|
||||
List<Object> all = filter.getAll(Object.class.getName());
|
||||
assertEquals(3, all.size());
|
||||
assertTrue(all.contains(myObj1));
|
||||
assertTrue(all.contains(myObj2));
|
||||
assertTrue(all.contains(myObj3));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetAdded() {
|
||||
|
||||
Object myObj1 = new Object();
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.add(myObj1);
|
||||
|
||||
testAssertions(filter, 1, 1, 1, 0, 0);
|
||||
|
||||
List<Object> list = filter.getAdded(Object.class.getName());
|
||||
assertEquals(1, list.size());
|
||||
assertTrue(list.contains(myObj1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetUpdated() {
|
||||
|
||||
Object myObj1 = new Object();
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.update(myObj1);
|
||||
|
||||
testAssertions(filter, 1, 1, 0, 1, 0);
|
||||
|
||||
List<Object> list = filter.getUpdated(Object.class.getName());
|
||||
assertEquals(1, list.size());
|
||||
assertTrue(list.contains(myObj1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldGetRemoved() {
|
||||
|
||||
Object myObj1 = new Object();
|
||||
|
||||
ObjectFilter filter = new ObjectFilter();
|
||||
filter.remove(myObj1);
|
||||
|
||||
testAssertions(filter, 1, 1, 0, 0, 1);
|
||||
|
||||
List<Object> list = filter.getRemoved(Object.class.getName());
|
||||
assertEquals(1, list.size());
|
||||
assertTrue(list.contains(myObj1));
|
||||
}
|
||||
|
||||
private void testAssertions(ObjectFilter filter, int size, int sizeKeySet, int added, int updated, int removed) {
|
||||
assertEquals(size, filter.sizeCache());
|
||||
assertEquals(sizeKeySet, filter.sizeKeySet());
|
||||
|
@ -244,4 +399,41 @@ public class ObjectFilterTest {
|
|||
List<Object> removedList = filter.getRemoved(Object.class.getName());
|
||||
assertEquals(removed, removedList.size());
|
||||
}
|
||||
|
||||
private class TestObject {
|
||||
private int id;
|
||||
|
||||
public TestObject(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + getOuterType().hashCode();
|
||||
result = prime * result + id;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
TestObject other = (TestObject) obj;
|
||||
if (!getOuterType().equals(other.getOuterType()))
|
||||
return false;
|
||||
if (id != other.id)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private ObjectFilterTest getOuterType() {
|
||||
return ObjectFilterTest.this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue