Package org.gudy.azureus2.ui.swt

Source Code of org.gudy.azureus2.ui.swt.Alerts$AlertHistoryListener

/*
* Created on May 1, 2004
* Created by Olivier Chalouhi
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.ui.swt;

import java.util.*;

import org.eclipse.swt.widgets.Display;

import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.ILogAlertListener;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.mainwindow.SWTThread;

import com.aelitis.azureus.util.MapUtils;

/**
* Utility methods to display popup window
*/
public class Alerts
{

  /**
   * alert queue is used at startup, prior to initialization to collect
   * and incoming alerts and start them.  Once initialization is complete,
   * the queue is processed (and moved to alert_history) and cleared
   */
  private static List<LogAlert> alert_queue = new ArrayList<LogAlert>();

  private static AEMonitor alert_queue_mon = new AEMonitor("Alerts:Q");

  private static ArrayList<String> alert_history = new ArrayList<String>(0);
 
  private static ArrayList<LogAlert> listUnviewedLogAlerts = new ArrayList<LogAlert>(0);

  private static AEMonitor alert_history_mon = new AEMonitor("Alerts:H");

  private static ArrayList<AlertHistoryListener> listMessageHistoryListeners = new ArrayList<AlertHistoryListener>(1);

  private static boolean initialisation_complete = false;

  private static volatile boolean stopping;

  private static List<AlertListener> listeners = new ArrayList<AlertListener>();

  private Alerts() {
  }
  /**
   * @param alert
   *
   * @since 3.0.0.9
   */
  protected static void showAlert(LogAlert alert) {
    final Display display = SWTThread.getInstance().getDisplay();

    if (alert.err != null) {
      alert.details = Debug.getStackTrace(alert.err);
    }

    /*
    final String message2;
    if (alert.text != null
        && COConfigurationManager.getBooleanParameter("Show Timestamp For Alerts")) {
      message2 = "["
          + DisplayFormatters.formatDateShort(SystemTime.getCurrentTime())
          + "] " + alert.text;
    } else {
      message2 = (alert.text == null) ? "" : alert.text;
    }
    */

    for (Iterator<AlertListener> iter = listeners.iterator(); iter.hasNext();) {
      AlertListener l = (AlertListener) iter.next();
      if (!l.allowPopup(alert.relatedTo, alert.entryType)) {
        return;
      }
    }
   
 
    if (stopping || display.isDisposed()) {

      try {
        alert_queue_mon.enter();

        List close_alerts = COConfigurationManager.getListParameter(
            "Alerts.raised.at.close", new ArrayList());

        Map alert_map = new HashMap();

        alert_map.put("type", new Long(alert.entryType));
        alert_map.put("message", alert.text);
        alert_map.put("timeout", new Long( alert.getGivenTimeoutSecs()));
       
        if (alert.details != null) {
          alert_map.put("details", alert.details);
        }

        close_alerts.add(alert_map);

        COConfigurationManager.setParameter("Alerts.raised.at.close",
            close_alerts);

        return;
      } finally {
        alert_queue_mon.exit();
      }
    }

    if (display.isDisposed()) {
      return;
    }

   
    String key = (alert.err == null) ? alert.text : alert.text + ":"
        + alert.err.toString();
    try {
      alert_history_mon.enter();

      if (!alert.repeatable) {
        if (alert_history.contains(key)) {
          return;
        }

        alert_history.add(key);

        if (alert_history.size() > 512) {
          alert_history.remove(0);
        }
      }

      listUnviewedLogAlerts.add(alert);
    } finally {
      alert_history_mon.exit();
    }
   
    AlertHistoryListener[] array = listMessageHistoryListeners.toArray(new AlertHistoryListener[0]);
    for (AlertHistoryListener l : array) {
      l.alertHistoryAdded(alert);
    }
  }

  public static void initComplete() {
    new AEThread2("Init Complete",true) {
      public void run() {
        try {
          alert_queue_mon.enter();

          initialisation_complete = true;

          for (int i = 0; i < alert_queue.size(); i++) {
            LogAlert alert = alert_queue.get(i);

            showAlert(alert);
          }

          List close_alerts = COConfigurationManager.getListParameter(
              "Alerts.raised.at.close", new ArrayList());

         
          if (close_alerts.size() > 0) {

            COConfigurationManager.setParameter("Alerts.raised.at.close",
                new ArrayList());

            String intro = MessageText.getString("alert.raised.at.close")
                + "\n";

            for (int i = 0; i < close_alerts.size(); i++) {

              try {
                Map alert_map = (Map) close_alerts.get(i);

                BDecoder.decodeStrings(alert_map);
               
                String details = MapUtils.getMapString(alert_map, "details", null);
               
                int timeout = MapUtils.getMapInt(alert_map, "timeout", -1);
               
                int entryType = MapUtils.getMapInt(alert_map, "type", 0);
               
                String message = intro + MapUtils.getMapString(alert_map, "message", "");
               
                LogAlert logAlert = new LogAlert(false, entryType, message, timeout);
                logAlert.details = details;
               
                showAlert(logAlert);

              } catch (Throwable e) {

                Debug.printStackTrace(e);
              }
            }
          }

          alert_queue.clear();

        } finally {

          alert_queue_mon.exit();
        }
      }
    }.start();
  }

  public static void stopInitiated() {
    stopping = true;
  }

  public static void init() {
    Logger.addListener(new ILogAlertListener() {
      /* (non-Javadoc)
       * @see org.gudy.azureus2.core3.logging.ILogAlertListener#alertRaised(org.gudy.azureus2.core3.logging.LogAlert)
       */
      public void alertRaised(LogAlert alert) {
        if (!initialisation_complete) {
          try {
            alert_queue_mon.enter();

            alert_queue.add(alert);

          } finally {

            alert_queue_mon.exit();
          }

          return;
        }

        showAlert(alert);
      }
    });
  }

 
  public static void addListener(AlertListener l) {
    listeners .add(l);
  }
 
  public static interface AlertListener {
    public boolean allowPopup(Object[] relatedObjects, int configID);
  }

 
  public static ArrayList<LogAlert> getUnviewedLogAlerts() {
    return new ArrayList<LogAlert>(listUnviewedLogAlerts);
  }

  public static void addMessageHistoryListener(AlertHistoryListener l) {
    listMessageHistoryListeners.add(l);
  }
 
  public static void markAlertAsViewed(LogAlert alert) {
    boolean removed = listUnviewedLogAlerts.remove(alert);
    if (removed) {
      AlertHistoryListener[] array = listMessageHistoryListeners.toArray(new AlertHistoryListener[0]);
      for (AlertHistoryListener l : array) {
        l.alertHistoryRemoved(alert);
      }
    }
  }
 
  public interface AlertHistoryListener {
    public void alertHistoryAdded(LogAlert alert);
    public void alertHistoryRemoved(LogAlert alert);
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.Alerts$AlertHistoryListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.