summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnits/unit/LoadingException.java
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2024-08-22 11:41:04 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2024-08-22 11:45:37 -0500
commitea3e2bf07939926e43c7abe3fd13a7c4e93f69d1 (patch)
tree958c97f05c2830aefef45f6882ba688694480b55 /src/main/java/sevenUnits/unit/LoadingException.java
parent43e3b70003fdda6f2ccdd2471e3ee3f97ad50ada (diff)
Show unit/dim file errors as popup
Previously, any error in the unit or dimension file(s) crashes the program. Instead, 7Units now ignores any invalid lines, still parsing the correct ones, and shows a popup in case any errors happen.
Diffstat (limited to 'src/main/java/sevenUnits/unit/LoadingException.java')
-rw-r--r--src/main/java/sevenUnits/unit/LoadingException.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/main/java/sevenUnits/unit/LoadingException.java b/src/main/java/sevenUnits/unit/LoadingException.java
new file mode 100644
index 0000000..9376ed7
--- /dev/null
+++ b/src/main/java/sevenUnits/unit/LoadingException.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (C) 2024 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package sevenUnits.unit;
+
+import java.nio.file.Path;
+import java.util.Optional;
+
+/**
+ * An exception that occurred when loading a file. This wrapper class adds more
+ * info about the error.
+ *
+ * @author Adrien Hopkins
+ * @since 2024-08-22
+ */
+public final class LoadingException extends RuntimeException {
+ public static enum FileType {
+ UNIT, DIMENSION
+ }
+
+ private static final long serialVersionUID = -8167971828216907607L;
+
+ private final long lineNumber;
+ private final String line;
+ private final Optional<Path> file;
+
+ private final FileType fileType;
+
+ private final RuntimeException problem;
+
+ public LoadingException(long lineNumber, String line, FileType fileType,
+ RuntimeException problem) {
+ super(problem);
+ this.lineNumber = lineNumber;
+ this.line = line;
+ this.file = Optional.empty();
+ this.fileType = fileType;
+ this.problem = problem;
+ }
+
+ public LoadingException(long lineNumber, String line, Path file,
+ FileType fileType, RuntimeException problem) {
+ super(problem);
+ this.lineNumber = lineNumber;
+ this.line = line;
+ this.file = Optional.of(file);
+ this.fileType = fileType;
+ this.problem = problem;
+ }
+
+ public Optional<Path> file() {
+ return this.file;
+ }
+
+ public FileType fileType() {
+ return this.fileType;
+ }
+
+ @Override
+ public String getMessage() {
+ return this.file
+ .map(f -> String.format(
+ "Error parsing line %d of %s file '%s' (\"%s\"): %s",
+ this.lineNumber, this.fileType.toString().toLowerCase(), f,
+ this.line, this.problem))
+ .orElse(String.format(
+ "Error parsing line %d of %s stream (\"%s\"): %s",
+ this.lineNumber, this.fileType.toString().toLowerCase(),
+ this.line, this.problem));
+ }
+
+ public String line() {
+ return this.line;
+ }
+
+ public long lineNumber() {
+ return this.lineNumber;
+ }
+
+ public RuntimeException problem() {
+ return this.problem;
+ }
+}