/*
* RunningFrame.java
*
* Created on 1 de octubre de 2009, 19:43
*/
package es.uvigo.darwin.xprottest.compute;
import es.uvigo.darwin.prottest.exe.ExternalExecutionManager;
import es.uvigo.darwin.prottest.global.options.ApplicationOptions;
import es.uvigo.darwin.xprottest.*;
import org.jdesktop.application.Action;
import org.jdesktop.application.Task;
import es.uvigo.darwin.xprottest.util.TextAreaAppender;
import es.uvigo.darwin.prottest.model.Model;
import es.uvigo.darwin.prottest.observer.ModelUpdaterObserver;
import es.uvigo.darwin.prottest.observer.ObservableModelUpdater;
import es.uvigo.darwin.prottest.util.Utilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.Timer;
/**
*
* @author diego
*/
public class RunningFrame extends javax.swing.JFrame
implements ModelUpdaterObserver {
private static final int TIMER_UPDATE_FREQUENCY = 1000;
private XProtTestView mainFrame;
private Task task;
private int computedModels;
private int numModels;
private PrintWriter displayWriter;
/** Timer for calculate the elapsed time **/
private Calendar startTime;
/** Timer for display the elapsed time **/
Timer timer;
private HashMap<String, Long> partialTimestamps;
private ArrayList<String> runningModels;
// var used to discard concurrent messages during
// proccess cancel
private boolean running;
/** Creates new form RunningFrame */
public RunningFrame(XProtTestView mainFrame, int numModels) {
initComponents();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
this.startTime = Calendar.getInstance();
this.mainFrame = mainFrame;
this.numModels = numModels;
this.displayWriter = new PrintWriter(new TextAreaAppender(computedTextArea));
this.running = true;
this.partialTimestamps = new HashMap<String, Long>();
this.runningModels = new ArrayList<String>();
lblNumModels.setText(String.valueOf(numModels));
lblExecutedModels.setText(String.valueOf(computedModels));
runningProgress.setMaximum(numModels);
runningProgress.setMinimum(0);
runningProgress.setValue(computedModels);
timer = new Timer(TIMER_UPDATE_FREQUENCY, new ActionListener() {
public void actionPerformed(ActionEvent e) {
lblElapsedTime.setText(Utilities.calculateRuntime(
startTime.getTimeInMillis(),
Calendar.getInstance().getTimeInMillis()));
updateHeader();
}
});
timer.start();
}
public void setTask(Task task) {
this.task = task;
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
lblRunning = new javax.swing.JLabel();
runningProgress = new javax.swing.JProgressBar();
cancelButton = new javax.swing.JButton();
lblNumModels = new javax.swing.JLabel();
lblExecutedModels = new javax.swing.JLabel();
lblSeparator = new javax.swing.JLabel();
computedScrollArea = new javax.swing.JScrollPane();
computedTextArea = new javax.swing.JTextArea();
lblElapsedTime = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(RunningFrame.class);
setTitle(resourceMap.getString("Form.title")); // NOI18N
setName("Form"); // NOI18N
lblRunning.setText(resourceMap.getString("lblRunning.text")); // NOI18N
lblRunning.setName("lblRunning"); // NOI18N
runningProgress.setName("runningProgress"); // NOI18N
javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(RunningFrame.class, this);
cancelButton.setAction(actionMap.get("cancelExecution")); // NOI18N
cancelButton.setText(resourceMap.getString("cancelButton.text")); // NOI18N
cancelButton.setName("cancelButton"); // NOI18N
lblNumModels.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblNumModels.setText(resourceMap.getString("lblNumModels.text")); // NOI18N
lblNumModels.setName("lblNumModels"); // NOI18N
lblExecutedModels.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblExecutedModels.setText(resourceMap.getString("lblExecutedModels.text")); // NOI18N
lblExecutedModels.setName("lblExecutedModels"); // NOI18N
lblSeparator.setText(resourceMap.getString("lblSeparator.text")); // NOI18N
lblSeparator.setName("lblSeparator"); // NOI18N
computedScrollArea.setName("computedScrollArea"); // NOI18N
computedTextArea.setBackground(resourceMap.getColor("computedTextArea.background")); // NOI18N
computedTextArea.setColumns(20);
computedTextArea.setEditable(false);
computedTextArea.setRows(15);
computedTextArea.setName("computedTextArea"); // NOI18N
computedScrollArea.setViewportView(computedTextArea);
lblElapsedTime.setText(resourceMap.getString("lblElapsedTime.text")); // NOI18N
lblElapsedTime.setName("lblElapsedTime"); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(computedScrollArea, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 329, Short.MAX_VALUE)
.addComponent(runningProgress, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 329, Short.MAX_VALUE)
.addComponent(lblRunning, javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(cancelButton)
.addGap(18, 18, 18)
.addComponent(lblElapsedTime)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 135, Short.MAX_VALUE)
.addComponent(lblExecutedModels)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblSeparator)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblNumModels, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(lblRunning)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(runningProgress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cancelButton)
.addComponent(lblNumModels)
.addComponent(lblSeparator)
.addComponent(lblExecutedModels)
.addComponent(lblElapsedTime))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(computedScrollArea, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
@Action
public void cancelExecution() {
ExternalExecutionManager.getInstance().killProcesses();
task.cancel(true);
unload();
}
public void finishedExecution() {
unload();
}
private void unload() {
mainFrame.unloadRunningView(this);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JScrollPane computedScrollArea;
private javax.swing.JTextArea computedTextArea;
private javax.swing.JLabel lblElapsedTime;
private javax.swing.JLabel lblExecutedModels;
private javax.swing.JLabel lblNumModels;
private javax.swing.JLabel lblRunning;
private javax.swing.JLabel lblSeparator;
private javax.swing.JProgressBar runningProgress;
// End of variables declaration//GEN-END:variables
public void updateHeader() {
StringBuffer models = new StringBuffer();
Iterator it = runningModels.iterator();
while (it.hasNext()) {
models.append(it.next());
if (it.hasNext()) {
models.append(", ");
}
}
lblRunning.setText("Computing: " + models);
}
public void update(ObservableModelUpdater o, Model model, ApplicationOptions options) {
if (running) {
if (options == null) {
// displayWriter.println("Computing " + model.getModelName() + "...");
runningModels.add(model.getModelName());
partialTimestamps.put(model.getModelName(), Calendar.getInstance().getTimeInMillis());
} else {
computedModels++;
runningProgress.setValue(computedModels);
lblExecutedModels.setText(String.valueOf(computedModels));
runningModels.remove(model.getModelName());
if (model.isComputed()) {
StringBuffer partialTime = new StringBuffer("");
displayWriter.println("Computed " + model.getModelName() + "(" + model.getLk() + ")");
long currentTimestamp = Calendar.getInstance().getTimeInMillis();
long partialTimestamp = partialTimestamps.get(model.getModelName());
displayWriter.println(" " + Utilities.calculateRuntime(partialTimestamp, currentTimestamp) +
" Elapsed time: " + Utilities.calculateRuntime(startTime.getTimeInMillis(), currentTimestamp));
} else {
// if (options != null) {
// Follow error behavior
if (mainFrame.getErrorBehavior() == XProtTestApp.ERROR_BEHAVIOR_CONTINUE) {
displayWriter.println("There were errors computing " + model.getModelName());
} else if (mainFrame.getErrorBehavior() == XProtTestApp.ERROR_BEHAVIOR_STOP) {
running = false;
mainFrame.computationInterrupted();
cancelExecution();
} else {
running = false;
cancelExecution();
throw new RuntimeException("Unsupported error behavior : " + mainFrame.getErrorBehavior());
}
// }
}
}
}
}
}