package org.greengin.sciencetoolkit.common.model; import java.util.Hashtable; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.locks.ReentrantLock; import org.greengin.sciencetoolkit.common.model.serialize.ModelDeserializer; import org.greengin.sciencetoolkit.common.model.serialize.ModelSerializer; import org.greengin.sciencetoolkit.common.model.serialize.ModelVersionManager; import android.content.Context; public abstract class AbstractModelManager implements ModelChangeListener, ModelVersionManager { ReentrantLock lock; Timer timer; int saveDelay; String filename; protected Context applicationContext; protected Hashtable<String, Model> items; protected AbstractModelManager(Context applicationContext, String filename, int saveDelay) { this.applicationContext = applicationContext; this.lock = new ReentrantLock(); this.filename = filename; this.saveDelay = saveDelay; load(); } private void load() { items = ModelDeserializer.xml2modelMap(this, this, applicationContext, filename); } public void forceSave() { this.save(); } private void save() { lock.lock(); ModelSerializer.model2xml(this, items, applicationContext, filename); lock.unlock(); } protected Model get(String key, boolean create) { if (!items.containsKey(key)) { if (create) { Model model = new Model(this); items.put(key, model); model.setString("id", key); return model; } else { return null; } } else { return items.get(key); } } public void remove(String key) { if (items.remove(key) != null) { modelModified(null); } } @Override public void modelModified(Model model) { lock.lock(); if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { timer = null; save(); } }, saveDelay); } lock.unlock(); } }