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();
} catch (Database.DatabaseLoadFailedException e) {
System.out.println(e.getMessage());
System.exit(-1);
}
PeopleDatabaseCommands.setPeopleDatabase(peopleDatabase);

View file

@ -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<Person> 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);

View file

@ -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<Coordinates> {
/**
* Координата Y типа float, значение должно быть больше -816
*/
private float y;
@XmlJavaTypeAdapter(Adapters.CoordinateYAdapter.class)
private Float y;
/**
* Конструктор с параметрами

View file

@ -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<Location> {
* Имя локации, может быть null
*/
@XmlElement(nillable = true)
@XmlJavaTypeAdapter(NameAdapter.class)
@XmlJavaTypeAdapter(Adapters.NameAdapter.class)
private String name;
private Location() {

View file

@ -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<Person> {
*/
@XmlTransient
private static long existingPeople = 0;
/**
* Id человека, не может быть null, значение поля должно быть больше 0,
* значение этого поля должно быть уникальным, значение этого поля должно генерироваться автоматически
@ -38,7 +34,7 @@ public class Person implements Comparable<Person> {
/**
* Имя человека, не может быть null, строка не может быть пустой
*/
@XmlJavaTypeAdapter(NameAdapter.class)
@XmlJavaTypeAdapter(Adapters.NameAdapter.class)
private String name;
/**
* Координаты человека, не может быть null
@ -47,19 +43,19 @@ public class Person implements Comparable<Person> {
/**
* Дата создания объекта, не может быть 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

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