docs: public final StringProperty recurrenceRuleProperty() {
          if (recurrenceRule == null) {
              recurrenceRule = new SimpleStringProperty(null, "recurrenceRule") { //$NON-NLS-1$
                  @Override
                  public void set(String newRecurrence) {
                      String oldRecurrence = get();
  
                      if (!Util.equals(oldRecurrence, newRecurrence)) {
  
                          Calendar calendar = getCalendar();
  
                          if (calendar != null && !isRecurrence()) {
                              calendar.impl_removeEntry(Entry.this);
                          }
  
                          super.set(newRecurrence);
  
                          updateRecurrenceEndProperty(newRecurrence);
  
                          if (calendar != null) {
                              if (!isRecurrence()) {
                                  calendar.impl_addEntry(Entry.this);
                              }
                              calendar.fireEvent(new CalendarEvent(CalendarEvent.ENTRY_RECURRENCE_RULE_CHANGED, calendar, Entry.this, oldRecurrence));
                          }
                      }
                  }
  
                  private void updateRecurrenceEndProperty(String newRecurrence) {
                      if (newRecurrence != null && !newRecurrence.trim().equals("")) { //$NON-NLS-1$
                          try {
                              RRule rule = new RRule(newRecurrence);
                              DateValue until = rule.getUntil();
                              if (until != null) {
                                  setRecurrenceEnd(LocalDate.of(until.year(), until.month(), until.day()));
                              } else {
                                  setRecurrenceEnd(LocalDate.MAX);
                              }
                          } catch (ParseException e) {
                              e.printStackTrace();
                          }
                      } else {
                          setRecurrenceEnd(LocalDate.MAX);
                      }
                  }
              };
          }
  
          return recurrenceRule;
      }