package laba1Loco;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class TrainsGenericStorage {
///
/// Разделитель для записи ключа и значения элемента словаря
///
private static String _separatorForKeyValueWR = "|";
private static String _separatorForKeyValue = "\\|";
///
/// Разделитель для записей коллекции данных в файл
///
private String _separatorRecordsWR = ";";
private String _separatorRecords = "\\;";
///
/// Разделитель для записи информации по объекту в файл
///
private static String _separatorForObjectWR = ":";
private static String _separatorForObject = "\\:";
public boolean SaveDataSingle(String filename, String key){
if (new File(filename).exists()) {
new File(filename).delete();
}
StringBuilder data = new StringBuilder();
data.append(key).append("\n");
for (DrawingTrain elem : _trainStorages.get(key).getTrains(100))
data.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + "\n" : "");
if (data.length() == 0)
return false;
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
writer.write("TrainStorageSingle" + System.lineSeparator() + data.toString());
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean LoadDataSingle(String filename){
if (!new File(filename).exists()) {
return false;
}
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String s = reader.readLine();
if (s == null || s.length() == 0)
return false;
if (!s.startsWith("TrainStorageSingle"))
return false;
String key = reader.readLine();
if (key == null || key.length() == 0)
return false;
TrainsGenericCollection collection;
if (_trainStorages.containsKey(key)){
collection = _trainStorages.get(key);
collection.clear();
}
else
collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
List trainsStrings = new ArrayList();
s = reader.readLine();
while (s != null && s.length() != 0){
trainsStrings.add(s);
s = reader.readLine();
}
Collections.reverse(trainsStrings);
for (String elem : trainsStrings) {
DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight);
if (train == null || collection.Add(train) == -1)
return false;
}
_trainStorages.put(key, collection);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
///
/// Сохранение информации по поездам в хранилище в файл
///
/// Путь и имя файла
/// true - сохранение прошло успешно, false - ошибка при cохранении данных
public boolean SaveData(String filename)
{
if (new File(filename).exists()) {
new File(filename).delete();
}
StringBuilder data = new StringBuilder();
for (Map.Entry> record : _trainStorages.entrySet()) {
StringBuilder records = new StringBuilder();
for (DrawingTrain elem : record.getValue().getTrains(100)) {
records.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : "");
}
data.append(record.getKey()).append(_separatorForKeyValueWR).append(records).append("\n");
}
if (data.length() == 0)
return false;
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
writer.write("TrainStorage" + System.lineSeparator() + data.toString());
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
///
/// Загрузка информации по поездам в хранилище из файла
///
/// Путь и имя файла
/// true - загрузка прошла успешно, false - ошибка призагрузке данных
public boolean LoadData(String filename) {
if (!new File(filename).exists()) {
return false;
}
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String s = reader.readLine();
if (s == null || s.length() == 0)
return false;
if (!s.startsWith("TrainStorage"))
return false;
_trainStorages.clear();
s = reader.readLine();
while (s != null && s.length() != 0) {
String[] record = s.split(_separatorForKeyValue);
s = reader.readLine();
if (record.length != 2) {
continue;
}
TrainsGenericCollection collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
String[] set = record[1].split(_separatorRecords);
List reversedSet = Arrays.asList(set);
Collections.reverse(reversedSet);
for (String elem : reversedSet) {
DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight);
if (train == null || collection.Add(train) == -1)
return false;
}
_trainStorages.put(record[0], collection);
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
///
/// Словарь (хранилище)
///
HashMap> _trainStorages;
///
/// Возвращение списка названий наборов
///
public List Keys(){return _trainStorages.keySet().stream().collect(Collectors.toList());}
///
/// Ширина окна отрисовки
///
private int _pictureWidth;
///
/// Высота окна отрисовки
///
private int _pictureHeight;
///
/// Конструктор
///
///
///
public TrainsGenericStorage(int pictureWidth, int pictureHeight)
{
_trainStorages = new HashMap>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
///
/// Добавление набора
///
/// Название набора
public void AddSet(String name)
{
if (_trainStorages.containsKey(name))
return;
_trainStorages.put(name, new TrainsGenericCollection(_pictureWidth, _pictureHeight));
}
///
/// Удаление набора
///
/// Название набора
public void DelSet(String name)
{
if (!_trainStorages.containsKey(name))
return;
_trainStorages.remove(name);
}
///
/// Доступ к набору
///
///
///
public TrainsGenericCollection get(String ind)
{
if (_trainStorages.containsKey(ind))
return _trainStorages.get(ind);
return null;
}
public DrawningObjectTrain get(String ind1, int ind2){
if (!_trainStorages.containsKey(ind1))
return null;
return _trainStorages.get(ind1).GetU(ind2);
}
}