Replace static fields with instance fields
This commit is contained in:
@@ -64,21 +64,40 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.stream.Collectors.toSet;
|
||||
import static org.jackhuang.hmcl.Metadata.HMCL_DIRECTORY;
|
||||
import static org.jackhuang.hmcl.util.Logging.LOG;
|
||||
import static org.jackhuang.hmcl.util.SelfDependencyPatcher.DependencyDescriptor.JFX_DEPENDENCIES;
|
||||
import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
|
||||
import static org.jackhuang.hmcl.util.platform.JavaVersion.CURRENT_JAVA;
|
||||
|
||||
// From: https://github.com/Col-E/Recaf/blob/7378b397cee664ae81b7963b0355ef8ff013c3a7/src/main/java/me/coley/recaf/util/self/SelfDependencyPatcher.java
|
||||
public final class SelfDependencyPatcher {
|
||||
private SelfDependencyPatcher() {
|
||||
private final List<DependencyDescriptor> dependencies = DependencyDescriptor.readDependencies();
|
||||
private final List<Repository> repositories;
|
||||
private final Repository defaultRepository;
|
||||
|
||||
private SelfDependencyPatcher() throws IncompatibleVersionException {
|
||||
// We can only self-patch JavaFX on specific platform.
|
||||
if (dependencies == null) {
|
||||
throw new IncompatibleVersionException();
|
||||
}
|
||||
|
||||
final String customUrl = System.getProperty("hmcl.openjfx.repo");
|
||||
if (customUrl == null) {
|
||||
if (System.getProperty("user.country", "").equalsIgnoreCase("CN")) {
|
||||
defaultRepository = Repository.ALIYUN_MIRROR;
|
||||
} else {
|
||||
defaultRepository = Repository.MAVEN_CENTRAL;
|
||||
}
|
||||
repositories = Collections.unmodifiableList(Arrays.asList(Repository.MAVEN_CENTRAL, Repository.ALIYUN_MIRROR));
|
||||
} else {
|
||||
defaultRepository = new Repository(String.format(i18n("repositories.custom"), customUrl), customUrl);
|
||||
repositories = Collections.unmodifiableList(Arrays.asList(Repository.MAVEN_CENTRAL, Repository.ALIYUN_MIRROR, defaultRepository));
|
||||
}
|
||||
}
|
||||
|
||||
static class DependencyDescriptor {
|
||||
|
||||
private static final class DependencyDescriptor {
|
||||
private static final String DEPENDENCIES_LIST_FILE = "/assets/openjfx-dependencies.json";
|
||||
private static final Path DEPENDENCIES_DIR_PATH = HMCL_DIRECTORY.resolve("dependencies").resolve(Platform.getPlatform().toString()).resolve("openjfx");
|
||||
public static final List<DependencyDescriptor> JFX_DEPENDENCIES = readDependencies();
|
||||
|
||||
private static List<DependencyDescriptor> readDependencies() {
|
||||
static List<DependencyDescriptor> readDependencies() {
|
||||
//noinspection ConstantConditions
|
||||
try (Reader reader = new InputStreamReader(SelfDependencyPatcher.class.getResourceAsStream(DEPENDENCIES_LIST_FILE), UTF_8)) {
|
||||
Map<String, List<DependencyDescriptor>> allDependencies =
|
||||
@@ -109,32 +128,10 @@ public final class SelfDependencyPatcher {
|
||||
}
|
||||
}
|
||||
|
||||
static final class Repository {
|
||||
public static final List<Repository> REPOSITORIES;
|
||||
|
||||
public static final Repository CUSTOM;
|
||||
private static final class Repository {
|
||||
public static final Repository MAVEN_CENTRAL = new Repository(i18n("repositories.maven_central"), "https://repo1.maven.org/maven2");
|
||||
public static final Repository ALIYUN_MIRROR = new Repository(i18n("repositories.aliyun_mirror"), "https://maven.aliyun.com/repository/central");
|
||||
|
||||
public static final Repository DEFAULT;
|
||||
|
||||
static {
|
||||
final String customUrl = System.getProperty("hmcl.openjfx.repo");
|
||||
if (customUrl == null) {
|
||||
CUSTOM = null;
|
||||
if (System.getProperty("user.country", "").equalsIgnoreCase("CN")) {
|
||||
DEFAULT = Repository.ALIYUN_MIRROR;
|
||||
} else {
|
||||
DEFAULT = Repository.MAVEN_CENTRAL;
|
||||
}
|
||||
REPOSITORIES = Collections.unmodifiableList(Arrays.asList(MAVEN_CENTRAL, ALIYUN_MIRROR));
|
||||
} else {
|
||||
CUSTOM = new Repository(String.format(i18n("repositories.custom"), customUrl), customUrl);
|
||||
DEFAULT = CUSTOM;
|
||||
REPOSITORIES = Collections.unmodifiableList(Arrays.asList(MAVEN_CENTRAL, ALIYUN_MIRROR, CUSTOM));
|
||||
}
|
||||
}
|
||||
|
||||
private final String name;
|
||||
private final String url;
|
||||
|
||||
@@ -152,8 +149,6 @@ public final class SelfDependencyPatcher {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String DEPENDENCIES_LIST_FILE = "/assets/openjfx-dependencies.json";
|
||||
|
||||
/**
|
||||
* Patch in any missing dependencies, if any.
|
||||
*/
|
||||
@@ -177,19 +172,16 @@ public final class SelfDependencyPatcher {
|
||||
throw new IncompatibleVersionException();
|
||||
}
|
||||
|
||||
// We can only self-patch JavaFX on specific platform.
|
||||
if (JFX_DEPENDENCIES == null) {
|
||||
throw new IncompatibleVersionException();
|
||||
}
|
||||
SelfDependencyPatcher patcher = new SelfDependencyPatcher();
|
||||
|
||||
// Otherwise we're free to download in Java 11+
|
||||
LOG.info("Missing JavaFX dependencies, attempting to patch in missing classes");
|
||||
|
||||
// Download missing dependencies
|
||||
List<DependencyDescriptor> missingDependencies = checkMissingDependencies();
|
||||
List<DependencyDescriptor> missingDependencies = patcher.checkMissingDependencies();
|
||||
if (!missingDependencies.isEmpty()) {
|
||||
try {
|
||||
fetchDependencies(missingDependencies);
|
||||
patcher.fetchDependencies(missingDependencies);
|
||||
} catch (IOException e) {
|
||||
throw new PatchException("Failed to download dependencies", e);
|
||||
}
|
||||
@@ -197,7 +189,7 @@ public final class SelfDependencyPatcher {
|
||||
|
||||
// Add the dependencies
|
||||
try {
|
||||
loadFromCache();
|
||||
patcher.loadFromCache();
|
||||
} catch (IOException ex) {
|
||||
throw new PatchException("Failed to load JavaFX cache", ex);
|
||||
} catch (ReflectiveOperationException | NoClassDefFoundError ex) {
|
||||
@@ -206,7 +198,7 @@ public final class SelfDependencyPatcher {
|
||||
LOG.info(" - Done!");
|
||||
}
|
||||
|
||||
private static Repository showChooseRepositoryDialog() {
|
||||
private Repository showChooseRepositoryDialog() {
|
||||
final JPanel panel = new JPanel();
|
||||
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||
|
||||
@@ -216,12 +208,12 @@ public final class SelfDependencyPatcher {
|
||||
|
||||
final ButtonGroup buttonGroup = new ButtonGroup();
|
||||
|
||||
for (Repository repository : Repository.REPOSITORIES) {
|
||||
for (Repository repository : repositories) {
|
||||
final JRadioButton button = new JRadioButton(repository.name);
|
||||
button.putClientProperty("repository", repository);
|
||||
buttonGroup.add(button);
|
||||
panel.add(button);
|
||||
if (repository == Repository.DEFAULT) {
|
||||
if (repository == defaultRepository) {
|
||||
button.setSelected(true);
|
||||
}
|
||||
}
|
||||
@@ -249,14 +241,14 @@ public final class SelfDependencyPatcher {
|
||||
* @throws IOException When the locally cached dependency urls cannot be resolved.
|
||||
* @throws ReflectiveOperationException When the call to add these urls to the system classpath failed.
|
||||
*/
|
||||
private static void loadFromCache() throws IOException, ReflectiveOperationException {
|
||||
private void loadFromCache() throws IOException, ReflectiveOperationException {
|
||||
LOG.info(" - Loading dependencies...");
|
||||
|
||||
Set<String> modules = JFX_DEPENDENCIES.stream()
|
||||
Set<String> modules = dependencies.stream()
|
||||
.map(it -> it.module)
|
||||
.collect(toSet());
|
||||
|
||||
Path[] jars = JFX_DEPENDENCIES.stream()
|
||||
Path[] jars = dependencies.stream()
|
||||
.map(DependencyDescriptor::localPath)
|
||||
.toArray(Path[]::new);
|
||||
|
||||
@@ -268,11 +260,11 @@ public final class SelfDependencyPatcher {
|
||||
*
|
||||
* @throws IOException When the files cannot be fetched or saved.
|
||||
*/
|
||||
private static void fetchDependencies(List<DependencyDescriptor> dependencies) throws IOException {
|
||||
private void fetchDependencies(List<DependencyDescriptor> dependencies) throws IOException {
|
||||
boolean isFirstTime = true;
|
||||
|
||||
byte[] buffer = new byte[IOUtils.DEFAULT_BUFFER_SIZE];
|
||||
Repository repository = Repository.DEFAULT;
|
||||
Repository repository = defaultRepository;
|
||||
|
||||
int count = 0;
|
||||
while (true) {
|
||||
@@ -346,10 +338,10 @@ public final class SelfDependencyPatcher {
|
||||
}
|
||||
}
|
||||
|
||||
private static List<DependencyDescriptor> checkMissingDependencies() {
|
||||
private List<DependencyDescriptor> checkMissingDependencies() {
|
||||
List<DependencyDescriptor> missing = new ArrayList<>();
|
||||
|
||||
for (DependencyDescriptor dependency : JFX_DEPENDENCIES) {
|
||||
for (DependencyDescriptor dependency : dependencies) {
|
||||
if (!Files.exists(dependency.localPath())) {
|
||||
missing.add(dependency);
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user