/*
* 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();
}
}
}