code: public static String getDependencyIssue(AddOn.BaseRunRequirements requirements) {
          if (!requirements.hasDependencyIssue()) {
              return null;
          }
  
          List<Object> issueDetails = requirements.getDependencyIssueDetails();
          switch (requirements.getDependencyIssue()) {
          case CYCLIC:
              return "Cyclic dependency with: " + issueDetails.get(0);
          case OLDER_VERSION:
              return "Older version still installed: " + issueDetails.get(0);
          case MISSING:
              String addOnId = (String) issueDetails.get(0);
              return MessageFormat.format("Add-On with ID \"{0}\"", addOnId);
          case VERSION:
              AddOn addOn = (AddOn) issueDetails.get(0);
              return MessageFormat.format(
                      "Add-on \"{0}\" with version matching {1} (found version {2})",
                      addOn.getName(),
                      issueDetails.get(1),
                      addOn.getSemVer() != null ? addOn.getSemVer() : addOn.getVersion());
          default:
              LOGGER.warn("Failed to handle dependency issue with name \"" + requirements.getDependencyIssue().name()
                      + "\" and details: " + issueDetails);
              return null;
          }
      }
docs: Returns the textual representation of the issue that prevents the add-on or extension from being run, if any.
  <p>
  The messages are not internationalised, should be used only for logging and non UI uses.
  
  @param requirements the run requirements of the add-on or extension
  @return a {@code String} representing the running issue, {@code null} if none.