Skip to content

Commit

Permalink
make chest thread save
Browse files Browse the repository at this point in the history
make thread save
add tests
  • Loading branch information
FabianTerhorst committed Jan 9, 2016
1 parent c5bb209 commit 4c1d771
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import io.fabianterhorst.iron.DataChangeCallback;
import io.fabianterhorst.iron.Iron;
import io.fabianterhorst.iron.IronLoadExtension;

import java.util.Collections;

public class ${keyWrapperClassName} {

public enum Keys {
Expand Down Expand Up @@ -68,7 +70,7 @@ public class ${keyWrapperClassName} {
@Override
public void onResult(${key.className} ${key.key}) {
if(${key.key} != null){
for(${key.className?replace('java.util.ArrayList<', '')?replace('>', '')} object : ${key.key}) {
for(${key.className?replace('java.util.ArrayList<', '')?replace('>', '')} object : Collections.synchronizedList(${key.key})) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Expand Down Expand Up @@ -113,6 +115,16 @@ public class ${keyWrapperClassName} {
}, new ${key.className}());
}
</#if>
<#if key.className?contains('java.util.ArrayList')>
public static void add${key.key?cap_first}(final ${key.className} object){
Iron.chest().execute("${key.key}", new Chest.Transaction<${key.className}>() {
@Override
public void execute(${key.className} objects) {
objects.addAll(object);
}
}, new ${key.className}());
}
</#if>
</#if>
<#if key.listener>
public static <T extends ${key.className}> void addOn${key.key?cap_first}DataChangeListener(DataChangeCallback<T> dataChangeCallback){
Expand Down
25 changes: 25 additions & 0 deletions iron/src/androidTest/java/io/fabianterhorst/iron/DataTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.fabianterhorst.iron;

import android.os.Handler;
import android.os.Looper;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
Expand Down Expand Up @@ -75,6 +77,29 @@ public void testPutGetList() {
assertThat(persons).isEqualTo(inserted);
}

@Test
public void testPutDifferentThreads() {
List<Person> inserted = genPersonList(10000);
Iron.chest().put("persons", inserted);
new Thread(new Runnable() {
@Override
public void run() {
List<Person> inserted = genPersonList(10000);
Iron.chest().put("persons", inserted);
}
}).start();
Runnable runnable = new Runnable(){
@Override
public void run() {
List<Person> inserted = genPersonList(10000);
Iron.chest().put("persons", inserted);
}
};
Handler handler = new Handler(Looper.getMainLooper());
handler.post(runnable);
Iron.chest().put("persons", inserted);
}

@Test
public void testPutMap() {
final Map<Integer, Person> inserted = genPersonMap(10000);
Expand Down
18 changes: 9 additions & 9 deletions iron/src/main/java/io/fabianterhorst/iron/Chest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void destroy() {
* @param <T> object type
* @return this Chest instance
*/
public <T> Chest write(String key, T value) {
synchronized public <T> Chest write(String key, T value) {
if (value == null) {
throw new IronException("Iron doesn't support writing null root values");
} else {
Expand All @@ -53,7 +53,7 @@ public <T> Chest write(String key, T value) {
return this;
}

public <T> Chest write(Class clazz, T value) {
synchronized public <T> Chest write(Class clazz, T value) {
write(clazz.getName(), value);
return this;
}
Expand All @@ -66,7 +66,7 @@ public <T> Chest write(Class clazz, T value) {
* @param <T> object type
* @return this Chest instance
*/
public <T> Chest put(String key, T value) {
synchronized public <T> Chest put(String key, T value) {
AsyncTask<Object, Void, Void> task = new AsyncTask<Object, Void, Void>() {

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -107,7 +107,7 @@ public <T> void get(String key, ReadCallback<T> readCallback) {
* @param readCallback callback that return the readed object
* @param defaultObject return the defaultObject if readed object is null
*/
public <T> void get(String key, ReadCallback<T> readCallback, Object defaultObject) {
synchronized public <T> void get(String key, ReadCallback<T> readCallback, Object defaultObject) {
AsyncTask<Object, Void, T> task = new AsyncTask<Object, Void, T>() {

protected ReadCallback<T> mReadCallback;
Expand All @@ -130,7 +130,7 @@ protected void onPostExecute(T value) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key, readCallback, defaultObject);
}

public <T> void execute(String key, Transaction<T> transaction, Object defaultObject) {
synchronized public <T> void execute(String key, Transaction<T> transaction, Object defaultObject) {
AsyncTask<Object, Void, Void> task = new AsyncTask<Object, Void, Void>() {

@Override
Expand All @@ -150,7 +150,7 @@ protected Void doInBackground(Object... objects) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key, transaction, defaultObject);
}

public void remove(String key) {
synchronized public void remove(String key) {
AsyncTask<Object, Void, Void> task = new AsyncTask<Object, Void, Void>() {
@Override
protected Void doInBackground(Object... objects) {
Expand All @@ -162,7 +162,7 @@ protected Void doInBackground(Object... objects) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key);
}

public void removeAll() {
synchronized public void removeAll() {
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
Expand All @@ -173,7 +173,7 @@ protected Void doInBackground(Void... voids) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

public void execute(String key, Transaction transaction) {
synchronized public void execute(String key, Transaction transaction) {
execute(key, transaction, null);
}

Expand Down Expand Up @@ -265,7 +265,7 @@ public void addOnDataChangeListener(DataChangeCallback callback) {
*
* @param object Object with listeners
*/
public void removeListener(Object object) {
synchronized public void removeListener(Object object) {
Iterator<DataChangeCallback> i = mCallbacks.iterator();
while (i.hasNext()) {
DataChangeCallback callback = i.next();
Expand Down

0 comments on commit 4c1d771

Please sign in to comment.