{"record":{"id":"0b397429ba9de1c2","repo":"SonarSource/sonarqube","slug":"only-level-1-2-3-and-4-are-supported","errorCode":null,"errorMessage":"Only level 1, 2, 3 and 4 are supported","messagePattern":"Only level 1, 2, 3 and 4 are supported","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sonar-core/src/main/java/org/sonar/core/extension/PlatformLevelPredicates.java","lineNumber":45,"sourceCode":"  private PlatformLevelPredicates() {\n    // prevents instantiation\n  }\n\n  public static Predicate<Object> hasPlatformLevel(int i) {\n    checkSupportedLevel(i, null);\n    return o -> {\n      PlatformLevel platformLevel = AnnotationUtils.getAnnotation(o, PlatformLevel.class);\n      return platformLevel != null && checkSupportedLevel(platformLevel.value(), o) == i;\n    };\n  }\n\n  private static int checkSupportedLevel(int i, @Nullable Object annotatedObject) {\n    boolean supported = i >= 1 && i <= 4;\n    if (supported) {\n      return i;\n    }\n\n    throw new IllegalArgumentException(buildErrorMsgFrom(annotatedObject));\n  }\n\n  private static String buildErrorMsgFrom(@Nullable Object annotatedObject) {\n    String baseErrorMsg = \"Only level 1, 2, 3 and 4 are supported\";\n    if (annotatedObject == null) {\n      return baseErrorMsg;\n    } else if (annotatedObject instanceof Class classAnnotatedObject) {\n      return String.format(\"Invalid value for annotation %s on class '%s'. %s\",\n        PlatformLevel.class.getName(), classAnnotatedObject.getName(),\n        baseErrorMsg);\n    } else {\n      return String.format(\"Invalid value for annotation %s on object of type %s. %s\",\n        PlatformLevel.class.getName(), annotatedObject.getClass().getName(), baseErrorMsg);\n    }\n  }\n\n  public static Predicate<Object> hasPlatformLevel4OrNone() {\n    return o -> {","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/sonar-core/src/main/java/org/sonar/core/extension/PlatformLevelPredicates.java#L27-L63","documentation":"PlatformLevelPredicates validates @PlatformLevel annotations and only accepts levels 1-4. Passing any other int to checkSupportedLevel throws IllegalArgumentException (with object context appended when available).","triggerScenarios":"Using PlatformLevelPredicates.hasPlatformLevel(n) or hasPlatformLevel4OrNone with n outside 1-4, or an annotated object carrying an out-of-range level value.","commonSituations":"Custom predicates built with a hardcoded level like 0 or 5; refactors that changed level enum ordinals; incorrect custom annotation processing.","solutions":["Use a platform level between 1 and 4","Use the PlatformLevel enum constants instead of raw ints","Review the annotated object named in the appended error message"],"exampleFix":"// before\nPredicate<Object> p = PlatformLevelPredicates.hasPlatformLevel(5);\n// after\nPredicate<Object> p = PlatformLevelPredicates.hasPlatformLevel(4);","handlingStrategy":"validation","validationCode":"if (level < 1 || level > 4) {\n  throw new IllegalArgumentException(\"Platform level must be 1-4, got: \" + level);\n}\nPredicate<Object> p = PlatformLevelPredicates.hasPlatformLevel(level);","typeGuard":null,"tryCatchPattern":"try {\n  return PlatformLevelPredicates.hasPlatformLevel(level);\n} catch (IllegalArgumentException e) {\n  LOG.warn(\"Invalid platform level, defaulting to 1\", e);\n  return PlatformLevelPredicates.hasPlatformLevel(1);\n}","preventionTips":["Always derive levels from the PlatformLevel enum, not raw ints","Clamp or assert user-supplied levels before building predicates","Add unit tests covering boundary levels 1 and 4"],"tags":["validation","range","annotations"],"backgroundTag":"value-out-of-range","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}