/*
 * Copyright (c) 1997-1999 Departamento de Informática - UFPE
 */

/**
 * Esta classe modela um conjunto (lista) de arquivos do padrão unix.
 */
public class ListaArquivos {

    // O arquivo deste nó da lista.
    private Arquivo noAtual;
    
    // Uma referência ao próximo elemento da lista.
    private ListaArquivos noProximo;

    /**
     * Insere um novo arquivo na lista.
     * 
     * @param           Um arquivo a ser inserido.
     */
    public void inserirArquivo(Arquivo arquivo) {
        if (this.noAtual == null) {
            this.noAtual = arquivo;
            noProximo = new ListaArquivos();
        } else
            noProximo.inserirArquivo(arquivo);
    }

    /**
     * Exclui um arquivo da lista.
     * 
     * @param           Um arquivo a ser excluido.
     */
    public void excluirArquivo(Arquivo arquivo) {
        if (this.noAtual == null)
            System.out.println ("Arquivo inexistente\n");
        else {
            if (this.noAtual == arquivo) {
                this.noAtual = noProximo.noAtual;
                this.noProximo = noProximo.noProximo;
            } else
                noProximo.excluirArquivo(arquivo);
        }
    }

/*
 * Note que no metodo acima quebra-se a nocao de encapsulamento
 * entre objetos da mesma classe; isto e, um objeto de Lista_arq
 * acessa diretamente as variaveis de instancia de um outro objeto
 * de Lista_arq. Assim, podemos verificar que o efeito da clausula
 * "private" e restrito a visibilidade entre objetos de classes
 * diferentes.
 */

    /**
     * Imprime os arquivos da lista.
     */
    public void listarArquivos(){
        if (this.noAtual != null) {
            System.out.println(noAtual.getNome());
            noProximo.listarArquivos();
        }
    }

    /**
     * Verifica se um dado arquivo pertence à lista.
     * 
     * @param           Um arquivo a ser procurado.
     * 
     * @return          Resposta se o arquivo existe.
     */
    public boolean existeArquivo(Arquivo arquivo){
        boolean resultado;
        if (this.noAtual == null)
            resultado = false;
        else
            if (this.noAtual == arquivo)
                resultado = true;
            else
                resultado = noProximo.existeArquivo(arquivo);

        return resultado;
    }

}
