package versao3.persistencia.impl.xml;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import versao3.Configuration;

/**
 * Classe utilitaria para acesso a dados em XML.
 * A base XML é um diretorio com um arquivo XML por objeto.
 * Cada arquivo é nomeado com a representacao String do objeto,
 * presumidadente Object.toString()
 *
 * @see versao3.Configuration
 * @see java.lang.Object
 */
public  final class XMLUtil {
  //Nao devem ser criadas instancias de XMLUtil fora desta classe.
  private XMLUtil() {}

  /**
   * Salva um objeto na base XML.
   *
   * @param obj Object
   * @throws FileNotFoundException
   */
  public static void save(Object obj) throws FileNotFoundException {
    XMLEncoder encoder = new XMLEncoder(
        new FileOutputStream(
        Configuration.getInstance().getXmlRepository() + obj.toString()));
    encoder.writeObject(obj);
    encoder.flush();
    encoder.close();
  }

  /**
   * Recupera um objeto da base de dados XML.
   *
   * @param obj String
   * @throws FileNotFoundException
   * @return Object
   */
  public static Object load(String obj) throws FileNotFoundException {
    XMLDecoder decoder = new XMLDecoder(
        new FileInputStream(
        Configuration.getInstance().getXmlRepository() + obj));
    Object result = decoder.readObject();
    decoder.close();
    return result;
  }

  /**
   * Retorna todos os nomes de objetos que comecam com o parametro especificado.
   *
   * @param classname String
   * @return List
   */
  public static List /*String*/ findByClassName(String classname){
    List result = new ArrayList();
    File rep = new File(Configuration.getInstance().getXmlRepository());
    File[] files = rep.listFiles();
    for (int i = 0; i < files.length; i++) {
      if (files[i].getName().startsWith(classname)){
        result.add(files[i].getName());
      };
    }
    return result;
  }

  /**
   * Remove o objeto especificado da base de dados XML.
   *
   * @param obj Object
   */
  public static void remove(Object obj){
    File file = new File(Configuration.getInstance().getXmlRepository() + obj.toString());
    file.delete();
  }

  /**
   * Remove todos objetos da base de dados XML.
   */
  public static void removeAll(){
    File rep = new File(Configuration.getInstance().getXmlRepository());
    File[] files = rep.listFiles();
    for (int i = 0; i < files.length; i++) {
        files[i].delete();
    }
  }
}
