/*
* 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.RemoteInputStreamServer;
import com.healthmarketscience.rmiio.SimpleRemoteInputStream;
import socius.adapter.Arquivo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import socius.excecoes.ComputadorNaoConectadoException;
import socius.excecoes.FalhaNaConexaoComServidorException;
import socius.excecoes.SistemaOperacionalNaoSuportadoException;
import socius.excecoes.UsuarioInvalidoException;
import socius.excecoes.UsuarioJaLogadoException;
import socius.factory.arquivo.ArquivoFactory;
import socius.telas.principal.PrincipalController;
import socius.modelo.Usuario;
import socius.state.EstadoComputador;
import socius.state.EstadoOffline;
/**
*
* @author Ana
*/
public class Computador extends UnicastRemoteObject implements EstadoComputador, ComputadorRemoto, Serializable {
private String descricao;
private EstadoComputador estado;
private String dir;
private Arquivo arquivos;
private Usuario usuario;
// private InicializarDadosTelaPrincipal initTela=InicializarDadosTelaPrincipal.getInstance();
public Computador(Usuario usuario) throws RemoteException {
try {
// Usuário atual do computador que será enviado ao servidor para
// autenticação
this.usuario = usuario;
// Estado inicial
estado = new EstadoOffline(this);
// Inicializa pasta pública compartilhada
arquivos = ArquivoFactory.getFactory().getArquivo();
} catch (SistemaOperacionalNaoSuportadoException ex) {
ex.exibeMensagem();
}
}
@Override
public List<Arquivo> getArquivos()
throws RemoteException {
File pasta = arquivos.getFile();
if(!pasta.isDirectory()) {
if(pasta.isFile()) {
pasta.delete();
}
pasta.mkdirs();
}
File[] arquivosPasta = pasta.listFiles();
List<Arquivo> lista = new ArrayList<>();
for (int i = 0; i < arquivosPasta.length; i++) {
if (arquivosPasta[i].isFile()) {
String absPath = arquivosPasta[i].getAbsolutePath();
Arquivo arq = null;
try {
arq = ArquivoFactory.getFactory().getArquivo(absPath);
} catch (SistemaOperacionalNaoSuportadoException ex) {
Logger.getLogger(Computador.class.getName()).log(Level.SEVERE, null, ex);
}
if (arq != null) {
lista.add(arq);
}
}
}
return lista;
}
@Override
public void conectar() {
try {
estado.conectar();
} // se falhar ou conectar com o servidor mostra
//mensagem de erro e fecha
catch (FalhaNaConexaoComServidorException ex) {
ex.exibeMensagem();
System.exit(0);
} catch (UsuarioInvalidoException | UsuarioJaLogadoException ex) {
ex.exibeMensagem();
}
}
@Override
public void desconectar() {
estado.desconectar();
}
public EstadoComputador getEstado() {
return estado;
}
public void setEstado(EstadoComputador estado) {
this.estado = estado;
}
@Override
public ServidorRemoto getServidorConectado() {
try {
return estado.getServidorConectado();
} catch (ComputadorNaoConectadoException ex) {
ex.exibeMensagem();
}
return null;
}
@Override
public Usuario getUsuario() throws RemoteException {
return usuario;
}
@Override
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
@Override
public RemoteInputStream iniciarTransferencia(Arquivo arquivo) throws RemoteException {
RemoteInputStreamServer uploadService = null;
try {
uploadService = new SimpleRemoteInputStream(new FileInputStream(arquivo.getFile()));
} catch (FileNotFoundException ex) {
}
return uploadService.export();
}
@Override
public void notificaAtualizacao() throws RemoteException {
PrincipalController.atualizar = true;
}
@Override
public String toString() {
return usuario.getNome();
}
}