[jbosstools-issues] [JBoss JIRA] (JBIDE-10229) org.jboss.tools.jst.css.dialog.ImageSelectionDialog has GC leaks logik

Vitali Yemialyanchyk (Created) (JIRA) jira-events at lists.jboss.org
Wed Nov 23 08:59:40 EST 2011


org.jboss.tools.jst.css.dialog.ImageSelectionDialog has GC leaks logik
----------------------------------------------------------------------

                 Key: JBIDE-10229
                 URL: https://issues.jboss.org/browse/JBIDE-10229
             Project: Tools (JBoss Tools)
          Issue Type: Sub-task
          Components: common/jst/core
    Affects Versions: 3.3.0.M4
            Reporter: Vitali Yemialyanchyk
            Assignee: Alexey Kazakov


{code}
        canvas.addPaintListener(new PaintListener() {
                public void paintControl(PaintEvent e) {
                    GC gc = new GC(canvas);                                           <-------------------------- here you create GC
                    gc.setForeground(emptyColor);
                    gc.fillRectangle(1, 1, canvas.getSize().x - 2, canvas.getSize().y - 2);
                    // resolution.setText("");
                    resolution.setVisible(false);

                    if (file != null) {                                                <-------------------------- here you check condition
                        Cursor parentCursor = getShell().getCursor();
                        final Cursor waitCursor = new Cursor(getShell().getDisplay(), SWT.CURSOR_WAIT);
                        Point previewPoint = new Point(0, 0);
                        Point labelPoint = canvas.getSize();
                        InputStream stream = null;

                        try {
                            getShell().setCursor(waitCursor);
                            stream = new FileInputStream(file.getLocation().toOSString());

                            ImageData imageData = new ImageData(stream);
                            stream.close();

                            if (imageData != null) {
                                Image image = new Image(getShell().getDisplay(), imageData);

                                // set image in center
                                Point imagePoint = new Point(image.getBounds().width,
                                        image.getBounds().height);

                                String imageInfo = imagePoint.x + " x " + imagePoint.y + " px"; //$NON-NLS-1$ //$NON-NLS-2$

                                // change resolution if image anymore image label
                                if ((imagePoint.x > labelPoint.x) || (imagePoint.y > labelPoint.y)) {
                                    float ratioImage = (float) imagePoint.x / (float) imagePoint.y;

                                    if (((imagePoint.y > labelPoint.y) &&
                                            ((labelPoint.y * ratioImage) > labelPoint.x)) ||
                                            ((imagePoint.x > labelPoint.x) &&
                                            ((labelPoint.x / ratioImage) < labelPoint.y))) {
                                        imageData = imageData.scaledTo(labelPoint.x - 10,
                                                (int) (labelPoint.x / ratioImage));
                                    } else {
                                        imageData = imageData.scaledTo((int) (labelPoint.y * ratioImage) -
                                                10, labelPoint.y);
                                    }

                                    image.dispose();
                                    image = new Image(getShell().getDisplay(), imageData);
                                    imagePoint.x = image.getBounds().width;
                                    imagePoint.y = image.getBounds().height;
                                }

                                previewPoint.x = (labelPoint.x / 2) - (imagePoint.x / 2);
                                previewPoint.y = (labelPoint.y / 2) - (imagePoint.y / 2);
                                gc.drawImage(image, previewPoint.x, previewPoint.y);
                                resolution.setVisible(true);
                                resolution.setText(imageInfo);
                                image.dispose();
                                gc.dispose();                                   <-------------------------- here you dispose
                            }
                        } catch (IOException ev) {
                            //ignore
                        } catch (SWTException ex) {
                            //ignore (if select not image file) 
                        } finally {
                            getShell().setCursor(parentCursor);

                            if (stream != null) {
                                try {
                                    stream.close();
                                } catch (IOException e1) {
                                    // ignore
                                }
                            }
                        }
                    }
                }
            });
{code}
here is absolutely invalid logic, guys :)
you close the stream in two places - try to find: stream.close();
I've check a history of changes:
>>>
PMD violations fixed.
InputStreams close() added where it was possible.
>>>
8/29/08 - someone try to close all streams where it possible, after that all of you respect his authority and afraid to fix his error... 
btw., you are still has a problems with "close of all streams", after 8/29/08 changes...

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the jbosstools-issues mailing list