From e727ca331f085490ea19ed3d2e1f458a4a421a3d Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Wed, 2 Sep 2015 18:57:24 +0800 Subject: [PATCH] Fix syncing TaskWindow. --- .../hellominecraft/launcher/Main.java | 8 +- .../launcher/launch/DefaultGameLauncher.java | 3 +- .../org/jackhuang/mojang/authlib/Agent.java | 1 - .../mojang/authlib/AuthenticationService.java | 6 - .../authlib/BaseAuthenticationService.java | 5 - .../mojang/authlib/GameProfileRepository.java | 6 - .../authlib/HttpAuthenticationService.java | 2 +- .../mojang/authlib/ProfileLookupCallback.java | 8 -- .../BaseMinecraftSessionService.java | 17 --- .../HttpMinecraftSessionService.java | 15 -- .../minecraft/MinecraftSessionService.java | 16 --- .../yggdrasil/ProfileIncompleteException.java | 19 --- .../yggdrasil/ProfileNotFoundException.java | 19 --- .../YggdrasilAuthenticationService.java | 12 -- .../YggdrasilGameProfileRepository.java | 134 ------------------ .../YggdrasilMinecraftSessionService.java | 97 ------------- .../request/JoinMinecraftServerRequest.java | 10 -- .../HasJoinedMinecraftServerResponse.java | 18 --- .../MinecraftProfilePropertiesResponse.java | 23 --- .../ProfileSearchResultsResponse.java | 17 --- .../hellominecraft/tasks/TaskList.java | 7 +- .../hellominecraft/tasks/TaskWindow.form | 1 + .../hellominecraft/tasks/TaskWindow.java | 36 ++++- .../installer/cauldron/ForgeInstaller.java | 77 +++++----- 24 files changed, 83 insertions(+), 474 deletions(-) delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/BaseAuthenticationService.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/GameProfileRepository.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/ProfileLookupCallback.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/BaseMinecraftSessionService.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/HttpMinecraftSessionService.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/MinecraftSessionService.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileIncompleteException.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileNotFoundException.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/request/JoinMinecraftServerRequest.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/HasJoinedMinecraftServerResponse.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/MinecraftProfilePropertiesResponse.java delete mode 100644 HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/ProfileSearchResultsResponse.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index e792b7bf8..09bbb8c33 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -31,6 +31,8 @@ import java.net.URLClassLoader; import java.security.GeneralSecurityException; import java.security.cert.X509Certificate; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Map; import java.util.jar.JarFile; import javax.net.ssl.HostnameVerifier; @@ -139,7 +141,11 @@ public final class Main implements Runnable { JarFile jarFile = new JarFile(jar); String mainClass = jarFile.getManifest().getMainAttributes().getValue("Main-Class"); if (mainClass != null) { - new URLClassLoader(new URL[]{jar.toURI().toURL()}, URLClassLoader.getSystemClassLoader().getParent()).loadClass(mainClass).getMethod("main", String[].class).invoke(null, new Object[]{new String[]{"nofound"}}); + ArrayList al = new ArrayList<>(Arrays.asList(args)); + al.add("notfound"); + new URLClassLoader(new URL[]{jar.toURI().toURL()}, + URLClassLoader.getSystemClassLoader().getParent()).loadClass(mainClass) + .getMethod("main", String[].class).invoke(null, new Object[]{al.toArray(new String[0])}); return; } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java index 58adee2b3..a5caaa175 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/DefaultGameLauncher.java @@ -43,10 +43,9 @@ public class DefaultGameLauncher extends GameLauncher { private void register() { downloadLibrariesEvent.register((sender, t) -> { - final TaskWindow dw = TaskWindow.getInstance(); + final TaskWindow.TaskWindowFactory dw = TaskWindow.getInstance(); ParallelTask parallelTask = new ParallelTask(); for (DownloadLibraryJob s : t) - //parallelTask.addDependsTask(new FileDownloadTask(s.url, s.path).setTag(s.name)); parallelTask.addDependsTask(new LibraryDownloadTask(s)); dw.addTask(parallelTask); boolean flag = true; diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/Agent.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/Agent.java index a83b0f678..cc6c6cc6e 100644 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/Agent.java +++ b/HMCL/src/main/java/org/jackhuang/mojang/authlib/Agent.java @@ -3,7 +3,6 @@ package org.jackhuang.mojang.authlib; public class Agent { public static final Agent MINECRAFT = new Agent("Minecraft", 1); - public static final Agent SCROLLS = new Agent("Scrolls", 1); private final String name; private final int version; diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/AuthenticationService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/AuthenticationService.java index 8776477a9..c0bacf8a5 100644 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/AuthenticationService.java +++ b/HMCL/src/main/java/org/jackhuang/mojang/authlib/AuthenticationService.java @@ -1,12 +1,6 @@ package org.jackhuang.mojang.authlib; -import org.jackhuang.mojang.authlib.minecraft.MinecraftSessionService; - public abstract interface AuthenticationService { public abstract UserAuthentication createUserAuthentication(Agent paramAgent); - - public abstract MinecraftSessionService createMinecraftSessionService(); - - public abstract GameProfileRepository createProfileRepository(); } diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/BaseAuthenticationService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/BaseAuthenticationService.java deleted file mode 100644 index 3b484d3c4..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/BaseAuthenticationService.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.jackhuang.mojang.authlib; - -public abstract class BaseAuthenticationService - implements AuthenticationService { -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/GameProfileRepository.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/GameProfileRepository.java deleted file mode 100644 index 7b7eccfe3..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/GameProfileRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.jackhuang.mojang.authlib; - -public abstract interface GameProfileRepository { - - public abstract void findProfilesByNames(String[] paramArrayOfString, Agent paramAgent, ProfileLookupCallback paramProfileLookupCallback); -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/HttpAuthenticationService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/HttpAuthenticationService.java index b971182d2..411243e1e 100644 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/HttpAuthenticationService.java +++ b/HMCL/src/main/java/org/jackhuang/mojang/authlib/HttpAuthenticationService.java @@ -14,7 +14,7 @@ import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.NetUtils; import org.jackhuang.hellominecraft.utils.Utils; -public abstract class HttpAuthenticationService extends BaseAuthenticationService { +public abstract class HttpAuthenticationService implements AuthenticationService { private static final Logger LOGGER = new Logger("HttpAuthenticationService"); private final Proxy proxy; diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/ProfileLookupCallback.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/ProfileLookupCallback.java deleted file mode 100644 index 335a118f2..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/ProfileLookupCallback.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.jackhuang.mojang.authlib; - -public abstract interface ProfileLookupCallback { - - public abstract void onProfileLookupSucceeded(GameProfile paramGameProfile); - - public abstract void onProfileLookupFailed(GameProfile paramGameProfile, Exception paramException); -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/BaseMinecraftSessionService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/BaseMinecraftSessionService.java deleted file mode 100644 index b4ed7691d..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/BaseMinecraftSessionService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jackhuang.mojang.authlib.minecraft; - -import org.jackhuang.mojang.authlib.AuthenticationService; - -public abstract class BaseMinecraftSessionService - implements MinecraftSessionService { - - private final AuthenticationService authenticationService; - - protected BaseMinecraftSessionService(AuthenticationService authenticationService) { - this.authenticationService = authenticationService; - } - - public AuthenticationService getAuthenticationService() { - return this.authenticationService; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/HttpMinecraftSessionService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/HttpMinecraftSessionService.java deleted file mode 100644 index 1f367b20b..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/HttpMinecraftSessionService.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.jackhuang.mojang.authlib.minecraft; - -import org.jackhuang.mojang.authlib.HttpAuthenticationService; - -public abstract class HttpMinecraftSessionService extends BaseMinecraftSessionService { - - protected HttpMinecraftSessionService(HttpAuthenticationService authenticationService) { - super(authenticationService); - } - - @Override - public HttpAuthenticationService getAuthenticationService() { - return (HttpAuthenticationService) super.getAuthenticationService(); - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/MinecraftSessionService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/MinecraftSessionService.java deleted file mode 100644 index 5041967be..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/minecraft/MinecraftSessionService.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jackhuang.mojang.authlib.minecraft; - -import org.jackhuang.mojang.authlib.GameProfile; -import org.jackhuang.mojang.authlib.exceptions.AuthenticationException; -import org.jackhuang.mojang.authlib.exceptions.AuthenticationUnavailableException; - -public abstract interface MinecraftSessionService { - - public abstract void joinServer(GameProfile paramGameProfile, String paramString1, String paramString2) - throws AuthenticationException; - - public abstract GameProfile hasJoinedServer(GameProfile paramGameProfile, String paramString) - throws AuthenticationUnavailableException; - - public abstract GameProfile fillProfileProperties(GameProfile paramGameProfile, boolean paramBoolean); -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileIncompleteException.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileIncompleteException.java deleted file mode 100644 index 499092168..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileIncompleteException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil; - -public class ProfileIncompleteException extends RuntimeException { - - public ProfileIncompleteException() { - } - - public ProfileIncompleteException(String message) { - super(message); - } - - public ProfileIncompleteException(String message, Throwable cause) { - super(message, cause); - } - - public ProfileIncompleteException(Throwable cause) { - super(cause); - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileNotFoundException.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileNotFoundException.java deleted file mode 100644 index 07a12a3e5..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/ProfileNotFoundException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil; - -public class ProfileNotFoundException extends RuntimeException { - - public ProfileNotFoundException() { - } - - public ProfileNotFoundException(String message) { - super(message); - } - - public ProfileNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public ProfileNotFoundException(Throwable cause) { - super(cause); - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java index 1447d97b2..4c17ac194 100644 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java +++ b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilAuthenticationService.java @@ -11,14 +11,12 @@ import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.jackhuang.mojang.authlib.Agent; import org.jackhuang.mojang.authlib.GameProfile; -import org.jackhuang.mojang.authlib.GameProfileRepository; import org.jackhuang.mojang.authlib.HttpAuthenticationService; import org.jackhuang.mojang.authlib.UserAuthentication; import org.jackhuang.mojang.authlib.exceptions.AuthenticationException; import org.jackhuang.mojang.authlib.exceptions.AuthenticationUnavailableException; import org.jackhuang.mojang.authlib.exceptions.InvalidCredentialsException; import org.jackhuang.mojang.authlib.exceptions.UserMigratedException; -import org.jackhuang.mojang.authlib.minecraft.MinecraftSessionService; import org.jackhuang.mojang.authlib.properties.PropertyMap; import org.jackhuang.mojang.authlib.yggdrasil.response.Response; import org.jackhuang.mojang.util.UUIDTypeAdapter; @@ -50,16 +48,6 @@ public class YggdrasilAuthenticationService extends HttpAuthenticationService { return new YggdrasilUserAuthentication(this, agent); } - @Override - public MinecraftSessionService createMinecraftSessionService() { - return new YggdrasilMinecraftSessionService(this); - } - - @Override - public GameProfileRepository createProfileRepository() { - return new YggdrasilGameProfileRepository(this); - } - protected T makeRequest(URL url, Object input, Class classOfT) throws AuthenticationException { try { String jsonResult = input == null ? performGetRequest(url) : performPostRequest(url, this.gson.toJson(input), "application/json"); diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java deleted file mode 100644 index 7a7d0df91..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil; - -import java.util.HashSet; -import java.util.Set; -import org.jackhuang.hellominecraft.logging.logger.Logger; -import org.jackhuang.hellominecraft.utils.NetUtils; -import org.jackhuang.hellominecraft.utils.StrUtils; -import org.jackhuang.mojang.authlib.Agent; -import org.jackhuang.mojang.authlib.GameProfile; -import org.jackhuang.mojang.authlib.GameProfileRepository; -import org.jackhuang.mojang.authlib.ProfileLookupCallback; -import org.jackhuang.mojang.authlib.exceptions.AuthenticationException; -import org.jackhuang.mojang.authlib.yggdrasil.response.ProfileSearchResultsResponse; - -public class YggdrasilGameProfileRepository - implements GameProfileRepository { - - private static final Logger LOGGER = new Logger("YggdrasilGameProfileRepository"); - private static final String BASE_URL = "https://api.mojang.com/"; - private static final String SEARCH_PAGE_URL = BASE_URL + "profiles/page/"; - private static final int MAX_FAIL_COUNT = 3; - private static final int DELAY_BETWEEN_PAGES = 100; - private static final int DELAY_BETWEEN_FAILURES = 750; - private final YggdrasilAuthenticationService authenticationService; - - public YggdrasilGameProfileRepository(YggdrasilAuthenticationService authenticationService) { - this.authenticationService = authenticationService; - } - - @Override - public void findProfilesByNames(String[] names, Agent agent, ProfileLookupCallback callback) { - Set criteria = new HashSet(); - - for (String name : names) { - if (StrUtils.isNotBlank(name)) { - criteria.add(new ProfileCriteria(name, agent)); - } - } - - Exception exception = null; - Set request = new HashSet(criteria); - int page = 1; - int failCount = 0; - while (!criteria.isEmpty()) { - try { - ProfileSearchResultsResponse response = (ProfileSearchResultsResponse) this.authenticationService.makeRequest(NetUtils.constantURL("https://api.mojang.com/profiles/page/" + page), request, ProfileSearchResultsResponse.class); - failCount = 0; - exception = null; - - if ((response.getSize() == 0) || (response.getProfiles().length == 0)) { - LOGGER.debug("Page {} returned empty, aborting search", new Object[]{page}); - } else { - LOGGER.debug("Page {} returned {} results of {}, parsing", new Object[]{page, response.getProfiles().length, response.getSize()}); - - for (GameProfile profile : response.getProfiles()) { - LOGGER.debug("Successfully looked up profile {}", new Object[]{profile}); - criteria.remove(new ProfileCriteria(profile.getName(), agent)); - callback.onProfileLookupSucceeded(profile); - } - - LOGGER.debug("Page {} successfully parsed", new Object[]{page}); - page++; - try { - Thread.sleep(DELAY_BETWEEN_PAGES); - } catch (InterruptedException ignored) { - } - } - } catch (AuthenticationException e) { - exception = e; - failCount++; - - if (failCount != 3) { - try { - Thread.sleep(DELAY_BETWEEN_FAILURES); - } catch (InterruptedException ignored) { - } - } - } - } - if (criteria.isEmpty()) { - LOGGER.debug("Successfully found every profile requested"); - } else { - LOGGER.debug("{} profiles were missing from search results", new Object[]{criteria.size()}); - if (exception == null) { - exception = new ProfileNotFoundException("Server did not find the requested profile"); - } - for (ProfileCriteria profileCriteria : criteria) { - callback.onProfileLookupFailed(new GameProfile(null, profileCriteria.getName()), exception); - } - } - } - - private class ProfileCriteria { - - private final String name; - private final String agent; - - private ProfileCriteria(String name, Agent agent) { - this.name = name; - this.agent = agent.getName(); - } - - public String getName() { - return this.name; - } - - public String getAgent() { - return this.agent; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if ((o == null) || (getClass() != o.getClass())) { - return false; - } - ProfileCriteria that = (ProfileCriteria) o; - return (this.agent.equals(that.agent)) && (this.name.toLowerCase().equals(that.name.toLowerCase())); - } - - @Override - public int hashCode() { - return 31 * this.name.toLowerCase().hashCode() + this.agent.hashCode(); - } - - @Override - public String toString() { - return "ProfileCriteria{" + "name=" + name + ", agent=" + agent + '}'; - } - - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java deleted file mode 100644 index 7834fa761..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil; - -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import org.jackhuang.hellominecraft.logging.logger.Logger; -import org.jackhuang.hellominecraft.utils.NetUtils; -import org.jackhuang.mojang.authlib.GameProfile; -import org.jackhuang.mojang.authlib.HttpAuthenticationService; -import org.jackhuang.mojang.authlib.exceptions.AuthenticationException; -import org.jackhuang.mojang.authlib.exceptions.AuthenticationUnavailableException; -import org.jackhuang.mojang.authlib.minecraft.HttpMinecraftSessionService; -import org.jackhuang.mojang.authlib.yggdrasil.request.JoinMinecraftServerRequest; -import org.jackhuang.mojang.authlib.yggdrasil.response.HasJoinedMinecraftServerResponse; -import org.jackhuang.mojang.authlib.yggdrasil.response.MinecraftProfilePropertiesResponse; -import org.jackhuang.mojang.authlib.yggdrasil.response.Response; -import org.jackhuang.mojang.util.UUIDTypeAdapter; - -public class YggdrasilMinecraftSessionService extends HttpMinecraftSessionService { - - private static final Logger LOGGER = new Logger("YggdrasilMinecraftSessionService"); - private static final String BASE_URL = "https://sessionserver.mojang.com/session/minecraft/"; - private static final URL JOIN_URL = NetUtils.constantURL(BASE_URL + "join"); - private static final URL CHECK_URL = NetUtils.constantURL(BASE_URL + "hasJoined"); - - protected YggdrasilMinecraftSessionService(YggdrasilAuthenticationService authenticationService) { - super(authenticationService); - } - - @Override - public void joinServer(GameProfile profile, String authenticationToken, String serverId) throws AuthenticationException { - JoinMinecraftServerRequest request = new JoinMinecraftServerRequest(); - request.accessToken = authenticationToken; - request.selectedProfile = profile.getId(); - request.serverId = serverId; - - getAuthenticationService().makeRequest(JOIN_URL, request, Response.class); - } - - @Override - public GameProfile hasJoinedServer(GameProfile user, String serverId) throws AuthenticationUnavailableException { - Map arguments = new HashMap(); - - arguments.put("username", user.getName()); - arguments.put("serverId", serverId); - - URL url = NetUtils.concatenateURL(CHECK_URL, HttpAuthenticationService.buildQuery(arguments)); - try { - HasJoinedMinecraftServerResponse response = (HasJoinedMinecraftServerResponse) getAuthenticationService().makeRequest(url, null, HasJoinedMinecraftServerResponse.class); - - if ((response != null) && (response.getId() != null)) { - GameProfile result = new GameProfile(response.getId(), user.getName()); - - if (response.getProperties() != null) { - result.getProperties().putAll(response.getProperties()); - } - - return result; - } - return null; - } catch (AuthenticationUnavailableException e) { - throw e; - } catch (AuthenticationException e) { - } - return null; - } - - @Override - public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) { - if (profile.getId() == null) { - return profile; - } - try { - URL url = NetUtils.constantURL(new StringBuilder().append("https://sessionserver.mojang.com/session/minecraft/profile/").append(UUIDTypeAdapter.fromUUID(profile.getId())).toString()); - url = NetUtils.concatenateURL(url, new StringBuilder().append("unsigned=").append(!requireSecure).toString()); - MinecraftProfilePropertiesResponse response = (MinecraftProfilePropertiesResponse) getAuthenticationService().makeRequest(url, null, MinecraftProfilePropertiesResponse.class); - - if (response == null) { - LOGGER.debug(new StringBuilder().append("Couldn't fetch profile properties for ").append(profile).append(" as the profile does not exist").toString()); - return profile; - } - GameProfile result = new GameProfile(response.getId(), response.getName()); - result.getProperties().putAll(response.getProperties()); - profile.getProperties().putAll(response.getProperties()); - LOGGER.debug(new StringBuilder().append("Successfully fetched profile properties for ").append(profile).toString()); - return result; - } catch (Exception e) { - LOGGER.warn(new StringBuilder().append("Couldn't look up profile properties for ").append(profile).toString(), e); - } - return profile; - } - - @Override - public YggdrasilAuthenticationService getAuthenticationService() { - return (YggdrasilAuthenticationService) super.getAuthenticationService(); - } -} \ No newline at end of file diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/request/JoinMinecraftServerRequest.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/request/JoinMinecraftServerRequest.java deleted file mode 100644 index 261946670..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/request/JoinMinecraftServerRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil.request; - -import java.util.UUID; - -public class JoinMinecraftServerRequest { - - public String accessToken; - public UUID selectedProfile; - public String serverId; -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/HasJoinedMinecraftServerResponse.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/HasJoinedMinecraftServerResponse.java deleted file mode 100644 index d2564080f..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/HasJoinedMinecraftServerResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil.response; - -import org.jackhuang.mojang.authlib.properties.PropertyMap; -import java.util.UUID; - -public class HasJoinedMinecraftServerResponse extends Response { - - private UUID id; - private PropertyMap properties; - - public UUID getId() { - return this.id; - } - - public PropertyMap getProperties() { - return this.properties; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/MinecraftProfilePropertiesResponse.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/MinecraftProfilePropertiesResponse.java deleted file mode 100644 index 23e91296b..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/MinecraftProfilePropertiesResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil.response; - -import org.jackhuang.mojang.authlib.properties.PropertyMap; -import java.util.UUID; - -public class MinecraftProfilePropertiesResponse extends Response { - - private UUID id; - private String name; - private PropertyMap properties; - - public UUID getId() { - return this.id; - } - - public String getName() { - return this.name; - } - - public PropertyMap getProperties() { - return this.properties; - } -} diff --git a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/ProfileSearchResultsResponse.java b/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/ProfileSearchResultsResponse.java deleted file mode 100644 index 2aeafc88f..000000000 --- a/HMCL/src/main/java/org/jackhuang/mojang/authlib/yggdrasil/response/ProfileSearchResultsResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.jackhuang.mojang.authlib.yggdrasil.response; - -import org.jackhuang.mojang.authlib.GameProfile; - -public class ProfileSearchResultsResponse extends Response { - - private GameProfile[] profiles; - private int size; - - public GameProfile[] getProfiles() { - return this.profiles; - } - - public int getSize() { - return this.size; - } -} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java index 1faef0b43..b6e5f3e44 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Set; import org.jackhuang.hellominecraft.HMCLog; @@ -30,7 +31,7 @@ import org.jackhuang.hellominecraft.HMCLog; */ public class TaskList extends Thread { - List taskQueue = Collections.synchronizedList(new ArrayList()); + List taskQueue = Collections.synchronizedList(new LinkedList<>()); ArrayList allDone = new ArrayList(); ArrayList> taskListener = new ArrayList(); @@ -143,8 +144,8 @@ public class TaskList extends Thread { threadPool.clear(); totTask = taskQueue.size(); - for (Task taskQueue1 : taskQueue) - executeTask(taskQueue1); + while(!taskQueue.isEmpty()) + executeTask(taskQueue.remove(0)); if (shouldContinue) for (Runnable d : allDone) d.run(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.form b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.form index ea8d80bc1..f39061c71 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.form +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.form @@ -13,6 +13,7 @@ + diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java index 4d59231f9..a88f082f0 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskWindow.java @@ -17,6 +17,7 @@ package org.jackhuang.hellominecraft.tasks; import java.util.ArrayList; +import java.util.LinkedList; import javax.swing.SwingUtilities; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; @@ -33,10 +34,14 @@ public class TaskWindow extends javax.swing.JDialog private static final TaskWindow instance = new TaskWindow(); - public static TaskWindow getInstance() { + private static TaskWindow inst() { instance.clean(); return instance; } + + public static TaskWindowFactory getInstance() { + return new TaskWindowFactory(); + } boolean suc = false; @@ -75,7 +80,7 @@ public class TaskWindow extends javax.swing.JDialog } public boolean start() { - if (taskList.isAlive()) return false; + if (isVisible() || taskList.isAlive()) return false; pgsTotal.setValue(0); suc = false; SwingUtils.clearDefaultTable(lstDownload); @@ -113,6 +118,9 @@ public class TaskWindow extends javax.swing.JDialog public void windowClosed(java.awt.event.WindowEvent evt) { formWindowClosed(evt); } + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } }); btnCancel.setText(bundle.getString("taskwindow.cancel")); // NOI18N @@ -174,8 +182,13 @@ public class TaskWindow extends javax.swing.JDialog SwingUtilities.invokeLater(taskList::abort); HMCLog.log("Tasks have been canceled by user."); } + taskList = null; }//GEN-LAST:event_formWindowClosed + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + // TODO add your handling code here: + }//GEN-LAST:event_formWindowClosing + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; private javax.swing.JTable lstDownload; @@ -262,4 +275,23 @@ public class TaskWindow extends javax.swing.JDialog SwingUtils.setValueAt(lstDownload, task.getInfo() + ": " + sta, idx, 0); }); } + + public static class TaskWindowFactory { + public static final Object obj = new Object(); + + LinkedList ll = new LinkedList<>(); + + public TaskWindowFactory addTask(Task t) { + ll.add(t); + return this; + } + + public boolean start() { + synchronized(obj) { + TaskWindow tw = inst(); + for(Task t : ll) tw.addTask(t); + return tw.start(); + } + } + } } diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/installer/cauldron/ForgeInstaller.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/installer/cauldron/ForgeInstaller.java index df7a5db56..d6cf8b4ab 100644 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/installer/cauldron/ForgeInstaller.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/installer/cauldron/ForgeInstaller.java @@ -78,23 +78,19 @@ public class ForgeInstaller { //forge.format(); File file = new File(gameDir, profile.install.filePath); file.getParentFile().mkdirs(); - FileOutputStream fos = new FileOutputStream(file); - BufferedOutputStream bos = new BufferedOutputStream(fos); - int c; - while ((c = is.read()) != -1) - bos.write((byte) c); - bos.close(); - fos.close(); + try (FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos)) { + int c; + while ((c = is.read()) != -1) + bos.write((byte) c); + } File minecraftserver = new File(gameDir, "minecraft_server." + profile.install.minecraft + ".jar"); - TaskWindow tw = TaskWindow.getInstance(); if (minecraftserver.exists() && JOptionPane.showConfirmDialog(null, "已发现官方服务端文件,是否要重新下载?") == JOptionPane.YES_OPTION) { - tw.clean(); - if (!tw.addTask(new FileDownloadTask("https://s3.amazonaws.com/Minecraft.Download/versions/{MCVER}/minecraft_server.{MCVER}.jar".replace("{MCVER}", profile.install.minecraft), + if (!TaskWindow.getInstance().addTask(new FileDownloadTask("https://s3.amazonaws.com/Minecraft.Download/versions/{MCVER}/minecraft_server.{MCVER}.jar".replace("{MCVER}", profile.install.minecraft), minecraftserver).setTag("minecraft_server")).start()) MessageBox.Show("Minecraft官方服务端下载失败!"); } - tw.clean(); + TaskWindow.TaskWindowFactory tw = TaskWindow.getInstance(); for (MinecraftLibrary library : profile.versionInfo.libraries) { library.init(); File lib = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); @@ -103,10 +99,10 @@ public class ForgeInstaller { libURL = library.url; tw.addTask(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - tw.start(); - if (!tw.areTasksFinished()) + if (!tw.start()) MessageBox.Show("压缩库下载失败!"); - tw.clean(); + + tw = TaskWindow.getInstance(); for (MinecraftLibrary library : profile.versionInfo.libraries) { File packxz = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); if (packxz.exists()) return; @@ -117,11 +113,10 @@ public class ForgeInstaller { libURL = library.url; tw.addTask(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - tw.start(); - if (!tw.areTasksFinished()) + if (!tw.start()) MessageBox.Show("库下载失败!"); - tw.clean(); - ArrayList badLibs = new ArrayList(); + + ArrayList badLibs = new ArrayList<>(); for (MinecraftLibrary library : profile.versionInfo.libraries) { File lib = new File(gameDir, "libraries" + File.separator + library.formatted); File packFile = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); @@ -157,17 +152,15 @@ public class ForgeInstaller { byte[] checksums = Arrays.copyOfRange(decompressed, decompressed.length - len - 8, decompressed.length - 8); - FileOutputStream jarBytes = new FileOutputStream(output); - JarOutputStream jos = new JarOutputStream(jarBytes); - - Pack200.newUnpacker().unpack(new ByteArrayInputStream(decompressed), jos); - - jos.putNextEntry(new JarEntry("checksums.sha1")); - jos.write(checksums); - jos.closeEntry(); - - jos.close(); - jarBytes.close(); + try (FileOutputStream jarBytes = new FileOutputStream(output); JarOutputStream jos = new JarOutputStream(jarBytes)) { + + Pack200.newUnpacker().unpack(new ByteArrayInputStream(decompressed), jos); + + jos.putNextEntry(new JarEntry("checksums.sha1")); + jos.write(checksums); + jos.closeEntry(); + + } } private static boolean checksumValid(File libPath, List checksums) { @@ -186,21 +179,21 @@ public class ForgeInstaller { private static boolean validateJar(File libPath, byte[] data, List checksums) throws IOException { System.out.println("Checking \"" + libPath.getAbsolutePath() + "\" internal checksums"); - HashMap files = new HashMap(); + HashMap files = new HashMap<>(); String[] hashes = null; - JarInputStream jar = new JarInputStream(new ByteArrayInputStream(data)); - JarEntry entry = jar.getNextJarEntry(); - while (entry != null) { - byte[] eData = IOUtils.readFully(jar); - - if (entry.getName().equals("checksums.sha1")) - hashes = new String(eData, Charset.forName("UTF-8")).split("\n"); - - if (!entry.isDirectory()) - files.put(entry.getName(), DigestUtils.sha1Hex(eData)); - entry = jar.getNextJarEntry(); + try (JarInputStream jar = new JarInputStream(new ByteArrayInputStream(data))) { + JarEntry entry = jar.getNextJarEntry(); + while (entry != null) { + byte[] eData = IOUtils.readFully(jar); + + if (entry.getName().equals("checksums.sha1")) + hashes = new String(eData, Charset.forName("UTF-8")).split("\n"); + + if (!entry.isDirectory()) + files.put(entry.getName(), DigestUtils.sha1Hex(eData)); + entry = jar.getNextJarEntry(); + } } - jar.close(); if (hashes != null) { boolean failed = !checksums.contains(files.get("checksums.sha1"));