package me.zinch.files; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DatabindException; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import me.zinch.exceptions.DbInitializationException; import me.zinch.models.Product; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.List; import java.util.Map; /** * The DbController class provides methods for loading and saving product data to a database file. */ public class DbController { private static final XmlMapper xmlMapper = XmlMapper.builder().addModule(new JavaTimeModule()).build(); private static final String path; static { Map env = System.getenv(); path = env.getOrDefault("DB_FILE", ""); xmlMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL); } /** * Represents a collection of products. */ private static class Products { @JacksonXmlElementWrapper(useWrapping = false) @JacksonXmlProperty(localName = "Product") private List products; public Products() {} public Products(List list) { this.products = list; } public List getProducts() { return products; } } public static List loadDb() throws IOException { try { BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path)); Products collection = xmlMapper.readValue(bufferedInputStream, Products.class); bufferedInputStream.close(); return collection.getProducts(); } catch (FileNotFoundException e) { throw new FileNotFoundException("Не удалось найти файл " + path); } catch (DatabindException e) { throw new DbInitializationException(); } catch (IOException e) { throw new IOException("Произошла неожиданная ошибка во время работы с файлом!"); } } public static void saveDb(List list) throws IOException { try { OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(path)); xmlMapper.writeValue(outputStreamWriter, new Products(list)); outputStreamWriter.close(); } catch (FileNotFoundException e) { throw new FileNotFoundException(e.getMessage()); } catch (IOException e) { throw new IOException(e); } } }