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();
|
||||
} catch (Database.DatabaseLoadFailedException e) {
|
||||
System.out.println(e.getMessage());
|
||||
System.exit(-1);
|
||||
}
|
||||
PeopleDatabaseCommands.setPeopleDatabase(peopleDatabase);
|
||||
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* Конструктор с параметрами
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
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