Skip to content

Feature for issue #99 make poll interval (HTTP HEAD) customizable #178

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,60 +18,69 @@
* @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
*/
public class RefreshWatchDog {
private static final int RELOAD_DELAY = 1000;

private GCModelLoaderController controller;
private GCDocument gcDocument;

private java.util.Timer reloadTimer;

public RefreshWatchDog(GCModelLoaderController controller, GCDocument gcDocument) {
this.controller = controller;
this.gcDocument = gcDocument;
}

public void start() {
reloadTimer = new java.util.Timer(true);
reloadTimer.schedule(new ModelReloader(), 0, RELOAD_DELAY);
}

public void stop() {
if (reloadTimer != null) {
reloadTimer.cancel();
}
}

private class ModelReloader extends TimerTask implements PropertyChangeListener {

private GCModelLoaderGroupTracker tracker;
/** initial value must be true for the first start */
private boolean isFinished = true;

@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())
&& SwingWorker.StateValue.DONE.equals(evt.getNewValue())) {

isFinished = true;
tracker.removePropertyChangeListener(this);
}
}

public void run() {
if (isFinished) {
isFinished = false;
tracker = controller.reload(gcDocument);

// if no reload takes place, the propertyChangeEvent is fired, before the listener is attached
// => set finished manually to true again.
if (tracker.size() == 0) {
isFinished = true;
}
else {
tracker.addPropertyChangeListener(this);
}
}
}

}
private static int RELOAD_DELAY = 1000;

private final GCModelLoaderController controller;
private final GCDocument gcDocument;

private java.util.Timer reloadTimer;

public RefreshWatchDog(GCModelLoaderController controller, GCDocument gcDocument) {
this.controller = controller;
this.gcDocument = gcDocument;
}

public void start() {
reloadTimer = new java.util.Timer(true);
reloadTimer.schedule(new ModelReloader(), 0, RELOAD_DELAY);
}

public void stop() {
if (reloadTimer != null) {
reloadTimer.cancel();
}
}

protected static int getRELOAD_DELAY() {
return RELOAD_DELAY;
}

protected static void setRELOAD_DELAY(int rELOAD_DELAY) {
RELOAD_DELAY = rELOAD_DELAY;
}

private class ModelReloader extends TimerTask implements PropertyChangeListener {

private GCModelLoaderGroupTracker tracker;
/** initial value must be true for the first start */
private boolean isFinished = true;

@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())
&& SwingWorker.StateValue.DONE.equals(evt.getNewValue())) {

isFinished = true;
tracker.removePropertyChangeListener(this);
}
}

@Override
public void run() {
if (isFinished) {
isFinished = false;
tracker = controller.reload(gcDocument);

// if no reload takes place, the propertyChangeEvent is fired, before the listener is attached
// => set finished manually to true again.
if (tracker.size() == 0) {
isFinished = true;
}
else {
tracker.addPropertyChangeListener(this);
}
}
}

}
}
210 changes: 111 additions & 99 deletions src/main/java/com/tagtraum/perf/gcviewer/ctrl/action/Watch.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,103 +29,115 @@
* Time: 1:59:59 PM
*/
public class Watch extends AbstractAction {
private Logger logger = Logger.getLogger(Watch.class.getCanonicalName());

private static final ImageIcon WATCH_ICON = ImageHelper.loadImageIcon("watch.png");
private static final ImageIcon CLOCK_ICON = ImageHelper.loadImageIcon("clock.png");

private GCModelLoaderController controller;
private GCViewerGui gcViewer;

private Map<GCDocument, TimerInfo> timerMap;

public Watch(GCModelLoaderController controller, GCViewerGui gcViewer) {
this.controller = controller;
this.gcViewer = gcViewer;
this.timerMap = new HashMap<GCDocument, TimerInfo>();

putValue(NAME, LocalisationHelper.getString("main_frame_menuitem_watch"));
putValue(SHORT_DESCRIPTION, LocalisationHelper.getString("main_frame_menuitem_hint_watch"));
putValue(MNEMONIC_KEY, new Integer(LocalisationHelper.getString("main_frame_menuitem_mnemonic_watch").charAt(0)));
putValue(ACTION_COMMAND_KEY, ActionCommands.WATCH.toString());
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('W', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ));
putValue(SMALL_ICON, WATCH_ICON);

setEnabled(false);
}

public void actionPerformed(final ActionEvent ae) {
final AbstractButton source = (AbstractButton)ae.getSource();
if (source.isSelected()) {
start();
}
else {
stop(gcViewer.getSelectedGCDocument());
}
}

private void start() {
GCDocument gcDocument = gcViewer.getSelectedGCDocument();
TimerInfo timerInfo = new TimerInfo(
new RefreshWatchDog(controller, gcDocument),
new GCDocumentCloseListener(gcDocument));

gcDocument.setWatched(true);
gcDocument.addInternalFrameListener(timerInfo.closeListener);
timerMap.put(gcDocument, timerInfo);

timerInfo.refreshWatchDog.start();
putValue(SMALL_ICON, CLOCK_ICON);
}

private void stop(GCDocument gcDocument) {
gcDocument.setWatched(false);
TimerInfo timerInfo = timerMap.get(gcDocument);
timerInfo.refreshWatchDog.stop();

gcDocument.removeInternalFrameListener(timerInfo.closeListener);

putValue(SMALL_ICON, WATCH_ICON);
}

public void setEnabled(final boolean newValue) {
super.setEnabled(newValue);
if (!newValue) {
putValue(SMALL_ICON, WATCH_ICON);
}
}

private class TimerInfo {
RefreshWatchDog refreshWatchDog;
GCDocumentCloseListener closeListener;

public TimerInfo(RefreshWatchDog refreshWatchDog, GCDocumentCloseListener closeListener) {
this.refreshWatchDog = refreshWatchDog;
this.closeListener = closeListener;
}
}

private class GCDocumentCloseListener extends InternalFrameAdapter {
private GCDocument gcDocument;

public GCDocumentCloseListener(GCDocument gcDocument) {
this.gcDocument = gcDocument;
}

@Override
public void internalFrameActivated(InternalFrameEvent e) {
putValue(SMALL_ICON, CLOCK_ICON);
}

@Override
public void internalFrameClosing(InternalFrameEvent e) {
stop(this.gcDocument);
}

@Override
public void internalFrameDeactivated(InternalFrameEvent e) {
putValue(SMALL_ICON, WATCH_ICON);
}

}
private Logger logger = Logger.getLogger(Watch.class.getCanonicalName());

private static final ImageIcon WATCH_ICON = ImageHelper.loadImageIcon("watch.png");
private static final ImageIcon CLOCK_ICON = ImageHelper.loadImageIcon("clock.png");

private GCModelLoaderController controller;
private GCViewerGui gcViewer;

private Map<GCDocument, TimerInfo> timerMap;

public Watch(GCModelLoaderController controller, GCViewerGui gcViewer) {
this.controller = controller;
this.gcViewer = gcViewer;
this.timerMap = new HashMap<GCDocument, TimerInfo>();

putValue(NAME, LocalisationHelper.getString("main_frame_menuitem_watch"));
putValue(SHORT_DESCRIPTION, LocalisationHelper.getString("main_frame_menuitem_hint_watch"));
putValue(MNEMONIC_KEY, new Integer(LocalisationHelper.getString("main_frame_menuitem_mnemonic_watch").charAt(0)));
putValue(ACTION_COMMAND_KEY, ActionCommands.WATCH.toString());
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke('W', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() ));
putValue(SMALL_ICON, WATCH_ICON);

setEnabled(false);
}

@Override
public void actionPerformed(final ActionEvent ae) {
final AbstractButton source = (AbstractButton)ae.getSource();
if (source.isSelected()) {
start();
}
else {
stop(gcViewer.getSelectedGCDocument());
}
}

/**
* Added restartIfRunning() method. Sep/11/2016 - Àngel Ollé Bláquez
*/
void restartIfRunning() {
if (gcViewer.getSelectedGCDocument().isWatched()) {
stop(gcViewer.getSelectedGCDocument());
start();
}
}

private void start() {
GCDocument gcDocument = gcViewer.getSelectedGCDocument();
TimerInfo timerInfo = new TimerInfo(
new RefreshWatchDog(controller, gcDocument),
new GCDocumentCloseListener(gcDocument));

gcDocument.setWatched(true);
gcDocument.addInternalFrameListener(timerInfo.closeListener);
timerMap.put(gcDocument, timerInfo);

timerInfo.refreshWatchDog.start();
putValue(SMALL_ICON, CLOCK_ICON);
}

private void stop(GCDocument gcDocument) {
gcDocument.setWatched(false);
TimerInfo timerInfo = timerMap.get(gcDocument);
timerInfo.refreshWatchDog.stop();

gcDocument.removeInternalFrameListener(timerInfo.closeListener);

putValue(SMALL_ICON, WATCH_ICON);
}

@Override
public void setEnabled(final boolean newValue) {
super.setEnabled(newValue);
if (!newValue) {
putValue(SMALL_ICON, WATCH_ICON);
}
}

private class TimerInfo {
RefreshWatchDog refreshWatchDog;
GCDocumentCloseListener closeListener;

public TimerInfo(RefreshWatchDog refreshWatchDog, GCDocumentCloseListener closeListener) {
this.refreshWatchDog = refreshWatchDog;
this.closeListener = closeListener;
}
}

private class GCDocumentCloseListener extends InternalFrameAdapter {
private final GCDocument gcDocument;

public GCDocumentCloseListener(GCDocument gcDocument) {
this.gcDocument = gcDocument;
}

@Override
public void internalFrameActivated(InternalFrameEvent e) {
putValue(SMALL_ICON, CLOCK_ICON);
}

@Override
public void internalFrameClosing(InternalFrameEvent e) {
stop(this.gcDocument);
}

@Override
public void internalFrameDeactivated(InternalFrameEvent e) {
putValue(SMALL_ICON, WATCH_ICON);
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.tagtraum.perf.gcviewer.ctrl.action;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

import com.tagtraum.perf.gcviewer.util.LocalisationHelper;
import com.tagtraum.perf.gcviewer.view.ActionCommands;
import com.tagtraum.perf.gcviewer.view.GCDocument;
import com.tagtraum.perf.gcviewer.view.GCViewerGui;
import com.tagtraum.perf.gcviewer.view.WatchDogReloadDelayView;

/**
*
* @author <a href="mailto:web@olleb.com">Àngel Ollé Blázquez</a>
*
*
*/
public class WatchDogReloadDelay extends AbstractAction {
private static final long serialVersionUID = -4527644600732531177L;
private final WatchDogReloadDelayView view;
private final GCViewerGui gui;

public WatchDogReloadDelay(final GCViewerGui gui) {
this.gui = gui;
int delay = RefreshWatchDog.getRELOAD_DELAY();
this.view = new WatchDogReloadDelayView(gui, delay);

putValue(NAME, LocalisationHelper.getString("main_frame_menuitem_watchdog"));
putValue(SHORT_DESCRIPTION, LocalisationHelper.getString("main_frame_menuitem_hint_watchdog"));
putValue(MNEMONIC_KEY,
new Integer(LocalisationHelper.getString("main_frame_menuitem_mnemonic_watchdog").charAt(0)));
putValue(ACTION_COMMAND_KEY, ActionCommands.ARRANGE.toString());
setEnabled(true);
}

@Override
public void actionPerformed(ActionEvent e) {
if (this.view.showDialog()) {
int delay = this.view.getReloadDelayValue();
RefreshWatchDog.setRELOAD_DELAY(delay);
GCDocument gcDocument = gui.getSelectedGCDocument();
if (gcDocument != null) {
Watch watch = (Watch) this.gui.getActionMap().get(ActionCommands.WATCH.toString());
watch.restartIfRunning();
}
}
}
}
Loading