All Downloads are FREE. Search and download functionalities are using the official Maven repository.

admin.astor.statistics.GlobalStatisticsTable Maven / Gradle / Ivy

//+======================================================================
// $Source:  $
//
// Project:   Tango
//
// Description:  java source code for Tango manager tool..
//
// $Author: verdier $
//
// Copyright (C) :      2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,
//						European Synchrotron Radiation Facility
//                      BP 220, Grenoble 38043
//                      FRANCE
//
// This file is part of Tango.
//
// Tango 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 3 of the License, or
// (at your option) any later version.
// 
// Tango 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 Tango.  If not, see .
//
// $Revision:  $
//
//-======================================================================


package admin.astor.statistics;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.List;

/**
 * JLChart Class to display statistics
 *
 * @author Pascal Verdier
 */
public class GlobalStatisticsTable extends JTable {
    private JFrame parent;
    private List serverStatistics;
    private List filteredServerStatistics = new ArrayList<>();
    private DataTableModel model;
    private TablePopupMenu menu;


    //	Column Definitions
    private static final int SERVER_NAME = 0;
    private static final int HOST_NAME = 1;
    private static final int NB_FAILURES = 2;
    private static final int TIME_FAILURE = 3;
    private static final int AVAILABILITY = 4;
    private static final int LAST_FAILURE = 5;

    //private static final    int TIME_RUNNING = 4;
    class Column {
        String name;
        int width;

        Column(String name, int width) {
            this.name = name;
            this.width = width;
        }
    }

    private final Column[] columns = {
            new Column("Server Name", 200),
            new Column("Host Name", 100),
            new Column("Failures", 50),
            new Column("Failure Duration", 150),
            new Column("Availability", 80),
            new Column("Last Failure", 150),
            //new Column("Running Duration", 150),
    };
    //=======================================================

    /**
     * Creates new JTable to display statistics
     *
     * @param parent JFrame parent instance
     */
    //=======================================================
    public GlobalStatisticsTable(JFrame parent) {
        this.parent = parent;

       //  Create the table.
        setRowSelectionAllowed(true);
        setColumnSelectionAllowed(true);
        setDragEnabled(false);
        setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tableActionPerformed(evt);
            }
        });
        model = new DataTableModel();
        setModel(model);

        //  Manage column headers
        getTableHeader().setFont(new java.awt.Font("Dialog", 1, 12));
        getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                headerTableActionPerformed(evt);
            }
        });

        //  Fix width for columns
        final Enumeration enumeration = getColumnModel().getColumns();
        int i = 0;
        TableColumn tc;
        while (enumeration.hasMoreElements()) {
            tc = (TableColumn) enumeration.nextElement();
            tc.setPreferredWidth(columns[i++].width);
        }

        menu = new TablePopupMenu(this);
    }

    //===============================================================
    //===============================================================
    public int getDefaultHeight() {
        int max = 400;
        int height = 22 + 17 * filteredServerStatistics.size();
        if (height > max) height = max;
        return height;
    }

    //===============================================================
    //===============================================================
    public int getDefaultWidth() {
        int width = 0;
        for (Column column : columns)
            width += column.width;
        return width;
    }

    //===============================================================
    //===============================================================
    private void tableActionPerformed(MouseEvent evt) {

        int column = columnAtPoint(new Point(evt.getX(), evt.getY()));
        int row = rowAtPoint(new Point(evt.getX(), evt.getY()));
        //	get selected cell
        ServerStat server = filteredServerStatistics.get(row);
        if (evt.getButton() == MouseEvent.BUTTON3) {
            switch (column) {
                case SERVER_NAME:
                    menu.showMenu(evt, server);
                    break;
                case HOST_NAME:
                    menu.showMenu(evt, server.starterStat);
                    break;
            }
        } else if (evt.getButton() == MouseEvent.BUTTON1) {
            if (evt.getClickCount() == 2) {
                switch (column) {
                    case SERVER_NAME:
                        displayServerStat(server);
                        break;
                    case HOST_NAME:
                        displayStarterStat(server.starterStat);
                        break;
                }
            }
        }
    }

    //===============================================================
    //===============================================================
    private void displayServerStat(ServerStat serverStat) {
        String title = serverStat.name + "  registered on  " + serverStat.starterStat.name;
        new ServerStatisticsPanel(parent, title, serverStat).setVisible(true);
    }

    //===============================================================
    //===============================================================
    private void displayStarterStat(StarterStat starterStat) {

        String title = starterStat.name;
        new StarterStatTable(parent, title, starterStat).setVisible(true);
    }

    //===============================================================
    //===============================================================
    private void headerTableActionPerformed(MouseEvent evt) {

		System.out.println("headerTableActionPerformed(evt); called");
        sort(getTableHeader().columnAtPoint(
                new Point(evt.getX(), evt.getY())));
    }

    //=======================================================
    //=======================================================
    private void sort(int column) {
        for (ServerStat serverStat : filteredServerStatistics) {
            System.out.println(serverStat.name);
        }
        Collections.sort(filteredServerStatistics, new ServersComparator(column));
        System.out.println("==============================================================================");
        for (ServerStat serverStat : filteredServerStatistics) {
            System.out.println(serverStat.name);
        }

        model.fireTableDataChanged();
    }

    //=======================================================
    //=======================================================
    public void setStatistics(List serverStatistics) {
        this.serverStatistics = serverStatistics;
        copyServerStatistics();
        sort(LAST_FAILURE);
        model.fireTableDataChanged();
    }

    //=======================================================
    //=======================================================
    public void setFilter(String startWith) {
        filteredServerStatistics.clear();
        for (ServerStat serverStat : serverStatistics) {
            if (serverStat.name.startsWith(startWith)) {
                filteredServerStatistics.add(serverStat);
            }
        }
        model.fireTableDataChanged();
    }

    //=======================================================
    //=======================================================
    public void resetFilter() {
        copyServerStatistics();
        model.fireTableDataChanged();
    }

    //=======================================================
    //=======================================================
    private void copyServerStatistics() {
        filteredServerStatistics.clear();
        for (ServerStat serverStat : serverStatistics) {
            filteredServerStatistics.add(serverStat);
        }
    }
    //=======================================================
    //=======================================================


    //=========================================================================
    //=========================================================================
    public class DataTableModel extends AbstractTableModel {
        //==========================================================
        //==========================================================
        public int getColumnCount() {
            return columns.length;
        }

        //==========================================================
        //==========================================================
        public int getRowCount() {
            return filteredServerStatistics.size();
        }

        //==========================================================
        //==========================================================
        public String getColumnName(int col) {
            return columns[col].name;
        }

        //==========================================================
        //==========================================================
        public Object getValueAt(int row, int col) {
            ServerStat server = filteredServerStatistics.get(row);
            return getServerValueString(server, col);
        }

        //==========================================================
        //==========================================================
        private String getServerValueString(ServerStat server, int column) {

            switch (column) {
                case SERVER_NAME:
                    return server.name;
                case HOST_NAME:
                    return server.starterStat.name;
                case NB_FAILURES:
                    return Integer.toString(server.nbFailures);
                case TIME_FAILURE:
                    return Utils.formatDuration(server.failedDuration);
                //case TIME_RUNNING:
                //    return Utils.formatDuration(server.runDuration);
                case AVAILABILITY:
                    return Utils.formatPercentage(server.getAvailability());
                case LAST_FAILURE:
                    long t = server.getLastFailure();
                    if (t > 0)
                        return Utils.formatDate(t);
                    else
                        return " ? ? ";
            }
            return "--";
        }
        //==========================================================
        //==========================================================
    }


    //======================================================

    /**
     * MyCompare class to sort collection
     */
    //======================================================
    class ServersComparator implements Comparator {
        private int column;

        private ServersComparator(int column) {
            this.column = column;
        }

        public int compare(ServerStat server1, ServerStat server2) {
            switch (column) {
                case SERVER_NAME:
                    return server1.name.compareToIgnoreCase(server2.name);
                case HOST_NAME:
                    return server1.starterStat.name.compareToIgnoreCase(server2.starterStat.name);
                case NB_FAILURES:
                    if (server1.nbFailures == server2.nbFailures) return 0;
                    return ((server1.nbFailures < server2.nbFailures) ? 1 : -1);
                case TIME_FAILURE:
                    if (server1.failedDuration < server2.failedDuration) return 0;
                    return ((server1.failedDuration < server2.failedDuration) ? 1 : -1);
                case AVAILABILITY:
                    if (server1.getAvailability() < server2.getAvailability()) return 0;
                    return ((server1.getAvailability() < server2.getAvailability()) ? 1 : -1);
                case LAST_FAILURE:
                    if (server1.getLastFailure() < server2.getLastFailure()) return 0;
                    return ((server1.getLastFailure() < server2.getLastFailure()) ? 1 : -1);
            }
            //	default case by name
            return server1.name.compareToIgnoreCase(server2.name);
        }
    }
    //==============================================================================
    //==============================================================================


    //==============================================================================
    //==============================================================================
    static private final int OFFSET = 2;
    static private final int SERVER_STAT = 0;
    static private final int HOST_STAT = 1;

    static private String[] menuLabels = {
            "Server statistics",
            "Host statistics",
    };

    private class TablePopupMenu extends JPopupMenu {
        private JTable table;
        private ServerStat serverStat;
        private StarterStat starterStat;
        private JLabel title;
        //=======================================================

        /**
         * Create a Popup menu for JTable object
         *
         * @param table specified JTable instance
         */
        //=======================================================
        private TablePopupMenu(JTable table) {
            this.table = table;
            title = new JLabel();
            title.setFont(new java.awt.Font("Dialog", 1, 16));
            add(title);
            add(new JPopupMenu.Separator());

            for (String menuLabel : menuLabels) {
                if (menuLabel == null)
                    add(new Separator());
                else {
                    JMenuItem btn = new JMenuItem(menuLabel);
                    btn.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            menuActionPerformed(evt);
                        }
                    });
                    add(btn);
                }
            }
        }

        //======================================================
        private void showMenu(MouseEvent evt, ServerStat serverStat) {

            title.setText(serverStat.name);
            this.serverStat = serverStat;
            //noinspection PointlessArithmeticExpression
            getComponent(OFFSET + SERVER_STAT).setVisible(true);
            getComponent(OFFSET + HOST_STAT).setVisible(false);
            show(table, evt.getX(), evt.getY());
        }

        //======================================================
        private void showMenu(MouseEvent evt, StarterStat starterStat) {

            title.setText(starterStat.name);
            this.starterStat = starterStat;
            //noinspection PointlessArithmeticExpression
            getComponent(OFFSET + SERVER_STAT).setVisible(false);
            getComponent(OFFSET + HOST_STAT).setVisible(true);
            show(table, evt.getX(), evt.getY());
        }

        //======================================================
        private void menuActionPerformed(ActionEvent evt) {
            //	Check component source
            Object obj = evt.getSource();
            int cmdidx = 0;
            for (int i = 0; i < menuLabels.length; i++)
                if (getComponent(OFFSET + i) == obj)
                    cmdidx = i;

            switch (cmdidx) {
                case SERVER_STAT:
                    displayServerStat(serverStat);
                    break;
                case HOST_STAT:
                    displayStarterStat(starterStat);
                    break;
            }
        }
    }
    //======================================================
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy