more detailed error messages, recursion prevention, stacktrace doesn't print on error anymore, xml fix, some other minor fixes
This commit is contained in:
parent
5a3877c86b
commit
4f8d6b45d0
11 changed files with 111 additions and 119 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Конструктор с параметрами
|
* Конструктор с параметрами
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
74
src/main/java/ru/erius/lab5/parser/Adapters.java
Normal file
74
src/main/java/ru/erius/lab5/parser/Adapters.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue