优化 Java 下载功能 (#3371)

* update

* update

* update

* update
This commit is contained in:
Glavo
2024-10-23 21:49:35 +08:00
committed by GitHub
parent 99c3ef8a57
commit 5aac4b82fc
7 changed files with 134 additions and 157 deletions

View File

@@ -17,12 +17,7 @@
*/
package org.jackhuang.hmcl.download.java;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.platform.Platform;
import java.util.Set;
import java.util.TreeMap;
/**
* @author Glavo
@@ -31,6 +26,4 @@ public interface JavaDistribution<V extends JavaRemoteVersion> {
String getDisplayName();
Set<JavaPackageType> getSupportedPackageTypes();
Task<TreeMap<Integer, V>> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType);
}

View File

@@ -34,6 +34,13 @@ public enum JavaPackageType {
this.javafx = javafx;
}
public static JavaPackageType of(boolean jdk, boolean javafx) {
if (jdk)
return javafx ? JDKFX : JDK;
else
return javafx ? JREFX : JRE;
}
public boolean isJDK() {
return jdk;
}

View File

@@ -33,7 +33,7 @@ import java.util.*;
/**
* @author Glavo
*/
public final class DiscoFetchJavaListTask extends Task<TreeMap<Integer, DiscoJavaRemoteVersion>> {
public final class DiscoFetchJavaListTask extends Task<EnumMap<JavaPackageType, TreeMap<Integer, DiscoJavaRemoteVersion>>> {
public static final String API_ROOT = System.getProperty("hmcl.discoapi.override", "https://api.foojay.io/disco/v3.0");
@@ -46,21 +46,15 @@ public final class DiscoFetchJavaListTask extends Task<TreeMap<Integer, DiscoJav
}
private final DiscoJavaDistribution distribution;
private final String packageType;
private final boolean isJavaFXBundled;
private final String archiveType;
private final Task<String> fetchPackagesTask;
public DiscoFetchJavaListTask(DownloadProvider downloadProvider, DiscoJavaDistribution distribution, Platform platform, JavaPackageType packageType) {
public DiscoFetchJavaListTask(DownloadProvider downloadProvider, DiscoJavaDistribution distribution, Platform platform) {
this.distribution = distribution;
this.packageType = packageType.isJDK() ? "jdk" : "jre";
this.isJavaFXBundled = packageType.isJavaFXBundled();
this.archiveType = platform.getOperatingSystem() == OperatingSystem.WINDOWS ? "zip" : "tar.gz";
HashMap<String, String> params = new HashMap<>();
params.put("distribution", distribution.getApiParameter());
params.put("package", this.packageType);
params.put("javafx_bundled", Boolean.toString(isJavaFXBundled));
params.put("operating_system", getOperatingSystemName(platform.getOperatingSystem()));
params.put("architecture", getArchitectureName(platform.getArchitecture()));
params.put("archive_type", archiveType);
@@ -79,29 +73,28 @@ public final class DiscoFetchJavaListTask extends Task<TreeMap<Integer, DiscoJav
@Override
public void execute() throws Exception {
String json = fetchPackagesTask.getResult();
List<DiscoJavaRemoteVersion> result = JsonUtils.fromNonNullJson(json, DiscoResult.typeOf(DiscoJavaRemoteVersion.class)).getResult();
List<DiscoJavaRemoteVersion> list = JsonUtils.fromNonNullJson(json, DiscoResult.typeOf(DiscoJavaRemoteVersion.class)).getResult();
EnumMap<JavaPackageType, TreeMap<Integer, DiscoJavaRemoteVersion>> result = new EnumMap<>(JavaPackageType.class);
TreeMap<Integer, DiscoJavaRemoteVersion> map = new TreeMap<>();
for (DiscoJavaRemoteVersion version : result) {
for (DiscoJavaRemoteVersion version : list) {
if (!distribution.getApiParameter().equals(version.getDistribution())
|| !version.isDirectlyDownloadable()
|| !packageType.equals(version.getPackageType())
|| !archiveType.equals(version.getArchiveType())
|| isJavaFXBundled != version.isJavaFXBundled())
|| !archiveType.equals(version.getArchiveType()))
continue;
if (!distribution.testVersion(version))
continue;
JavaPackageType packageType = JavaPackageType.of("jdk".equals(version.getPackageType()), version.isJavaFXBundled());
TreeMap<Integer, DiscoJavaRemoteVersion> map = result.computeIfAbsent(packageType, ignored -> new TreeMap<>());
int jdkVersion = version.getJdkVersion();
DiscoJavaRemoteVersion oldVersion = map.get(jdkVersion);
if (oldVersion == null || VersionNumber.compare(version.getDistributionVersion(), oldVersion.getDistributionVersion()) > 0) {
if (oldVersion == null || VersionNumber.compare(version.getDistributionVersion(), oldVersion.getDistributionVersion()) > 0)
map.put(jdkVersion, version);
}
}
setResult(map);
setResult(result);
}
}

View File

@@ -17,10 +17,8 @@
*/
package org.jackhuang.hmcl.download.java.disco;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.java.JavaDistribution;
import org.jackhuang.hmcl.download.java.JavaPackageType;
import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.Pair;
import org.jackhuang.hmcl.util.platform.Architecture;
import org.jackhuang.hmcl.util.platform.OperatingSystem;
@@ -131,11 +129,6 @@ public enum DiscoJavaDistribution implements JavaDistribution<DiscoJavaRemoteVer
return architectures != null && architectures.contains(platform.getArchitecture());
}
@Override
public Task<TreeMap<Integer, DiscoJavaRemoteVersion>> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType) {
return new DiscoFetchJavaListTask(provider, this, platform, packageType);
}
public boolean testVersion(DiscoJavaRemoteVersion version) {
return this.getApiParameter().equals(version.getDistribution());
}

View File

@@ -171,6 +171,10 @@ public final class DiscoJavaRemoteVersion implements JavaRemoteVersion {
return termOfSupport;
}
public boolean isLTS() {
return "lts".equals(termOfSupport);
}
public String getOperatingSystem() {
return operatingSystem;
}

View File

@@ -17,16 +17,12 @@
*/
package org.jackhuang.hmcl.download.java.mojang;
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.download.java.JavaDistribution;
import org.jackhuang.hmcl.download.java.JavaPackageType;
import org.jackhuang.hmcl.download.java.JavaRemoteVersion;
import org.jackhuang.hmcl.task.Task;
import org.jackhuang.hmcl.util.platform.Platform;
import java.util.Collections;
import java.util.Set;
import java.util.TreeMap;
/**
* @author Glavo
@@ -47,9 +43,4 @@ public final class MojangJavaDistribution implements JavaDistribution<JavaRemote
public Set<JavaPackageType> getSupportedPackageTypes() {
return Collections.singleton(JavaPackageType.JRE);
}
@Override
public Task<TreeMap<Integer, JavaRemoteVersion>> getFetchJavaVersionsTask(DownloadProvider provider, Platform platform, JavaPackageType packageType) {
return null;
}
}