package sce.list;

import java.io.*;
import java.util.*;

public aspect PersistenciaAspect {

    declare parents : DNodeImpl implements Serializable ;

	private FileOutputStream escreve = null;
	private FileInputStream le = null;
	private ObjectInputStream leObjetos = null;
	private ObjectOutputStream escreveObjetos = null;
	private DListImpl listaDE = null;
	
	private pointcut remove(DListImpl lista): (execution(* sce.list.DListImpl.remove*(..))||execution(* sce.list.DListImpl.insert*(..))) && this(lista);
	private pointcut construtor(DListImpl lista): initialization( sce.list.DListImpl.new(..)) && this(lista);
	
	after(DListImpl lista) : construtor(lista){
		this.listaDE = lista;
		this.carregar();
	}

	after(DListImpl lista) : remove(lista){
		this.listaDE = lista;
		this.salvar();
	}
	
	private void carregar(){
		int tamanho = 0;
		try {
			this.le = new FileInputStream("DListImpl.dat"); 
			this.leObjetos = new ObjectInputStream(this.le);
			tamanho = this.leObjetos.readInt();
			//System.out.println("TAM: "+tamanho);
			if(tamanho == 0)return;
			for (int i=0 ; i<tamanho ;i++) {
				DNode aux = (DNode)this.leObjetos.readObject();
				this.listaDE.add(aux.getContent());
				//System.out.println("insertafter");
			}
			this.leObjetos.close();
		}catch(IOException _ioex){
			System.out.println("IO erro na leitura: "+_ioex.getMessage());
		}catch(ClassNotFoundException _cnfex){
			System.out.println(_cnfex.getMessage());
		}
	}
	
	private void salvar(){
		Iterator itera = null;
		try {
			this.escreve = new FileOutputStream("DListImpl.dat"); 
			this.escreveObjetos = new ObjectOutputStream(this.escreve);
			itera = this.listaDE.iterator();
			this.escreveObjetos.writeInt(this.listaDE.getSize());
			for ( ; itera.hasNext() ;) {
				Object obj=itera.next();
				//System.out.println(((DNode)obj).getContent());
				this.escreveObjetos.writeObject(obj);
		    }
			this.escreveObjetos.flush();
			this.escreveObjetos.close();
		}catch(IOException _ioex){
			System.out.println("IO erro na escrita");
		}
	}

}
