Skip to content

Commit

Permalink
implemented proper equals hashcode and clone
Browse files Browse the repository at this point in the history
  • Loading branch information
michelegonella committed Sep 27, 2012
1 parent 336f300 commit 312b237
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import static com.nominanuda.lang.Check.illegalargument;

import static com.nominanuda.dataobject.DataStructHelper.STRUCT;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
Expand All @@ -29,7 +31,6 @@


public abstract class AbstractDataStruct<K> implements DataStruct, PropertyBag<K> {
protected static final DataStructHelper structHelper = new DataStructHelper();
protected final DataStruct parent;

public AbstractDataStruct(DataStruct parent) {
Expand Down Expand Up @@ -89,7 +90,7 @@ public K checkKey(K key) throws IllegalArgumentException {
}

public boolean isPrimitiveOrNull(Object o) {
return structHelper.isPrimitiveOrNull(o);
return STRUCT.isPrimitiveOrNull(o);
}
public DataArray asArray() throws ClassCastException {
return (DataArray)this;
Expand Down Expand Up @@ -131,7 +132,7 @@ public DataObject getObject(K k) throws IllegalArgumentException {
public void setPathProperty(String path, @Nullable Object value) {
String[] pathBits = path.split("\\.");
int len = pathBits.length;
explodePath(path).setProperty(pathBits[len-1], value);
explodePath(path).put(pathBits[len-1], value);
}
public void setOrPushPathProperty(String path, @Nullable Object value) {
String[] pathBits = path.split("\\.");
Expand Down Expand Up @@ -159,14 +160,14 @@ private PropertyBag<Object> explodePath(String path) {
return _target;
}

public void setProperty(Object key, @Nullable Object value) {
private void setProperty(Object key, @Nullable Object value) {
asObjectKeyedDataStruct().put(key, value);
}
public void setOrPushProperty(Object key, @Nullable Object value) {
PropertyBag<Object> _this = asObjectKeyedDataStruct();
if(_this.exists(key)) {
Object cur = _this.get(key);
if(structHelper.isDataArray(cur)) {
if(STRUCT.isDataArray(cur)) {
((DataArray)cur).add(value);
} else {
DataArray darr = new DataArrayImpl();
Expand All @@ -191,10 +192,7 @@ private Object toStringOrIntKey(String s) {
private PropertyBag<Object> asObjectKeyedDataStruct(DataStruct ds) {
return (PropertyBag<Object>)ds;
}
@Override
public String toString() {
return structHelper.toJsonString(this);
}

@SuppressWarnings("unchecked")
public Object getPathSafe(String path) {
PropertyBag<Object> _target = asObjectKeyedDataStruct();
Expand Down Expand Up @@ -308,4 +306,31 @@ public DataObject putObject(K key, DataObject o) {
public DataArray putArray(K key, DataArray o) {
return (DataArray)put(key, o);
}

protected void onMutate() {
json = null;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return STRUCT.clone(this);
}

@Override
public String toString() {
return json != null ? json : STRUCT.toJsonString(this);
}

@Override
public boolean equals(Object obj) {
return STRUCT.equals(this, obj);
}

private String json = null;
@Override
public int hashCode() {
if(json == null) {
json = toString();
}
return json.hashCode();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public Object put(Integer i, Object v) {
Object obj = isPrimitiveOrNull(v)
? v : ((AbstractDataStruct)v).cloneStruct(this);
l.set(ensureRoom(i),obj);
onMutate();
return obj;
}

Expand All @@ -68,10 +69,15 @@ private int ensureRoom(int i) {
}

public Object remove(Integer i) {
return l.remove(i);
Object o = l.remove(i);
if(o != null) {
onMutate();
}
return o;
}

public Object add(Object v) {
onMutate();
return put(getLength(), v);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ private DataObjectImpl(Map<String, ? super Object> o, DataStruct parent) {
public Object put(String k, Object v) {
Object o = cloneInternal(v,this);
m.put(checkKey(k), o);
onMutate();
return o;
}

Expand All @@ -52,7 +53,11 @@ public boolean exists(String k) {
}

public Object remove(String k) {
return m.remove(k);
Object o = m.remove(k);
if(o != null) {
onMutate();
}
return o;
}

public List<String> getKeys() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import com.nominanuda.code.Nullable;

public interface DataStruct {
public interface DataStruct extends Cloneable {
Pattern VALID_OBJ_KEY = Pattern.compile("[\\$_A-Za-z][\\$_A-Za-z0-9]*");
@Deprecated
@Nullable DataStruct getParent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,6 @@ public void setOrPushPathProperty(String path, Object value) {
delegee.setOrPushPathProperty(path, value);
}

public void setProperty(Object key, Object value) {
explode();
delegee.setProperty(key, value);
}

public void setOrPushProperty(Object key, Object value) {
explode();
delegee.setOrPushProperty(key, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,6 @@ public void setOrPushPathProperty(String path, Object value) {
delegee.setOrPushPathProperty(path, value);
}

public void setProperty(Object key, Object value) {
explode();
delegee.setProperty(key, value);
}

public void setOrPushProperty(Object key, Object value) {
explode();
delegee.setOrPushProperty(key, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public interface PropertyBag<K> extends DataStruct {
boolean isPrimitiveOrNull(@Nullable Object o);
void setPathProperty(String path, @Nullable Object value);
void setOrPushPathProperty(String path, @Nullable Object value);
void setProperty(Object key, @Nullable Object value);
//void setProperty(Object key, @Nullable Object value);
void setOrPushProperty(Object key, @Nullable Object value);
Object getPathSafe(String path);
@Nullable String getString(K key) throws ClassCastException;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.nominanuda.dataobject;

import static org.junit.Assert.*;

import java.util.HashSet;

import org.junit.Test;

import static com.nominanuda.dataobject.DataStructHelper.STRUCT;

public class HashCodeEqualsTest {

@Test
public void test1() {
HashSet<DataStruct> s = new HashSet<DataStruct>();
DataObject o1 = STRUCT.newObject();
s.add(o1);
assertEquals(1, s.size());
DataObject o2 = STRUCT.newObject();
s.add(o2);
assertEquals(1, s.size());

}

@Test
public void test2() {
HashSet<DataStruct> s = new HashSet<DataStruct>();
DataObject o1 = STRUCT.newObject().with("a", 1);
s.add(o1);
assertEquals(1, s.size());
DataObject o2 = STRUCT.newObject();
s.add(o2);
assertEquals(2, s.size());

}

@Test
public void test3() {
HashSet<DataStruct> s = new HashSet<DataStruct>();
DataObject o1 = STRUCT.newObject();
s.add(o1);
assertEquals(1, s.size());
o1.with("a", 1);
assertEquals(1, s.size());
assertSame(o1, s.iterator().next());
}

@Test
public void test4() {
HashSet<DataStruct> s = new HashSet<DataStruct>();
DataObject o1 = STRUCT.newObject().with("a", 1);
s.add(o1);
DataObject o2 = STRUCT.newObject();
s.add(o2);
assertTrue(s.contains(o2));
assertEquals(2, s.size());
assertFalse(o1.equals(o2));
o2.with("a", 1);
assertTrue(s.contains(o2));
assertEquals(o1, o2);
assertEquals(2, s.size());
}
}

0 comments on commit 312b237

Please sign in to comment.