// Last edited on 2014-12-17 02:46:37 by stolfilocal package quack; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletResponse; public interface HTMLTools { // Esta classe especifica funções auxiliares para construção de // páginas HTML a serem enviadas ao browser através do servidor // HTTP. Enquanto o servidor {Quack} estiver rodando, deveria heaver // uma única instância desta classe. (Os métodos logicamente // deveriam ser {static} mas não é possível usar {static} numa // interface.) // O parâmetro {wr} nos métodos abaixo é um {PrintWriter}, // geralmente obtido de um objeto {HttpServletResponse}, onde o // método escreverá o trecho de HTML especificado. public HTMLTools initialize(Server server); // Inicializa uma instância desta classe e devolve a mesma inicializada. // ---------------------------------------------------------------------- // COMPONENTES PRINCIPAIS DE PÁGINAS // // O parâmetro {requestor} nos métodos abaixo é o usuário que pediu a informação, // ou seja o dono da sessão. Se esse parâmetro for {null}, supõe // que a informação foi solicitada por uma pessoa que não está atualmente logada no // sistema {Quack}. Esse parâmetro afeta os botões e informações incluídos // no HTML gerado. public void writePageHeader(PrintWriter wr, User requestor, String title) throws IOException; // Escreve em {wr} o trecho de HTML inicial comum a todas as páginas, // incluindo as tags de abertura "", "", "..." // e ". Escreve também a declaração dos estilos, e a barra de menu no alto da página. O // parâmetro {title} é usado na declaração "..." e no // cabeçalho "

...

" logo abaixo da barra de menu. public void writePageTrailer(PrintWriter wr, User requestor) throws IOException; // Escreve em {wr} o trecho de HTML final comum a todas as páginas, // terminando com "". public void writeListWithNavLinks ( PrintWriter wr, User requestor, List list, int start, int n, String requestCmd, User user, int maxN ) throws IOException; // Escreve em {wr} um trecho de uma lista {list} de mensagens, usuários, contatos, etc.. Cada item é // formatado por {writeMessage}, {writeUser}, {writeContact} etc.. // Escreve também botões de navegação na lista. Esses botões são criados // por {writeMoreItemsReqLink}. public void writeMessageList(PrintWriter wr, User requestor, List list, int start, int n) throws IOException; // Escreve em {wr} um trecho de uma lista de mensagens {list}. Cada mensagem é // formatada por {writeMessage}. public void writeUserList(PrintWriter wr, User requestor, List list, int start, int n) throws IOException; // Escreve em {wr} um trecho de uma lista de usuários {list}. Cada usuário é // formatado por {writeUser}. Se o {requestor} não for {null}, mostra // também o estado do contato entre {requestor} e cada usuário. public void writeContactList(PrintWriter wr, User requestor, List list, boolean targets, int start, int n) throws IOException; // Escreve em {wr} um trecho de uma lista de contatos {list}. Cada contato é // formatado por {writeUser} aplicado ao usuário fonte (se {targets == false}) // ou ao usuário alvo se {targets == true}. // ---------------------------------------------------------------------- // SUB-COMPONENTES DE PÁGINAS public void writeMessage(PrintWriter wr, User requestor, Message message, boolean full) throws IOException; // Escreve em {wr} a mensagem {message}, na forma de uma tabela HTML de largura fixa. // Pode ser usada isoladamente ou dentro de uma lista de mensagens. // // Além do texto da mensagem original, escreve os dados do autor original // (nome login, nome completo, avatar) e botões (repostar, deletar, responder, etc.). // Se a mensagem é repostagem, escreve também o login, nome e data do último repostador. // Se {full} for verdade, mostra toda a história de repostagens. // O botão para repostar só é gerado se {requestor} não for {null}, nem o autor, nem um dos repostadres. // O botão para responder só é gerado se {requestor} não for {null} nem o autor. // // Se o texto da mensagem contém nomes de login de usuários com "@", // eles são transformados em links para a página desses usuários. // trecho é transformado em link. Caracteres "<", "&", e ">" no texto // são convertidos para "<", "&", e ">" respectivamente. public void writeUser(PrintWriter wr, User requestor, User user, Contact contact) throws IOException; // Escreve em {wr} os dados do usuário {user}, na forma de uma tabela HTML de largura fixa. // Pode ser usada isoladamente ou dentro de uma lista de usuários. // // A tabela mostra o nome login, nome completo, e avatar do usuário // {user}. Se o {contact} não for nulo, deve ter origem {requestor} // e alvo {user}, ou vice-versa; o método vai mostra o estado // corrente desse contato. Mostra também botões para listar as // mensagens postadas e repostadas pelo usuário. // // Se {user} é igual a {requestor}, inclui botões para mostrar // listas de contatos de {user}, e sua caixa de entrada (timeline). // // Se {requestor} não é {null} e é diferente de {user}, mostra // botões para fazer o {requestor} seguir, bloquear, deixar de // seguir, desbloquear o {user}. Se {contact} não é null, o botão // correspondente ao estado corrente estará desativado. // ---------------------------------------------------------------------- // BOTÕES E LINKS public void writeMoreItemsReqLink ( PrintWriter wr, String label, String requestCmd, User user, int start, int dir, long maxN ) throws IOException; // Escreve em {wr} um link HTTP que pede mais um lote de elementos // de uma lista de mensagens, usuários, contatos, etc.. // // O link gerado terá texto visível {label}. Seu URL será // "{requestCmd}" seguido de "?" e dos argumentos // "user={user.getLoginName()}", "start={start}, // "dir={dir}", e "maxN={maxN}", separados por "&". // // A lista original é identificada pelos parâmetros {requestCmd} e {user}. O // parâmetro {start} identifica um elemento // nessa lista original. O parâmetro {dir} indica a direção de // percurso na lista original, a partir desse elemento inclusive; pode // ser {-1} (para trás) ou {+1} (para a frente). Note que é direção // na lista e não no tempo. O parâmetro {maxN} diz o número máximo // de mensagens a incluir no lote. // ---------------------------------------------------------------------- // FORMATAÇÃO DE DATAHORAS // // Internamente, uma datahora é um {long int}: um número inteiro de // segundos desde a "época UNIX" (1970-01-01 00:00:00 UTC). // A precisão de segundos deve ser suficiente para fins do sistema Quack. // // Externamente (em particular, nas páginas HTML), uma datahora é // uma {String} no formato "%Y-%m-%d %H:%M:%S %Z" onde "%Z" é o fuso // horário. // // Tratar fuso horário local é complicado, tem que deixar o usuário // escolher se quiser, tratar o começo e fim do horário de verão, // etc. Quando um usuário quer especificar uma hora para outro // usuário, ele precisa incluir seu fuso, e o outro usuário precisa // saber converter para o seu. Portanto, por enquanto o sistema // Quack usa apenas o fuso horário "UTC" (praticamente a hora de // Londres). Para evitar confusão, o fuso "UTC" será sempre // especificado exxplicitamente em todas as datahoras no formato // externo. ??{ Mais tarde podemos implementar códigos de fusos // locais, como "BRST", ou a notação geral "(+0300)" para UTC + 3 // horas. }?? public String formatTimestamp(long timestamp, String timezone); // Converte uma datahora do formato interno para o formato externo, // com o fuso horário especificado pelo parâmetro {timezone}. // Por enquanto, {timezone} deve ser obrigatoriamente "UTC". public long parseTimestamp(String timestamp); // Converte uma datahora do formato externo para o formato interno. // Por enquanto, a cadeia {timestamp} deve terminar com " UTC", e // a conversão vai usar o fuso horário UTC. // Se o formato não for reconhecido, retorna {-1L}. }