{"record":{"id":"899f13995befdb21","repo":"theonedev/onedev","slug":"malformed-review-requirement","errorCode":null,"errorMessage":"Malformed review requirement","messagePattern":"Malformed review requirement","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/util/reviewrequirement/ReviewRequirement.java","lineNumber":43,"sourceCode":"\tpublic ReviewRequirement(List<User> users, Map<Group, Integer> groups) {\n\t\tthis.users = users;\n\t\tthis.groups = groups;\n\t}\n\t\n\tpublic static ReviewRequirement parse(@Nullable String requirementString) {\n\t\tList<User> users = new ArrayList<>();\n\t\tMap<Group, Integer> groups = new LinkedHashMap<>();\n\t\t\n\t\tif (requirementString != null) {\n\t\t\tCharStream is = CharStreams.fromString(requirementString); \n\t\t\tReviewRequirementLexer lexer = new ReviewRequirementLexer(is);\n\t\t\tlexer.removeErrorListeners();\n\t\t\tlexer.addErrorListener(new BaseErrorListener() {\n\n\t\t\t\t@Override\n\t\t\t\tpublic void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line,\n\t\t\t\t\t\tint charPositionInLine, String msg, RecognitionException e) {\n\t\t\t\t\tthrow new RuntimeException(\"Malformed review requirement\");\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\tCommonTokenStream tokens = new CommonTokenStream(lexer);\n\t\t\tReviewRequirementParser parser = new ReviewRequirementParser(tokens);\n\t\t\tparser.removeErrorListeners();\n\t\t\tparser.setErrorHandler(new BailErrorStrategy());\n\t\t\t\n\t\t\tRequirementContext requirementContext = parser.requirement();\n\t\t\t\n\t\t\tfor (CriteriaContext criteria: requirementContext.criteria()) {\n\t\t\t\tif (criteria.userCriteria() != null) {\n\t\t\t\t\tString userName = getValue(criteria.userCriteria().Value());\n\t\t\t\t\tUser user = OneDev.getInstance(UserService.class).findByName(userName);\n\t\t\t\t\tif (user != null) {\n\t\t\t\t\t\tif (!users.contains(user)) \n\t\t\t\t\t\t\tusers.add(user);\n\t\t\t\t\t\telse ","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/util/reviewrequirement/ReviewRequirement.java#L25-L61","documentation":"ReviewRequirement.parse uses an ANTLR lexer with a custom BaseErrorListener; any tokenization failure of the review requirement expression is converted to a plain RuntimeException with this message. It means the requirement string does not conform to the ReviewRequirement grammar, so no review requirement can be built. It is thrown from the lexer stage, before any user/group resolution happens.","triggerScenarios":"Calling ReviewRequirement.parse (via reviewRequirement) with a syntactically invalid expression, e.g. missing quotes around a user name, unbalanced parentheses, or unknown tokens like 'usr: bob'.","commonSituations":"Typo'd or hand-edited review requirement in branch protection / pull request review settings; copying requirements between tools with slightly different syntax; shell escaping stripping quotes so the parser sees raw characters.","solutions":["Fix the review requirement syntax (quote user/group names, balance parentheses, use valid criteria keywords)","Check for shell/YAML quoting that stripped or mangled quotes in the stored requirement string","Catch RuntimeException and surface a message pointing at the invalid requirement text"],"exampleFix":"// before\nreviewRequirement = \"developers (2\";\n// after\nreviewRequirement = \"(group:developers and 2)\";","handlingStrategy":"validation","validationCode":"try {\n    ReviewRequirement.parse(requirementString);\n} catch (RuntimeException e) {\n    throw new ExplicitException(\"Invalid review requirement: \" + requirementString);\n}","typeGuard":null,"tryCatchPattern":"try {\n    ReviewRequirement.parse(req);\n} catch (RuntimeException e) {\n    log.error(\"Malformed review requirement: {}\", req, e);\n}","preventionTips":["Keep requirement strings in typed config objects, not free text","Validate the requirement at settings-save time, not runtime","Use the UI editor rather than hand-writing requirement expressions"],"tags":["parser","antlr","review-requirement","syntax"],"backgroundTag":"schema-validation-failed","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}