package com.c2kernel.gui.lifecycle.instance; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Map; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import com.c2kernel.common.InvalidDataException; import com.c2kernel.entity.agent.Job; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.graph.model.Vertex; import com.c2kernel.gui.MainFrame; import com.c2kernel.gui.graph.view.SelectedVertexPanel; import com.c2kernel.gui.tabs.EntityTabPane; import com.c2kernel.gui.tabs.execution.Executor; import com.c2kernel.lifecycle.instance.Activity; import com.c2kernel.lifecycle.instance.stateMachine.State; import com.c2kernel.lifecycle.instance.stateMachine.StateMachine; import com.c2kernel.lifecycle.instance.stateMachine.Transition; import com.c2kernel.utils.Logger; /************************************************************************** * * $Revision: 1.8 $ * $Date: 2005/09/07 13:46:31 $ * * Copyright (C) 2003 CERN - European Organization for Nuclear Research * All rights reserved. **************************************************************************/ public class TransitionPanel extends SelectedVertexPanel implements ActionListener { protected Activity mCurrentAct; protected GridBagLayout gridbag; protected GridBagConstraints c; protected Box transBox; protected JComboBox executors; protected JComboBox states = new JComboBox(); protected JCheckBox active = new JCheckBox(); protected JLabel status = new JLabel(); protected ItemProxy mItem; public TransitionPanel() { super(); gridbag = new GridBagLayout(); setLayout(gridbag); c = new GridBagConstraints(); c.gridx=0; c.gridy=0; c.weightx=1; c.weighty=0; c.fill=GridBagConstraints.HORIZONTAL; JLabel title = new JLabel("Available Transitions"); title.setFont(EntityTabPane.titleFont); gridbag.setConstraints(title, c); add(title); c.gridy++; gridbag.setConstraints(status, c); add(status); c.gridy++; transBox = Box.createHorizontalBox(); gridbag.setConstraints(transBox, c); add(transBox); c.weightx=0; c.gridx++; executors = MainFrame.getExecutionPlugins(); if (executors.getItemCount() > 1) { gridbag.setConstraints(executors, c); add(executors); } if (MainFrame.isAdmin) { c.gridx=0; c.gridy++; title = new JLabel("State Hacking"); title.setFont(EntityTabPane.titleFont); gridbag.setConstraints(title, c); add(title); Box hackBox = Box.createHorizontalBox(); hackBox.add(states); hackBox.add(Box.createHorizontalGlue()); hackBox.add(new JLabel("Active:")); hackBox.add(active); c.gridy++; gridbag.setConstraints(hackBox, c); add(hackBox); states.addActionListener(this); active.addActionListener(this); } clear(); } /** * */ @Override public void select(Vertex vert) { clear(); if (!(vert instanceof Activity)) return; mCurrentAct = (Activity)vert; StateMachine sm; try { sm = mCurrentAct.getStateMachine(); } catch (InvalidDataException e) { status.setText("Invalid state machine."); Logger.error(e); return; } states.removeAllItems(); int currentState; try { currentState = mCurrentAct.getState(); } catch (InvalidDataException e) { status.setText("Could not find activity state"); Logger.error(e); return; } for (State thisState : sm.getStates()) { states.addItem(thisState); if (currentState == thisState.getId()) states.setSelectedItem(thisState); } states.setEnabled(true); active.setSelected(mCurrentAct.active); active.setEnabled(true); Logger.msg(1, "Retrieving possible transitions for activity "+mCurrentAct.getName()); Map transitions; try { transitions = mCurrentAct.getStateMachine().getPossibleTransitions(mCurrentAct, MainFrame.userAgent.getPath()); } catch (Exception e) { status.setText("Error loading possible transitions of activity. See log."); Logger.error(e); return; } if (transitions.size() == 0) { status.setText("None"); return; } for (Transition trans:transitions.keySet()) { if (!trans.hasOutcome() || (trans.hasOutcome() && !trans.getOutcome().isRequired())) { JButton thisTrans = new JButton(trans.getName()); thisTrans.setActionCommand("Trans:"+trans.getId()); thisTrans.addActionListener(this); transBox.add(thisTrans); transBox.add(Box.createHorizontalGlue()); } status.setText(transitions.size()+" transitions possible."); } revalidate(); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == active && mCurrentAct != null) { mCurrentAct.active = active.isSelected(); return; } if (e.getSource() == states && mCurrentAct != null) { mCurrentAct.setState(states.getSelectedIndex()); return; } if (!e.getActionCommand().startsWith("Trans:")) return; int transition = Integer.parseInt(e.getActionCommand().substring(6)); Logger.msg("Requesting transition "+transition); try { StateMachine actSM = mCurrentAct.getStateMachine(); Job thisJob = new Job(mCurrentAct, mItem.getSystemKey(), actSM.getTransition(transition), MainFrame.userAgent.getPath(), "Admin"); Executor selectedExecutor = (Executor)executors.getSelectedItem(); selectedExecutor.execute(thisJob, status); } catch (Exception ex) { String className = ex.getClass().getName(); className = className.substring(className.lastIndexOf('.')+1); Logger.error(ex); JOptionPane.showMessageDialog(null, ex.getMessage(), className, JOptionPane.ERROR_MESSAGE); } } @Override public void clear() { mCurrentAct = null; transBox.removeAll(); status.setText("No activity selected"); states.setEnabled(false); active.setSelected(false); active.setEnabled(false); revalidate(); } /** * @param item The mItem to set. */ public void setItem(ItemProxy item) { mItem = item; } }