/*
* @@COPYRIGHT@@
*/
package com.cosylab.acs.maci.manager.gui;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import alma.acs.logging.formatters.ConsoleLogFormatter;
import com.cosylab.acs.maci.manager.ManagerShutdown;
import com.cosylab.acs.maci.manager.app.ManagerEngine;
/**
* Manager activation application and GUI implementation.
*
* @author Matej Sekoranja (matej.sekoranja@cosylab.com)
* @version @@VERSION@@
*/
public class Manager extends JFrame implements ManagerShutdown
{
/**
* Serial version UID.
*/
private static final long serialVersionUID = -1120227545786082722L;
/**
* Manager engine.
*/
private ManagerEngine engine;
/**
* Shutdown status.
*/
private boolean shuttingDown = false;
/**
* GUI update interval in ms.
*/
public final static int GUI_UPDATE_INTERVAL = 250; // 1/4th of second
/**
* Progress bar indicating number of requests.
*/
private JProgressBar progressBar;
/**
* Timer updating the GUI.
*/
private Timer guiUpdaterTimer;
/**
* Default progress bar foreground color.
*/
private Color defaultProgressBarColor;
/**
* Constructor for Manager.
*/
public Manager()
{
initialize();
}
/**
* Get manager engine.
*/
public ManagerEngine getManagerEngine()
{
if (engine == null)
engine = new ManagerEngine(this);
return engine;
}
/**
* Initialize.
*/
protected void initialize()
{
getManagerEngine().initialize();
initializeGUI();
LogRecord record = new LogRecord(Level.INFO, "AcsManagerStatusMessage_ManagerStarted Manager Application initialized.");
record.setLoggerName(getManagerEngine().getLogger().getName());
String formattedString = new ConsoleLogFormatter().format(record);
System.out.println(formattedString);
//getManagerEngine().getLogger().log(Level.OFF, "AcsManagerStatusMessage_ManagerStarted Manager Application initialized.");
}
/**
* Initialize GUI.
*/
public void initializeGUI()
{
setSize(320, 200);
setLayout(new GridBagLayout());
setTitle("ACS Manager");
add(getRequestsProgressBar(),
new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(40, 40, 40, 40), 0, 0));
guiUpdaterTimer = new Timer(GUI_UPDATE_INTERVAL, new GUIUpdater());
guiUpdaterTimer.start();
setLocationByPlatform(true);
setVisible(true);
toFront();
addWindowListener(new WindowListener() {
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent)
*/
public void windowActivated(WindowEvent event) {
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
*/
public void windowClosed(WindowEvent event) {
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
*/
public void windowClosing(WindowEvent event) {
destroy();
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
*/
public void windowDeactivated(WindowEvent event) {
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
*/
public void windowDeiconified(WindowEvent event) {
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
*/
public void windowIconified(WindowEvent event) {
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent)
*/
public void windowOpened(WindowEvent event) {
}
});
}
/**
* @see com.cosylab.acs.maci.manager.ManagerShutdown#isShutdownInProgress()
*/
public boolean isShutdownInProgress()
{
return shuttingDown;
}
/**
* @see com.cosylab.acs.maci.manager.ManagerShutdown#shutdown()
*/
public void shutdown(boolean sigInt)
{
// delegate destroy
if (!shuttingDown)
destroy();
}
/**
* Destroyed.
*/
public void destroy()
{
shuttingDown = true;
if (guiUpdaterTimer != null)
guiUpdaterTimer.stop();
dispose();
getManagerEngine().destroy();
}
/*****************************************************************************/
/*************************** [ GUI components ] ******************************/
/*****************************************************************************/
/**
* GUI updater
*/
class GUIUpdater implements ActionListener
{
/**
* "Requests pending" string.
*/
private static final String requestsPending = " request(s) pending";
public void actionPerformed(ActionEvent e)
{
ManagerEngine engine = getManagerEngine();
JProgressBar progressBar = getRequestsProgressBar();
// update number of requests
int requests = engine.getNumberOfPendingRequests();
if (requests != progressBar.getValue())
{
// colorize it
if (requests < progressBar.getMaximum()/2)
progressBar.setForeground(defaultProgressBarColor);
else if (requests < progressBar.getMaximum())
progressBar.setForeground(Color.yellow);
else
progressBar.setForeground(Color.red);
progressBar.setValue(requests);
progressBar.setString(String.valueOf(requests)+requestsPending);
}
}
}
/**
* Returns progress bar indicating number of components.
*/
public JProgressBar getRequestsProgressBar()
{
if (progressBar == null)
{
// create progress bar
progressBar = new JProgressBar(0, 8);
defaultProgressBarColor = progressBar.getForeground();
progressBar.setStringPainted(true);
progressBar.setString("0 requests pending");
}
return progressBar;
}
/*****************************************************************************/
/***************************** [ Main entry ] ********************************/
/*****************************************************************************/
/**
* Application main entry point.
* @param args
*/
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-n") || args[i].equals("-nr")) {
// do not read saved state of the Manager
System.getProperties().put("Manager.recovery", "false");
}
}
new Manager();
}
}