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; } };