PIbd-21_Kouvshinoff_T._A._W.../laba1Loco/TrainsGenericStorage.java

247 lines
9.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 {
/// <summary>
/// Разделитель для записи ключа и значения элемента словаря
/// </summary>
private static String _separatorForKeyValueWR = "|";
private static String _separatorForKeyValue = "\\|";
/// <summary>
/// Разделитель для записей коллекции данных в файл
/// </summary>
private String _separatorRecordsWR = ";";
private String _separatorRecords = "\\;";
/// <summary>
/// Разделитель для записи информации по объекту в файл
/// </summary>
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<DrawingTrain, DrawningObjectTrain> collection;
if (_trainStorages.containsKey(key)){
collection = _trainStorages.get(key);
collection.clear();
}
else
collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
List<String> trainsStrings = new ArrayList<String>();
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;
}
/// <summary>
/// Сохранение информации по поездам в хранилище в файл
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - сохранение прошло успешно, false - ошибка при cохранении данных</returns>
public boolean SaveData(String filename)
{
if (new File(filename).exists()) {
new File(filename).delete();
}
StringBuilder data = new StringBuilder();
for (Map.Entry<String, TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>> 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;
}
/// <summary>
/// Загрузка информации по поездам в хранилище из файла
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - загрузка прошла успешно, false - ошибка призагрузке данных</returns>
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<DrawingTrain, DrawningObjectTrain> collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
String[] set = record[1].split(_separatorRecords);
List<String> 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;
}
/// <summary>
/// Словарь (хранилище)
/// </summary>
HashMap<String, TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>> _trainStorages;
/// <summary>
/// Возвращение списка названий наборов
/// </summary>
public List<String> Keys(){return _trainStorages.keySet().stream().collect(Collectors.toList());}
/// <summary>
/// Ширина окна отрисовки
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна отрисовки
/// </summary>
private int _pictureHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="pictureWidth"></param>
/// <param name="pictureHeight"></param>
public TrainsGenericStorage(int pictureWidth, int pictureHeight)
{
_trainStorages = new HashMap<String, TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
/// <summary>
/// Добавление набора
/// </summary>
/// <param name="name">Название набора</param>
public void AddSet(String name)
{
if (_trainStorages.containsKey(name))
return;
_trainStorages.put(name, new TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>(_pictureWidth, _pictureHeight));
}
/// <summary>
/// Удаление набора
/// </summary>
/// <param name="name">Название набора</param>
public void DelSet(String name)
{
if (!_trainStorages.containsKey(name))
return;
_trainStorages.remove(name);
}
/// <summary>
/// Доступ к набору
/// </summary>
/// <param name="ind"></param>
/// <returns></returns>
public TrainsGenericCollection<DrawingTrain, DrawningObjectTrain> 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);
}
}