/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.trade;
import io.bitsquare.app.Version;
import io.bitsquare.common.persistance.Persistable;
import io.bitsquare.storage.Storage;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
public final class TradableList<T extends Tradable> extends ArrayList<T> implements Persistable {
// That object is saved to disc. We need to take care of changes to not break deserialization.
private static final long serialVersionUID = Version.LOCAL_DB_VERSION;
private static final Logger log = LoggerFactory.getLogger(TradableList.class);
transient final private Storage<TradableList<T>> storage;
// Use getObservableList() also class locally, to be sure that object exists in case we use the object as deserialized form
transient private ObservableList<T> observableList;
// Superclass is ArrayList, which will be persisted
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
public TradableList(Storage<TradableList<T>> storage, String fileName) {
this.storage = storage;
TradableList<T> persisted = storage.initAndGetPersisted(this, fileName);
if (persisted != null) {
this.addAll(persisted);
}
observableList = FXCollections.observableArrayList(this);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
try {
in.defaultReadObject();
} catch (Throwable t) {
log.warn("Cannot be deserialized." + t.getMessage());
}
}
@Override
public boolean add(T tradable) {
boolean changed = super.add(tradable);
getObservableList().add(tradable);
if (changed)
storage.queueUpForSave();
return changed;
}
@Override
public boolean remove(Object tradable) {
boolean changed = super.remove(tradable);
getObservableList().remove(tradable);
if (changed)
storage.queueUpForSave();
return changed;
}
public ObservableList<T> getObservableList() {
if (observableList == null)
observableList = FXCollections.observableArrayList(this);
return observableList;
}
}