Skip to content

Commit 8351ee4

Browse files
authored
重构下载源选择逻辑 (#4856)
1 parent 310a344 commit 8351ee4

19 files changed

Lines changed: 211 additions & 342 deletions

HMCL/src/main/java/org/jackhuang/hmcl/setting/Config.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ public void setDownloadThreads(int downloadThreads) {
493493
}
494494

495495
@SerializedName("downloadType")
496-
private final StringProperty downloadType = new SimpleStringProperty(DownloadProviders.DEFAULT_RAW_PROVIDER_ID);
496+
private final StringProperty downloadType = new SimpleStringProperty(DownloadProviders.DEFAULT_DIRECT_PROVIDER_ID);
497497

498498
public StringProperty downloadTypeProperty() {
499499
return downloadType;
@@ -523,7 +523,7 @@ public void setAutoChooseDownloadType(boolean autoChooseDownloadType) {
523523
}
524524

525525
@SerializedName("versionListSource")
526-
private final StringProperty versionListSource = new SimpleStringProperty("balanced");
526+
private final StringProperty versionListSource = new SimpleStringProperty(DownloadProviders.DEFAULT_AUTO_PROVIDER_ID);
527527

528528
public StringProperty versionListSourceProperty() {
529529
return versionListSource;

HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java

Lines changed: 47 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -21,114 +21,99 @@
2121
import org.jackhuang.hmcl.download.*;
2222
import org.jackhuang.hmcl.task.DownloadException;
2323
import org.jackhuang.hmcl.task.FetchTask;
24-
import org.jackhuang.hmcl.ui.FXUtils;
24+
import org.jackhuang.hmcl.util.Lang;
2525
import org.jackhuang.hmcl.util.StringUtils;
2626
import org.jackhuang.hmcl.util.i18n.I18n;
27+
import org.jackhuang.hmcl.util.i18n.LocaleUtils;
2728
import org.jackhuang.hmcl.util.io.ResponseCodeException;
2829

2930
import javax.net.ssl.SSLHandshakeException;
3031
import java.io.FileNotFoundException;
3132
import java.net.SocketTimeoutException;
3233
import java.net.URI;
3334
import java.nio.file.AccessDeniedException;
34-
import java.util.ArrayList;
3535
import java.util.List;
3636
import java.util.Map;
37-
import java.util.Objects;
3837
import java.util.concurrent.CancellationException;
3938

4039
import static org.jackhuang.hmcl.setting.ConfigHolder.config;
4140
import static org.jackhuang.hmcl.task.FetchTask.DEFAULT_CONCURRENCY;
41+
import static org.jackhuang.hmcl.util.Pair.pair;
4242
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
4343

4444
public final class DownloadProviders {
4545
private DownloadProviders() {
4646
}
4747

48-
private static final DownloadProviderWrapper provider;
48+
public static final String DEFAULT_AUTO_PROVIDER_ID = "balanced";
49+
public static final String DEFAULT_DIRECT_PROVIDER_ID = "mojang";
4950

50-
public static final Map<String, DownloadProvider> providersById;
51-
public static final Map<String, DownloadProvider> rawProviders;
52-
private static final AdaptedDownloadProvider fileDownloadProvider = new AdaptedDownloadProvider();
51+
private static final DownloadProviderWrapper PROVIDER_WRAPPER;
5352

54-
private static final MojangDownloadProvider MOJANG;
55-
private static final BMCLAPIDownloadProvider BMCLAPI;
56-
57-
public static final String DEFAULT_PROVIDER_ID = "balanced";
58-
public static final String DEFAULT_RAW_PROVIDER_ID = "bmclapi";
59-
60-
@SuppressWarnings("unused")
61-
private static final InvalidationListener observer;
53+
private static final DownloadProvider DEFAULT_PROVIDER;
54+
public static final Map<String, DownloadProvider> DIRECT_PROVIDERS;
55+
public static final Map<String, DownloadProvider> AUTO_PROVIDERS;
6256

6357
static {
64-
String bmclapiRoot = "https://bmclapi2.bangbang93.com";
65-
String bmclapiRootOverride = System.getProperty("hmcl.bmclapi.override");
66-
if (bmclapiRootOverride != null) bmclapiRoot = bmclapiRootOverride;
67-
68-
MOJANG = new MojangDownloadProvider();
69-
BMCLAPI = new BMCLAPIDownloadProvider(bmclapiRoot);
70-
rawProviders = Map.of(
71-
"mojang", MOJANG,
72-
"bmclapi", BMCLAPI
73-
);
58+
String bmclapiRoot = System.getProperty("hmcl.bmclapi.override", "https://bmclapi2.bangbang93.com");
59+
BMCLAPIDownloadProvider bmclapiRaw = new BMCLAPIDownloadProvider(bmclapiRoot);
7460

75-
AdaptedDownloadProvider fileProvider = new AdaptedDownloadProvider();
76-
fileProvider.setDownloadProviderCandidates(List.of(BMCLAPI, MOJANG));
77-
BalancedDownloadProvider balanced = new BalancedDownloadProvider(MOJANG, BMCLAPI);
61+
DownloadProvider mojang = new MojangDownloadProvider();
62+
DownloadProvider bmclapi = new AutoDownloadProvider(bmclapiRaw, mojang);
7863

79-
providersById = Map.of(
80-
"official", new AutoDownloadProvider(MOJANG, fileProvider),
81-
"balanced", new AutoDownloadProvider(balanced, fileProvider),
82-
"mirror", new AutoDownloadProvider(BMCLAPI, fileProvider));
64+
DEFAULT_PROVIDER = mojang;
65+
DIRECT_PROVIDERS = Lang.mapOf(
66+
pair("mojang", mojang),
67+
pair("bmclapi", bmclapi)
68+
);
8369

84-
observer = FXUtils.observeWeak(() -> {
85-
FetchTask.setDownloadExecutorConcurrency(
86-
config().getAutoDownloadThreads() ? DEFAULT_CONCURRENCY : config().getDownloadThreads());
87-
}, config().autoDownloadThreadsProperty(), config().downloadThreadsProperty());
70+
AUTO_PROVIDERS = Lang.mapOf(
71+
pair("balanced", LocaleUtils.IS_CHINA_MAINLAND ? bmclapi : mojang),
72+
pair("official", LocaleUtils.IS_CHINA_MAINLAND ? new AutoDownloadProvider(
73+
List.of(mojang, bmclapiRaw),
74+
List.of(bmclapiRaw, mojang)
75+
) : mojang),
76+
pair("mirror", bmclapi)
77+
);
8878

89-
provider = new DownloadProviderWrapper(MOJANG);
79+
PROVIDER_WRAPPER = new DownloadProviderWrapper(DEFAULT_PROVIDER);
9080
}
9181

9282
static void init() {
83+
InvalidationListener onChangeDownloadThreads = observable -> {
84+
FetchTask.setDownloadExecutorConcurrency(config().getAutoDownloadThreads()
85+
? DEFAULT_CONCURRENCY
86+
: config().getDownloadThreads());
87+
};
88+
config().autoDownloadThreadsProperty().addListener(onChangeDownloadThreads);
89+
config().downloadThreadsProperty().addListener(onChangeDownloadThreads);
90+
onChangeDownloadThreads.invalidated(null);
91+
9392
InvalidationListener onChangeDownloadSource = observable -> {
94-
String versionListSource = Objects.requireNonNullElse(config().getVersionListSource(), "");
9593
if (config().isAutoChooseDownloadType()) {
96-
DownloadProvider currentDownloadProvider = providersById.get(versionListSource);
97-
if (currentDownloadProvider == null)
98-
currentDownloadProvider = Objects.requireNonNull(providersById.get(DEFAULT_PROVIDER_ID),
99-
"default provider is null");
100-
101-
provider.setProvider(currentDownloadProvider);
94+
String versionListSource = config().getVersionListSource();
95+
DownloadProvider downloadProvider = versionListSource != null
96+
? AUTO_PROVIDERS.getOrDefault(versionListSource, DEFAULT_PROVIDER)
97+
: DEFAULT_PROVIDER;
98+
PROVIDER_WRAPPER.setProvider(downloadProvider);
10299
} else {
103-
provider.setProvider(fileDownloadProvider);
100+
String downloadType = config().getDownloadType();
101+
PROVIDER_WRAPPER.setProvider(downloadType != null
102+
? DIRECT_PROVIDERS.getOrDefault(downloadType, DEFAULT_PROVIDER)
103+
: DEFAULT_PROVIDER);
104104
}
105105
};
106106
config().versionListSourceProperty().addListener(onChangeDownloadSource);
107107
config().autoChooseDownloadTypeProperty().addListener(onChangeDownloadSource);
108-
108+
config().downloadTypeProperty().addListener(onChangeDownloadSource);
109109
onChangeDownloadSource.invalidated(null);
110-
111-
FXUtils.onChangeAndOperate(config().downloadTypeProperty(), downloadType -> {
112-
DownloadProvider primary = Objects.requireNonNullElseGet(
113-
rawProviders.get(Objects.requireNonNullElse(downloadType, "")),
114-
() -> rawProviders.get(DEFAULT_RAW_PROVIDER_ID));
115-
116-
List<DownloadProvider> providers = new ArrayList<>(rawProviders.size());
117-
providers.add(primary);
118-
for (DownloadProvider provider : rawProviders.values()) {
119-
if (provider != primary)
120-
providers.add(provider);
121-
}
122-
123-
fileDownloadProvider.setDownloadProviderCandidates(providers);
124-
});
125110
}
126111

127112
/**
128113
* Get current primary preferred download provider
129114
*/
130115
public static DownloadProvider getDownloadProvider() {
131-
return provider;
116+
return PROVIDER_WRAPPER;
132117
}
133118

134119
public static String localizeErrorMessage(Throwable exception) {

HMCL/src/main/java/org/jackhuang/hmcl/ui/main/DownloadSettingsPage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public DownloadSettingsPage() {
7878
versionListSourcePane.setRight(cboVersionListSource);
7979
FXUtils.setLimitWidth(cboVersionListSource, 400);
8080

81-
cboVersionListSource.getItems().setAll(DownloadProviders.providersById.keySet());
81+
cboVersionListSource.getItems().setAll(DownloadProviders.AUTO_PROVIDERS.keySet());
8282
selectedItemPropertyFor(cboVersionListSource).bindBidirectional(config().versionListSourceProperty());
8383
}
8484

@@ -95,7 +95,7 @@ public DownloadSettingsPage() {
9595
downloadSourcePane.setRight(cboDownloadSource);
9696
FXUtils.setLimitWidth(cboDownloadSource, 420);
9797

98-
cboDownloadSource.getItems().setAll(DownloadProviders.rawProviders.keySet());
98+
cboDownloadSource.getItems().setAll(DownloadProviders.DIRECT_PROVIDERS.keySet());
9999
selectedItemPropertyFor(cboDownloadSource).bindBidirectional(config().downloadTypeProperty());
100100
}
101101

HMCLCore/src/main/java/org/jackhuang/hmcl/download/AdaptedDownloadProvider.java

Lines changed: 0 additions & 92 deletions
This file was deleted.

0 commit comments

Comments
 (0)