more detailed error messages, recursion prevention, stacktrace doesn't print on error anymore, xml fix, some other minor fixes

This commit is contained in:
Egor 2022-03-21 19:43:44 +03:00
parent 5a3877c86b
commit 4f8d6b45d0
11 changed files with 111 additions and 119 deletions

View file

@ -16,6 +16,7 @@ public class Lab5 {
peopleDatabase.load(); peopleDatabase.load();
} catch (Database.DatabaseLoadFailedException e) { } catch (Database.DatabaseLoadFailedException e) {
System.out.println(e.getMessage()); System.out.println(e.getMessage());
System.exit(-1);
} }
PeopleDatabaseCommands.setPeopleDatabase(peopleDatabase); PeopleDatabaseCommands.setPeopleDatabase(peopleDatabase);

View file

@ -2,7 +2,7 @@ package ru.erius.lab5.collection;
import lombok.Getter; import lombok.Getter;
import ru.erius.lab5.data.Person; 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.JAXBContext;
import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBException;
@ -40,7 +40,7 @@ public class PeopleDatabase implements Database {
@XmlElement(name = "person") @XmlElement(name = "person")
private TreeSet<Person> collection = new TreeSet<>(); private TreeSet<Person> collection = new TreeSet<>();
@Getter @Getter
@XmlJavaTypeAdapter(LocalDateAdapter.class) @XmlJavaTypeAdapter(Adapters.LocalDateAdapter.class)
@XmlElement(name = "initDate") @XmlElement(name = "initDate")
private LocalDate initDate = LocalDate.now(); private LocalDate initDate = LocalDate.now();
@ -71,28 +71,29 @@ public class PeopleDatabase implements Database {
System.out.println("Инициализация коллекции из файла..."); System.out.println("Инициализация коллекции из файла...");
String path = System.getenv(ENV_VAR); String path = System.getenv(ENV_VAR);
boolean envSet = true;
if (path == null) { if (path == null) {
errorMessage = "Не найдена переменная окружения LAB5_PATH"; System.out.println("Не найдена переменная окружения LAB5_PATH, создание файла в директории jar файла");
throw new DatabaseLoadFailedException("Не найдена переменная окружения LAB5_PATH"); path = ".";
envSet = false;
} }
File file = new File(path); File file = new File(path);
if (!file.exists()) { if (!file.exists() && envSet) {
errorMessage = String.format("Файл %s не был найден. Поменяйте значение переменной окружения LAB5_PATH", path); System.out.println("Файл " + file.getAbsolutePath() + " не был найден, создание файла в директории jar файла");
throw new DatabaseLoadFailedException(errorMessage); file = new File(".");
} }
if (file.isDirectory()) if (file.isDirectory())
file = createFile(file); file = createFile(file);
if (!file.canRead()) { if (!file.canRead()) {
errorMessage = String.format("У вас нет прав на чтение файла %s", path); errorMessage = String.format("У вас нет прав на чтение файла %s", file.getAbsolutePath());
throw new DatabaseLoadFailedException(errorMessage); throw new DatabaseLoadFailedException(errorMessage);
} }
if (!file.canWrite()) { if (!file.canWrite()) {
errorMessage = String.format("У вас нет прав на запись в файл %s", path); errorMessage = String.format("У вас нет прав на запись в файл %s", file.getAbsolutePath());
throw new DatabaseLoadFailedException(errorMessage); throw new DatabaseLoadFailedException(errorMessage);
} }
this.file = file; this.file = file;
System.out.println("Файл успешно найден");
try { try {
Unmarshaller unmarshaller = context.createUnmarshaller(); Unmarshaller unmarshaller = context.createUnmarshaller();
@ -101,8 +102,7 @@ public class PeopleDatabase implements Database {
this.initDate = pd.initDate; this.initDate = pd.initDate;
System.out.println("Инициализация успешно выполнена"); System.out.println("Инициализация успешно выполнена");
} catch (JAXBException e) { } catch (JAXBException e) {
e.printStackTrace(); System.out.println("Не удалось загрузить коллекцию из файла " + file.getAbsolutePath() + ", он пуст, либо нарушена структура xml");
throw new DatabaseLoadFailedException("Не удалось загрузить коллекцию из файла %s, он пуст, либо нарушена структура xml", file.getPath(), e);
} }
} }
@ -116,8 +116,17 @@ public class PeopleDatabase implements Database {
*/ */
@Override @Override
public void save() throws Database.DatabaseSaveFailedException { public void save() throws Database.DatabaseSaveFailedException {
if (file == null || context == null) if (!file.exists()) {
throw new DatabaseSaveFailedException("Не удалось сохранить коллекцию, " + errorMessage); System.out.println("Файла " + file.getAbsolutePath() + " не существует, ");
boolean created;
try {
created = file.createNewFile();
} catch (IOException e) {
}
errorMessage = "Файла %s не существует, возможно он был удален";
throw new DatabaseSaveFailedException(errorMessage, file.getAbsolutePath());
}
try { try {
Marshaller marshaller = context.createMarshaller(); Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

View file

@ -1,12 +1,11 @@
package ru.erius.lab5.data; package ru.erius.lab5.data;
import lombok.Data; import lombok.*;
import lombok.EqualsAndHashCode; import ru.erius.lab5.parser.Adapters;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/** /**
* Класс данных координат * Класс данных координат
@ -22,7 +21,8 @@ public class Coordinates implements Comparable<Coordinates> {
/** /**
* Координата Y типа float, значение должно быть больше -816 * Координата Y типа float, значение должно быть больше -816
*/ */
private float y; @XmlJavaTypeAdapter(Adapters.CoordinateYAdapter.class)
private Float y;
/** /**
* Конструктор с параметрами * Конструктор с параметрами

View file

@ -1,7 +1,7 @@
package ru.erius.lab5.data; package ru.erius.lab5.data;
import lombok.*; 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.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
@ -33,7 +33,7 @@ public class Location implements Comparable<Location> {
* Имя локации, может быть null * Имя локации, может быть null
*/ */
@XmlElement(nillable = true) @XmlElement(nillable = true)
@XmlJavaTypeAdapter(NameAdapter.class) @XmlJavaTypeAdapter(Adapters.NameAdapter.class)
private String name; private String name;
private Location() { private Location() {

View file

@ -4,10 +4,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NonNull; import lombok.NonNull;
import lombok.ToString; import lombok.ToString;
import ru.erius.lab5.parser.HeightAdapter; import ru.erius.lab5.parser.*;
import ru.erius.lab5.parser.LocalDateAdapter;
import ru.erius.lab5.parser.NameAdapter;
import ru.erius.lab5.parser.PassportAdapter;
import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@ -28,7 +25,6 @@ public class Person implements Comparable<Person> {
*/ */
@XmlTransient @XmlTransient
private static long existingPeople = 0; private static long existingPeople = 0;
/** /**
* Id человека, не может быть null, значение поля должно быть больше 0, * Id человека, не может быть null, значение поля должно быть больше 0,
* значение этого поля должно быть уникальным, значение этого поля должно генерироваться автоматически * значение этого поля должно быть уникальным, значение этого поля должно генерироваться автоматически
@ -38,7 +34,7 @@ public class Person implements Comparable<Person> {
/** /**
* Имя человека, не может быть null, строка не может быть пустой * Имя человека, не может быть null, строка не может быть пустой
*/ */
@XmlJavaTypeAdapter(NameAdapter.class) @XmlJavaTypeAdapter(Adapters.NameAdapter.class)
private String name; private String name;
/** /**
* Координаты человека, не может быть null * Координаты человека, не может быть null
@ -47,19 +43,19 @@ public class Person implements Comparable<Person> {
/** /**
* Дата создания объекта, не может быть null, значение этого поля должно генерироваться автоматически * Дата создания объекта, не может быть null, значение этого поля должно генерироваться автоматически
*/ */
@XmlJavaTypeAdapter(LocalDateAdapter.class) @XmlJavaTypeAdapter(Adapters.LocalDateAdapter.class)
private LocalDate creationDate; private LocalDate creationDate;
/** /**
* Рост человека, может быть null, значение поля должно быть больше 0 * Рост человека, может быть null, значение поля должно быть больше 0
*/ */
@XmlElement(nillable = true) @XmlElement(nillable = true)
@XmlJavaTypeAdapter(HeightAdapter.class) @XmlJavaTypeAdapter(Adapters.HeightAdapter.class)
private Integer height; private Integer height;
/** /**
* Номер паспорта человека, длина строки должна быть не меньше 8, поле может быть null * Номер паспорта человека, длина строки должна быть не меньше 8, поле может быть null
*/ */
@XmlElement(nillable = true) @XmlElement(nillable = true)
@XmlJavaTypeAdapter(PassportAdapter.class) @XmlJavaTypeAdapter(Adapters.PassportAdapter.class)
private String passportID; private String passportID;
/** /**
* Цвет глаз человека, не может быть null * Цвет глаз человека, не может быть null

View file

@ -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<String, LocalDate> {
@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<String, Float> {
@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<String, Integer> {
@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<String, String> {
@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<String, String> {
@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;
}
}
}

View file

@ -1,16 +0,0 @@
package ru.erius.lab5.parser;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CoordinateYAdapter extends XmlAdapter<String, Float> {
@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();
}
}

View file

@ -1,21 +0,0 @@
package ru.erius.lab5.parser;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class HeightAdapter extends XmlAdapter<String, Integer> {
@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();
}
}

View file

@ -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<String, LocalDate> {
@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);
}
}

View file

@ -1,15 +0,0 @@
package ru.erius.lab5.parser;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class NameAdapter extends XmlAdapter<String, String> {
@Override
public String unmarshal(String v) throws Exception {
return v.isEmpty() ? "none" : v;
}
@Override
public String marshal(String v) throws Exception {
return v;
}
}

View file

@ -1,16 +0,0 @@
package ru.erius.lab5.parser;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class PassportAdapter extends XmlAdapter<String, String> {
@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;
}
}