[prev in list] [next in list] [prev in thread] [next in thread] 

List:       fop-dev
Subject:    [jira] [Created] (FOP-2725) Division by zero in PreviewPanel.PageNumberListener
From:       "Eo Manis (JIRA)" <jira () apache ! org>
Date:       2017-07-12 22:15:00
Message-ID: JIRA.13086726.1499897661000.233704.1499897700100 () Atlassian ! JIRA
[Download RAW message or body]

Eo Manis created FOP-2725:
-----------------------------

             Summary: Division by zero in PreviewPanel.PageNumberListener
                 Key: FOP-2725
                 URL: https://issues.apache.org/jira/browse/FOP-2725
             Project: FOP
          Issue Type: Bug
          Components: renderer/awt
    Affects Versions: 2.1
         Environment: Microsoft Windows 7 Professional x64, Oracle JRE 8u121 x64, \
also Red Hat OpenJDK for Windows 8u121  Reporter: Eo Manis


The Apache FOP print preview panel now and then throws an ArithmeticException due to \
a division by zero.

The affected application has a print preview where the user can navigate through a \
list of printouts, and it lazily creates and keeps PreviewPanels for them, as \
rendering is expensive. As the user navigates to a different printout, the current \
printout's PreviewPanel instance is removed from the Swing container layout and the \
next printout's PreviewPanel instance is put onto the layout. At this step, sometimes \
the ArithmeticException occurs, wreaking all kinds of havoc with the application.

It may be the case that sometimes the PageNumberListener is fired from a PreviewPanel \
instance that is not contained in any layout, and in that case the scroll bar / \
Adjustable reports bad values for getMinimum() and getMaximum(). Possibly the \
PageNumberListener should guard against that and perhaps just do nothing then.

{{
    private class PageNumberListener implements AdjustmentListener {
        public void adjustmentValueChanged(AdjustmentEvent e) {
            if (displayMode == PreviewPanel.CONTINUOUS || displayMode == \
PreviewPanel.CONT_FACING) {  Adjustable a = e.getAdjustable();
                int value = +e.getValue();
                int min = a.getMinimum();
                int max = a.getMaximum();
*-->             int page = ((renderer.getNumberOfPages() * value) / (max - min));*
                if (page != currentPage) {
                    int oldPage = currentPage;
                    currentPage = page;
                    firePageChange(oldPage, currentPage);
                }
            }
        }
    }

max == 0
min == 0

java.lang.ArithmeticException: / by zero
        at org.apache.fop.render.awt.viewer.PreviewPanel$PageNumberListener.adjustmentValueChanged(PreviewPanel.java:403)
                
        at javax.swing.JScrollBar.fireAdjustmentValueChanged(JScrollBar.java:705)
        at javax.swing.JScrollBar.access$100(JScrollBar.java:81)
        at javax.swing.JScrollBar$ModelListener.stateChanged(JScrollBar.java:727)
        at javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:364)
                
        at javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:302)
  at javax.swing.JScrollBar.setValues(JScrollBar.java:623)
        at javax.swing.plaf.basic.BasicScrollPaneUI.syncScrollPaneWithViewport(BasicScrollPaneUI.java:285)
                
        at javax.swing.plaf.basic.BasicScrollPaneUI$Handler.stateChanged(BasicScrollPaneUI.java:1034)
  at javax.swing.JViewport.fireStateChanged(JViewport.java:1369)
        at javax.swing.JViewport.reshape(JViewport.java:839)
        at java.awt.Component.setBounds(Component.java:2261)
        at java.awt.Component.setBounds(Component.java:2405)
        at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:890)
        at java.awt.Container.layout(Container.java:1510)
        at java.awt.Container.doLayout(Container.java:1499)
        at java.awt.Container.validateTree(Container.java:1695)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validate(Container.java:1630)
        at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1447)
                
        at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1467)
                
        at com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI.setRolloverTab(WindowsTabbedPaneUI.java:104)
                
        at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(BasicTabbedPaneUI.java:2400)
  at java.awt.Container.layout(Container.java:1510)
        at java.awt.Container.doLayout(Container.java:1499)
        at java.awt.Container.validateTree(Container.java:1695)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validateTree(Container.java:1704)
        at java.awt.Container.validate(Container.java:1630)
        at javax.swing.RepaintManager$3.run(RepaintManager.java:711)
        at javax.swing.RepaintManager$3.run(RepaintManager.java:709)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
                
        at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:708)
                
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1731)
                
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
        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:80)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
                
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
                
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
                
        at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
        at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
        at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
        at java.awt.Dialog.show(Dialog.java:1084)
        at java.awt.Component.show(Component.java:1671)
        at java.awt.Component.setVisible(Component.java:1623)
        at java.awt.Window.setVisible(Window.java:1014)
        at java.awt.Dialog.setVisible(Dialog.java:1005)
        at com.guetermann.printout.ui.PrintoutsDisplayDialog.setVisible(PrintoutsDisplayDialog.java:80)
                
        at com.guetermann.printout.ui.PrintoutPrintPanel.showPrintouts(PrintoutPrintPanel.java:908)
                
        at com.guetermann.printout.ui.PrintoutPrintPanel.access$6(PrintoutPrintPanel.java:888)
                
        at com.guetermann.printout.ui.PrintoutPrintPanel$15.actionPerformed(PrintoutPrintPanel.java:681)
                
        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.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:80)
                
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
  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:80)
  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)
}}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic