{"record":{"id":"ce7e38d09753f466","repo":"flowable/flowable-engine","slug":"decisionrequirementsdiagramgenerator-already-close","errorCode":null,"errorMessage":"DecisionRequirementsDiagramGenerator already closed","messagePattern":"DecisionRequirementsDiagramGenerator already closed","errorType":"exception","errorClass":"FlowableImageException","httpStatus":null,"severity":"error","filePath":"modules/flowable-dmn-image-generator/src/main/java/org/flowable/dmn/image/impl/DefaultDecisionRequirementsDiagramCanvas.java","lineNumber":212,"sourceCode":"            throw new FlowableImageException(\"CaseDiagramGenerator already closed\");\n        }\n\n        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {\n            ImageIO.write(decisionRequirementsDiagram, imageType, out);\n            return new ByteArrayInputStream(out.toByteArray());\n        } catch (IOException e) {\n            throw new FlowableImageException(\"Error while generating case image\", e);\n        }\n    }\n\n    /**\n     * Generates an image of what currently is drawn on the canvas.\n     *\n     * Throws an {@link FlowableImageException} when {@link #close()} is already called.\n     */\n    public BufferedImage generateBufferedImage(String imageType) {\n        if (closed) {\n            throw new FlowableImageException(\"DecisionRequirementsDiagramGenerator already closed\");\n        }\n\n        // Try to remove white space\n        minX = (minX <= 5) ? 5 : minX;\n        minY = (minY <= 5) ? 5 : minY;\n        BufferedImage imageToSerialize = decisionRequirementsDiagram;\n        imageToSerialize = decisionRequirementsDiagram.getSubimage(minX - 5, minY - 5, canvasWidth - minX + 5, canvasHeight - minY + 5);\n        return imageToSerialize;\n    }\n\n    /**\n     * Closes the canvas which disallows further drawing and releases graphical resources.\n     */\n    public void close() {\n        g.dispose();\n        closed = true;\n    }\n","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-image-generator/src/main/java/org/flowable/dmn/image/impl/DefaultDecisionRequirementsDiagramCanvas.java#L194-L230","documentation":"DefaultDecisionRequirementsDiagramCanvas.generateBufferedImage throws FlowableImageException when the canvas has been closed, mirroring generateImage. Once closed, no BufferedImage can be produced from the canvas.","triggerScenarios":"Calling generateBufferedImage(imageType) after close() was called on the same canvas instance.","commonSituations":"Requesting a BufferedImage after already exporting an InputStream via generateImage followed by close(); reusing a cached canvas after its lifecycle ended.","solutions":["Call generateBufferedImage before close().","Regenerate the diagram into a fresh canvas if a buffered image is needed later.","Restructure code so all image extraction happens inside the canvas's open lifecycle."],"exampleFix":"// before\ncanvas.close();\nBufferedImage img = canvas.generateBufferedImage(\"png\"); // throws\n// after\nBufferedImage img = canvas.generateBufferedImage(\"png\");\ncanvas.close();","handlingStrategy":"type-guard","validationCode":"if (!canvasOpen) throw new IllegalStateException(\"Canvas already closed; regenerate the diagram\");","typeGuard":"boolean canRender(DefaultDecisionRequirementsDiagramCanvas c) { return c != null && !c.isClosed(); }","tryCatchPattern":"try {\n    BufferedImage img = canvas.generateBufferedImage(\"png\");\n} catch (FlowableImageException e) {\n    logger.error(\"Canvas closed before buffered image generation\", e);\n}","preventionTips":["Extract BufferedImage before close()","Never reuse a closed canvas","Centralize canvas creation/closing in one code path"],"tags":["dmn","diagram","lifecycle","closed-resource"],"backgroundTag":"invalid-state-transition","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}