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.testrunner;
021
022 import java.awt.BorderLayout;
023 import java.awt.Dimension;
024 import java.awt.FlowLayout;
025 import java.util.Calendar;
026 import java.util.HashMap;
027 import java.util.LinkedList;
028 import java.util.List;
029
030 import javax.swing.AbstractAction;
031 import javax.swing.JButton;
032 import javax.swing.JPanel;
033 import javax.swing.JScrollPane;
034 import javax.swing.JTable;
035 import javax.swing.SwingUtilities;
036 import javax.swing.table.AbstractTableModel;
037
038 import org.mactor.framework.MactorException;
039 import org.mactor.framework.MockRunner;
040 import org.mactor.framework.TestEvent;
041 import org.mactor.framework.TestFeedbackListener;
042 import org.mactor.framework.spec.MockBatterySpec;
043 import org.mactor.framework.spec.TestSpec;
044 import org.mactor.ui.gui.GuiUtil;
045 import org.mactor.ui.gui.Stoppable;
046 import org.mactor.ui.gui.project.ProjectTreeNode;
047
048 public class MockBatteryPanel extends JPanel implements Stoppable {
049 JTable table;
050 MockRunner mr;
051 int testThreadCount;
052 MockStatusTableModel model;
053 List<TestSpec> tests = new LinkedList<TestSpec>();
054 TestFeedbackListener tfl = new TestFeedbackListener() {
055 public void onNodeEvent(final org.mactor.framework.TestEvent event, org.mactor.framework.TestContext context) {
056 if (event.isStartEventType() || event.isTestCompleteEvent()) {
057 SwingUtilities.invokeLater(new Runnable() {
058 public void run() {
059 model.setLastEvent(event);
060 };
061 });
062 }
063 };
064 public void onTestRunCompleted(String testRunInstanceId, int succededCount, int failedCount) {
065 // TODO Auto-generated method stub
066 }
067 };
068 JButton startButton = new JButton(new AbstractAction("Start Mock") {
069 public void actionPerformed(java.awt.event.ActionEvent e) {
070 try {
071 mr = new MockRunner(testThreadCount, tests, tfl);
072 mr.start();
073 startButton.setEnabled(false);
074 stopButton.setEnabled(true);
075 } catch (MactorException me) {
076 GuiUtil.showGuiError(MockBatteryPanel.this, me);
077 }
078 };
079 });
080 JButton stopButton = new JButton(new AbstractAction("Stop Mock") {
081 public void actionPerformed(java.awt.event.ActionEvent e) {
082 mr.stop();
083 startButton.setEnabled(true);
084 stopButton.setEnabled(false);
085 };
086 });
087 public MockBatteryPanel(ProjectTreeNode node) throws MactorException {
088 super(new BorderLayout());
089 MockBatterySpec spec = MockBatterySpec.loadFromFile(node.getName());
090 testThreadCount = spec.getThreadCount();
091 for (String t : spec.getTests())
092 tests.add(TestSpec.loadFromFile(t));
093 model = new MockStatusTableModel(tests);
094 table = new JTable(model);
095 stopButton.setEnabled(false);
096 JPanel buttonPanel = new JPanel(new FlowLayout());
097 buttonPanel.add(startButton);
098 buttonPanel.add(stopButton);
099 add(buttonPanel, BorderLayout.NORTH);
100 JScrollPane sp = new JScrollPane(table);
101 sp.setPreferredSize(new Dimension(800, 200));
102 add(sp, BorderLayout.CENTER);
103 }
104 public void stop() {
105 if (mr != null)
106 mr.stop();
107 }
108 private class MockStatusTableModel extends AbstractTableModel {
109 final String[] cols = new String[] { "Test Name", "Last Event Time", "Last Node", "Last Message" };
110 TestSnapshotInfo[] ts;
111 HashMap<TestSpec, TestSnapshotInfo> dic = new HashMap<TestSpec, TestSnapshotInfo>();
112 public MockStatusTableModel(List<TestSpec> tests) {
113 int i = 0;
114 ts = new TestSnapshotInfo[tests.size()];
115 for (TestSpec t : tests) {
116 ts[i] = new TestSnapshotInfo(i, t.getName());
117 dic.put(t, ts[i]);
118 i++;
119 }
120 System.out.println(ts.length);
121 }
122 @Override
123 public String getColumnName(int index) {
124 return cols[index];
125 }
126 public int getColumnCount() {
127 return cols.length;
128 }
129 public int getRowCount() {
130 return ts.length;
131 }
132 @Override
133 public Class<?> getColumnClass(int arg0) {
134 return String.class;
135 }
136 public Object getValueAt(int row, int col) {
137 if (col == 0)
138 return ts[row].getTestName();
139 else if (col == 1)
140 return ts[row].getLastEventTime() + "";
141 else if (col == 2)
142 return ts[row].getLastNodeName();
143 else if (col == 3)
144 return ts[row].getLastMessage();
145 throw new RuntimeException("No such row!");
146 }
147 public void setLastEvent(TestEvent event) {
148 TestSnapshotInfo t = dic.get(event.getTestSpec());
149 if (t != null) {
150 if (event.isStartEventType()) {
151 t.setEventInfo(event.getTime(), event.getNode().getName(), event.getOutputText());
152 super.fireTableRowsUpdated(t.getIndex(), t.getIndex());
153 }
154 if (event.isTestCompleteEvent()) {
155 t.setEventInfo(event.getTime(), "Test Completed", event.getOutputText());
156 }
157 super.fireTableRowsUpdated(t.getIndex(), t.getIndex());
158 } else {
159 System.out.println("test not found:" + event.getTestSpec());
160 }
161 }
162 public void clearResults() {
163 for (TestSnapshotInfo t : ts)
164 t.setEventInfo(null, null, null);
165 super.fireTableDataChanged();
166 }
167 }
168 private class TestSnapshotInfo {
169 private String testName;
170 private Calendar lastEventTime;
171 private String lastNodeName;
172 private String lastMessage;
173 private int index;
174 public TestSnapshotInfo(int index, String testName) {
175 this.testName = testName;
176 this.index = index;
177 }
178 public void setEventInfo(Calendar eventTime, String nodeName, String message) {
179 this.lastEventTime = eventTime;
180 this.lastNodeName = nodeName;
181 this.lastMessage = message;
182 }
183 public String getLastEventTime() {
184 return GuiUtil.format(lastEventTime);
185 }
186 public String getLastMessage() {
187 return lastMessage;
188 }
189 public String getLastNodeName() {
190 return lastNodeName;
191 }
192 public String getTestName() {
193 return testName;
194 }
195 public int getIndex() {
196 return index;
197 }
198 }
199 }