// Path: src/log/Logger.java
// public class Logger
// {
//     private static final String    infoKey  = "INFO";
//     private static final String    errorKey = "ERROR";
// 
//     private static final Printer   out      = new Printer();
// 
//     public static SimpleDateFormat sdf      = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
// 
//     private static String getCallingClass()
//     {
//         final Throwable t = new Throwable();
//         final StackTraceElement methodCaller = t.getStackTrace()[3];
//         String filename = methodCaller.getFileName();
//         return filename.substring(0, filename.lastIndexOf('.'));
//     }
// 
//     private static String baseLogMessage(String key, String msg)
//     {
//         return sdf.format(new Date()) + " [" + key + "] [" + getCallingClass() + "] " + msg;
//     }
// 
//     public static void traceINFO(String msg)
//     {
//         out.println(baseLogMessage(infoKey, msg));
//     }
// 
//     public static void traceINFO_NoNewLine(String msg)
//     {
//         out.print(baseLogMessage(infoKey, msg));
//     }
// 
//     public static void traceINFO_NoBaseLine(String msg)
//     {
//         out.println(msg);
//     }
// 
//     public static void traceERROR(String msg)
//     {
//         out.println(baseLogMessage(errorKey, msg));
//     }
// 
//     public static void traceINFO(int level, long[] array)
//     {
//         StringBuilder sBuilder = new StringBuilder();
//         sBuilder.append(level + " : ");
//         for (int i = 0; i < array.length; i++)
//         {
//             if (i == array.length - 1)
//             {
// 
//                 sBuilder.append(array[i]);
//             }
//             else
//             {
//                 sBuilder.append(array[i] + ", ");
//             }
//         }
//         traceINFO(sBuilder.toString());
//     }
// 
//     public static void traceINFO(String... msgs)
//     {
//         StringBuilder sBuilder = new StringBuilder();
//         for (int i = 0; i < msgs.length; i++)
//         {
//             if (i == msgs.length - 1)
//             {
// 
//                 sBuilder.append(msgs[i]);
//             }
//             else
//             {
//                 sBuilder.append(msgs[i] + ", ");
//             }
//         }
//         traceINFO(sBuilder.toString());
//     }
// 
//     public static void traceERROR(Exception e)
//     {
//         if (e != null)
//         {
//             out.println(baseLogMessage(errorKey, e.getMessage()));
//             e.printStackTrace(System.out);
//         }
//     }
// 
//     public static void endLogging()
//     {
//         out.close();
//     }
// }
// 
// Path: src/run/main/App.java
// public class App
// {
//     public static void main(String[] args)
//     {
//         start();
//         stop();
//     }
// 
//     public static void start()
//     {
//         new DeleteAdMailCleaner().run();
//         new AdRetrieveID().run();
//         new AdPublisher().run();
//         new AdRepublisher().run();
//         new MonitoringTask().run();
//     }
//     
//     public static void stop()
//     {
//     	Logger.endLogging();
//     }
// 
//     public static void restart()
//     {
//         Client.reset();
//         start();
//     }
// 
//     public static void kill()
//     {
//         kill(null);
//     }
// 
//     public static void kill(Exception e)
//     {
//         Logger.traceERROR(e);
//         Logger.traceERROR("Killing the app...");
//         System.exit(-1);
//     }
// }
// 
// Path: src/utils/NameFactory.java
// public class NameFactory
// {
//     public static final String REGION_TAG_NAME      = "region";
//     public static final String DEPARTMENT_TAG_NAME  = "dpt_code";
//     public static final String CODE_POSTAL_TAG_NAME = "zipcode";
//     public static final String CATEGORY_TAG_NAME    = "category";
//     public static final String NAME_TAG_NAME        = "name";
//     public static final String EMAIL_TAG_NAME       = "email";
//     public static final String PHONE_TAG_NAME       = "phone";
//     public static final String SUBJECT_TAG_NAME     = "subject";
//     public static final String BODY_TAG_NAME        = "body";
//     public static final String PRICE_TAG_NAME       = "price";
//     public static final String IMAGE_0              = "image0";
//     public static final String SUBMIT_BUTTON        = "validate";
// 
//     public static final String WINE_CATEGORY_ID     = "48";
// 
//     public static final int    ORIG_YEAR            = 2016;
// 
//     public static final String CONF_PATH_FILE       = "conf/conf.csv";
//     public static final String PERSISTENCE_CSV      = "conf/persistence.csv";
// }


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;

package persistence;


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
        {

// Path: src/log/Logger.java
// public class Logger
// {
//     private static final String    infoKey  = "INFO";
//     private static final String    errorKey = "ERROR";
// 
//     private static final Printer   out      = new Printer();
// 
//     public static SimpleDateFormat sdf      = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
// 
//     private static String getCallingClass()
//     {
//         final Throwable t = new Throwable();
//         final StackTraceElement methodCaller = t.getStackTrace()[3];
//         String filename = methodCaller.getFileName();
//         return filename.substring(0, filename.lastIndexOf('.'));
//     }
// 
//     private static String baseLogMessage(String key, String msg)
//     {
//         return sdf.format(new Date()) + " [" + key + "] [" + getCallingClass() + "] " + msg;
//     }
// 
//     public static void traceINFO(String msg)
//     {
//         out.println(baseLogMessage(infoKey, msg));
//     }
// 
//     public static void traceINFO_NoNewLine(String msg)
//     {
//         out.print(baseLogMessage(infoKey, msg));
//     }
// 
//     public static void traceINFO_NoBaseLine(String msg)
//     {
//         out.println(msg);
//     }
// 
//     public static void traceERROR(String msg)
//     {
//         out.println(baseLogMessage(errorKey, msg));
//     }
// 
//     public static void traceINFO(int level, long[] array)
//     {
//         StringBuilder sBuilder = new StringBuilder();
//         sBuilder.append(level + " : ");
//         for (int i = 0; i < array.length; i++)
//         {
//             if (i == array.length - 1)
//             {
// 
//                 sBuilder.append(array[i]);
//             }
//             else
//             {
//                 sBuilder.append(array[i] + ", ");
//             }
//         }
//         traceINFO(sBuilder.toString());
//     }
// 
//     public static void traceINFO(String... msgs)
//     {
//         StringBuilder sBuilder = new StringBuilder();
//         for (int i = 0; i < msgs.length; i++)
//         {
//             if (i == msgs.length - 1)
//             {
// 
//                 sBuilder.append(msgs[i]);
//             }
//             else
//             {
//                 sBuilder.append(msgs[i] + ", ");
//             }
//         }
//         traceINFO(sBuilder.toString());
//     }
// 
//     public static void traceERROR(Exception e)
//     {
//         if (e != null)
//         {
//             out.println(baseLogMessage(errorKey, e.getMessage()));
//             e.printStackTrace(System.out);
//         }
//     }
// 
//     public static void endLogging()
//     {
//         out.close();
//     }
// }
// 
// Path: src/run/main/App.java
// public class App
// {
//     public static void main(String[] args)
//     {
//         start();
//         stop();
//     }
// 
//     public static void start()
//     {
//         new DeleteAdMailCleaner().run();
//         new AdRetrieveID().run();
//         new AdPublisher().run();
//         new AdRepublisher().run();
//         new MonitoringTask().run();
//     }
//     
//     public static void stop()
//     {
//     	Logger.endLogging();
//     }
// 
//     public static void restart()
//     {
//         Client.reset();
//         start();
//     }
// 
//     public static void kill()
//     {
//         kill(null);
//     }
// 
//     public static void kill(Exception e)
//     {
//         Logger.traceERROR(e);
//         Logger.traceERROR("Killing the app...");
//         System.exit(-1);
//     }
// }
// 
// Path: src/utils/NameFactory.java
// public class NameFactory
// {
//     public static final String REGION_TAG_NAME      = "region";
//     public static final String DEPARTMENT_TAG_NAME  = "dpt_code";
//     public static final String CODE_POSTAL_TAG_NAME = "zipcode";
//     public static final String CATEGORY_TAG_NAME    = "category";
//     public static final String NAME_TAG_NAME        = "name";
//     public static final String EMAIL_TAG_NAME       = "email";
//     public static final String PHONE_TAG_NAME       = "phone";
//     public static final String SUBJECT_TAG_NAME     = "subject";
//     public static final String BODY_TAG_NAME        = "body";
//     public static final String PRICE_TAG_NAME       = "price";
//     public static final String IMAGE_0              = "image0";
//     public static final String SUBMIT_BUTTON        = "validate";
// 
//     public static final String WINE_CATEGORY_ID     = "48";
// 
//     public static final int    ORIG_YEAR            = 2016;
// 
//     public static final String CONF_PATH_FILE       = "conf/conf.csv";
//     public static final String PERSISTENCE_CSV      = "conf/persistence.csv";
// }


// Path: src/persistence/Persistence.java
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;

package persistence;


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));
