USEPA / emf

Emissions Modeling Framework (EMF)
6 stars 3 forks source link

Add Custom QA Step: Order field gets blanked, no error message shown #73

Closed cseppan closed 2 years ago

cseppan commented 3 years ago

Steps to reproduce:

Edit a dataset's properties and switch to the QA tab Click Add Custom button Enter a Name, select a Program (e.g. SQL), and select the Version Click in the Order field but don't type anything Click the OK button A NumberFormatException is thrown (stack trace below) but no message is displayed to the user

This is particularly a problem when using keyboard navigation because tabbing through the fields causes the same behavior and is unavoidable.

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
    at java.lang.Float.parseFloat(Float.java:451)
    at gov.epa.emissions.framework.client.meta.qa.NewCustomQAStepWindow.save(NewCustomQAStepWindow.java:226)
    at gov.epa.emissions.framework.client.meta.qa.NewCustomQAStepPresenter.doSave(NewCustomQAStepPresenter.java:37)
    at gov.epa.emissions.framework.client.meta.qa.NewCustomQAStepWindow.doOk(NewCustomQAStepWindow.java:195)
    at gov.epa.emissions.framework.client.meta.qa.NewCustomQAStepWindow.access$3(NewCustomQAStepWindow.java:193)
    at gov.epa.emissions.framework.client.meta.qa.NewCustomQAStepWindow$3.actionPerformed(NewCustomQAStepWindow.java:177)
    at gov.epa.emissions.commons.gui.Button$1.actionPerformed(Button.java:25)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6533)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6298)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
ddelvecchio commented 3 years ago

Changed the code to prompt the user with an error message if the Order field is blank or a non number.

cseppan commented 3 years ago

While the exception and lack of message are now fixed, there's still a problem where the value in the Order field is cleared out or not accepted. If you follow the "Steps to reproduce" (be sure to click in the Order field), when you click OK, the value in the Order field (which was 0 by default) gets blanked out, and the error message "Error: Please enter an order that is a numeric value" is displayed.

ddelvecchio commented 2 years ago

The solution was to set the Value field instead of the Text field, this causes the value to stick to the base class, whereas setting the Text field does not.

use: order.setValue(step.getOrder()); //Need to set value instead of: order.setText(step.getOrder() + "");

I did find a similar strange issue where leaving focus on the QA user does cause a similar issue where the software thinks the field has been changed but really the user just focused off the field. I will clone this tickets and create a new ticket.

ddelvecchio commented 2 years ago

There was still an issue with the order being validated after focusing through the field , if the user changed the order to a non number.
I got rid of the validation when focusing through a field and instead moved the validation logic to the save() method of the various QA Step windows. I removed the ActionListerner in addition to the DocumentListener from the order field for the Edit Custom and Norml QA Windows.