From 4f8d6b45d076825dae4c9e9b55b28ef1acbd9933 Mon Sep 17 00:00:00 2001 From: egor Date: Mon, 21 Mar 2022 19:43:44 +0300 Subject: [PATCH] more detailed error messages, recursion prevention, stacktrace doesn't print on error anymore, xml fix, some other minor fixes --- src/main/java/ru/erius/lab5/Lab5.java | 1 + .../erius/lab5/collection/PeopleDatabase.java | 39 ++++++---- .../java/ru/erius/lab5/data/Coordinates.java | 10 +-- .../java/ru/erius/lab5/data/Location.java | 4 +- src/main/java/ru/erius/lab5/data/Person.java | 14 ++-- .../java/ru/erius/lab5/parser/Adapters.java | 74 +++++++++++++++++++ .../erius/lab5/parser/CoordinateYAdapter.java | 16 ---- .../ru/erius/lab5/parser/HeightAdapter.java | 21 ------ .../erius/lab5/parser/LocalDateAdapter.java | 20 ----- .../ru/erius/lab5/parser/NameAdapter.java | 15 ---- .../ru/erius/lab5/parser/PassportAdapter.java | 16 ---- 11 files changed, 111 insertions(+), 119 deletions(-) create mode 100644 src/main/java/ru/erius/lab5/parser/Adapters.java delete mode 100644 src/main/java/ru/erius/lab5/parser/CoordinateYAdapter.java delete mode 100644 src/main/java/ru/erius/lab5/parser/HeightAdapter.java delete mode 100644 src/main/java/ru/erius/lab5/parser/LocalDateAdapter.java delete mode 100644 src/main/java/ru/erius/lab5/parser/NameAdapter.java delete mode 100644 src/main/java/ru/erius/lab5/parser/PassportAdapter.java diff --git a/src/main/java/ru/erius/lab5/Lab5.java b/src/main/java/ru/erius/lab5/Lab5.java index cb05471..7de6065 100644 --- a/src/main/java/ru/erius/lab5/Lab5.java +++ b/src/main/java/ru/erius/lab5/Lab5.java @@ -16,6 +16,7 @@ public class Lab5 { peopleDatabase.load(); } catch (Database.DatabaseLoadFailedException e) { System.out.println(e.getMessage()); + System.exit(-1); } PeopleDatabaseCommands.setPeopleDatabase(peopleDatabase); diff --git a/src/main/java/ru/erius/lab5/collection/PeopleDatabase.java b/src/main/java/ru/erius/lab5/collection/PeopleDatabase.java index 3d72bb5..df8f508 100644 --- a/src/main/java/ru/erius/lab5/collection/PeopleDatabase.java +++ b/src/main/java/ru/erius/lab5/collection/PeopleDatabase.java @@ -2,7 +2,7 @@ package ru.erius.lab5.collection; import lombok.Getter; import ru.erius.lab5.data.Person; -import ru.erius.lab5.parser.LocalDateAdapter; +import ru.erius.lab5.parser.Adapters; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -40,7 +40,7 @@ public class PeopleDatabase implements Database { @XmlElement(name = "person") private TreeSet collection = new TreeSet<>(); @Getter - @XmlJavaTypeAdapter(LocalDateAdapter.class) + @XmlJavaTypeAdapter(Adapters.LocalDateAdapter.class) @XmlElement(name = "initDate") private LocalDate initDate = LocalDate.now(); @@ -71,28 +71,29 @@ public class PeopleDatabase implements Database { System.out.println("Инициализация коллекции из файла..."); String path = System.getenv(ENV_VAR); + boolean envSet = true; if (path == null) { - errorMessage = "Не найдена переменная окружения LAB5_PATH"; - throw new DatabaseLoadFailedException("Не найдена переменная окружения LAB5_PATH"); + System.out.println("Не найдена переменная окружения LAB5_PATH, создание файла в директории jar файла"); + path = "."; + envSet = false; } File file = new File(path); - if (!file.exists()) { - errorMessage = String.format("Файл %s не был найден. Поменяйте значение переменной окружения LAB5_PATH", path); - throw new DatabaseLoadFailedException(errorMessage); + if (!file.exists() && envSet) { + System.out.println("Файл " + file.getAbsolutePath() + " не был найден, создание файла в директории jar файла"); + file = new File("."); } if (file.isDirectory()) - file = createFile(file); + file = createFile(file); if (!file.canRead()) { - errorMessage = String.format("У вас нет прав на чтение файла %s", path); + errorMessage = String.format("У вас нет прав на чтение файла %s", file.getAbsolutePath()); throw new DatabaseLoadFailedException(errorMessage); } if (!file.canWrite()) { - errorMessage = String.format("У вас нет прав на запись в файл %s", path); + errorMessage = String.format("У вас нет прав на запись в файл %s", file.getAbsolutePath()); throw new DatabaseLoadFailedException(errorMessage); } this.file = file; - System.out.println("Файл успешно найден"); try { Unmarshaller unmarshaller = context.createUnmarshaller(); @@ -101,8 +102,7 @@ public class PeopleDatabase implements Database { this.initDate = pd.initDate; System.out.println("Инициализация успешно выполнена"); } catch (JAXBException e) { - e.printStackTrace(); - throw new DatabaseLoadFailedException("Не удалось загрузить коллекцию из файла %s, он пуст, либо нарушена структура xml", file.getPath(), e); + System.out.println("Не удалось загрузить коллекцию из файла " + file.getAbsolutePath() + ", он пуст, либо нарушена структура xml"); } } @@ -116,8 +116,17 @@ public class PeopleDatabase implements Database { */ @Override public void save() throws Database.DatabaseSaveFailedException { - if (file == null || context == null) - throw new DatabaseSaveFailedException("Не удалось сохранить коллекцию, " + errorMessage); + if (!file.exists()) { + System.out.println("Файла " + file.getAbsolutePath() + " не существует, "); + boolean created; + try { + created = file.createNewFile(); + } catch (IOException e) { + + } + errorMessage = "Файла %s не существует, возможно он был удален"; + throw new DatabaseSaveFailedException(errorMessage, file.getAbsolutePath()); + } try { Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); diff --git a/src/main/java/ru/erius/lab5/data/Coordinates.java b/src/main/java/ru/erius/lab5/data/Coordinates.java index 8b1ffcf..a8ef08e 100644 --- a/src/main/java/ru/erius/lab5/data/Coordinates.java +++ b/src/main/java/ru/erius/lab5/data/Coordinates.java @@ -1,12 +1,11 @@ package ru.erius.lab5.data; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; +import ru.erius.lab5.parser.Adapters; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** * Класс данных координат @@ -22,7 +21,8 @@ public class Coordinates implements Comparable { /** * Координата Y типа float, значение должно быть больше -816 */ - private float y; + @XmlJavaTypeAdapter(Adapters.CoordinateYAdapter.class) + private Float y; /** * Конструктор с параметрами diff --git a/src/main/java/ru/erius/lab5/data/Location.java b/src/main/java/ru/erius/lab5/data/Location.java index 0b0ece9..92a546d 100644 --- a/src/main/java/ru/erius/lab5/data/Location.java +++ b/src/main/java/ru/erius/lab5/data/Location.java @@ -1,7 +1,7 @@ package ru.erius.lab5.data; import lombok.*; -import ru.erius.lab5.parser.NameAdapter; +import ru.erius.lab5.parser.Adapters; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -33,7 +33,7 @@ public class Location implements Comparable { * Имя локации, может быть null */ @XmlElement(nillable = true) - @XmlJavaTypeAdapter(NameAdapter.class) + @XmlJavaTypeAdapter(Adapters.NameAdapter.class) private String name; private Location() { diff --git a/src/main/java/ru/erius/lab5/data/Person.java b/src/main/java/ru/erius/lab5/data/Person.java index 32c8d5c..599e977 100644 --- a/src/main/java/ru/erius/lab5/data/Person.java +++ b/src/main/java/ru/erius/lab5/data/Person.java @@ -4,10 +4,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.ToString; -import ru.erius.lab5.parser.HeightAdapter; -import ru.erius.lab5.parser.LocalDateAdapter; -import ru.erius.lab5.parser.NameAdapter; -import ru.erius.lab5.parser.PassportAdapter; +import ru.erius.lab5.parser.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -28,7 +25,6 @@ public class Person implements Comparable { */ @XmlTransient private static long existingPeople = 0; - /** * Id человека, не может быть null, значение поля должно быть больше 0, * значение этого поля должно быть уникальным, значение этого поля должно генерироваться автоматически @@ -38,7 +34,7 @@ public class Person implements Comparable { /** * Имя человека, не может быть null, строка не может быть пустой */ - @XmlJavaTypeAdapter(NameAdapter.class) + @XmlJavaTypeAdapter(Adapters.NameAdapter.class) private String name; /** * Координаты человека, не может быть null @@ -47,19 +43,19 @@ public class Person implements Comparable { /** * Дата создания объекта, не может быть null, значение этого поля должно генерироваться автоматически */ - @XmlJavaTypeAdapter(LocalDateAdapter.class) + @XmlJavaTypeAdapter(Adapters.LocalDateAdapter.class) private LocalDate creationDate; /** * Рост человека, может быть null, значение поля должно быть больше 0 */ @XmlElement(nillable = true) - @XmlJavaTypeAdapter(HeightAdapter.class) + @XmlJavaTypeAdapter(Adapters.HeightAdapter.class) private Integer height; /** * Номер паспорта человека, длина строки должна быть не меньше 8, поле может быть null */ @XmlElement(nillable = true) - @XmlJavaTypeAdapter(PassportAdapter.class) + @XmlJavaTypeAdapter(Adapters.PassportAdapter.class) private String passportID; /** * Цвет глаз человека, не может быть null diff --git a/src/main/java/ru/erius/lab5/parser/Adapters.java b/src/main/java/ru/erius/lab5/parser/Adapters.java new file mode 100644 index 0000000..5747a73 --- /dev/null +++ b/src/main/java/ru/erius/lab5/parser/Adapters.java @@ -0,0 +1,74 @@ +package ru.erius.lab5.parser; + +import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public final class Adapters { + + public static class LocalDateAdapter extends XmlAdapter { + @Override + public LocalDate unmarshal(String v) throws Exception { + return LocalDate.parse(v); + } + + @Override + public String marshal(LocalDate v) throws Exception { + return v.format(DateTimeFormatter.ISO_LOCAL_DATE); + } + } + + public static class CoordinateYAdapter extends XmlAdapter { + @Override + public Float unmarshal(String v) throws Exception { + float result = Float.parseFloat(v); + return result > -816F ? result : 0F; + } + + @Override + public String marshal(Float v) throws Exception { + return v.toString(); + } + } + + public static class HeightAdapter extends XmlAdapter { + @Override + public Integer unmarshal(String v) throws Exception { + if (v == null) + return null; + int result = Integer.parseInt(v); + if (result <= 0) + return 1; + return result; + } + + @Override + public String marshal(Integer v) throws Exception { + return v.toString(); + } + } + + public static class NameAdapter extends XmlAdapter { + @Override + public String unmarshal(String v) throws Exception { + return v.isEmpty() ? "none" : v; + } + + @Override + public String marshal(String v) throws Exception { + return v; + } + } + + public static class PassportAdapter extends XmlAdapter { + @Override + public String unmarshal(String v) throws Exception { + return v.length() < 8 ? "no_passport" : v; + } + + @Override + public String marshal(String v) throws Exception { + return v; + } + } +} diff --git a/src/main/java/ru/erius/lab5/parser/CoordinateYAdapter.java b/src/main/java/ru/erius/lab5/parser/CoordinateYAdapter.java deleted file mode 100644 index cfc5386..0000000 --- a/src/main/java/ru/erius/lab5/parser/CoordinateYAdapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.erius.lab5.parser; - -import javax.xml.bind.annotation.adapters.XmlAdapter; - -public class CoordinateYAdapter extends XmlAdapter { - @Override - public Float unmarshal(String v) throws Exception { - float result = Float.parseFloat(v); - return result > -816F ? result : 0F; - } - - @Override - public String marshal(Float v) throws Exception { - return v.toString(); - } -} diff --git a/src/main/java/ru/erius/lab5/parser/HeightAdapter.java b/src/main/java/ru/erius/lab5/parser/HeightAdapter.java deleted file mode 100644 index 82778d2..0000000 --- a/src/main/java/ru/erius/lab5/parser/HeightAdapter.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.erius.lab5.parser; - -import javax.xml.bind.annotation.adapters.XmlAdapter; - -public class HeightAdapter extends XmlAdapter { - - @Override - public Integer unmarshal(String v) throws Exception { - if (v == null) - return null; - int result = Integer.parseInt(v); - if (result <= 0) - return 1; - return result; - } - - @Override - public String marshal(Integer v) throws Exception { - return v.toString(); - } -} diff --git a/src/main/java/ru/erius/lab5/parser/LocalDateAdapter.java b/src/main/java/ru/erius/lab5/parser/LocalDateAdapter.java deleted file mode 100644 index 5d637b9..0000000 --- a/src/main/java/ru/erius/lab5/parser/LocalDateAdapter.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.erius.lab5.parser; - -import javax.xml.bind.annotation.adapters.XmlAdapter; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; - -/** - * Класс парсера для корректного преобразования объекта LocalDate в xml формат и наоборот - */ -public class LocalDateAdapter extends XmlAdapter { - @Override - public LocalDate unmarshal(String v) throws Exception { - return LocalDate.parse(v); - } - - @Override - public String marshal(LocalDate v) throws Exception { - return v.format(DateTimeFormatter.ISO_LOCAL_DATE); - } -} diff --git a/src/main/java/ru/erius/lab5/parser/NameAdapter.java b/src/main/java/ru/erius/lab5/parser/NameAdapter.java deleted file mode 100644 index fa318fa..0000000 --- a/src/main/java/ru/erius/lab5/parser/NameAdapter.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.erius.lab5.parser; - -import javax.xml.bind.annotation.adapters.XmlAdapter; - -public class NameAdapter extends XmlAdapter { - @Override - public String unmarshal(String v) throws Exception { - return v.isEmpty() ? "none" : v; - } - - @Override - public String marshal(String v) throws Exception { - return v; - } -} diff --git a/src/main/java/ru/erius/lab5/parser/PassportAdapter.java b/src/main/java/ru/erius/lab5/parser/PassportAdapter.java deleted file mode 100644 index 78c0c10..0000000 --- a/src/main/java/ru/erius/lab5/parser/PassportAdapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.erius.lab5.parser; - -import javax.xml.bind.annotation.adapters.XmlAdapter; - -public class PassportAdapter extends XmlAdapter { - - @Override - public String unmarshal(String v) throws Exception { - return v.length() < 8 ? "no_passport" : v; - } - - @Override - public String marshal(String v) throws Exception { - return v; - } -}