package persistence; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import log.Logger; import run.main.App; import utils.NameFactory; import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.CSVWriter; public final class Persistence { // 0 : hash // 1 : web id private static Persistence persistence = new Persistence(); public static Persistence getInstance() { return persistence; } private Persistence() { } public List<PersistedObject> getPersistedObjects() { List<PersistedObject> persistedObjects = new ArrayList<>(); try { CSVReader reader = new CSVReader(new FileReader(NameFactory.PERSISTENCE_CSV)); List<String[]> allEntries = reader.readAll(); reader.close(); for (String[] entry : allEntries) { persistedObjects.add(new PersistedObject(entry[1], entry[0])); } } catch (Exception e) { App.kill(e); } return persistedObjects; } private synchronized boolean persist(String id, String hash, boolean append) throws IOException { // Append CSVReader reader = new CSVReader(new FileReader(NameFactory.PERSISTENCE_CSV)); List<String[]> allEntries = reader.readAll(); for (String[] entry : allEntries) { if (entry[0].equals(hash)) { reader.close(); return false; } } reader.close(); CSVWriter writer = new CSVWriter(new FileWriter(NameFactory.PERSISTENCE_CSV, append)); String[] entries = new String[2]; entries[0] = hash; entries[1] = id; writer.writeNext(entries); writer.close(); return true; } public synchronized boolean persist(PersistedObject persistedObject) { boolean result = false; try { result = persist(persistedObject.id, persistedObject.hash, true); } catch (IOException e) { App.kill(e); } return result; } public synchronized void flush() { try { CSVWriter writer = new CSVWriter(new FileWriter(NameFactory.PERSISTENCE_CSV, false)); writer.close(); } catch (IOException e) { Logger.traceERROR(e); } if (getSize() != 0) { Logger.traceERROR("PERSISTENCE - Persistence flush failed. Program will exit."); App.kill(); } } public synchronized int getSize() { try { CSVReader reader = new CSVReader(new FileReader(NameFactory.PERSISTENCE_CSV)); List<String[]> entries = reader.readAll(); reader.close(); return entries.size(); } catch (IOException e) { Logger.traceERROR(e); } return -1; } public synchronized void update(PersistedObject persistedObject) { int oldSize = getSize(); remove(persistedObject); persist(persistedObject); int newSize = getSize(); if (oldSize != newSize) { Logger.traceERROR("PERSISTENCE - Error updating the object : " + persistedObject + ". It does not exist in the persistence. Program will exit."); App.kill(); } } public synchronized void remove(PersistedObject persistedObject) { try { CSVReader reader = new CSVReader(new FileReader(NameFactory.PERSISTENCE_CSV)); List<String[]> entries = reader.readAll(); Map<String, String> entriesMap = new HashMap<String, String>(); for (String[] entry : entries) { entriesMap.put(entry[0], entry[1]); } entriesMap.keySet().remove(persistedObject.hash); flush(); for (Entry<String, String> entry : entriesMap.entrySet()) { persist(entry.getValue(), entry.getKey(), true); } reader.close(); } catch (Exception e) { Logger.traceERROR(e); } } }