diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java
index d6efe4859..c840ca842 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DownloadInfo.java
@@ -22,6 +22,7 @@ import com.google.gson.annotations.SerializedName;
import org.jackhuang.hmcl.util.Immutable;
import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.ToStringBuilder;
+import org.jackhuang.hmcl.util.gson.TolerableValidationException;
import org.jackhuang.hmcl.util.gson.Validation;
/**
@@ -74,8 +75,8 @@ public class DownloadInfo implements Validation {
}
@Override
- public void validate() throws JsonParseException {
+ public void validate() throws JsonParseException, TolerableValidationException {
if (StringUtils.isBlank(url))
- throw new JsonParseException("DownloadInfo url can not be null");
+ throw new TolerableValidationException();
}
}
diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/IdDownloadInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/IdDownloadInfo.java
index 992245604..b79ca3757 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/IdDownloadInfo.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/IdDownloadInfo.java
@@ -21,6 +21,7 @@ import com.google.gson.JsonParseException;
import com.google.gson.annotations.SerializedName;
import org.jackhuang.hmcl.util.Immutable;
import org.jackhuang.hmcl.util.StringUtils;
+import org.jackhuang.hmcl.util.gson.TolerableValidationException;
/**
*
@@ -54,7 +55,7 @@ public class IdDownloadInfo extends DownloadInfo {
}
@Override
- public void validate() throws JsonParseException {
+ public void validate() throws JsonParseException, TolerableValidationException {
super.validate();
if (StringUtils.isBlank(id))
diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LoggingInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LoggingInfo.java
index ccd1ce1fe..dd359757b 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LoggingInfo.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LoggingInfo.java
@@ -20,6 +20,7 @@ package org.jackhuang.hmcl.game;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.SerializedName;
import org.jackhuang.hmcl.util.StringUtils;
+import org.jackhuang.hmcl.util.gson.TolerableValidationException;
import org.jackhuang.hmcl.util.gson.Validation;
/**
@@ -66,7 +67,7 @@ public final class LoggingInfo implements Validation {
}
@Override
- public void validate() throws JsonParseException {
+ public void validate() throws JsonParseException, TolerableValidationException {
file.validate();
if (StringUtils.isBlank(argument))
throw new JsonParseException("LoggingInfo.argument is empty.");
diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CircleDependencyException.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/TolerableValidationException.java
similarity index 61%
rename from HMCLCore/src/main/java/org/jackhuang/hmcl/game/CircleDependencyException.java
rename to HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/TolerableValidationException.java
index e56826e1f..d1146e67c 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/CircleDependencyException.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/TolerableValidationException.java
@@ -15,24 +15,15 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.jackhuang.hmcl.game;
+package org.jackhuang.hmcl.util.gson;
/**
- * What's circle dependency?
- * When C inherits from B, and B inherits from something else, and finally inherits from C again.
- *
- * @author huangyuhui
+ * This exception gets thrown by implementations of {@link Validation#validate()} if you want to replace
+ * the nullable JSON-parsed object which does not satisfy the constraint with null value.
+ * @see Validation
*/
-public final class CircleDependencyException extends GameException {
+public final class TolerableValidationException extends Exception {
- public CircleDependencyException() {
- }
-
- public CircleDependencyException(String message) {
- super(message);
- }
-
- public CircleDependencyException(String message, Throwable cause) {
- super(message, cause);
+ public TolerableValidationException() {
}
}
diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/Validation.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/Validation.java
index 951e1c52c..b987f8a38 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/Validation.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/Validation.java
@@ -36,5 +36,5 @@ public interface Validation {
*
* @throws JsonParseException if fields are filled in wrong format or wrong type.
*/
- void validate() throws JsonParseException;
+ void validate() throws JsonParseException, TolerableValidationException;
}
diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/ValidationTypeAdapterFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/ValidationTypeAdapterFactory.java
index 2bcb49d3a..415ec84c5 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/ValidationTypeAdapterFactory.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/ValidationTypeAdapterFactory.java
@@ -40,8 +40,13 @@ public final class ValidationTypeAdapterFactory implements TypeAdapterFactory {
return new TypeAdapter() {
@Override
public void write(JsonWriter writer, T t) throws IOException {
- if (t instanceof Validation)
- ((Validation) t).validate();
+ if (t instanceof Validation) {
+ try {
+ ((Validation) t).validate();
+ } catch (TolerableValidationException e) {
+ delegate.write(writer, null);
+ }
+ }
delegate.write(writer, t);
}
@@ -49,8 +54,13 @@ public final class ValidationTypeAdapterFactory implements TypeAdapterFactory {
@Override
public T read(JsonReader reader) throws IOException {
T t = delegate.read(reader);
- if (t instanceof Validation)
- ((Validation) t).validate();
+ if (t instanceof Validation) {
+ try {
+ ((Validation) t).validate();
+ } catch (TolerableValidationException e) {
+ return null;
+ }
+ }
return t;
}
};