summaryrefslogtreecommitdiff
path: root/java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java')
-rw-r--r--java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java769
1 files changed, 769 insertions, 0 deletions
diff --git a/java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java b/java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java
new file mode 100644
index 00000000000..4ac60aa8814
--- /dev/null
+++ b/java/src/IceGridGUI/LiveDeployment/ShowLogFileDialog.java
@@ -0,0 +1,769 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package IceGridGUI.LiveDeployment;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ButtonGroup;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JOptionPane;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+
+import com.jgoodies.looks.BorderStyle;
+import com.jgoodies.looks.HeaderStyle;
+import com.jgoodies.looks.Options;
+import com.jgoodies.looks.plastic.PlasticLookAndFeel;
+
+import IceGrid.*;
+import IceGridGUI.*;
+
+class ShowLogFileDialog extends JDialog
+{
+ static interface FileIteratorFactory
+ {
+ FileIteratorPrx open(int count)
+ throws Ice.UserException;
+
+ String getTitle();
+
+ String getDefaultFilename();
+ }
+
+ private class FIFOTextArea extends JTextArea
+ {
+ FIFOTextArea(int rows, int colums)
+ {
+ super(rows, colums);
+ setEditable(false);
+ setLineWrap(true);
+ }
+
+ void appendLines(final String[] lines, final int maxLines, final int maxSize)
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ for(int i = 0; i < lines.length; ++i)
+ {
+ //
+ // The last line is always incomplete
+ //
+ if(i + 1 != lines.length)
+ {
+ append(lines[i] + "\n");
+ }
+ else
+ {
+ append(lines[i]);
+ }
+ removeLines(maxLines, maxSize);
+ }
+ }
+ });
+ }
+
+ void removeLines(int maxLines, int maxSize)
+ {
+ javax.swing.text.Document doc = getDocument();
+ javax.swing.text.Element rootElt = doc.getDefaultRootElement();
+
+ //
+ // We keep at least one line, no matter its length
+ //
+ int lineCount = getLineCount();
+ while(lineCount > 1 && (doc.getLength() > maxSize || (lineCount > maxLines)))
+ {
+ javax.swing.text.Element firstLine = rootElt.getElement(0);
+ try
+ {
+ doc.remove(0, firstLine.getEndOffset());
+ }
+ catch(javax.swing.text.BadLocationException ble)
+ {
+ assert false;
+ }
+ lineCount--;
+ }
+ setCaretPosition(doc.getLength());
+ }
+ }
+
+ private class ReaderThread extends Thread
+ {
+ ReaderThread()
+ {
+ _threadMaxLines = _maxLines;
+ _threadMaxSize = _maxSize;
+ _threadInitialLines = _initialLines;
+ _threadMaxReadSize = _maxReadSize;
+ _threadPeriod = _period;
+
+ _playButton.setSelected(true);
+ _playItem.setSelected(true);
+ _pause.setEnabled(true);
+ }
+
+ private void openError(final String message)
+ {
+ SwingUtilities.invokeLater(
+ new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ if(_textArea.getText() == null || _textArea.getText().length() == 0)
+ {
+ close(true);
+ }
+ else
+ {
+ stopReading();
+ }
+
+ JOptionPane.showMessageDialog(
+ ShowLogFileDialog.this,
+ message,
+ _factory.getTitle() + ": cannot open file",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+ }
+
+ @Override
+ public void run()
+ {
+ //
+ // Open file
+ //
+ int initialLines;
+
+ synchronized(this)
+ {
+ initialLines = _threadInitialLines;
+ }
+
+ try
+ {
+ _p = _factory.open(initialLines);
+ }
+ catch(Ice.UserException e)
+ {
+ openError(e.toString());
+ return;
+ }
+ catch(Ice.LocalException e)
+ {
+ openError(e.toString());
+ return;
+ }
+
+ SwingUtilities.invokeLater(
+ new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ if(isVisible())
+ {
+ _textArea.setText(null);
+ }
+ else
+ {
+ setVisible(true);
+ }
+ }
+ });
+
+ boolean firstRun = true;
+ for(;;)
+ {
+ synchronized(this)
+ {
+ if(!_done)
+ {
+ if(_paused)
+ {
+ while(_paused && !_done)
+ {
+ try
+ {
+ wait();
+ }
+ catch(InterruptedException e)
+ {
+ }
+ }
+ }
+ else if(!firstRun)
+ {
+ try
+ {
+ wait(_threadPeriod);
+ }
+ catch(InterruptedException e)
+ {
+ }
+ }
+ else
+ {
+ firstRun = false;
+ }
+ }
+
+ if(_done)
+ {
+ cleanupIterator();
+ return;
+ }
+ }
+
+ boolean eofEncountered = false;
+
+ while(!eofEncountered)
+ {
+ int maxLines;
+ int maxSize;
+ int maxReadSize;
+
+ synchronized(this)
+ {
+ if(_done || _paused)
+ {
+ break; // while(!eofEncountered)
+ }
+
+ maxLines = _threadMaxLines;
+ maxSize = _threadMaxSize;
+ maxReadSize = _threadMaxReadSize;
+ }
+
+ Ice.StringSeqHolder linesHolder = new Ice.StringSeqHolder();
+
+ try
+ {
+ eofEncountered = _p.read(maxReadSize, linesHolder);
+ }
+ catch(IceGrid.FileNotAvailableException e)
+ {
+ _textArea.appendLines(new String[]
+ {
+ "---------------------------",
+ "IceGridAdmin caught: " + e.toString(),
+ "---------------------------"
+ }, maxLines, maxSize);
+ SwingUtilities.invokeLater(
+ new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ stopReading();
+ }
+ });
+ cleanupIterator();
+ return;
+ }
+ catch(Ice.LocalException e)
+ {
+ _textArea.appendLines(new String[]
+ {
+ "---------------------------",
+ "IceGridAdmin caught: " + e.toString(),
+ "---------------------------"
+ }, maxLines, maxSize);
+ SwingUtilities.invokeLater(
+ new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ stopReading();
+ }
+ });
+ return;
+ }
+
+ _textArea.appendLines(linesHolder.value, maxLines, maxSize);
+ }
+ }
+ }
+
+ private void cleanupIterator()
+ {
+ try
+ {
+ _p.destroy();
+ }
+ catch(Ice.LocalException e)
+ {
+ // Ignored, maybe should log warning
+ }
+ }
+
+ synchronized void pause()
+ {
+ if(!_paused)
+ {
+ _paused = true;
+ notify();
+ }
+ }
+
+ synchronized void terminate()
+ {
+ if(!_done)
+ {
+ _done = true;
+ notify();
+ }
+ }
+
+ synchronized void play()
+ {
+ if(_paused)
+ {
+ _paused = false;
+ notify();
+ }
+ }
+
+ synchronized void setPrefs()
+ {
+ _threadMaxLines = _maxLines;
+ _threadMaxSize = _maxSize;
+ _threadInitialLines = _initialLines;
+ _threadMaxReadSize = _maxReadSize;
+ _threadPeriod = _period;
+ }
+
+ private FileIteratorPrx _p;
+ private boolean _done = false;
+ private boolean _paused = false;
+
+ private int _threadMaxLines;
+ private int _threadMaxSize;
+ private int _threadInitialLines;
+ private int _threadMaxReadSize;
+ private int _threadPeriod;
+ }
+
+ private class MenuBar extends JMenuBar
+ {
+ private MenuBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+
+ final int MENU_MASK = java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+
+ //
+ // File menu
+ //
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
+ add(fileMenu);
+
+ ButtonGroup bg = new ButtonGroup();
+
+ _pauseItem = new JRadioButtonMenuItem(_pause);
+ fileMenu.add(_pauseItem);
+ bg.add(_pauseItem);
+ _playItem = new JRadioButtonMenuItem(_play);
+ fileMenu.add(_playItem);
+ bg.add(_playItem);
+ _stopItem = new JRadioButtonMenuItem(_stop);
+ fileMenu.add(_stopItem);
+ bg.add(_stopItem);
+ fileMenu.addSeparator();
+
+ Action save = new AbstractAction("Save As...")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ JFileChooser fileChooser = _root.getCoordinator().getSaveLogFileChooser();
+
+ fileChooser.setSelectedFile(new java.io.File(fileChooser.getCurrentDirectory(),
+ _factory.getDefaultFilename()));
+
+ java.io.File file = null;
+
+ while(file == null)
+ {
+ int result = fileChooser.showSaveDialog(ShowLogFileDialog.this);
+ if(result == JFileChooser.APPROVE_OPTION)
+ {
+ file = fileChooser.getSelectedFile();
+
+ if(file != null)
+ {
+ if(!file.exists() && file.getName().indexOf('.') == -1)
+ {
+ file = new java.io.File(file.getAbsolutePath() + ".log");
+ }
+
+ java.io.OutputStreamWriter os = null;
+
+ try
+ {
+ os = new java.io.OutputStreamWriter(new java.io.FileOutputStream(file));
+ String txt = _textArea.getText();
+ if(txt == null)
+ {
+ txt = "";
+ }
+ os.write(txt, 0, txt.length());
+ }
+ catch(java.io.IOException io)
+ {
+ JOptionPane.showMessageDialog(
+ ShowLogFileDialog.this,
+ io.toString(),
+ "Cannot write file",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ finally
+ {
+ if(os != null)
+ {
+ try
+ {
+ os.close();
+ }
+ catch(java.io.IOException io)
+ {
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ break; // while
+ }
+ }
+ }
+ };
+ save.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, MENU_MASK));
+ save.putValue(Action.SHORT_DESCRIPTION, "Save As...");
+ fileMenu.add(save);
+ fileMenu.addSeparator();
+
+ fileMenu.add(new AbstractAction("Close")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ close(true);
+ }
+ });
+ JMenu editMenu = new JMenu("Edit");
+ editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
+ add(editMenu);
+
+ Action copy = new AbstractAction("Copy")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ _textArea.copy();
+ }
+
+ };
+ copy.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, MENU_MASK));
+ copy.putValue(Action.SHORT_DESCRIPTION, "Copy");
+ editMenu.add(copy);
+
+ editMenu.addSeparator();
+ Action selectAll = new AbstractAction("Select All")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ _textArea.grabFocus();
+ _textArea.selectAll();
+ }
+ };
+ selectAll.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, MENU_MASK));
+ selectAll.putValue(Action.SHORT_DESCRIPTION, "Select All");
+
+ editMenu.add(selectAll);
+ editMenu.addSeparator();
+ editMenu.add(new AbstractAction("Preferences...")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ new ShowPrefsDialog(ShowLogFileDialog.this);
+ }
+ });
+ }
+ }
+
+ private class ToolBar extends JToolBar
+ {
+ private ToolBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+ setFloatable(false);
+ putClientProperty("JToolBar.isRollover", Boolean.TRUE);
+
+ _pauseButton = new JToggleButton(_pause);
+ _pauseButton.setText(null);
+ _pauseButton.setIcon(Utils.getIcon("/icons/16x16/pause.png"));
+ add(_pauseButton);
+ _playButton = new JToggleButton(_play);
+ _playButton.setText(null);
+ _playButton.setIcon(Utils.getIcon("/icons/16x16/start.png"));
+ add(_playButton);
+ _stopButton = new JToggleButton(_stop);
+ _stopButton.setText(null);
+ _stopButton.setIcon(Utils.getIcon("/icons/16x16/stop.png"));
+ add(_stopButton);
+
+ ButtonGroup bg = new ButtonGroup();
+ bg.add(_pauseButton);
+ bg.add(_playButton);
+ bg.add(_stopButton);
+ }
+ }
+
+ ShowLogFileDialog(Root root, FileIteratorFactory factory, int maxLines, int maxSize, int initialLines, int maxReadSize,
+ int period)
+ {
+ super(root.getCoordinator().getMainFrame(), factory.getTitle() + " - IceGrid Admin", false);
+
+ _maxLines = maxLines;
+ _maxSize = maxSize;
+ _initialLines = initialLines;
+ _maxReadSize = maxReadSize;
+ _period = period;
+ _factory = factory;
+ _root = root;
+
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ addWindowListener(new java.awt.event.WindowAdapter()
+ {
+ @Override
+ public void windowClosing(java.awt.event.WindowEvent e)
+ {
+ close(true);
+ }
+ });
+
+ _pause = new AbstractAction("Pause")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ pause();
+ }
+ };
+
+ _play = new AbstractAction("Play")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ play();
+ }
+ };
+
+ _stop = new AbstractAction("Stop")
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ stopReading();
+ }
+ };
+
+ setJMenuBar(new MenuBar());
+ getContentPane().add(new ToolBar(), BorderLayout.PAGE_START);
+
+ JScrollPane scrollPane = new JScrollPane(_textArea,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+
+ getContentPane().add(scrollPane);
+
+ pack();
+ setResizable(true);
+
+ setLocationRelativeTo(root.getCoordinator().getMainFrame());
+ play();
+ }
+
+ void pause()
+ {
+ _thread.pause();
+ _pauseItem.setSelected(true);
+ _pauseButton.setSelected(true);
+ }
+
+ void stopReading()
+ {
+ if(_thread != null)
+ {
+ _thread.terminate();
+
+ try
+ {
+ _thread.join();
+ }
+ catch(InterruptedException e)
+ {
+ }
+
+ _thread = null;
+ _stopItem.setSelected(true);
+ _stopButton.setSelected(true);
+ _pause.setEnabled(false);
+ }
+ }
+
+ void play()
+ {
+ if(_thread != null)
+ {
+ _thread.play();
+ _playItem.setSelected(true);
+ _playButton.setSelected(true);
+ _pause.setEnabled(true);
+ }
+ else
+ {
+ _thread = new ReaderThread();
+ _thread.start();
+ }
+ }
+
+ int getMaxLines()
+ {
+ return _maxLines;
+ }
+
+ int getMaxSize()
+ {
+ return _maxSize;
+ }
+
+ int getInitialLines()
+ {
+ return _initialLines;
+ }
+
+ int getMaxReadSize()
+ {
+ return _maxReadSize;
+ }
+
+ int getPeriod()
+ {
+ return _period;
+ }
+
+ void setPrefs(int maxLines, int maxSize, int initialLines, int maxReadSize, int period)
+ {
+ if(maxLines < 50)
+ {
+ maxLines = 50;
+ }
+ _maxLines = maxLines;
+
+ if(maxSize < 1000)
+ {
+ maxSize = 1000;
+ }
+ _maxSize = maxSize;
+
+ _initialLines = initialLines;
+
+ if(maxReadSize < 100)
+ {
+ maxReadSize = 100;
+ }
+ else if(maxReadSize + 512 > _root.getMessageSizeMax())
+ {
+ maxReadSize = _root.getMessageSizeMax() - 512;
+ }
+ _maxReadSize = maxReadSize;
+
+ if(period < 200)
+ {
+ period = 200;
+ }
+ else if(period > 5000)
+ {
+ period = 5000;
+ }
+ _period = period;
+
+ if(_thread != null)
+ {
+ _thread.setPrefs();
+ }
+
+ _root.setLogPrefs(_maxLines, _maxSize, _initialLines, _maxReadSize, _period);
+ }
+
+ void close(boolean notifyRoot)
+ {
+ stopReading();
+
+ if(notifyRoot)
+ {
+ _root.removeShowLogFileDialog(_factory.getTitle());
+ }
+ dispose();
+ }
+
+ private final Root _root;
+ private final FileIteratorFactory _factory;
+
+ private int _maxLines;
+ private int _maxSize;
+ private int _initialLines;
+ private int _maxReadSize;
+ private int _period;
+
+ private Action _play;
+ private Action _pause;
+ private Action _stop;
+
+ private JRadioButtonMenuItem _playItem;
+ private JRadioButtonMenuItem _pauseItem;
+ private JRadioButtonMenuItem _stopItem;
+
+ private JToggleButton _playButton;
+ private JToggleButton _pauseButton;
+ private JToggleButton _stopButton;
+
+ private FIFOTextArea _textArea = new FIFOTextArea(20, 45);
+ private ReaderThread _thread;
+}