// Last edited on 2014-12-17 01:55:06 by stolfilocal package quack; import java.io.InputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.servlet.ServletContext; public interface Database { // Interface com o banco de dados persistente. Enquanto o servidor // Quack estiver rodando, deve existir apenas uma instância desta // classe, que encapsula a implementação do banco de dados // persitente. Os métodos abaixo permitem acessar o banco de maneira // independente da implementação. // // Salvo exeções indicadas, quando há algum erro de acesso ao banco // os métodos abaixo escrevem uma mensagem em {System.out} e abortam // o processo, // // O banco de dados pode ser nulo; nesse caso nenhuma das operações // abaixo tem efeito, e qualquer alteração será perdida quando o // processo do servidor Quack terminar. public Database initialize(String dbLoginName, String dbName, String dbPassword); // Inicializa uma instância da classe com parametros de login {dbLoginName}, senha {dbPassword} // e banco de nome {dbName}. Retorna o objeto inicializado. // Se {dbName} for {null}, o banco de dados será nulo. public void loadDatabase(UserTable userTable, Long nextUserId, Long nextMessageId, ServletContext context); // Carrega a base de dados {this.database} na memória, criando os objetos // {User,Message,Contact} e ligando-os entre si. Supõe que a conexão com o // servidor da base de dados já foi estabelecida. public void addUser(User user); // Acrescenta ao banco de dados um novo usuário {user}, com seus atributos atuais. // O usuário será identificado no banco pelo seu índice {user.getDbIndex()}, // que deve ser distinto dos índices de todos os usuários no banco. public void modifyUser(User user); // Altera os atributos mutáveis do usuário {user} (nome completo, senha, // email) no banco de dados com os atributos de {user}. O usuário deve ter // sido acrescentado anteriormente ao banco. public void addContact (Contact contact); // Acrescenta ao banco de dados um novo contato {contact} entre dois usuários, com seus atributos atuais. // O contato será identificado no banco pelo par de índices {contact.getSource().getDbIndex()} // e {contact.getTarget().getDbIndex()}. Não deve existir nenhum contato com esse // par de índices no banco. public void modifyContact(Contact contact); // Altera os atributos mutáveis do contato {contact} (estado e datahora de última alteração) // no banco de dados. O contato deve ter sido acrescentado anteriormente ao banco. public void addMessage(Message message); // Acrescenta ao banco de dados a mensagem {message}, com seus atributos atuais. // A mensagem será identificada no banco pelo índice {message.getDbIndex()}. // Não deve existir nenhuma mensagem com esse par de índices no banco. public void closeConnection(); // Fecha a conexão {this} com banco de dados persistente. // Em caso de erro, imprime mensagem no {System.out} mas retorna normalmente. }