Remove CompensationRequestModel

This commit is contained in:
Manfred Karrer 2017-12-05 15:57:05 -05:00
parent 74d180fcf7
commit ac2c95c987
No known key found for this signature in database
GPG key ID: 401250966A6B2C46
4 changed files with 65 additions and 119 deletions

View file

@ -25,7 +25,6 @@ import io.bisq.core.dao.blockchain.BsqLiteNode;
import io.bisq.core.dao.blockchain.json.JsonChainStateExporter;
import io.bisq.core.dao.blockchain.parse.*;
import io.bisq.core.dao.compensation.CompensationRequestManager;
import io.bisq.core.dao.compensation.CompensationRequestModel;
import io.bisq.core.dao.vote.VotingDefaultValues;
import io.bisq.core.dao.vote.VotingManager;
import io.bisq.core.dao.vote.VotingService;
@ -63,7 +62,6 @@ public class DaoModule extends AppModule {
bind(VotingService.class).in(Singleton.class);
bind(CompensationRequestManager.class).in(Singleton.class);
bind(CompensationRequestModel.class).in(Singleton.class);
bind(VotingManager.class).in(Singleton.class);
bind(VotingDefaultValues.class).in(Singleton.class);

View file

@ -21,7 +21,7 @@ import io.bisq.core.dao.blockchain.vo.Tx;
import io.bisq.core.dao.blockchain.vo.TxOutput;
import io.bisq.core.dao.blockchain.vo.TxType;
import io.bisq.core.dao.compensation.CompensationRequest;
import io.bisq.core.dao.compensation.CompensationRequestModel;
import io.bisq.core.dao.compensation.CompensationRequestManager;
import lombok.extern.slf4j.Slf4j;
import javax.inject.Inject;
@ -37,17 +37,17 @@ public class IssuanceVerification {
private final BsqChainState bsqChainState;
private final PeriodVerification periodVerification;
private final VotingVerification votingVerification;
private final CompensationRequestModel compensationRequestModel;
private CompensationRequestManager compensationRequestManager;
@Inject
public IssuanceVerification(BsqChainState bsqChainState,
PeriodVerification periodVerification,
VotingVerification votingVerification,
CompensationRequestModel compensationRequestModel) {
CompensationRequestManager compensationRequestManager) {
this.bsqChainState = bsqChainState;
this.periodVerification = periodVerification;
this.votingVerification = votingVerification;
this.compensationRequestModel = compensationRequestModel;
this.compensationRequestManager = compensationRequestManager;
}
boolean maybeProcessData(Tx tx) {
@ -57,7 +57,7 @@ public class IssuanceVerification {
TxOutput btcTxOutput = outputs.get(1);
final String btcAddress = btcTxOutput.getAddress();
// TODO find address by block range/cycle
final Optional<CompensationRequest> compensationRequest = compensationRequestModel.findByAddress(btcAddress);
final Optional<CompensationRequest> compensationRequest = compensationRequestManager.findByAddress(btcAddress);
if (compensationRequest.isPresent()) {
final CompensationRequest compensationRequest1 = compensationRequest.get();
final long bsqAmount = bsqTxOutput.getValue();

View file

@ -29,13 +29,17 @@ import io.bisq.core.btc.wallet.BsqWalletService;
import io.bisq.core.btc.wallet.BtcWalletService;
import io.bisq.core.dao.DaoPeriodService;
import io.bisq.core.dao.blockchain.BsqChainStateListener;
import io.bisq.core.dao.blockchain.parse.PeriodVerification;
import io.bisq.core.dao.blockchain.parse.VotingVerification;
import io.bisq.core.dao.vote.VotingDefaultValues;
import io.bisq.network.p2p.P2PService;
import io.bisq.network.p2p.storage.HashMapChangedListener;
import io.bisq.network.p2p.storage.payload.ProtectedStorageEntry;
import io.bisq.network.p2p.storage.payload.ProtectedStoragePayload;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import lombok.Getter;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction;
import org.slf4j.Logger;
@ -43,6 +47,7 @@ import org.slf4j.LoggerFactory;
import java.security.PublicKey;
import java.util.List;
import java.util.Optional;
public class CompensationRequestManager implements PersistedDataHost, BsqChainStateListener {
private static final Logger log = LoggerFactory.getLogger(CompensationRequestManager.class);
@ -53,13 +58,20 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
private final DaoPeriodService daoPeriodService;
private final BtcWalletService btcWalletService;
private final BsqWalletService bsqWalletService;
private final CompensationRequestModel model;
private final VotingDefaultValues votingDefaultValues;
private final PeriodVerification periodVerification;
private final VotingVerification votingVerification;
private final KeyRing keyRing;
private final Storage<CompensationRequestList> compensationRequestsStorage;
private CompensationRequest selectedCompensationRequest;
@Getter
private final ObservableList<CompensationRequest> allRequests = FXCollections.observableArrayList();
@Getter
private final FilteredList<CompensationRequest> activeRequests = new FilteredList<>(allRequests);
@Getter
private final FilteredList<CompensationRequest> pastRequests = new FilteredList<>(allRequests);
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
@ -70,16 +82,18 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
BtcWalletService btcWalletService,
BsqWalletService bsqWalletService,
DaoPeriodService daoPeriodService,
CompensationRequestModel model,
VotingDefaultValues votingDefaultValues,
PeriodVerification periodVerification,
VotingVerification votingVerification,
KeyRing keyRing,
Storage<CompensationRequestList> compensationRequestsStorage) {
this.p2PService = p2PService;
this.daoPeriodService = daoPeriodService;
this.btcWalletService = btcWalletService;
this.bsqWalletService = bsqWalletService;
this.model = model;
this.votingDefaultValues = votingDefaultValues;
this.periodVerification = periodVerification;
this.votingVerification = votingVerification;
this.keyRing = keyRing;
this.compensationRequestsStorage = compensationRequestsStorage;
}
@ -89,7 +103,7 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
if (BisqEnvironment.isDAOActivatedAndBaseCurrencySupportingBsq()) {
CompensationRequestList persisted = compensationRequestsStorage.initAndGetPersistedWithFileName("CompensationRequestList", 100);
if (persisted != null)
model.setPersistedCompensationRequest(persisted.getList());
setPersistedCompensationRequest(persisted.getList());
}
}
@ -112,10 +126,10 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
public void onRemoved(ProtectedStorageEntry data) {
final ProtectedStoragePayload protectedStoragePayload = data.getProtectedStoragePayload();
if (protectedStoragePayload instanceof CompensationRequestPayload) {
model.findCompensationRequest((CompensationRequestPayload) protectedStoragePayload).ifPresent(compensationRequest -> {
findCompensationRequest((CompensationRequestPayload) protectedStoragePayload).ifPresent(compensationRequest -> {
if (daoPeriodService.isInCompensationRequestPhase(compensationRequest)) {
model.removeCompensationRequest(compensationRequest);
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(model.getAllRequests()), 500);
removeCompensationRequestFromList(compensationRequest);
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(getAllRequests()), 500);
} else {
final String msg = "onRemoved called of a CompensationRequest which is outside of the CompensationRequest phase is invalid and we ignore it.";
log.warn(msg);
@ -127,7 +141,7 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
}
});
// At startup the P2PDataStorage inits earlier, otherwise we ge the listener called.
// At startup the P2PDataStorage initializes earlier, otherwise we ge the listener called.
p2PService.getP2PDataStorage().getMap().values().forEach(e -> {
final ProtectedStoragePayload protectedStoragePayload = e.getProtectedStoragePayload();
if (protectedStoragePayload instanceof CompensationRequestPayload)
@ -139,7 +153,7 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
// Republish
PublicKey signaturePubKey = keyRing.getPubKeyRing().getSignaturePubKey();
UserThread.runAfter(() -> {
model.getActiveRequests().stream()
activeRequests.stream()
.filter(e -> e.getCompensationRequestPayload().getOwnerPubKey().equals(signaturePubKey))
.forEach(e -> addToP2PNetwork(e.getCompensationRequestPayload()));
}, 1); // TODO increase delay to about 30 sec.
@ -152,22 +166,22 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
@Override
public void onBsqChainStateChanged() {
model.updateFilteredLists();
updateFilteredLists();
}
private void onChainHeightChanged() {
model.updateFilteredLists();
updateFilteredLists();
}
public void addToP2PNetwork(CompensationRequestPayload compensationRequestPayload) {
p2PService.addProtectedStorageEntry(compensationRequestPayload, true);
}
public void addCompensationRequestPayload(CompensationRequestPayload compensationRequestPayload, boolean storeLocally) {
private void addCompensationRequestPayload(CompensationRequestPayload compensationRequestPayload, boolean storeLocally) {
if (!contains(compensationRequestPayload)) {
model.addCompensationRequest(new CompensationRequest(compensationRequestPayload));
addCompensationRequest(new CompensationRequest(compensationRequestPayload));
if (storeLocally)
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(model.getAllRequests()), 500);
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(getAllRequests()), 500);
} else {
log.warn("We have already an item with the same CompensationRequest.");
}
@ -176,8 +190,8 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
public boolean removeCompensationRequest(CompensationRequest compensationRequest) {
if (daoPeriodService.isInCompensationRequestPhase(compensationRequest)) {
if (isMyCompensationRequest(compensationRequest)) {
model.removeCompensationRequest(compensationRequest);
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(model.getAllRequests()), 500);
removeCompensationRequestFromList(compensationRequest);
compensationRequestsStorage.queueUpForSave(new CompensationRequestList(getAllRequests()), 500);
return p2PService.removeData(compensationRequest.getCompensationRequestPayload(), true);
} else {
final String msg = "removeCompensationRequest called for a CompensationRequest which is not ours.";
@ -195,16 +209,21 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
}
}
private void removeCompensationRequestFromList(CompensationRequest compensationRequest) {
allRequests.remove(compensationRequest);
updateFilteredLists();
}
public boolean isMyCompensationRequest(CompensationRequest compensationRequest) {
return keyRing.getPubKeyRing().getSignaturePubKey().equals(compensationRequest.getCompensationRequestPayload().getOwnerPubKey());
}
private boolean contains(CompensationRequestPayload compensationRequestPayload) {
return model.getAllRequests().stream().filter(e -> e.getCompensationRequestPayload().equals(compensationRequestPayload)).findAny().isPresent();
return allRequests.stream().filter(e -> e.getCompensationRequestPayload().equals(compensationRequestPayload)).findAny().isPresent();
}
public List<CompensationRequest> getCompensationRequestsList() {
return model.getAllRequests();
return allRequests;
}
public void fundCompensationRequest(CompensationRequest compensationRequest, Coin amount, FutureCallback<Transaction> callback) {
@ -219,15 +238,31 @@ public class CompensationRequestManager implements PersistedDataHost, BsqChainSt
return selectedCompensationRequest;
}
public ObservableList<CompensationRequest> getAllRequests() {
return model.getAllRequests();
private void updateFilteredLists() {
activeRequests.setPredicate(daoPeriodService::isInCurrentCycle);
pastRequests.setPredicate(compensationRequest -> {
return !daoPeriodService.isInCurrentCycle(compensationRequest);
});
}
public FilteredList<CompensationRequest> getActiveRequests() {
return model.getActiveRequests();
private void setPersistedCompensationRequest(List<CompensationRequest> list) {
this.allRequests.clear();
this.allRequests.addAll(list);
updateFilteredLists();
}
public FilteredList<CompensationRequest> getPastRequests() {
return model.getPastRequests();
public Optional<CompensationRequest> findByAddress(String address) {
return allRequests.stream()
.filter(e -> e.getCompensationRequestPayload().getBsqAddress().equals(address))
.findAny();
}
private void addCompensationRequest(CompensationRequest compensationRequest) {
allRequests.add(compensationRequest);
updateFilteredLists();
}
private Optional<CompensationRequest> findCompensationRequest(CompensationRequestPayload compensationRequestPayload) {
return allRequests.stream().filter(e -> e.getCompensationRequestPayload().equals(compensationRequestPayload)).findAny();
}
}

View file

@ -1,87 +0,0 @@
/*
* This file is part of Bisq.
*
* Bisq 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.
*
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bisq.core.dao.compensation;
import io.bisq.core.dao.DaoPeriodService;
import io.bisq.core.dao.blockchain.parse.PeriodVerification;
import io.bisq.core.dao.blockchain.parse.VotingVerification;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import javax.inject.Inject;
import java.util.List;
import java.util.Optional;
@Slf4j
public class CompensationRequestModel {
private final DaoPeriodService daoPeriodService;
private final PeriodVerification periodVerification;
private final VotingVerification votingVerification;
@Getter
private final ObservableList<CompensationRequest> allRequests = FXCollections.observableArrayList();
@Getter
private final FilteredList<CompensationRequest> activeRequests = new FilteredList<>(allRequests);
@Getter
private final FilteredList<CompensationRequest> pastRequests = new FilteredList<>(allRequests);
@Inject
public CompensationRequestModel(DaoPeriodService daoPeriodService,
PeriodVerification periodVerification,
VotingVerification votingVerification) {
this.daoPeriodService = daoPeriodService;
this.periodVerification = periodVerification;
this.votingVerification = votingVerification;
}
public void updateFilteredLists() {
activeRequests.setPredicate(daoPeriodService::isInCurrentCycle);
pastRequests.setPredicate(compensationRequest -> {
return !daoPeriodService.isInCurrentCycle(compensationRequest);
});
}
public void setPersistedCompensationRequest(List<CompensationRequest> list) {
this.allRequests.clear();
this.allRequests.addAll(list);
updateFilteredLists();
}
public Optional<CompensationRequest> findByAddress(String address) {
return allRequests.stream()
.filter(e -> e.getCompensationRequestPayload().getBsqAddress().equals(address))
.findAny();
}
public void addCompensationRequest(CompensationRequest compensationRequest) {
allRequests.add(compensationRequest);
updateFilteredLists();
}
public void removeCompensationRequest(CompensationRequest compensationRequest) {
allRequests.remove(compensationRequest);
updateFilteredLists();
}
public Optional<CompensationRequest> findCompensationRequest(CompensationRequestPayload compensationRequestPayload) {
return allRequests.stream().filter(e -> e.getCompensationRequestPayload().equals(compensationRequestPayload)).findAny();
}
}