package database;
import java.util.HashMap;
import java.util.Map;
import org.mapdb.Atomic;
import org.mapdb.DB;
import qora.assets.Asset;
import utils.ObserverMessage;
import database.DBSet;
import database.serializer.AssetSerializer;
public class AssetMap extends DBMap<Long, Asset>
{
private Map<Integer, Integer> observableData = new HashMap<Integer, Integer>();
private Atomic.Long atomicKey;
private long key;
public AssetMap(DBSet databaseSet, DB database)
{
super(databaseSet, database);
this.atomicKey = database.getAtomicLong("assets_key");
this.key = this.atomicKey.get();
this.observableData.put(DBMap.NOTIFY_ADD, ObserverMessage.ADD_ASSET_TYPE);
this.observableData.put(DBMap.NOTIFY_REMOVE, ObserverMessage.REMOVE_ASSET_TYPE);
this.observableData.put(DBMap.NOTIFY_LIST, ObserverMessage.LIST_ASSET_TYPE);
}
public AssetMap(AssetMap parent)
{
super(parent);
this.key = this.getKey();
}
protected long getKey()
{
return this.key;
}
protected void createIndexes(DB database){}
@Override
protected Map<Long, Asset> getMap(DB database)
{
//OPEN MAP
return database.createTreeMap("assets")
.valueSerializer(new AssetSerializer())
.makeOrGet();
}
@Override
protected Map<Long, Asset> getMemoryMap()
{
return new HashMap<Long, Asset>();
}
@Override
protected Asset getDefaultValue()
{
return null;
}
@Override
protected Map<Integer, Integer> getObservableData()
{
return this.observableData;
}
public long add(Asset asset)
{
//INCREMENT ATOMIC KEY IF EXISTS
if(this.atomicKey != null)
{
this.atomicKey.incrementAndGet();
}
//INCREMENT KEY
this.key++;
//INSERT WITH NEW KEY
this.set(this.key, asset);
//RETURN KEY
return this.key;
}
public void delete(long key)
{
super.delete(key);
//DECREMENT ATOMIC KEY IF EXISTS
if(this.atomicKey != null)
{
this.atomicKey.decrementAndGet();
}
//DECREMENT KEY
this.key--;
}
}