/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package socius.dispositivos; import com.healthmarketscience.rmiio.RemoteInputStream; import com.healthmarketscience.rmiio.RemoteInputStreamClient; import com.healthmarketscience.rmiio.RemoteInputStreamServer; import com.healthmarketscience.rmiio.SimpleRemoteInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import socius.adapter.Arquivo; /** * * @author Ana */ public class Servidor extends UnicastRemoteObject implements ServidorRemoto { // Computador = Chave (PC online) // Date = data de última notificação que ele está online para manter // controle do timeout quando um PC desconecta private Map<ComputadorRemoto, Date> online; public Servidor() throws RemoteException { online = new HashMap<>(); } @Override public List<ComputadorRemoto> getClientes() throws RemoteException { Iterator<Map.Entry<ComputadorRemoto, Date>> iterator = online.entrySet().iterator(); List<ComputadorRemoto> resultado = new ArrayList<>(); while (iterator.hasNext()) { resultado.add(iterator.next().getKey()); } return resultado; } @Override public Map<ComputadorRemoto, Date> getMapClientes() throws RemoteException { return online; } @Override public void enviaManterOnline(ComputadorRemoto c) throws RemoteException { // método cujos computadores conectados chamam para // notificar que ainda estão online mandando um "NãoMorri", vamos // atualizar a data de última atualização para que a Thread que mantem // a lista de Computadores não remova ele :) if (online.get(c) == null) { System.out.println("Computador conectado: " + c.hashCode()); online.put(c, new Date()); disparaNotificacoes(); } else { online.put(c, new Date()); } } @Override public RemoteInputStream iniciarTransferencia(ComputadorRemoto computador, Arquivo arquivo) throws RemoteException { RemoteInputStreamServer uploadService = null; try { uploadService = new SimpleRemoteInputStream( RemoteInputStreamClient.wrap(computador.iniciarTransferencia(arquivo))); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } return uploadService.export(); } @Override public void disparaNotificacoes() throws RemoteException { for (ComputadorRemoto c : getClientes()) { try { c.notificaAtualizacao(); } catch(Exception e) { desconectar(c); } } } @Override public void desconectar(ComputadorRemoto computador) throws RemoteException { if(online.get(computador) != null) { online.remove(computador); System.out.println("Computador desconectado: " + computador.hashCode()); disparaNotificacoes(); } } }