Merge branch 'HotFix_0.4.8.1' into Development

Conflicts:
	common/pom.xml
	common/src/main/java/io/bitsquare/app/Version.java
	core/pom.xml
	gui/pom.xml
	jsocks/pom.xml
	jtorctl/pom.xml
	jtorproxy/pom.xml
	network/pom.xml
	package/linux/create_32bit_app.sh
	package/linux/create_64bit_app.sh
	package/mac/create_app.sh
	package/mac/finalize.sh
	package/windows/Bitsquare.iss
	package/windows/create_32bit_app.bat
	package/windows/create_64bit_app.bat
	pom.xml
	seednode/pom.xml
This commit is contained in:
Manfred Karrer 2016-07-05 14:48:21 +02:00
commit 3f9c35fe55
4 changed files with 41 additions and 21 deletions

View file

@ -28,6 +28,7 @@ import io.bitsquare.p2p.NodeAddress;
import io.bitsquare.p2p.P2PService;
import io.bitsquare.p2p.storage.HashMapChangedListener;
import io.bitsquare.p2p.storage.storageentry.ProtectedStorageEntry;
import io.bitsquare.user.Preferences;
import io.bitsquare.user.User;
import javafx.collections.FXCollections;
import javafx.collections.ObservableMap;
@ -94,7 +95,9 @@ public class ArbitratorManager {
private final KeyRing keyRing;
private final ArbitratorService arbitratorService;
private final User user;
private Preferences preferences;
private final ObservableMap<NodeAddress, Arbitrator> arbitratorsObservableMap = FXCollections.observableHashMap();
private final List<Arbitrator> persistedAcceptedArbitrators;
private Timer republishArbitratorTimer, retryRepublishArbitratorTimer;
@ -103,20 +106,26 @@ public class ArbitratorManager {
///////////////////////////////////////////////////////////////////////////////////////////
@Inject
public ArbitratorManager(KeyRing keyRing, ArbitratorService arbitratorService, User user) {
public ArbitratorManager(KeyRing keyRing, ArbitratorService arbitratorService, User user, Preferences preferences) {
this.keyRing = keyRing;
this.arbitratorService = arbitratorService;
this.user = user;
this.preferences = preferences;
persistedAcceptedArbitrators = new ArrayList<>(user.getAcceptedArbitrators());
user.clearAcceptedArbitrators();
arbitratorService.addHashSetChangedListener(new HashMapChangedListener() {
@Override
public void onAdded(ProtectedStorageEntry data) {
applyArbitrators();
if (data.getStoragePayload() instanceof Arbitrator)
updateArbitratorMap();
}
@Override
public void onRemoved(ProtectedStorageEntry data) {
applyArbitrators();
if (data.getStoragePayload() instanceof Arbitrator)
updateArbitratorMap();
}
});
}
@ -145,7 +154,7 @@ public class ArbitratorManager {
});
}
applyArbitrators();
updateArbitratorMap();
}
private void isBootstrapped() {
@ -156,7 +165,7 @@ public class ArbitratorManager {
}
}
public void applyArbitrators() {
public void updateArbitratorMap() {
Map<NodeAddress, Arbitrator> map = arbitratorService.getArbitrators();
arbitratorsObservableMap.clear();
Map<NodeAddress, Arbitrator> filtered = map.values().stream()
@ -165,19 +174,25 @@ public class ArbitratorManager {
.collect(Collectors.toMap(Arbitrator::getArbitratorNodeAddress, Function.identity()));
arbitratorsObservableMap.putAll(filtered);
// we need to remove accepted arbitrators which are not available anymore
if (user.getAcceptedArbitrators() != null) {
List<Arbitrator> removeList = user.getAcceptedArbitrators().stream()
.filter(e -> !arbitratorsObservableMap.containsValue(e))
.collect(Collectors.toList());
removeList.stream().forEach(user::removeAcceptedArbitrator);
arbitratorsObservableMap.values().stream()
.filter(arbitrator -> persistedAcceptedArbitrators.contains(arbitrator))
.forEach(user::addAcceptedArbitrator);
// if we don't have any arbitrator anymore we set all matching
if (user.getAcceptedArbitrators().isEmpty()) {
arbitratorsObservableMap.values().stream()
.filter(user::hasMatchingLanguage)
.forEach(user::addAcceptedArbitrator);
}
if (preferences.getAutoSelectArbitrators()) {
arbitratorsObservableMap.values().stream()
.filter(user::hasMatchingLanguage)
.forEach(user::addAcceptedArbitrator);
} else {
// if we don't have any arbitrator we set all matching
// we use a delay as we might get our matching arbitrator a bit delayed (first we get one we did not selected
// then we get our selected one - we don't want to activate the first in that case)
UserThread.runAfter(() -> {
if (user.getAcceptedArbitrators().isEmpty()) {
arbitratorsObservableMap.values().stream()
.filter(user::hasMatchingLanguage)
.forEach(user::addAcceptedArbitrator);
}
}, 100, TimeUnit.MILLISECONDS);
}
}
@ -190,7 +205,7 @@ public class ArbitratorManager {
resultHandler.handleResult();
if (arbitratorsObservableMap.size() > 0)
UserThread.runAfter(this::applyArbitrators, 100, TimeUnit.MILLISECONDS);
UserThread.runAfter(this::updateArbitratorMap, 100, TimeUnit.MILLISECONDS);
},
errorMessageHandler::handleErrorMessage);
}
@ -243,7 +258,7 @@ public class ArbitratorManager {
Arbitrator registeredArbitrator = user.getRegisteredArbitrator();
if (registeredArbitrator != null) {
addArbitrator(registeredArbitrator,
this::applyArbitrators,
this::updateArbitratorMap,
errorMessage -> {
if (retryRepublishArbitratorTimer == null)
retryRepublishArbitratorTimer = UserThread.runPeriodically(() -> {

View file

@ -272,6 +272,11 @@ public final class User implements Persistable {
return null;
}
public void clearAcceptedArbitrators() {
acceptedArbitrators.clear();
storage.queueUpForSave();
}
///////////////////////////////////////////////////////////////////////////////////////////
// Utils

View file

@ -66,7 +66,7 @@ class ArbitratorSelectionViewModel extends ActivatableDataModel {
protected void activate() {
languageCodes.setAll(user.getAcceptedLanguageLocaleCodes());
arbitratorManager.getArbitratorsObservableMap().addListener(arbitratorMapChangeListener);
arbitratorManager.applyArbitrators();
arbitratorManager.updateArbitratorMap();
applyArbitratorMap();
updateAutoSelectArbitrators();

View file

@ -106,7 +106,7 @@ public class DisputesView extends ActivatableViewAndModel<TabPane, Activatable>
@Override
protected void activate() {
arbitratorManager.applyArbitrators();
arbitratorManager.updateArbitratorMap();
arbitratorManager.getArbitratorsObservableMap().addListener(arbitratorMapChangeListener);
updateArbitratorsDisputesTabDisableState();