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

admin.astor.HostInfoDialog Maven / Gradle / Ivy

//+======================================================================
// $Source:  $
//
// Project:   Tango
//
// Description:  java source code for Tango manager tool..
//
// $Author$
//
// 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;



import admin.astor.tools.PopupText;
import admin.astor.tools.Utils;
import fr.esrf.Tango.DevFailed;
import fr.esrf.Tango.DevState;
import fr.esrf.TangoApi.ApiUtil;
import fr.esrf.TangoApi.DbServInfo;
import fr.esrf.TangoApi.DbServer;
import fr.esrf.TangoApi.DeviceAttribute;
import fr.esrf.TangoApi.events.ITangoChangeListener;
import fr.esrf.TangoApi.events.TangoChange;
import fr.esrf.TangoApi.events.TangoChangeEvent;
import fr.esrf.TangoApi.events.TangoEventsAdapter;
import fr.esrf.TangoDs.Except;
import fr.esrf.TangoDs.TangoConst;
import fr.esrf.tangoatk.widget.util.ATKConstant;
import fr.esrf.tangoatk.widget.util.ATKGraphicsUtils;
import fr.esrf.tangoatk.widget.util.ErrorPane;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.tree.TreePath;


/**
 *	This class display a dialog with a list of servers running, stopped,
 *	and buttons to start or stop servers.
 *
 * @author verdier
 * @version $Revision$
 */


@SuppressWarnings("MagicConstant")
public class HostInfoDialog extends JDialog implements AstorDefs, TangoConst {
    private TangoHost host;
    private String hostName;
    private Astor astorMainClass;
    private Color bg;
    private List warningServers;

    private String attribute = "Servers";

    private static final int NO_CHANGE = 0;
    private static final int LIST_CHANGED = 1;
    private static final int STATE_CHANGED = 2;
    private static Dimension preferredSize;

    private JScrollPane scrollPane;
    private LevelTree[] trees = null;
    private JPanel levelsPanel = null;
    private JPanel[] treePanels;
    private boolean standAlone = false;
    private UpdateThread    updateThread;
    //===============================================================
    /**
     * Creates new form HostInfoDialog
     *
     * @param astor        the Astor parent instance
     * @param hostName      host hostName to display info
     * @param standAlone    true if stand alone
     * @throws DevFailed    if starter connection failed
     */
    //===============================================================
    public HostInfoDialog(Astor astor, String hostName, boolean standAlone) throws DevFailed{
        this(astor, new TangoHost(hostName, true));
        this.standAlone = standAlone;
        
        host.thread = new HostStateThread(host);
        host.thread.start();
        
        initWarningButton();
     }
    //===============================================================
    /**
     * Creates new form HostInfoDialog
     *
     * @param astor the Astor parent instance
     * @param host   host to display info
     */
    //===============================================================
    public HostInfoDialog(Astor astor, TangoHost host) {
        super(astor);
        this.astorMainClass = astor;
        this.host = host;
        this.hostName= host.getName();
        initComponents();
        
        setTitle(host + "  Control");
        displayAllBtn.setSelected(true);
        preferredSize = AstorUtil.getHostDialogPreferredSize();
        scrollPane = new JScrollPane();

        updateThread = new UpdateThread();
        updateThread.start();

        bg = titlePanel.getBackground();
        titleLabel.setText("Controlled Servers on " + hostName);

        //  Manage for READ_ONLY mode
        if (Astor.rwMode==AstorDefs.READ_ONLY) {
            startNewBtn.setVisible(false);
            startAllBtn.setVisible(false);
            stopAllBtn.setVisible(false);
        }
        initWarningButton();
        
        pack();
        
        ATKGraphicsUtils.centerDialog(this);
    }
    //===============================================================
    //===============================================================
    private void initWarningButton() {
        warningButton.setText("");
        warningButton.setIcon(Utils.getResizedIcon(Utils.getWarningIcon(), 0.5));
        separatorLabel.setVisible(false);
        warningButton.setVisible(false);
    }
    //===============================================================
    //===============================================================
    public String getHostName() {
        return hostName;
    }
    //===============================================================
    //===============================================================
    public Astor getAstorObject() {
        return astorMainClass;
    }

    //===============================================================
    //===============================================================
    public void displayHostInfoDialog(String hostname) {
        astorMainClass.tree.displayHostInfoDialog(hostname);
    }

    //===============================================================
    //===============================================================
    void setDialogPreferredSize(Dimension d) {
        preferredSize = d;
        packTheDialog();
    }

    //===============================================================
    //===============================================================
    void updatePanel(final boolean resizePanel) {
        //	Build panel
        if (trees == null) {
            int nbLevels = AstorUtil.getStarterNbStartupLevels();
            nbLevels++; //	for not controlled

            levelsPanel = new JPanel();
            levelsPanel.setLayout(new GridBagLayout());

            centerPanel.add(levelsPanel, BorderLayout.CENTER);
            treePanels = new JPanel[nbLevels];
            trees = new LevelTree[nbLevels];
            
            for (int i = 0; i < nbLevels; i++) {
                trees[i] = new LevelTree(astorMainClass, this, host, i);
                treePanels[i] = new JPanel();
                treePanels[i].add(trees[i]);
            }
        } else
            for (LevelTree tree : trees)
                tree.checkUpdate();

        int nbServers = 0;
        for (int i = 1; i < trees.length; i++)
            nbServers += trees[i].getNbServers();
        titleLabel.setText("" + nbServers + " Controlled Servers on " + hostName);

        //  ToDo Check for servers with several instances
        warningServers = new ArrayList<>();
        for (LevelTree levelTree : trees) {
            List tangoServerList = levelTree.getTangoServerList();
            for (TangoServer tangoServer : tangoServerList) {
                if (tangoServer.getNbInstances()>1) {
                    warningServers.add(tangoServer);
                }
            }
        }
        separatorLabel.setVisible(!warningServers.isEmpty());
        warningButton.setVisible(!warningServers.isEmpty());

        SwingUtilities.invokeLater(() -> {
            checkActiveLevels();
            updateHostState();
            if (resizePanel)
                packTheDialog();
        });
    }
    //===============================================================
    /**
     * Pack the window and check if it needs scroll bars or not.
     * If very big, needs scroll bars.
     * But if not so big, do not needs to have a good resize.
     */
    //===============================================================
    void packTheDialog() {
        if (!isVisible())
            return;

        Point p = getLocation();
        pack();
        int width = levelsPanel.getWidth();
        int height = levelsPanel.getHeight();
        //System.out.println(width + ", " + height);
        
        if (width > preferredSize.width || height > preferredSize.height) {
            //	set bar width (cannot get, not active yet)
            int bw = 20;
            //	Put the tree panel in a scroll pane
            centerPanel.remove(levelsPanel);
            Dimension d = new Dimension(preferredSize);
            //	Check to resize only in one way
            if (width < preferredSize.width - bw)
                d.width = width + bw;
            if (height < preferredSize.height - bw)
                d.height = height + bw;
            scrollPane.setPreferredSize(d);
            scrollPane.add(levelsPanel);
            scrollPane.setViewportView(levelsPanel);
            centerPanel.add(scrollPane, java.awt.BorderLayout.CENTER);
        } else {
            //	Put the tree panel directly in center panel.
            centerPanel.remove(scrollPane);
            scrollPane.remove(levelsPanel);
            centerPanel.add(levelsPanel, java.awt.BorderLayout.CENTER);
        }
        pack();
        setLocation(p);
   }

    //===============================================================
    //===============================================================
    private void checkActiveLevels() {
        levelsPanel.removeAll();

        //	Check how many levels are active
        List v = new ArrayList<>();
        for (int i = 1; i < trees.length; i++)
            if (trees[i].getNbServers() > 0)
                v.add(treePanels[i]);
        if (trees[LEVEL_NOT_CTRL].getNbServers() > 0)
            v.add(treePanels[LEVEL_NOT_CTRL]);

        //	Compute horizontal size and dispach
        int x = 0;
        int y = 1;
        int x_size = v.size() / 2 - 1;
        if (x_size < 2) x_size = 2;

        for (int i = 0; i < v.size(); i++) {
            JPanel panel = v.get(i);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = x++;
            gbc.gridy = y;
            gbc.insets = new Insets(5, 10, 0, 0);
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.fill = GridBagConstraints.VERTICAL;
            gbc.anchor = GridBagConstraints.WEST;
            levelsPanel.add(panel, gbc);
            if (i == x_size) {
                x = 0;
                y += 2;
            }
        }
    }

    //===============================================================
    //===============================================================
    Color getBackgroundColor() {
        //	under Win32 the color is from button
        //	From dialog it is another one (Why ?)
        return startNewBtn.getBackground();
    }

    //===============================================================
    //===============================================================
    void updateHostState() {
        //	Manage Starter state
        if (host.state == moving) {
            titlePanel.setBackground(ATKConstant.getColor4State(DevState.MOVING.toString()));
        } else if (host.state == alarm || host.state == long_moving) {
            titlePanel.setBackground(ATKConstant.getColor4State(DevState.ALARM.toString()));
        } else
            titlePanel.setBackground(bg);
    }


    //===============================================================
    /**
     * This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    //===============================================================
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.JPanel topPanel = new javax.swing.JPanel();
        startNewBtn = new javax.swing.JButton();
        startAllBtn = new javax.swing.JButton();
        stopAllBtn = new javax.swing.JButton();
        displayAllBtn = new javax.swing.JRadioButton();
        centerPanel = new javax.swing.JPanel();
        titlePanel = new javax.swing.JPanel();
        titleLabel = new javax.swing.JLabel();
        javax.swing.JPanel bottomPanel = new javax.swing.JPanel();
        javax.swing.JButton cancelBtn = new javax.swing.JButton();
        separatorLabel = new javax.swing.JLabel();
        warningButton = new javax.swing.JButton();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                closeDialog(evt);
            }
        });
        getContentPane().setLayout(new java.awt.BorderLayout());

        startNewBtn.setText("Start New");
        startNewBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startNewBtnActionPerformed(evt);
            }
        });
        topPanel.add(startNewBtn);

        startAllBtn.setText("Start All");
        startAllBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startAllBtnActionPerformed(evt);
            }
        });
        topPanel.add(startAllBtn);

        stopAllBtn.setText("Stop All");
        stopAllBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stopAllBtnActionPerformed(evt);
            }
        });
        topPanel.add(stopAllBtn);

        displayAllBtn.setText("Display All");
        displayAllBtn.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        displayAllBtn.setMargin(new java.awt.Insets(0, 0, 0, 0));
        displayAllBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                displayAllBtnActionPerformed(evt);
            }
        });
        topPanel.add(displayAllBtn);

        getContentPane().add(topPanel, java.awt.BorderLayout.NORTH);

        centerPanel.setLayout(new java.awt.BorderLayout());

        titleLabel.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
        titleLabel.setText("Dialog Title");
        titlePanel.add(titleLabel);

        centerPanel.add(titlePanel, java.awt.BorderLayout.NORTH);

        getContentPane().add(centerPanel, java.awt.BorderLayout.CENTER);

        cancelBtn.setText("Dismiss");
        cancelBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelBtnActionPerformed(evt);
            }
        });
        bottomPanel.add(cancelBtn);

        separatorLabel.setText("            ");
        bottomPanel.add(separatorLabel);

        warningButton.setText("Warning");
        warningButton.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        warningButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                warningButtonActionPerformed(evt);
            }
        });
        bottomPanel.add(warningButton);

        getContentPane().add(bottomPanel, java.awt.BorderLayout.SOUTH);

        pack();
    }// //GEN-END:initComponents
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void displayAllBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_displayAllBtnActionPerformed

        boolean b = (displayAllBtn.getSelectedObjects() != null);
        if (trees != null) {
            for (LevelTree tree : trees)
                if (b) {
                    if (tree.getLevelRow() != LEVEL_NOT_CTRL)
                        tree.expandTree();
                } else
                    tree.collapseTree();
        }
    }//GEN-LAST:event_displayAllBtnActionPerformed
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void stopAllBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopAllBtnActionPerformed

        //	Check levels used by servers
        List used = new ArrayList<>();
        for (int i = trees.length - 1; i >= 0; i--) {
            int level = trees[i].getLevelRow();
            if (level != LEVEL_NOT_CTRL) {    //	is controlled
                if (trees[i].getNbServers()>0 && trees[i].hasRunningServer())
                    used.add(level);
                else {
                    //  Send DevStopAll it to stop a DevStartAll if running
                    try { host.stopServers(level); }
                    catch (DevFailed e) { /* */ }
                }
            }
        }
        //	And stop them
        new ServerCmdThread(this, host, StopAllServers, used).start();

    }//GEN-LAST:event_stopAllBtnActionPerformed
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void startAllBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startAllBtnActionPerformed

        //	Check levels used by servers
        List used = new ArrayList<>();
        for (LevelTree tree : trees) {
            int level = tree.getLevelRow();
            if (level != LEVEL_NOT_CTRL) { //	is controlled
                if(tree.getNbServers() > 0 && tree.getState() != DevState.ON)
                    used.add(level);
            }
        }
        //	And start them
        new ServerCmdThread(this, host, StartAllServers, used).start();

    }//GEN-LAST:event_startAllBtnActionPerformed
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void startNewBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startNewBtnActionPerformed

        //	Get Server hostName
        ListDialog listDialog = new ListDialog(this);
        //	Search Btn position to set dialog location
        Point point = getLocationOnScreen();
        point.translate(50, 50);
        listDialog.setLocation(point);
        listDialog.showDialog();
        List serverNames = listDialog.getSelectedItems();
        if (serverNames != null) {
            new StartServersThread(this, serverNames, point).start();
        }
    }//GEN-LAST:event_startNewBtnActionPerformed

    TreePath [] getSelectedPath() {
        ArrayList paths = new ArrayList();
        for(LevelTree tree : this.trees){
            if(tree != null){
                TreePath [] selection = tree.getSelectionPaths();
                if(selection != null){
                    paths.addAll(Arrays.asList(selection));
                }
            }
        }
        
        return paths.toArray(new TreePath[0]);
    }

    TangoHost getHost() {
        return this.host;
    }

    //===============================================================
    //===============================================================
    private class StartServersThread extends Thread {
        private Window window;
        private List serverNames;
        private Point point;
        private StartServersThread(Window parentWindow, List serverNames, Point point) {
            this.window = parentWindow;
            this.serverNames = serverNames;
            this.point = point;
        }
        public void run () {
            try {
                //  If several servers -> ask level management ?
                DbServInfo dbServInfo = null;
                int levelManagement = ASK_FOR_EACH;
                if (serverNames.size()>4) {
                    levelManagement=getLevelManagement();
                    if (levelManagement == CANCEL)
                        return;

                    if (levelManagement == SET_ONE) {
                        TangoServer server = new TangoServer(serverNames.get(0), DevState.OFF);
                        dbServInfo = server.getStartupLevel(window, point);
                    }
                }
                //  Start each server
                for (String serverName : serverNames) {
                    if (serverName != null) {
                        try {
                            //	OK to start, do it.
                            host.registerServer(serverName);
                            host.startServer(serverName);

                            switch (levelManagement) {
                                case DON_T_ASK:
                                    //  Do not loop to fast
                                    try { Thread.sleep(1000); } catch (InterruptedException e) { /* */ }
                                    break;
                                case ASK_FOR_EACH:
                                    //	OK to start get the Startup control params.
                                    TangoServer server=new TangoServer(serverName, DevState.OFF);
                                    server.startupLevel(window, host.getName(), point);
                                    break;
                                case SET_ONE:
                                    //  Set the specified level
                                    if (dbServInfo != null) {
                                        dbServInfo.name = serverName;
                                        dbServInfo.host=host.getName();
                                        new DbServer(serverName).put_info(dbServInfo);
                                    }
                                    //  Do not loop to fast
                                    try { Thread.sleep(1000); } catch (InterruptedException e) { /* */ }
                                    break;
                            }
                        } catch (DevFailed e) {
                            ErrorPane.showErrorMessage(astorMainClass, null, e);
                        }
                    }

                    //  Force a Starter update
                    host.updateServersList(astorMainClass);

                    //  And force asynchronous update
                    DeviceAttribute attribute=host.read_attribute("Servers");
                    manageServersAttribute(attribute);
                }
            }
            catch(DevFailed e) {
                // Nothing
            }
        }
    }
    //===============================================================
    private static final int DON_T_ASK = 0;
    private static final int SET_ONE = 1;
    private static final int ASK_FOR_EACH = 2;
    private static final int CANCEL = 3;
    //===============================================================
    private int getLevelManagement() {
        Object[] options = {"Don't ask", "Set one for all", "Ask for each", "Cancel"};
        int option = JOptionPane.showOptionDialog(this,
                "Device servers startup level ?\n\n",
                "Question", JOptionPane.DEFAULT_OPTION,
                JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
        switch (option) {
            case 3:    //	Cancel
            case -1:   //	escape
                return CANCEL;
            default:
                return option;
        }
    }
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed
        doClose();
    }//GEN-LAST:event_cancelBtnActionPerformed
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog
        doClose();
    }//GEN-LAST:event_closeDialog
    //===============================================================
    //===============================================================
    @SuppressWarnings({"UnusedDeclaration"})
    private void warningButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_warningButtonActionPerformed
        StringBuilder  sb = new StringBuilder("Servers running at least twice:\n\n");
        int i = 0;
        for (TangoServer tangoServer : warningServers) {
            sb.append(tangoServer.getName()).append("\n");
        }
        new PopupText(this).show(sb.toString(), 300, 400);
    }//GEN-LAST:event_warningButtonActionPerformed
    //===============================================================
    //===============================================================
    void doClose() {
        if (!standAlone) {
            setVisible(false);
            dispose();
        } else {
            updateThread.stopThread();
            System.exit(0);
        }
    }
    //===============================================================
    //===============================================================
    void fireNewTreeSelection(LevelTree tree) {
        for (LevelTree tree1 : trees)
            if (tree1 != tree){
                tree1.clearSelection();
                tree1.repaint();
            }
    }
    //===============================================================
    //===============================================================
    void stopLevel(int level) {
        List levels = new ArrayList<>();
        levels.add(level);
        new ServerCmdThread(this, host, StopAllServers, levels).start();
    }
    //===============================================================
    //===============================================================
    void startLevel(int level) {
        List levels = new ArrayList<>();
        levels.add(level);
        new ServerCmdThread(this, host, StartAllServers, levels, false).start();
    }
    //=============================================================
    //=============================================================
    private void manageServersAttribute(DeviceAttribute att) {
        //
        List servers = new ArrayList<>();
        try {
            if (!att.hasFailed()) {
                int nbLevels = AstorUtil.getStarterNbStartupLevels();
                String[] lines = att.extractStringArray();
                for (String line : lines) {
                    // ToDO
                    Server server = new Server(line);
                    servers.add(server);
                    if (server.level>nbLevels) {
                        // Level not coherent with Control System config
                        // Set as not controlled
                        DbServInfo info = new DbServInfo(server.name, hostName, false, 0);
                        new DbServer(server.name).put_info(info);
                        server.level = 0;
                        server.controlled = false;
                    }
                }
            }
        } catch (DevFailed e) {
            System.err.println(hostName);
            Except.print_exception(e);
        }

        //	Check if something has changed
        switch (updateHost(servers)) {
            case STATE_CHANGED:
                updatePanel(false);
                break;
            case LIST_CHANGED:
                updatePanel(true);
                break;
            case NO_CHANGE:
                return;
        }
        for (LevelTree tree : trees)
            tree.repaint();
    }
    //=============================================================
    /**
     *	Update TangoHost objects and check what has changed.
     */
    //=============================================================
    private int updateHost(List newServers) {
        boolean stateChanged = false;
        boolean listChanged = false;

        //	check if new one
        for (Server newServer : newServers) {
            TangoServer server = host.getServer(newServer.name);
            if (server == null) {
                //	create it
                try {
                    server = new TangoServer(newServer.name, newServer.state);
                    host.addServer(server);
                    listChanged = true;
                } catch (DevFailed e) {
                    System.err.println(hostName);
                    Except.print_exception(e);
                    ErrorPane.showErrorMessage(this, hostName, e);
                }
            }

            if (server != null) {
                //	Check state
                if (newServer.state != server.getState() ||
                    newServer.nbInstances != server.getNbInstances()) {
                    server.setState(newServer.state);
                    stateChanged = true;
                    server.setNbInstances(newServer.nbInstances);
                }
                //	Check control
                if (newServer.controlled != server.controlled |
                        newServer.level != server.startup_level) {
                    server.controlled = newServer.controlled;
                    server.startup_level = newServer.level;
                    listChanged = true;
                }
            }
        }

        //	Check if some have been removed
        List removed = new ArrayList<>();
        for (TangoServer server : host.getServerList()) {
            boolean found = false;
            for (Server newServer : newServers) {
                if(found=newServer.name.equals(server.getName())) {
                    break;
                }
            }
            if (!found) {
                removed.add(server);
            }
        }
        for (TangoServer server : removed) {
            host.removeServer(server.getName());
            listChanged = true;
        }


        if (listChanged)
            return LIST_CHANGED;
        else if (stateChanged)
            return STATE_CHANGED;
        else
            return NO_CHANGE;
    }

    //=============================================================
    //=============================================================
    private DevState string2state(String str) {
        for (int i = 0; i < Tango_DevStateName.length; i++)
            if (str.equals(Tango_DevStateName[i]))
                return DevState.from_int(i);
        return DevState.UNKNOWN;
    }

    //=========================================================
    //=========================================================
    void setSelection(String serverName) {
        if (trees != null)
            for (LevelTree tree : trees) {
                TangoServer server = tree.getServer(serverName);
                if (server != null) {
                    tree.expandTree();
                    tree.setSelection(server);
                } else
                    tree.resetSelection();
            }
    }

    //=========================================================
    //=========================================================
    void updateData() {
        updatePanel(true);
    }
    //=========================================================
    //=========================================================

    //===============================================================
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel centerPanel;
    private javax.swing.JRadioButton displayAllBtn;
    private javax.swing.JLabel separatorLabel;
    private javax.swing.JButton startAllBtn;
    private javax.swing.JButton startNewBtn;
    private javax.swing.JButton stopAllBtn;
    private javax.swing.JLabel titleLabel;
    private javax.swing.JPanel titlePanel;
    private javax.swing.JButton warningButton;
    // End of variables declaration//GEN-END:variables
    //===============================================================

    //===============================================================
    //===============================================================
    public static void main(String[] args) {
        try {
			String hostname;
			
                        if (args.length>0) {
				hostname = args[0];
			}
			else {
        		if ((hostname=(String) JOptionPane.showInputDialog(
                        new JFrame(), "Host Name ?", "Input Dialog",
                		JOptionPane.INFORMATION_MESSAGE, null, null, "")) ==null)
            		System.exit(0);
			}

            HostInfoDialog hid = new HostInfoDialog(new Astor(), hostname, true);
            
            hid.setVisible(true);
        }
        catch(DevFailed e) {
            ErrorPane.showErrorMessage(new JFrame(), null, e);
       }
    }
    //===============================================================
    //===============================================================







    //=============================================================
    /*
     *  A class defining a server
     */
    //=============================================================
    class Server {
        String name;
        DevState state;
        boolean controlled = false;
        int level = 0;
        int nbInstances = 1;

        //=========================================================
        public Server(String line) {
            //	Parse line
            StringTokenizer stk = new StringTokenizer(line);
            List items = new ArrayList<>();
            while (stk.hasMoreTokens())
                items.add(stk.nextToken());

            int n = 0;
            if (items.size() > n)
                this.name = items.get(n);
            n++;
            if (items.size() > n)
                this.state = string2state(items.get(n));
            n++;
            if (items.size() > n)
                this.controlled = ((items.get(n)).equals("1"));
            n++;
            if (items.size() > n) {
                String s = items.get(n);
                try {
                    this.level = Integer.parseInt(s);
                } catch (NumberFormatException e) { /* */}
            }
            n++;
            if (items.size() > n) {
                String s = items.get(n);
                try {
                    this.nbInstances = Integer.parseInt(s);
                } catch (NumberFormatException e) { /* */}
            }
            //System.out.println(this);
        }

        //=========================================================
        public String toString() {
            return name + " -> " + ApiUtil.stateName(state) + "	- " +
                    ((controlled) ? "" : "not ") + "Controlled 	level " + level;
        }
        //=========================================================
    }
    //===============================================================
    //===============================================================












    private static final int readInfoPeriod = 1000;
    //===============================================================
    /**
     * A thread to read and update server lists
     */
    //===============================================================
    private class UpdateThread extends Thread {
        private boolean stopIt = false;

        //===========================================================
        private synchronized void stopThread() {
            stopIt = true;
            notify();
        }
        //===========================================================
        public void run() {
            if (host.onEvents)
                subscribeChangeEvent();

            //	Manage polling on synchronous calls
            while (!stopIt) {
                long t0 = System.currentTimeMillis();

                waitNextLoop(t0);
                if (!stopIt) {
                    SwingUtilities.invokeLater(() -> {
                        if (!host.onEvents) {
                            manageSynchronous();
                        }
                    });
                }
            }
        }
        //=============================================================
        /**
         * Compute time to sleep before next loop
         *
         * @param t0 time reference to compute time to wait
         */
        //=============================================================
        private synchronized void waitNextLoop(long t0) {
            try {
                long t1 = System.currentTimeMillis();
                long time_to_sleep = readInfoPeriod - (t1 - t0);

                if (time_to_sleep <= 0)
                    time_to_sleep = 100;
                wait(time_to_sleep);
            } catch (InterruptedException e) {
                System.out.println(e.toString());
            }
        }
        //=============================================================
        /**
         * Read servers list attributes in synchronous mode.
         */
        //=============================================================
        private void manageSynchronous() {
            try {
                DeviceAttribute att = host.read_attribute(attribute);
                manageServersAttribute(att);
            } catch (DevFailed e) {
                // Except.print_exception(e);
            }
        }
    }


    //======================================================================
    //======================================================================
    private void subscribeChangeEvent() {
        try {
            if (host.supplier == null)
                host.supplier = new TangoEventsAdapter(host);
        } catch (DevFailed e) {
            host.onEvents = false;
            //	Display exception
            System.err.println("subscribeChangeServerEvent() for " +
                    host.get_name() + " FAILED !");
            fr.esrf.TangoDs.Except.print_exception(e);
            return;
        } catch (Exception e) {
            host.onEvents = false;
            //	Display exception
            System.err.println("subscribeChangeServerEvent() for " +
                    host.get_name() + " FAILED !");
            System.err.println(e.toString());
            return;
        }

        try {
            //	add listener for double_event and server_event
            ServerEventListener serverListener = new ServerEventListener();
            host.supplier.addTangoChangeListener(serverListener, attribute, false);

            System.out.println("subscribeChangeServerEvent() for " +
                    host.get_name() + "/" + attribute + " OK!");
        } catch (DevFailed e) {
            //	Display exception
            host.onEvents = false;
            System.err.println("subscribeChangeServerEvent() for " +
                    host.get_name() + " FAILED !");
            fr.esrf.TangoDs.Except.print_exception(e);
        } catch (Exception e) {
            //	Display exception
            host.onEvents = false;
            System.err.println("subscribeChangeServerEvent() for " +
                    host.get_name() + " FAILED !");
            System.err.println(e.toString());
        }
    }
    //======================================================================
    //======================================================================











    //=========================================================================
    /**
     * Server event listener
     */
    //=========================================================================
    private class ServerEventListener implements ITangoChangeListener {
        //=====================================================================
        //=====================================================================
        public void change(TangoChangeEvent event) {
            TangoChange tc = (TangoChange) event.getSource();
            String deviceName = tc.getEventSupplier().get_name();

            try {
                DeviceAttribute att = event.getValue();
                //if (AstorUtil.getDebug())
                  //System.out.println(host + "/" + att.getName() + " changed " + " : ");
                manageServersAttribute(att);
            } catch (DevFailed e) {
                System.out.println(hostName);
                if (e.errors[0].reason.equals("API_EventTimeout")) {
                    System.err.println("HostStateThread.ServerEventListener" +
                            deviceName + " : API_EventTimeout");
                    //fr.esrf.TangoDs.Except.print_exception(e);
                } else
                    fr.esrf.TangoDs.Except.print_exception(e);
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println(hostName);
                System.err.println("AstorEvent." + deviceName);
                System.err.println(e.toString());
                System.err.println("HostStateThread.ServerEventListener : could not extract data!");
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy