{"record":{"id":"80ef5d77da01a066","repo":"flowable/flowable-engine","slug":"error-determine-output-clause-for-position","errorCode":null,"errorMessage":"Error determine output clause for position: {}","messagePattern":"Error determine output clause for position: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"modules/flowable-dmn-xml-converter/src/main/java/org/flowable/dmn/converter/child/InputEntryParser.java","lineNumber":58,"sourceCode":"        if (!(parentElement instanceof DecisionRule rule)) {\n            return;\n        }\n\n        UnaryTests inputEntry = new UnaryTests();\n\n        inputEntry.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID));\n\n        // determine corresponding input clause based on position\n        InputClause inputClause = null;\n        DecisionTable decisionTable = (DecisionTable) decision.getExpression();\n        if (decisionTable.getInputs() != null) {\n            if (decisionTable.getInputs().get(rule.getInputEntries().size()) != null) {\n                inputClause = decisionTable.getInputs().get(rule.getInputEntries().size());\n            }\n        }\n\n        if (inputClause == null) {\n            LOGGER.warn(\"Error determine output clause for position: {}\", decisionTable.getInputs());\n        }\n\n        boolean readyWithInputEntry = false;\n        try {\n            while (!readyWithInputEntry && xtr.hasNext()) {\n                xtr.next();\n                if (xtr.isStartElement() && ELEMENT_TEXT.equalsIgnoreCase(xtr.getLocalName())) {\n                    inputEntry.setText(xtr.getElementText());\n                } else if (xtr.isStartElement() && ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {\n                    while (xtr.hasNext()) {\n                        xtr.next();\n                        if (xtr.isStartElement()) {\n                            DmnExtensionElement extensionElement = DmnXMLUtil.parseExtensionElement(xtr);\n                            migrateExtensionElement(extensionElement, inputClause);\n                            inputEntry.addExtensionElement(extensionElement);\n                        } else if (xtr.isEndElement()) {\n                            if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {\n                                break;","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-xml-converter/src/main/java/org/flowable/dmn/converter/child/InputEntryParser.java#L40-L76","documentation":"Warning logged by InputEntryParser.parseChildElement when it cannot resolve the input clause (column) that a rule's input entry belongs to. It looks up decisionTable.getInputs() at the position given by the rule's current input-entry count; if inputs is null or the position is out of range, inputClause stays null and this warning is logged, yet parsing continues and the resulting RuleInputClauseContainer has a null input clause. The DMN table's rule cells and headers are then out of sync.","triggerScenarios":"Parsing a <decisionTable> where the number of <inputEntry> elements in a <rule> exceeds the number of <input> clauses, or where <input> elements were not parsed (null getInputs()) — e.g. malformed DMN XML with mismatched rule cells vs header columns.","commonSituations":"Hand-edited .dmn tables where a rule row has more cells than header columns; corrupted export from a DMN editor; merge conflicts in .dmn files that dropped an <input> column but kept the rule cells.","solutions":["Open the .dmn file and make each <rule> contain exactly as many <inputEntry> elements as there are <input> clauses.","Validate the DMN XML against the DMN 1.1/1.2 XSD to catch the structural mismatch before deployment.","Re-export the decision table from the DMN modeling tool to regenerate consistent headers/rules.","Add a pre-deployment model validation step so the malformed table fails fast instead of producing a silently broken model."],"exampleFix":"<!-- before: 3 inputs declared but rule has 4 inputEntries -->\n<rule>\n  <inputEntry>...</inputEntry><inputEntry>...</inputEntry>\n  <inputEntry>...</inputEntry><inputEntry>...</inputEntry>\n</rule>\n<!-- after: entries match input count -->\n<rule>\n  <inputEntry>...</inputEntry><inputEntry>...</inputEntry><inputEntry>...</inputEntry>\n</rule>","handlingStrategy":"validation","validationCode":"// pre-deploy check: rule entry counts must match column counts\nlong inputs = xml.count(\"<dmn:input \");\nfor (Element rule : rules) {\n  int in = rule.getElementsByTag(\"inputEntry\").size();\n  if (in != inputs) throw new IllegalArgumentException(\n    \"Rule has \" + in + \" inputEntries but table has \" + inputs + \" inputs\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep every <rule>'s inputEntry count exactly equal to the number of <input> clauses","Run XSD validation before deployment to catch structural drift","Regenerate .dmn from the designer tool after manual merges","After conversion, assert each RuleInputClauseContainer.getInputClause() != null"],"tags":["flowable","dmn","xml-parsing","decision-table","mismatch"],"backgroundTag":"internal-invariant-violation","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}