From bc7a33dcd9c5768c4cc35e3fb268a8bdb0de54e0 Mon Sep 17 00:00:00 2001 From: "Jose E. Chavez" Date: Thu, 7 May 2015 12:45:31 -0500 Subject: [PATCH 1/2] Using Java7, GlazedLists 1.9.1, SwingX 1.6.5 Modified tests to use a custom EDT JUnit Runner for Glazedlists --- pom.xml | 107 +++++++++--------- .../log4fix/ui/messages/ViewModel.java | 55 ++++----- .../log4fix/core/AbstractSessionTestCase.java | 8 +- .../ViewModelHideHeartbeatMessagesTest.java | 22 +++- .../ui/messages/ViewModelSortTest.java | 42 +++++-- .../log4fix/util/EDTRunner.java | 56 +++++++++ 6 files changed, 192 insertions(+), 98 deletions(-) create mode 100644 src/test/java/org/opentradingsolutions/log4fix/util/EDTRunner.java diff --git a/pom.xml b/pom.xml index 7796dab..b2ba55f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,54 +1,55 @@ - - 4.0.0 - org.opentradingsolutions - log4fix - 2.0.0-SNAPSHOT - - - MarketceteraRepo - http://repo.marketcetera.org/maven - - true - - - - - - quickfixj - quickfixj-all - 1.5.3 - - - net.java.dev.glazedlists - glazedlists_java15 - 1.6.1 - - - org.swinglabs - swingx - 0.9 - - - junit - junit - 4.7 - test - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - - - - - + + 4.0.0 + org.opentradingsolutions + log4fix + 2.0.0-SNAPSHOT + + UTF-8 + 1.7 + 1.7 + + + + MarketceteraRepo + http://repo.marketcetera.org/maven + + true + + + + + + quickfixj + quickfixj-all + 1.5.3 + + + net.java.dev.glazedlists + glazedlists_java15 + 1.9.1 + + + org.swinglabs.swingx + swingx-all + 1.6.5 + + + junit + junit + 4.7 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + \ No newline at end of file diff --git a/src/main/java/org/opentradingsolutions/log4fix/ui/messages/ViewModel.java b/src/main/java/org/opentradingsolutions/log4fix/ui/messages/ViewModel.java index d7b041e..943ee27 100644 --- a/src/main/java/org/opentradingsolutions/log4fix/ui/messages/ViewModel.java +++ b/src/main/java/org/opentradingsolutions/log4fix/ui/messages/ViewModel.java @@ -29,20 +29,6 @@ package org.opentradingsolutions.log4fix.ui.messages; -import ca.odell.glazedlists.EventList; -import ca.odell.glazedlists.FilterList; -import ca.odell.glazedlists.GlazedLists; -import ca.odell.glazedlists.SortedList; -import ca.odell.glazedlists.gui.TableFormat; -import ca.odell.glazedlists.impl.beans.BeanTableFormat; -import ca.odell.glazedlists.impl.filter.TextMatcher; -import ca.odell.glazedlists.impl.matchers.NotMatcher; -import ca.odell.glazedlists.matchers.Matcher; -import ca.odell.glazedlists.matchers.TextMatcherEditor; -import ca.odell.glazedlists.swing.EventListModel; -import ca.odell.glazedlists.swing.EventSelectionModel; -import ca.odell.glazedlists.swing.EventTableModel; - import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; @@ -64,6 +50,21 @@ import org.opentradingsolutions.log4fix.ui.fields.FieldTreeTableModel; import org.opentradingsolutions.log4fix.ui.fields.RootNode; +import ca.odell.glazedlists.EventList; +import ca.odell.glazedlists.FilterList; +import ca.odell.glazedlists.GlazedLists; +import ca.odell.glazedlists.SortedList; +import ca.odell.glazedlists.gui.TableFormat; +import ca.odell.glazedlists.impl.beans.BeanTableFormat; +import ca.odell.glazedlists.impl.filter.SearchTerm; +import ca.odell.glazedlists.impl.filter.TextMatcher; +import ca.odell.glazedlists.impl.matchers.NotMatcher; +import ca.odell.glazedlists.matchers.Matcher; +import ca.odell.glazedlists.matchers.TextMatcherEditor; +import ca.odell.glazedlists.swing.DefaultEventListModel; +import ca.odell.glazedlists.swing.DefaultEventSelectionModel; +import ca.odell.glazedlists.swing.DefaultEventTableModel; + /** * Simple core representing raw and cracked FIX messages. This core provides * various Swing core objects that are used to bind the data to Swing table components. @@ -72,15 +73,15 @@ */ public class ViewModel implements ListSelectionListener { - private EventTableModel rawMessagesTableModel; - private EventSelectionModel rawMessagesSelectionModel; + private DefaultEventTableModel rawMessagesTableModel; + private DefaultEventSelectionModel rawMessagesSelectionModel; private TableCellRenderer rawMessagesTableCellRenderer; private final FieldTreeTableModel treeTableModel; private final MemoryLogModel memoryLogModel; private final SortedList sortedList; private final FilterList filteredList; - private final EventListModel eventsListModel; + private final DefaultEventListModel eventsListModel; public ViewModel(MemoryLogModel memoryLogModel) { this.memoryLogModel = memoryLogModel; @@ -91,10 +92,10 @@ public ViewModel(MemoryLogModel memoryLogModel) { createRaw(sortedList); treeTableModel = new FieldTreeTableModel(); - eventsListModel = new EventListModel((EventList) memoryLogModel.getEvents()); + eventsListModel = new DefaultEventListModel((EventList) memoryLogModel.getEvents()); } - public EventListModel getEventsListModel() { + public DefaultEventListModel getEventsListModel() { return eventsListModel; } @@ -106,7 +107,7 @@ FilterList getFilteredList() { return filteredList; } - public EventSelectionModel getRawMessagesSelectionModel() { + public DefaultEventSelectionModel getRawMessagesSelectionModel() { return rawMessagesSelectionModel; } @@ -178,9 +179,9 @@ private void createRaw(EventList adminMessages) { TableFormat adminTableFormat = new BeanTableFormat( LogMessage.class, properties, columnNames); - rawMessagesTableModel = new EventTableModel(adminMessages, + rawMessagesTableModel = new DefaultEventTableModel(adminMessages, adminTableFormat); - rawMessagesSelectionModel = new EventSelectionModel(adminMessages); + rawMessagesSelectionModel = new DefaultEventSelectionModel(adminMessages); rawMessagesSelectionModel.addListSelectionListener(this); rawMessagesTableCellRenderer = new RawMessageTableCellRenderer(); } @@ -204,10 +205,12 @@ public ActionListener getHideHeartbeatsActionListener() { public void actionPerformed(ActionEvent e) { JCheckBox checkBox = (JCheckBox) e.getSource(); if (checkBox.isSelected()) { - - String[] filters = {"Heartbeat"}; - TextMatcher textMatcher = new TextMatcher( - filters, new HeartbeatFilterator(), TextMatcherEditor.CONTAINS); + SearchTerm[] filters = new SearchTerm[] { new SearchTerm( + "HeartBeat") }; + TextMatcher textMatcher = new TextMatcher( + filters, new HeartbeatFilterator(), + TextMatcherEditor.CONTAINS, + TextMatcherEditor.NORMALIZED_STRATEGY); Matcher matcher = new NotMatcher(textMatcher); filteredList.setMatcher(matcher); } else { diff --git a/src/test/java/org/opentradingsolutions/log4fix/core/AbstractSessionTestCase.java b/src/test/java/org/opentradingsolutions/log4fix/core/AbstractSessionTestCase.java index addbf13..3b3963e 100644 --- a/src/test/java/org/opentradingsolutions/log4fix/core/AbstractSessionTestCase.java +++ b/src/test/java/org/opentradingsolutions/log4fix/core/AbstractSessionTestCase.java @@ -29,19 +29,19 @@ package org.opentradingsolutions.log4fix.core; +import java.io.InputStream; + import junit.framework.TestCase; import quickfix.DataDictionary; import quickfix.SessionID; -import java.io.InputStream; - /** * @author Brian M. Coyner */ public abstract class AbstractSessionTestCase extends TestCase { - private SessionID sessionId; - private DataDictionary dictionary; + protected SessionID sessionId; + protected DataDictionary dictionary; public AbstractSessionTestCase() { } diff --git a/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelHideHeartbeatMessagesTest.java b/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelHideHeartbeatMessagesTest.java index a5e9d85..a3d8af1 100644 --- a/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelHideHeartbeatMessagesTest.java +++ b/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelHideHeartbeatMessagesTest.java @@ -29,19 +29,28 @@ package org.opentradingsolutions.log4fix.ui.messages; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.swing.JCheckBox; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.opentradingsolutions.log4fix.core.AbstractSessionTestCase; import org.opentradingsolutions.log4fix.core.LogMessage; import org.opentradingsolutions.log4fix.core.MockMemoryLogModel; +import org.opentradingsolutions.log4fix.util.EDTRunner; import org.opentradingsolutions.log4fix.util.FIXMessageTestHelper; +import quickfix.DataDictionary; +import quickfix.SessionID; + /** * @author Brian M. Coyner */ +@RunWith(EDTRunner.class) public class ViewModelHideHeartbeatMessagesTest extends AbstractSessionTestCase { private JCheckBox checkBox; @@ -50,22 +59,27 @@ public class ViewModelHideHeartbeatMessagesTest extends AbstractSessionTestCase private FIXMessageTestHelper testHelper; @Override - public void doSetUp() { + @Before + public void doSetUp() throws Exception { + sessionId = new SessionID("FIX.4.2", "sender", "target"); + InputStream ddis = getClass().getResourceAsStream("/FIX42.xml"); + assertNotNull("Cannot find FIX42.xml file on the classpath.", ddis); + dictionary = new DataDictionary(ddis); checkBox = new JCheckBox(); memoryLogModel = new MockMemoryLogModel(); model = new ViewModel(memoryLogModel); checkBox.addActionListener(model.getHideHeartbeatsActionListener()); - testHelper = new FIXMessageTestHelper(getSessionId()); } + @Test public void testHideHeartbeatsWhenThereAreNoMessagesIsANoOp() { - memoryLogModel.clear(); checkBox.setSelected(true); assertEquals(0, memoryLogModel.getMessages().size()); } + @Test public void testHideHeartbeatsWhenThereAreNoHeartbeatMessages() { List messages = new ArrayList(); @@ -86,6 +100,7 @@ public void testHideHeartbeatsWhenThereAreNoHeartbeatMessages() { assertEquals(messages, model.getSortedList()); } + @Test public void testHideOneHeartbeatMessage() { List noHeartbeats = new ArrayList(); @@ -120,4 +135,5 @@ public void testHideOneHeartbeatMessage() { assertEquals(noHeartbeats, model.getSortedList()); assertEquals(noHeartbeats, model.getFilteredList()); } + } \ No newline at end of file diff --git a/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelSortTest.java b/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelSortTest.java index 1a926b7..a6b1057 100644 --- a/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelSortTest.java +++ b/src/test/java/org/opentradingsolutions/log4fix/ui/messages/ViewModelSortTest.java @@ -29,22 +29,29 @@ package org.opentradingsolutions.log4fix.ui.messages; -import java.lang.reflect.InvocationTargetException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JCheckBox; -import javax.swing.SwingUtilities; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import org.opentradingsolutions.log4fix.core.AbstractSessionTestCase; import org.opentradingsolutions.log4fix.core.LogMessage; import org.opentradingsolutions.log4fix.core.MockMemoryLogModel; +import org.opentradingsolutions.log4fix.util.EDTRunner; import org.opentradingsolutions.log4fix.util.FIXMessageTestHelper; +import quickfix.DataDictionary; +import quickfix.SessionID; + /** * @author Brian M. Coyner */ +@RunWith(EDTRunner.class) public class ViewModelSortTest extends AbstractSessionTestCase { private JCheckBox checkBox; @@ -52,16 +59,23 @@ public class ViewModelSortTest extends AbstractSessionTestCase { private MockMemoryLogModel memoryLogModel; private FIXMessageTestHelper testHelper; - @Override - public void doSetUp() { - checkBox = new JCheckBox(); - memoryLogModel = new MockMemoryLogModel(); - model = new ViewModel(memoryLogModel); - checkBox.addActionListener(model.getSortByMessageIndexActionListener()); + @Override + @Before + public void doSetUp() throws Exception { + sessionId = new SessionID("FIX.4.2", "sender", "target"); + InputStream ddis = getClass().getResourceAsStream("/FIX42.xml"); + assertNotNull("Cannot find FIX42.xml file on the classpath.", ddis); + dictionary = new DataDictionary(ddis); - testHelper = new FIXMessageTestHelper(getSessionId()); - } + checkBox = new JCheckBox(); + memoryLogModel = new MockMemoryLogModel(); + model = new ViewModel(memoryLogModel); + checkBox.addActionListener(model.getSortByMessageIndexActionListener()); + testHelper = new FIXMessageTestHelper(getSessionId()); + } + + @Test public void testSortWhenThereAreNoMessagesIsANoOp() { memoryLogModel.clear(); @@ -69,6 +83,7 @@ public void testSortWhenThereAreNoMessagesIsANoOp() { assertEquals(0, memoryLogModel.getMessages().size()); } + @Test public void testNoSortMaintainsOriginalOrder() { List messages = new ArrayList(); @@ -87,6 +102,7 @@ public void testNoSortMaintainsOriginalOrder() { assertEquals(messages, model.getSortedList()); } + @Test public void testReverseTheMessageOrder() { List messages = new ArrayList(); @@ -114,6 +130,7 @@ public void testReverseTheMessageOrder() { assertEquals(messages, model.getSortedList()); } + @Test public void testFlipBeforeAdding() { List messages = new ArrayList(); @@ -141,6 +158,7 @@ public void testFlipBeforeAdding() { assertEquals(messages, model.getSortedList()); } + @Test public void testFlipFlop() { List messages = new ArrayList(); @@ -187,13 +205,13 @@ public void testFlipFlop() { } private void waitForSwing() { - try { + /* try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { } }); } catch (InterruptedException e) { } catch (InvocationTargetException e) { - } + }*/ } } diff --git a/src/test/java/org/opentradingsolutions/log4fix/util/EDTRunner.java b/src/test/java/org/opentradingsolutions/log4fix/util/EDTRunner.java new file mode 100644 index 0000000..ad77987 --- /dev/null +++ b/src/test/java/org/opentradingsolutions/log4fix/util/EDTRunner.java @@ -0,0 +1,56 @@ +package org.opentradingsolutions.log4fix.util; + +import javax.swing.SwingUtilities; + +import org.junit.Ignore; +import org.junit.runner.notification.RunNotifier; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +/** + * Runs JUnit tests in the Event Dispatch Thread (EDT). + * + * To accomplish this, timeouts are not considered. + * + * @BeforeClass and @AfterClass methods are NOT run in the EDT + * + * @author Marcelo J. Ruiz. + */ +@Ignore +public class EDTRunner extends BlockJUnit4ClassRunner { + + public EDTRunner(Class klass) throws InitializationError { + super(klass); + } + + @Override + protected void runChild(final FrameworkMethod method, + final RunNotifier notifier) { + try { + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + hookMethod(method, notifier); + } + }); + } catch (Exception ex) { + throw new RuntimeException("Failed While Running in EDT:" + + ex.getMessage(), ex); + } + } + + private void hookMethod(final FrameworkMethod method, + final RunNotifier notifier) { + super.runChild(method, notifier); + } + + @Override + protected Statement withPotentialTimeout(final FrameworkMethod method, + final Object test, final Statement next) { + return next; + } + +} \ No newline at end of file From eb1302f1b457f5487fcb9bba82ec9213a55023cb Mon Sep 17 00:00:00 2001 From: "Jose E. Chavez" Date: Thu, 14 May 2015 10:43:44 -0500 Subject: [PATCH 2/2] Removed redundant member fields from FieldTreeNode Handling RootNode in FieldTreeTableModel Changed use of EventTableModel to DefaultEventTableModel in RawMessageTableCellRenderer --- .../log4fix/ui/fields/FieldTreeNode.java | 30 ++---------- .../ui/fields/FieldTreeTableModel.java | 49 ++++++++++++------- .../messages/RawMessageTableCellRenderer.java | 12 ++--- 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeNode.java b/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeNode.java index c37b002..644a845 100644 --- a/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeNode.java +++ b/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeNode.java @@ -29,14 +29,10 @@ package org.opentradingsolutions.log4fix.ui.fields; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; import java.util.List; -import javax.swing.tree.TreeNode; - import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; +import org.jdesktop.swingx.treetable.MutableTreeTableNode; import org.jdesktop.swingx.treetable.TreeTableNode; import org.opentradingsolutions.log4fix.core.LogField; import org.opentradingsolutions.log4fix.core.LogGroup; @@ -46,9 +42,7 @@ */ public class FieldTreeNode extends DefaultMutableTreeTableNode { - private TreeTableNode parent; private final LogField field; - private List groups = new ArrayList(); public FieldTreeNode(LogField field) { this.field = field; @@ -59,32 +53,20 @@ public FieldTreeNode(LogField field) { for (LogGroup logGroup : logGroups) { List fields = logGroup.getFields(); for (LogField logField : fields) { - groups.add(new FieldTreeNode(logField)); + add(new FieldTreeNode(logField)); } } } } - public void setParent(TreeTableNode parent) { - this.parent = parent; - } - - public TreeTableNode getChildAt(int childIndex) { - return groups.get(childIndex); - } - - public int getChildCount() { - return field.isRepeatingGroup() ? groups.size() : 0; + public void setParent(MutableTreeTableNode parent) { + super.setParent(parent); } public TreeTableNode getParent() { return parent; } - public int getIndex(TreeNode node) { - return groups.indexOf(node); - } - public boolean getAllowsChildren() { return field.isRepeatingGroup(); } @@ -93,10 +75,6 @@ public boolean isLeaf() { return !field.isRepeatingGroup(); } - public Enumeration children() { - return Collections.enumeration(groups); - } - public LogField getField() { return field; } diff --git a/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeTableModel.java b/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeTableModel.java index f258298..1c9c7cb 100644 --- a/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeTableModel.java +++ b/src/main/java/org/opentradingsolutions/log4fix/ui/fields/FieldTreeTableModel.java @@ -75,23 +75,38 @@ public String getColumnName(int column) { } public Object getValueAt(Object node, int column) { - - FieldTreeNode fieldTreeNode = (FieldTreeNode) node; - LogField field = fieldTreeNode.getField(); - - switch (column) { - case 0: - return field.getFieldName(); - case 1: - return field.getTag(); - case 2: - return field.getValue(); - case 3: - return field.getFieldValueName(); - case 4: - return field.isRequired(); - default: - return "Dang It!"; + if (node instanceof FieldTreeNode) { + FieldTreeNode fieldTreeNode = (FieldTreeNode) node; + LogField field = fieldTreeNode.getField(); + switch (column) { + case 0: + return field.getFieldName(); + case 1: + return field.getTag(); + case 2: + return field.getValue(); + case 3: + return field.getFieldValueName(); + case 4: + return field.isRequired(); + default: + return "Dang It!"; + } + } else { + switch (column) { + case 0: + return "Unknown"; + case 1: + return -1; + case 2: + return "None"; + case 3: + return ""; + case 4: + return false; + default: + return "Dang It!"; } + } } } diff --git a/src/main/java/org/opentradingsolutions/log4fix/ui/messages/RawMessageTableCellRenderer.java b/src/main/java/org/opentradingsolutions/log4fix/ui/messages/RawMessageTableCellRenderer.java index a8c8c5f..55cf89d 100644 --- a/src/main/java/org/opentradingsolutions/log4fix/ui/messages/RawMessageTableCellRenderer.java +++ b/src/main/java/org/opentradingsolutions/log4fix/ui/messages/RawMessageTableCellRenderer.java @@ -29,8 +29,6 @@ package org.opentradingsolutions.log4fix.ui.messages; -import ca.odell.glazedlists.swing.EventTableModel; - import java.awt.Color; import java.awt.Component; import java.text.SimpleDateFormat; @@ -42,16 +40,18 @@ import org.opentradingsolutions.log4fix.core.LogMessage; import org.opentradingsolutions.log4fix.core.ValidationError; +import ca.odell.glazedlists.swing.DefaultEventTableModel; + /** * @author Brian M. Coyner */ public class RawMessageTableCellRenderer extends DefaultTableCellRenderer { - public static final String RECEIVING = "Receiving"; + public static final String RECEIVING = "Receiving"; public static final String SENDING = "Sending"; - private Color incomingColor = new Color(131, 218, 102); - private Color outgoingColor = new Color(233, 173, 89); + private Color incomingColor = new Color(255, 200, 80); + private Color outgoingColor = new Color(195, 255, 195); private SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); @Override @@ -61,7 +61,7 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); // noinspection unchecked - EventTableModel tableModel = (EventTableModel) table.getModel(); + DefaultEventTableModel tableModel = (DefaultEventTableModel) table.getModel(); LogMessage message = tableModel.getElementAt(row); if (table.convertColumnIndexToModel(column) == 2) {