/*
 * Fichero: 	ConfiguraPlataforma.java
 * Fecha: 		9/08/2006
 * Autor: 		Alvaro Sarmiento Losada
 * Asignatura:	Proyecto final de carrera
 * Descripción: Contiene la clase que configura la plataforma jxta, estaleciendo
 *              el nombre del nodo, los puertos que utiliza y  el modo de conexión a la red.
 *              
 */

package com.pfc.lib.p2p;


import java.lang.Exception;
import net.jxta.platform.NetworkConfigurator;
import net.jxta.peergroup.*;
import java.io.File;
import net.jxta.rendezvous.RendezVousService;

/** Clase que configura la plataforma jxta, estaleciendo el nombre del nodo,
 *  los puertos que utiliza y  el modo de conexión a la red.
 *              
 * @author Alvaro Sarmiento Losada
 */
public class ConfiguraPlataforma {
    /** Objeto que configura la red.*/
    private NetworkConfigurator config;
    /** Nombre del nodo que se conecta.*/
    private String nombre;
    /** Contraseña del nodo que se conecta.*/
    private String password;
    /** Puerto HTTP.Por defecto tomamos el de por defecto de jxta, el 9700.*/
    private int ptoHttp = 9700;
    /** Puerto TCP.Por defecto tomamos el de por defecto de jxta, el 9701.*/
    private int ptoTcp = 9701;
    /** Objeto que representa en Peergroup por defecto.*/
    PeerGroup netpg;

    /** Crea una nueva instancia de esta clase, inicializando los distintos componentes. */
    public ConfiguraPlataforma(String nombre, String password, int ptoHttp,int ptoTcp ) {
        this.nombre = nombre;
        this.password =password;
        this.ptoHttp = ptoHttp;
        this.ptoTcp = ptoTcp;
    }
    
    /** Método que propiamente configura el nodo.
     * @param netpg PeerGroup primario de jxta.El grupo de la aplicación se crea como subgrupo de netpg. 
     * @return true si se configura correctamente el nodo */
   
    public boolean ConfiguraPar(PeerGroup netpg){
        boolean correcto = true;
        this.netpg = netpg;
        config = new NetworkConfigurator();
        // Si el fichero de configuración no existe se crea una nueva configuración
        if (!config.exists()) {
            /* Creamos una nueva configuración nombre, principal, password
             * Se especifica el modo de conexión, los puertos que se utilizan y se habilita el multicast
             */
            config.setName(nombre);
            config.setPrincipal("username");
            config.setPassword(password);
            config.setDescription("Nodo:Fs");
            config.setHttpPort(ptoHttp);
            config.setTcpPort(ptoTcp);
            config.setMode(config.EDGE_NODE);
            config.setUseMulticast(true);
            
            try {
                // Grabamos la configuración
                config.save();
            } catch (Exception e) {
                //FicheroLog.escribirLinea(-1,e.toString());
                correcto = false;
                e.printStackTrace();
                System.exit(1);
            }
        } else {
            // Si ya existe una configuración anterior, la cargamos
            File pc = new File(config.getHome(), "PlatformConfig");
            try {
                config.load(pc.toURI());
                config.setName(nombre);
                config.setPassword(password);
                config.setDescription("Nodo:Fs");
                config.setHttpPort(ptoHttp);
                config.setTcpPort(ptoTcp);
                config.setMode(config.EDGE_NODE);
                config.setUseMulticast(true);
                //Guardamos
                config.save();
            } catch (Exception e) {
                //FicheroLog.escribirLinea(-1,e.toString());
                correcto = false;
                e.printStackTrace();
                System.exit(1);
                
            }
        }
        try {
            if (this.netpg == null)//&& !yaConfigurado)
                this.netpg = PeerGroupFactory.newNetPeerGroup();
            
        } catch (Exception e) {
            //FicheroLog.escribirLinea(-1,e.toString());
            correcto = false;
            e.printStackTrace();
            System.exit(1);
        }
        return correcto;
    }


}
