Skip to content
This repository has been archived by the owner on Mar 3, 2022. It is now read-only.

Commit

Permalink
reload only after last model of a group (inside GCDocument) has finis…
Browse files Browse the repository at this point in the history
…hed loading
  • Loading branch information
chewiebug committed Jul 7, 2014
1 parent 15500cc commit 15ea595
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.tagtraum.perf.gcviewer.ctrl;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;

import javax.swing.SwingWorker;

/**
* Helperclass to track several modelLoaders and get an event, when all loaders have finished
* loading. GCModelLoaders should be added to the tracker and then be started via
* {@link #execute()}.
*
* @author <a href="mailto:[email protected]">Joerg Wuethrich</a>
* <p>created on: 02.02.2014</p>
*/
public class GCModelLoaderGroupTracker implements PropertyChangeListener {
private PropertyChangeSupport propertyChangeSupport;
private List<GCModelLoader> loaderList = new ArrayList<GCModelLoader>();
private int finishedCount;

public GCModelLoaderGroupTracker() {
super();

propertyChangeSupport = new PropertyChangeSupport(this);
}

/**
* @see PropertyChangeSupport#addPropertyChangeListener(PropertyChangeListener)
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}

/**
* Add a <code>GCModelLoader</code> to be tracked by this tracker.
*
* @param loader <code>GCModelLoader</code> to be tracked by this tracker.
*/
public void addGcModelLoader(GCModelLoader loader) {
loader.addPropertyChangeListener(this);
loaderList.add(loader);
}

/**
* Start execution of all loaders tracked by this tracker.
*/
public void execute() {
for (GCModelLoader loader : loaderList) {
loader.execute();
}
}

/**
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("state".equals(evt.getPropertyName())
&& SwingWorker.StateValue.DONE == evt.getNewValue()) {

++finishedCount;
if (finishedCount == loaderList.size()) {
propertyChangeSupport.firePropertyChange("state",
SwingWorker.StateValue.STARTED,
SwingWorker.StateValue.DONE);
}
}

}

/**
* @see PropertyChangeSupport#removePropertyChangeListener(PropertyChangeListener)
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,6 @@ public void add(File[] files) {
}
}

public void add(String[] resourceNames) {

}

private void addModel(String resourceName) {
GCModelLoader loader = new GCModelLoader(new GCResource(resourceName));
GCDocumentController docController = getDocumentController(gcViewerGui.getSelectedGCDocument());
Expand Down Expand Up @@ -135,14 +131,26 @@ public void open(URL[] urls) {
open(resourceNameList.toArray(new String[resourceNameList.size()]));
}

public void reload(GCDocument gcDocument) {
/**
* Reload all models of <code>gcDocument</code> and provide tracker. The tracker will
* fire a propertyChangeEvent, as soon as all GCModelLoaders have finished loading.
*
* @param gcDocument document of which models should be reloaded
* @return tracker to track finish state of all models being loaded
*/
public GCModelLoaderGroupTracker reload(GCDocument gcDocument) {
GCModelLoaderGroupTracker tracker = new GCModelLoaderGroupTracker();
for (GCResource gcResource : gcDocument.getGCResources()) {
GCModelLoader loader = new GCModelLoader(gcResource);
GCDocumentController docController = getDocumentController(gcDocument);
docController.reloadModel(loader);

loader.execute();
tracker.addGcModelLoader(loader);
}

tracker.execute();

return tracker;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.tagtraum.perf.gcviewer.ctrl.action;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.TimerTask;

import javax.swing.SwingWorker;

import com.tagtraum.perf.gcviewer.ctrl.GCModelLoaderGroupTracker;
import com.tagtraum.perf.gcviewer.ctrl.GCViewerController;
import com.tagtraum.perf.gcviewer.view.GCDocument;

Expand Down Expand Up @@ -36,11 +41,29 @@ public void stop() {
}
}

private class ModelReloader extends TimerTask {
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() {
// TODO SWINGWORKER: next reload should not be started, if document takes too long to reload
controller.reload(gcDocument);
if (isFinished) {
isFinished = false;
tracker = controller.reload(gcDocument);
tracker.addPropertyChangeListener(this);
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@
import java.io.PrintWriter;

/**
* TextAreaFormatter.
* <p/>
* Date: Oct 3, 2005
* Time: 4:50:41 PM
* Formatter for a {@link LogRecord} to be displayed in a text area.
*
* <p>Date: Oct 3, 2005<br/>
* Time: 4:50:41 PM</p>
*
* @author <a href="mailto:[email protected]">Hendrik Schreiber</a>
*/
public class TextAreaFormatter extends Formatter {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");

public String format(LogRecord record) {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
sb.append(record.getLevel().getLocalizedName());
sb.append(" [");
final String logger = record.getSourceClassName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,56 +14,71 @@
public class TextAreaLogHandler extends Handler {

private JTextArea textArea;
private boolean errors;
private boolean hasErrors;
private int errorCount;

public TextAreaLogHandler() {
this.textArea = new JTextArea();
setFormatter(new TextAreaFormatter());
}

public JTextArea getTextArea() {
return textArea;
/**
* @see java.util.logging.Handler#close()
*/
public void close() throws SecurityException {
}

public boolean hasErrors() {
return errors;
/**
* @see java.util.logging.Handler#flush()
*/
public void flush() {
}

public int getErrorCount() {
return errorCount;
}

public JTextArea getTextArea() {
return textArea;
}

public boolean hasErrors() {
return hasErrors;
}

/**
* @see java.util.logging.Handler#publish(java.util.logging.LogRecord)
*/
public void publish(LogRecord record) {
try {
if (isLoggable(record)) {
final int level = record.getLevel().intValue();
if (level >=Level.WARNING.intValue() && level < Level.OFF.intValue()) {
++errorCount;
}
if (!errors) {
errors = level >= Level.WARNING.intValue() && level < Level.OFF.intValue();
}
String formattedRecord = null;
try {
formattedRecord = getFormatter().format(record);
} catch (Exception e) {
reportError(e.toString(), e, ErrorManager.FORMAT_FAILURE);
if (!hasErrors) {
hasErrors = level >= Level.WARNING.intValue() && level < Level.OFF.intValue();
}
try {
String formattedRecord = getFormatter().format(record);
textArea.append(formattedRecord);
} catch (Exception e) {
}
catch (RuntimeException e) {
reportError(e.toString(), e, ErrorManager.WRITE_FAILURE);
}
}
} catch (Exception e) {
}
catch (Exception e) {
reportError(e.toString(), e, ErrorManager.GENERIC_FAILURE);
}
}

public void flush() {
}

public void close() throws SecurityException {

/**
* Resets all internal state to an initial state and is ready to receive log events.
*/
public void reset() {
textArea.setText("");
errorCount = 0;
hasErrors = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public GCModelLoaderView(GCResource gcResource) {
}

public void setGCResource(GCResource gcResource) {
textAreaLogHandler.getTextArea().setText("");
textAreaLogHandler.reset();
progressBar.setVisible(true);
progressBar.setValue(0);
messageLabel.setVisible(false);
Expand Down

0 comments on commit 15ea595

Please sign in to comment.