summaryrefslogtreecommitdiff
path: root/src/main/java/org/cristalise/gui/tabs/execution
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/cristalise/gui/tabs/execution')
-rw-r--r--src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java57
-rw-r--r--src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java346
-rw-r--r--src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java38
-rw-r--r--src/main/java/org/cristalise/gui/tabs/execution/Executor.java23
-rw-r--r--src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java44
5 files changed, 508 insertions, 0 deletions
diff --git a/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java b/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java
new file mode 100644
index 0000000..81ccb02
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/execution/ActivityItem.java
@@ -0,0 +1,57 @@
+package org.cristalise.gui.tabs.execution;
+import java.util.ArrayList;
+
+import org.cristalise.kernel.entity.agent.Job;
+
+
+public class ActivityItem {
+ public String stepPath;
+ public int state;
+ public String stateName;
+ public String name;
+ ArrayList<Job> jobs = new ArrayList<Job>();
+
+ public ActivityItem() {
+ stepPath = "";
+ state = -1;
+ name = "--";
+ }
+
+ public ActivityItem(Job thisJob) {
+ stepPath = thisJob.getStepPath();
+ state = thisJob.getTransition().getOriginStateId();
+ stateName = thisJob.getOriginStateName();
+ name = thisJob.getStepName();
+ jobs.add(thisJob);
+ }
+
+ public void addJob(Job newJob) {
+ jobs.add(newJob);
+ }
+
+ public ArrayList<Job> getJobs() {
+ return jobs;
+ }
+
+ public String getStepPath() {
+ return stepPath;
+ }
+
+ @Override
+ public String toString() {
+ return name+(state>-1?" ("+stateName+")":"");
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof ActivityItem)
+ return hashCode() == ((ActivityItem)other).hashCode();
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return stepPath.hashCode();
+ }
+
+}
diff --git a/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java b/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java
new file mode 100644
index 0000000..2193916
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/execution/ActivityViewer.java
@@ -0,0 +1,346 @@
+package org.cristalise.gui.tabs.execution;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.ArrayList;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import org.cristalise.gui.MainFrame;
+import org.cristalise.gui.tabs.ExecutionPane;
+import org.cristalise.gui.tabs.ItemTabPane;
+import org.cristalise.gui.tabs.outcome.InvalidOutcomeException;
+import org.cristalise.gui.tabs.outcome.InvalidSchemaException;
+import org.cristalise.gui.tabs.outcome.OutcomeHandler;
+import org.cristalise.kernel.common.InvalidDataException;
+import org.cristalise.kernel.common.ObjectNotFoundException;
+import org.cristalise.kernel.entity.agent.Job;
+import org.cristalise.kernel.entity.proxy.ItemProxy;
+import org.cristalise.kernel.utils.FileStringUtility;
+import org.cristalise.kernel.utils.Language;
+import org.cristalise.kernel.utils.LocalObjectLoader;
+import org.cristalise.kernel.utils.Logger;
+
+
+public class ActivityViewer extends JPanel implements Runnable {
+
+ ItemProxy item;
+ Box outcomeButtons = Box.createHorizontalBox();
+ OutcomeHandler outcomePanel;
+ OutcomeHandler errorPanel;
+ JPanel outcomeView = new JPanel(new GridLayout(1,1));
+ JPanel errorView = new JPanel(new GridLayout(2,1));
+ ActivityItem thisAct;
+ ArrayList<RequestButton> requestButtons = new ArrayList<RequestButton>();
+ JLabel noOutcome = new JLabel(Language.translate("No outcome data is required for this activity"));
+ ExecutionPane parent;
+ JLabel status;
+ JComboBox executors;
+ JButton saveButton = new JButton("Save");
+ JButton loadButton = new JButton("Load");
+ GridBagLayout gridbag = new GridBagLayout();
+ Job executingJob = null;
+ static JFileChooser chooser = new JFileChooser();
+ static {
+ chooser.addChoosableFileFilter(
+ new javax.swing.filechooser.FileFilter() {
+ @Override
+ public String getDescription() {
+ return "XML Files";
+ }
+ @Override
+ public boolean accept(File f) {
+ if (f.isDirectory() || (f.isFile() && f.getName().endsWith(".xml"))) {
+ return true;
+ }
+ return false;
+ }
+ });
+ }
+
+ public ActivityViewer (ActivityItem newAct, ItemProxy item, ExecutionPane parent){
+ thisAct = newAct;
+ this.item = item;
+ this.parent = parent;
+ setLayout(gridbag);
+
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridx=0; c.gridy=1; c.weightx=1.0; c.weighty=0.0;
+ c.insets = new Insets(5,5,5,5);
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.HORIZONTAL;
+
+// activity title
+ JLabel actTitle = new JLabel(Language.translate("Activity")+": "+newAct.name);
+ actTitle.setFont(ItemTabPane.titleFont);
+ gridbag.setConstraints(actTitle, c);
+ add(actTitle);
+
+ Job firstJob = (thisAct.getJobs().get(0));
+// desc
+ String desc = firstJob.getDescription();
+ if (desc != null && desc.length() > 0) {
+ Box descBox = Box.createHorizontalBox();
+
+ String chopDesc = null;
+ if(desc.length() >= 40) chopDesc = desc.substring(0,40);
+ else chopDesc = desc;
+
+ descBox.add(new JLabel("Description: "+chopDesc));
+ if (desc.length()>chopDesc.length()) {
+ descBox.add(new JLabel(" ..."));
+ descBox.add(Box.createHorizontalStrut(7));
+ JButton descButton = new JButton("View");
+ descButton.setMargin(new Insets(0,0,0,0));
+ descButton.setActionCommand(desc);
+ descButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JTextArea descArea = new JTextArea(e.getActionCommand());
+ descArea.setLineWrap(true);
+ descArea.setWrapStyleWord(true);
+ JScrollPane descScroll = new JScrollPane(descArea);
+ descScroll.setPreferredSize(new Dimension(400,150));
+ JOptionPane.showMessageDialog(null, descScroll, "Activity Description", JOptionPane.PLAIN_MESSAGE);
+ }
+ });
+ descBox.add(descButton);
+ }
+
+ c.gridy++;
+ gridbag.setConstraints(descBox, c);
+ add(descBox);
+ }
+
+
+// agentid
+ String roleName = firstJob.getAgentRole();
+ if (roleName!= null && roleName.length()>0) {
+ c.gridy++;
+ JLabel role = new JLabel(Language.translate("Agent Role")+": "+roleName);
+ gridbag.setConstraints(role, c);
+ add(role);
+ }
+
+ c.gridy++;
+ c.anchor = GridBagConstraints.EAST;
+ gridbag.setConstraints(outcomeButtons, c);
+ add(outcomeButtons);
+
+ executors = MainFrame.getExecutionPlugins();
+ if (executors.getItemCount() > 1) {
+ c.gridx++;
+ gridbag.setConstraints(executors, c);
+ add(executors);
+ c.gridx--;
+ }
+
+ c.gridy++;
+
+ status = new JLabel(Language.translate("Waiting for request"));
+ status.setFont(ItemTabPane.titleFont);
+ gridbag.setConstraints(status, c);
+ add(status);
+
+ c.gridx++;
+ Box fileBox = Box.createHorizontalBox();
+ fileBox.add(saveButton); fileBox.add(Box.createHorizontalGlue()); fileBox.add(loadButton);
+ gridbag.setConstraints(fileBox, c);
+ add(fileBox);
+ saveButton.setEnabled(false);
+ loadButton.setEnabled(false);
+ c.gridx--;
+ c.gridwidth = 2;
+ for (Object name2 : thisAct.getJobs()) {
+ Job thisJob = (Job)name2;
+ RequestButton newButton = new RequestButton(thisJob, this);
+ requestButtons.add(newButton);
+ outcomeButtons.add(newButton);
+ outcomeButtons.add(Box.createHorizontalStrut(5));
+ newButton.setEnabled(false);
+
+ if (thisJob.hasOutcome()) {
+
+ String schemaName;
+ int schemaVersion;
+ try {
+ schemaName = thisJob.getSchemaName();
+ schemaVersion = thisJob.getSchemaVersion();
+ } catch (Exception e) {
+ newButton.setToolTipText("Could not load schema for this job.");
+ continue;
+ }
+
+ if(!schemaName.equals("Errors") && outcomePanel == null) {
+ try {
+ outcomePanel = getOutcomeHandler(thisJob);
+ outcomeView = outcomePanel.getPanel();
+ newButton.setEnabled(true);
+ } catch (ObjectNotFoundException ex) {
+ outcomeView.add(new JLabel(Language.translate("Schema not found:")+" "+schemaName+" v"+schemaVersion));
+ } catch (Exception ex) {
+ outcomeView.add(new JLabel(Language.translate("ERROR loading outcome editor: ")
+ +ex.getClass().getName()+" ("+ex.getMessage()+")"));
+ Logger.error(ex);
+ }
+ }
+ if (schemaName.equals("Errors")) {
+ try {
+ errorPanel = getOutcomeHandler(thisJob);
+ errorView.add(errorPanel.getPanel());
+ newButton.setEnabled(true);
+ } catch (Exception ex) {
+ errorView.add(new JLabel(Language.translate("ERROR loading error editor: ")
+ +ex.getClass().getName()+" ("+ex.getMessage()+")"));
+
+ }
+ }
+ }
+ else
+ newButton.setEnabled(true);
+ }
+ if (outcomePanel == null)
+ outcomeView.add(noOutcome);
+ else
+ enableLoadSaveButtons();
+
+
+ c.gridy++; c.weighty=1.0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.BOTH;
+ gridbag.setConstraints(outcomeView, c);
+ add(outcomeView);
+
+ }
+
+ public OutcomeHandler getOutcomeHandler(Job thisJob) throws ObjectNotFoundException, InvalidSchemaException, InvalidOutcomeException, InvalidDataException {
+ String schema;
+ OutcomeHandler thisForm;
+ schema = LocalObjectLoader.getSchema(thisJob.getSchemaName(), thisJob.getSchemaVersion()).schema;
+ thisForm = ItemTabPane.getOutcomeHandler(thisJob.getSchemaName(), thisJob.getSchemaVersion());
+ thisForm.setReadOnly(false);
+ thisForm.setDescription(schema);
+ String outcomeString = thisJob.getOutcomeString();
+ if ( outcomeString!= null && outcomeString.length() > 0)
+ thisForm.setOutcome(outcomeString);
+ return thisForm;
+ }
+
+ public void enableLoadSaveButtons() {
+ saveButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String output;
+ try {
+ output = outcomePanel.getOutcome();
+ int returnVal = chooser.showSaveDialog(null);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ File targetFile = chooser.getSelectedFile();
+ if (!(targetFile.getAbsolutePath().endsWith(".xml")))
+ targetFile = new File(targetFile.getAbsolutePath()+".xml");
+
+ Logger.msg(2, "ExecutionPane - Exporting outcome to file " + targetFile.getName());
+ FileStringUtility.string2File(targetFile, output);
+ }
+ } catch (Exception ex) {
+ Logger.error(ex);
+ MainFrame.exceptionDialog(ex);
+ }
+ }
+ });
+ saveButton.setEnabled(true);
+
+ loadButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ try {
+ int returnVal = chooser.showOpenDialog(null);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ File targetFile = chooser.getSelectedFile();
+
+ Logger.msg(2, "ViewpointPane.actionPerformed() - Reading outcome from file " + targetFile.getName());
+ String outcome = FileStringUtility.file2String(targetFile);
+ outcomePanel.setOutcome(outcome);
+ new Thread(outcomePanel).start();
+ }
+ } catch (Exception ex) {
+ Logger.error(ex);
+ MainFrame.exceptionDialog(ex);
+ }
+ }
+ });
+ loadButton.setEnabled(true);
+ }
+
+ public void init() {
+ if (outcomePanel != null)
+ new Thread(outcomePanel).start();
+ if (errorPanel != null)
+ new Thread(errorPanel).start();
+ }
+
+ public void execute(Job thisJob) {
+ try {
+ if (thisJob.hasOutcome())
+ if (!thisJob.getSchemaName().equals("Errors"))
+ thisJob.setOutcome(outcomePanel.getOutcome());
+ else {
+ Box errorBox = Box.createVerticalBox();
+ errorBox.add(new JLabel("Please give details of the error:"));
+ errorBox.add(errorView);
+ int result = JOptionPane.showConfirmDialog(this, errorBox, "Send Error", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
+ if (result != JOptionPane.OK_OPTION)
+ return;
+ thisJob.setOutcome(errorPanel.getOutcome());
+ }
+ executingJob = thisJob;
+ new Thread(this).start();
+ } catch (Exception ex) {
+ MainFrame.exceptionDialog(ex);
+ }
+
+ }
+
+ /**
+ * Submits the job to the database
+ */
+ @Override
+ public void run() {
+ Thread.currentThread().setName("Activity Execution");
+ enableAllButtons(false);
+ try {
+ Executor selectedExecutor = (Executor)executors.getSelectedItem();
+ selectedExecutor.execute(executingJob, status);
+ } catch (Exception e) {
+ Logger.error(e);
+ MainFrame.progress.stopBouncing(Language.translate("Error during execution"));
+ status.setText(Language.translate("Error during execution: "+e.getClass().getSimpleName()));
+ MainFrame.exceptionDialog(e);
+ }
+ enableAllButtons(true);
+ }
+
+ private void enableAllButtons(boolean enabled) {
+
+ for (RequestButton thisButton : requestButtons) {
+ thisButton.setEnabled(enabled);
+ }
+ }
+
+ public ActivityItem getActivity() {
+ return thisAct;
+ }
+}
diff --git a/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java b/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java
new file mode 100644
index 0000000..8b15c95
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/execution/DefaultExecutor.java
@@ -0,0 +1,38 @@
+package org.cristalise.gui.tabs.execution;
+
+import javax.swing.JLabel;
+
+import org.cristalise.gui.MainFrame;
+import org.cristalise.kernel.entity.agent.Job;
+import org.cristalise.kernel.utils.Language;
+
+
+/**************************************************************************
+ *
+ * $Revision: 1.2 $
+ * $Date: 2003/11/04 14:31:30 $
+ *
+ * Copyright (C) 2003 CERN - European Organization for Nuclear Research
+ * All rights reserved.
+ **************************************************************************/
+
+public class DefaultExecutor implements Executor {
+
+ public DefaultExecutor() {
+ super();
+ }
+
+ @Override
+ public void execute(Job job, JLabel status) throws Exception {
+ status.setText(Language.translate("Submitting..."));
+ MainFrame.progress.startBouncing("Requesting, please wait.");
+ MainFrame.userAgent.execute(job);
+ MainFrame.progress.stopBouncing("Execution complete.");
+ status.setText("Waiting for joblist update.");
+ }
+
+ @Override
+ public String toString() {
+ return "Normal";
+ }
+}
diff --git a/src/main/java/org/cristalise/gui/tabs/execution/Executor.java b/src/main/java/org/cristalise/gui/tabs/execution/Executor.java
new file mode 100644
index 0000000..8a08351
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/execution/Executor.java
@@ -0,0 +1,23 @@
+package org.cristalise.gui.tabs.execution;
+
+import javax.swing.JLabel;
+
+import org.cristalise.kernel.entity.agent.Job;
+
+
+/**************************************************************************
+ *
+ * $Revision: 1.1 $
+ * $Date: 2003/09/25 10:28:02 $
+ *
+ * Copyright (C) 2003 CERN - European Organization for Nuclear Research
+ * All rights reserved.
+ **************************************************************************/
+
+public interface Executor {
+
+ @Override
+ public String toString();
+
+ public void execute(Job job, JLabel status) throws Exception;
+}
diff --git a/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java b/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java
new file mode 100644
index 0000000..bccf99f
--- /dev/null
+++ b/src/main/java/org/cristalise/gui/tabs/execution/RequestButton.java
@@ -0,0 +1,44 @@
+package org.cristalise.gui.tabs.execution;
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+import org.cristalise.gui.MainFrame;
+import org.cristalise.kernel.entity.agent.Job;
+import org.cristalise.kernel.utils.Logger;
+
+/**
+ * Each job gets a RequestButton
+ */
+
+ public class RequestButton extends JButton implements ActionListener {
+
+ Job myJob;
+ ActivityViewer parent;
+
+ public RequestButton(Job myJob, ActivityViewer parent) {
+ super();
+ this.myJob = myJob;
+ this.parent = parent;
+ String label = myJob.getTransition().getName();
+ if (myJob.hasOutcome()) {
+ setBackground(Color.white);
+ try {
+ if (myJob.getSchemaName().equals("Errors")) setBackground(Color.pink);
+ } catch (Exception e) {
+ Logger.error(e);
+ MainFrame.exceptionDialog(e);
+ setEnabled(false);
+ }
+ }
+ super.setText(label);
+ addActionListener(this);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent event) {
+ parent.execute(myJob);
+ }
+ }