/**
   * Inicializa la comunicación con el servidor.
   *
   * @throws RequestException es lanzada cuando no se puede establecer la comunicación el servidor
   */
  protected void activeCommunication() throws RequestException {
    try {
      OutputMonitor.printLine("Initialize communication", OutputMonitor.INFORMATION_MESSAGE);

      // iniciar el entorno de ejecución de ICE
      if (communication.isInitialize()) {
        communication.reset();
      } else {
        communication.initialize(this.args);
      }
      SettingProperties.loadSettingProperies();
      ApplicationContext.initContext();
      String host = cnxServer.getServerHost();
      int serverPort = cnxServer.getServerPort();
      int clientPort = clientSetting.getPortNumber();
      OutputMonitor.printLine("Server host: " + host, OutputMonitor.INFORMATION_MESSAGE);
      OutputMonitor.printLine("Server port: " + serverPort, OutputMonitor.INFORMATION_MESSAGE);
      OutputMonitor.printLine(
          "Server name: " + cnxServer.getServerName(), OutputMonitor.INFORMATION_MESSAGE);
      OutputMonitor.printLine(
          "Container name: " + cnxServer.getContainerName(), OutputMonitor.INFORMATION_MESSAGE);
      OutputMonitor.printLine(
          "Session name: " + cnxServer.getSessionName(), OutputMonitor.INFORMATION_MESSAGE);
      OutputMonitor.printLine(
          "File store name: " + cnxServer.getFileStoreName(), OutputMonitor.INFORMATION_MESSAGE);

      if (clientPort <= 0) {
        clientPort = (clientPort <= 0) ? Utilities.getAvailablePort() : clientPort;
        clientSetting.setPortNumber(clientPort);
      }

      this.appManager = new ApplicationManager(communication, netController, clientPort);
      this.appManager.activate();
      this.server =
          new DelegateServerManager(communication, cnxServer.getServerName(), host, serverPort);
      this.server.create(); // se establece la comunicación con el proxy del servidor
      this.container = server.getDlgSessionContainer(cnxServer.getContainerName());
      this.session =
          container.getNoPersistentSessionByName(
              cnxServer.getSessionName(), Invocation.SYNCHRONOUS_METHOD_INVOCATION);
      this.session.setCommunication(container.getCommunication());
      this.fileStore =
          new DelegateFileStore(communication, cnxServer.getFileStoreName(), host, serverPort);
      this.fileStore.create();
      this.startedCommunication = true;

      OutputMonitor.printLine("Initialized communication", OutputMonitor.INFORMATION_MESSAGE);
    } catch (Exception ex) {
      throw new RequestException(ex.getMessage());
    }
  }
  /**
   * Registra la entrada del usuario en la sesión de comunicación del servidor
   *
   * @param user usuario
   * @param password contraseña
   * @throws RequestException si ocurre alguna error durante el proceso de la solicitud
   */
  public void login(String user, String password) throws RequestException {
    activeCommunication();

    this.rqsDispatcher = new RequestDispatcher(communication.getCommunicator());
    Seeker seeker = session.login(user, DrakkarSecurity.SHA(password));

    if (seeker == null) {
      listenerManager.notifyFailedConnection();
      return;
    }

    this.clientSetting.setSeeker(seeker);
    this.dRole = session.getDlgRole();
    seeker.setState(Seeker.STATE_ONLINE);
    seeker.setRole(Seeker.ROLE_POTENTIAL_MEMBER);
    //        ImageIcon fromDB = seeker.getAvatar();
    //        this.icon32 = fromDB;

    //        if (fromDB.getIconHeight() != 16 && fromDB.getIconWidth() != 16) {
    //            BufferedImage resized =
    // ImageUtil.getFasterScaledInstance(ImageUtil.makeBufferedImage(fromDB.getImage()), 16, 16,
    // java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR, false);
    //            this.icon16 = new ImageIcon(resized);
    //            seeker.setAvatar(icon16);
    //        }
    this.dRole.login(seeker, appManager, rqsDispatcher);
  }
  /**
   * Registra la entrada del usuario en la sesión de comunicación del servidor sin autenticación.
   * Tomando el nombre de usuario del sistema operativo, más un ID generado automáticamente por
   * sistema, para identificar al seeker en el servidor. Solo para ejemplos demostrativos.
   *
   * @throws RequestException si ocurre alguna error durante el proceso de la solicitud
   */
  public void login() throws RequestException {
    activeCommunication();

    Seeker seeker = clientSetting.getSeeker();
    String user = seeker.getUser() + session.getSeekerID();
    seeker.setUser(user);
    seeker.setState(Seeker.STATE_ONLINE);
    seeker.setRole(Seeker.ROLE_POTENTIAL_MEMBER);
    //        ImageIcon fromDB = seeker.getAvatar();
    //        this.icon32 = fromDB;
    this.dRole = session.getDlgRole();
    this.rqsDispatcher = new RequestDispatcher(communication.getCommunicator());

    this.dRole.login(seeker, appManager, rqsDispatcher);
  }
  /**
   * Registra la entrada del usuario en la sesión de comunicación del servidor sin autenticación.
   *
   * @param seeker
   * @throws RequestException si ocurre alguna error durante el proceso de la solicitud
   */
  public void login(Seeker seeker) throws RequestException {
    activeCommunication();

    this.rqsDispatcher = new RequestDispatcher(communication.getCommunicator());
    clientSetting.setSeeker(seeker);
    this.dRole = session.getDlgRole();
    seeker.setState(Seeker.STATE_ONLINE);
    //        ImageIcon fromDB = seeker.getAvatar();
    //        this.icon32 = fromDB;
    //        BufferedImage resized =
    // ImageUtil.getFasterScaledInstance(ImageUtil.makeBufferedImage(fromDB.getImage()), 16, 16,
    // java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR, false);
    seeker.setRole(Seeker.ROLE_POTENTIAL_MEMBER);
    //        seeker.setAvatar(new ImageIcon(resized));

    this.dRole.login(seeker, appManager, rqsDispatcher);
  }
  /**
   * Registra la entrada del usuario en la sesión de comunicación del servidor sin autenticación y
   * al mismo tiempo entra en una sesión de búsqueda colaborativa por defecto. Tomando el nombre de
   * usuario del sistema operativo, más un ID generado automáticamente por sistema, para identificar
   * al seeker en el servidor. Solo para ejemplos demostrativos.
   *
   * @param seeker
   * @throws RequestException si ocurre alguna error durante el proceso de la solicitud
   */
  public void loginSearchCollabSession(Seeker seeker) throws RequestException {
    activeCommunication();

    this.rqsDispatcher = new RequestDispatcher(communication.getCommunicator());
    clientSetting.setSeeker(seeker);
    this.dRole = session.getDlgRole();
    //        ImageIcon fromDB = seeker.getAvatar();
    //        this.icon32 = fromDB;
    seeker.setState(Seeker.STATE_ONLINE);
    seeker.setRole(Seeker.ROLE_CHAIRMAN);

    OutputMonitor.printLine("Request connection...", OutputMonitor.INFORMATION_MESSAGE);
    this.dRole.login(seeker, appManager, rqsDispatcher);
    String chairman = session.getChairmanName("DefaultSCS");
    if (!chairman.equals(seeker.getUser())) {
      seeker.setRole(Seeker.ROLE_MEMBER);
    }
  }