class FalseFriendRuleLoader extends DefaultHandler {

  private final String falseFriendHint;
  private final String falseFriendSugg;

  public FalseFriendRuleLoader(Language motherTongue) {
    ResourceBundle messages = JLanguageTool.getDataBroker().getResourceBundle(JLanguageTool.MESSAGE_BUNDLE, motherTongue.getLocale());
    this.falseFriendHint =  messages.getString("false_friend_hint");
    this.falseFriendSugg =  messages.getString("false_friend_suggestion");
  }

  public FalseFriendRuleLoader(String falseFriendHint, String falseFriendSugg) {
    this.falseFriendHint = Objects.requireNonNull(falseFriendHint);
    this.falseFriendSugg = Objects.requireNonNull(falseFriendSugg);
  }

  /**
   * @param file XML file with false friend rules
   * @since 2.3
   */
  public final List<AbstractPatternRule> getRules(File file, Language language, Language motherTongue) throws IOException {
    try (InputStream inputStream = new FileInputStream(file)) {
      return getRules(inputStream, language, motherTongue);
    } catch (ParserConfigurationException | SAXException e) {
      throw new IOException("Could not load false friend rules from " + file, e);
    }
  }

  public final List<AbstractPatternRule> getRules(InputStream stream,
      Language textLanguage, Language motherTongue)
      throws ParserConfigurationException, SAXException, IOException {<FILL_FUNCTION_BODY>}

}

    FalseFriendRuleHandler handler = new FalseFriendRuleHandler(
        textLanguage, motherTongue, falseFriendHint);
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    saxParser.getXMLReader().setFeature(
            "http://apache.org/xml/features/nonvalidating/load-external-dtd",
            false);
    saxParser.parse(stream, handler);
    List<AbstractPatternRule> rules = handler.getRules();
    List<AbstractPatternRule> filteredRules = new ArrayList<>();
    // Add suggestions to each rule:
    MessageFormat msgFormat = new MessageFormat(falseFriendSugg);
    ShortDescriptionProvider descProvider = new ShortDescriptionProvider();
    for (AbstractPatternRule rule : rules) {
      String patternStr = rule.getPatternTokens().stream().map(k -> k.getString()).collect(Collectors.joining(" "));
      List<String> suggestions = handler.getSuggestionMap().get(rule.getId());
      if (suggestions != null) {
        List<String> formattedSuggestions = new ArrayList<>();
        for (String suggestion : suggestions) {
          if (patternStr.equalsIgnoreCase(suggestion)) {
            continue;
          }
          String desc = descProvider.getShortDescription(suggestion, textLanguage);
          if (desc != null) {
            formattedSuggestions.add("<suggestion>" + suggestion + "</suggestion> (" + desc + ")");
          } else {
            formattedSuggestions.add("<suggestion>" + suggestion + "</suggestion>");
          }
        }
        if (formattedSuggestions.size() > 0) {
          String joined = String.join(", ", formattedSuggestions);
          rule.setMessage(rule.getMessage() + " " + msgFormat.format(new String[]{joined}));
          filteredRules.add(rule);
        }
      }
    }
    return filteredRules;
  
<methods>public void <init>() ,public void characters(char[], int, int) throws org.xml.sax.SAXException,public void endDocument() throws org.xml.sax.SAXException,public void endElement(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException,public void endPrefixMapping(java.lang.String) throws org.xml.sax.SAXException,public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException,public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException,public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException,public void notationDecl(java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException,public void processingInstruction(java.lang.String, java.lang.String) throws org.xml.sax.SAXException,public org.xml.sax.InputSource resolveEntity(java.lang.String, java.lang.String) throws java.io.IOException, org.xml.sax.SAXException,public void setDocumentLocator(org.xml.sax.Locator) ,public void skippedEntity(java.lang.String) throws org.xml.sax.SAXException,public void startDocument() throws org.xml.sax.SAXException,public void startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) throws org.xml.sax.SAXException,public void startPrefixMapping(java.lang.String, java.lang.String) throws org.xml.sax.SAXException,public void unparsedEntityDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.xml.sax.SAXException,public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException<variables>