001 /****************************************************************************** 002 * Copyright (C) MActor Developers. All rights reserved. * 003 * ---------------------------------------------------------------------------* 004 * This file is part of MActor. * 005 * * 006 * MActor is free software; you can redistribute it and/or modify * 007 * it under the terms of the GNU General Public License as published by * 008 * the Free Software Foundation; either version 2 of the License, or * 009 * (at your option) any later version. * 010 * * 011 * MActor is distributed in the hope that it will be useful, * 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 014 * GNU General Public License for more details. * 015 * * 016 * You should have received a copy of the GNU General Public License * 017 * along with MActor; if not, write to the Free Software * 018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 019 ******************************************************************************/ 020 package org.mactor.ui.gui.project.editors; 021 022 import java.awt.BorderLayout; 023 import java.awt.FlowLayout; 024 import java.awt.Frame; 025 import java.awt.event.ActionEvent; 026 import java.util.HashMap; 027 028 import javax.swing.AbstractAction; 029 import javax.swing.BorderFactory; 030 import javax.swing.JButton; 031 import javax.swing.JDialog; 032 import javax.swing.JLabel; 033 import javax.swing.JPanel; 034 import javax.swing.JScrollPane; 035 import javax.swing.JTextArea; 036 037 import org.dom4j.Element; 038 import org.mactor.brokers.Message; 039 import org.mactor.framework.MactorException; 040 import org.mactor.framework.TestContextImpl; 041 import org.mactor.framework.commandexecutors.ActionCommandExecutor; 042 import org.mactor.framework.commandexecutors.ActionCommandExecutorFactory; 043 import org.mactor.framework.commandexecutors.MessageBuilderCommandExecutor; 044 import org.mactor.framework.commandexecutors.MessageBuilderCommandExecutorFactory; 045 import org.mactor.framework.commandexecutors.MessageSelectorCommandExecutor; 046 import org.mactor.framework.commandexecutors.MessageSelectorCommandExecutorFactory; 047 import org.mactor.framework.commandexecutors.ValueCommandExecutor; 048 import org.mactor.framework.commandexecutors.ValueCommandExecutorFactory; 049 import org.mactor.framework.spec.ActionSpec; 050 import org.mactor.framework.spec.MessageBuilderSpec; 051 import org.mactor.framework.spec.MessageSelectorSpec; 052 import org.mactor.framework.spec.ProjectContext; 053 import org.mactor.framework.spec.TestSpec; 054 import org.mactor.framework.spec.ValueSpec; 055 import org.mactor.framework.spec.XmlUtil; 056 import org.mactor.ui.gui.AsyncAction; 057 import org.mactor.ui.gui.GuiUtil; 058 059 public class CommandTestDlg extends JDialog { 060 JTextArea resultText = new JTextArea(10, 60); 061 ContextPanel contextPanel = new ContextPanel(); 062 Element commandElement; 063 TestContextImpl context; 064 JButton okButton = new JButton(new AbstractAction("Ok") { 065 public void actionPerformed(ActionEvent arg0) { 066 dispose(); 067 }; 068 }); 069 JButton evaluateButton = new JButton(new AsyncAction("Evaluate Command", false, new AsyncAction.AsyncRunnable() { 070 public void run() { 071 context.setValues(contextPanel.getContextValues()); 072 resultText.setText(evaluateCommand()); 073 }; 074 })); 075 private String evaluateCommand() { 076 String elementName = commandElement.getName(); 077 String prefix = "The evaluation of:\n" + XmlUtil.getPrettyXML(commandElement) + "\n\nResultet in:\n"; 078 try { 079 if ("value".equals(elementName)) 080 return prefix + evaluateValueCommand(); 081 if ("action".equals(elementName)) 082 return prefix + evaluateActionCommand(); 083 if ("message_selector".equals(elementName)) 084 return prefix + evaluateMessageSelectorCommand(); 085 if ("message_builder".equals(elementName)) 086 return prefix + evaluateMessageBuilderCommand(); 087 throw new MactorException("Unsupported command container: '" + elementName + "'"); 088 } catch (Exception e) { 089 e.printStackTrace(); 090 return prefix + e; 091 } 092 } 093 private String evaluateValueCommand() throws MactorException { 094 ValueSpec spec = ValueSpec.loadSpec(commandElement); 095 ValueCommandExecutor executor = ValueCommandExecutorFactory.createExecutor(context, spec); 096 return executor.extractValue(context); 097 } 098 private String evaluateActionCommand() throws MactorException { 099 ActionSpec spec = ActionSpec.loadSpec(commandElement); 100 ActionCommandExecutor executor = ActionCommandExecutorFactory.createExecutor(context, spec); 101 executor.perform(context); 102 return "Success"; 103 } 104 private String evaluateMessageSelectorCommand() throws MactorException { 105 MessageSelectorSpec spec = MessageSelectorSpec.loadSpec(commandElement); 106 MessageSelectorCommandExecutor executor = MessageSelectorCommandExecutorFactory.createExecutor(context, spec); 107 Message m = context.getLastIncomingMessage(); 108 if (m == null) 109 throw new MactorException("There is no incoming message to validate!"); 110 if (executor.isAcceptableMessage(m)) 111 return "The Message was accepted"; 112 else 113 return "The Message was NOT accepted"; 114 } 115 private String evaluateMessageBuilderCommand() throws MactorException { 116 MessageBuilderSpec spec = MessageBuilderSpec.loadSpec(commandElement); 117 MessageBuilderCommandExecutor executor = MessageBuilderCommandExecutorFactory.createExecutor(context, spec); 118 return executor.buildMessage(context).getContent(); 119 } 120 public CommandTestDlg(Frame parent, Element commandElement) throws MactorException { 121 super(parent); 122 setLayout(new BorderLayout()); 123 setModal(true); 124 setTitle("Test " + commandElement.getName() + " Command"); 125 this.commandElement = commandElement; 126 contextPanel.clearContext(); 127 SimpleFormPanel form = new SimpleFormPanel(); 128 form.add(contextPanel); 129 JPanel bp = new JPanel(new FlowLayout()); 130 bp.add(evaluateButton); 131 form.add(bp); 132 SimpleFormPanel resultForm = new SimpleFormPanel(); 133 resultForm.add(new JScrollPane(resultText)); 134 resultForm.setBorder(BorderFactory.createTitledBorder("Evaluation Result")); 135 form.add(resultForm); 136 add(form, BorderLayout.CENTER); 137 JPanel buttonPanel = new JPanel(new FlowLayout()); 138 buttonPanel.add(okButton); 139 add(buttonPanel, BorderLayout.SOUTH); 140 pack(); 141 } 142 private class ContextPanel extends SimpleFormPanel { 143 ParamsPanel paramsPanel = new ParamsPanel(); 144 JTextArea messageText = new JTextArea(10, 40); 145 JButton clearContextButton = new JButton(new AbstractAction("Remove All Messages from Context") { 146 public void actionPerformed(ActionEvent arg0) { 147 try { 148 clearContext(); 149 } catch (MactorException me) { 150 GuiUtil.showGuiError(ContextPanel.this, me); 151 } 152 }; 153 }); 154 JButton addParamButton = new JButton(new AbstractAction("Add Variable to Context") { 155 public void actionPerformed(ActionEvent arg0) { 156 paramsPanel.addNewRow(); 157 } 158 }); 159 JButton addMessageButton = new JButton(new AbstractAction("Add Message to Context") { 160 public void actionPerformed(ActionEvent arg0) { 161 try { 162 context.addReceivedMessage("dummy", Message.createMessage(messageText.getText())); 163 } catch (MactorException me) { 164 GuiUtil.showGuiError(ContextPanel.this, me); 165 } 166 }; 167 }); 168 public ContextPanel() { 169 setBorder(BorderFactory.createTitledBorder("Test Context")); 170 add(new JLabel("Incoming Message:")); 171 add(new JScrollPane(messageText)); 172 JPanel bp = new JPanel(new FlowLayout()); 173 bp.add(addMessageButton); 174 bp.add(clearContextButton); 175 bp.add(addParamButton); 176 add(bp); 177 add(new JLabel("Context Variables:")); 178 add(paramsPanel); 179 } 180 public HashMap<String, String> getContextValues() { 181 HashMap<String, String> m = new HashMap<String, String>(); 182 for (ParamsPanel.RowPanel row : paramsPanel.rows) 183 m.put(row.nameField.getText(), row.valueField.getText()); 184 return m; 185 } 186 private void clearContext() throws MactorException { 187 context = new TestContextImpl(ProjectContext.getGlobalInstance().loadGlobalConfig(), TestSpec.loadFromDocument(commandElement.getDocument(), "dummy")); 188 } 189 } 190 }