docs: @Override
      public Timer createCalendarTimer(ScheduleExpression schedule, TimerConfig timerConfig)
      {
          Serializable info = timerConfig == null ? null : timerConfig.getInfo();
          boolean persistent = timerConfig == null || timerConfig.isPersistent();
  
          boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "createCalendarTimer: " + persistent, this);
  
          // Bean must implement TimedObject interface or have a timeout method to create a timer.
          if (!home.beanMetaData.isTimedObject)
          {
              IllegalStateException ise = new IllegalStateException(
                              "Timer Service: Bean does not implement TimedObject: " + beanId);
  
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "createCalendarTimer: " + ise);
              throw ise;
          }
  
          if (home.beanMetaData.isEntityBean()) // d595255
          {
              IllegalStateException ise = new IllegalStateException(
                              "Timer Service: Entity beans cannot use calendar-based timers: " + beanId);
  
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "createCalendarTimer: " + ise);
              throw ise;
          }
  
          // Determine if this bean is in a state that allows timer service
          // method access - throws IllegalStateException if not allowed.
          checkTimerServiceAccess();
  
          // Make sure the arguments are valid....
          if (schedule == null)
          {
              IllegalArgumentException ise = new IllegalArgumentException(
                              "TimerService: schedule not a valid value: null");
  
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "createCalendarTimer: " + ise);
              throw ise;
          }
  
          Timer timer = container.getEJBRuntime().createTimer(this, null, -1, schedule, info, persistent); // F743-13022
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "createCalendarTimer: " + timer);
          return timer;
      }