docs: private void mapUnspecifiedTimers(Map<String, List<com.ibm.ws.javaee.dd.ejb.Timer>> timers0ParmByMethodName,
                                        Map<String, List<com.ibm.ws.javaee.dd.ejb.Timer>> timers1ParmByMethodName,
                                        Map<String, List<com.ibm.ws.javaee.dd.ejb.Timer>> timersUnspecifiedParmByMethodName,
                                        Class<?> beanClass,
                                        BeanMetaData bmd) throws EJBConfigurationException {
          //F743-15870CodRv
          //There are four scenarios we must deal with here:
          //
          //scenario 1: methodName is defined once in the hierarchy
          //
          //       This is valid.  Timers should be associated with the Method.
          //
          //scenario 2: methodName is defined on both child and parent class,
          //            both methods are non-private, and both methods have the
          //            same parameter list (0 or 1).
          //
          //       This is valid.  The method on the child class overrides the
          //       method on the parent class.  Timers should be associated
          //       with the Method on the child class.
          //
          //scenario 3: methodName is defined on both child and parent class,
          //            at least one method is private, and both methods have
          //            same parameter list (0 or 1).
          //
          //       This is valid.  There is no overriding that takes place because
          //       one of the methods is private, but that doesn't matter.  The
          //       timers should still be associated with the Method on the child
          //       class.
          //
          //scenario 4: methodName is defined in multiple places (once a child and once on parent class,
          //            or twice on the same class, etc), and the two definitions take *different*
          //            parm lists (0 and 1).
          //
          //       This is NOT valid.  This is called ambiguous by the spec
          //       (regardless of whether either the methods is private or not) and
          //       is a deployment error.
  
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled()) {
              Tr.entry(tc, "mapUnspecifiedTimers", new Object[] { timersUnspecifiedParmByMethodName });
          }
  
          Map<String, Integer> unspecParamCounts = new HashMap<String, Integer>();
          String ambiguousTimer = null;
          for (MethodMap.MethodInfo methodInfo : MethodMap.getAllDeclaredMethods(beanClass)) {
              Method method = methodInfo.getMethod();
              String methodName = methodInfo.getMethod().getName();
  
              if (timersUnspecifiedParmByMethodName.containsKey(methodName) &&
                  hasTimeoutCallbackParameters(methodInfo)) {
                  //Method has a signature that makes it a valid recipient of a
                  //timer callback, and its got the same name as method that was
                  //targeted by undefined xml timers.
  
                  Integer currentCount = unspecParamCounts.get(methodName);
  
                  if (isTraceOn && tc.isDebugEnabled())
                      Tr.debug(tc, "method=" + method + ", currentCount=" + currentCount);
  
                  if (currentCount == null) {
                      //scenario #1
                      //This is the first time we've encountered a callback
                      //eligible method of this name in the bean's class
                      //heirarchy. Indicate whether the undefined timers targeting
                      //this method should go into the 0 or 1 parm list.
                      unspecParamCounts.put(methodName, methodInfo.getNumParameters());
                  } else {
                      //This is NOT the first time we've encountered a callback
                      //eligible method of this name in the bean's class
                      //heirarchy.  Determine if this is a deployment error or not.
                      if (currentCount != methodInfo.getNumParameters()) {
                          //scenario #4
                          ambiguousTimer = methodName;
                          Tr.error(tc, "AUTOMATIC_TIMER_METHOD_AMBIGUOUS_CNTR0314E",
                                   new Object[] { bmd.j2eeName.getComponent(), bmd.j2eeName.getModule(), methodName });
                      } else {
                          //scenario #2 or scenario #3
                          if (isTraceOn && tc.isDebugEnabled()) {
                              Tr.debug(tc, "Encountered an additional definition of Method **" + methodName + "** in the class hierarchy, but " +
                                           "not flagging this as an ambiguous situation because the method has the same number of parms as the " +
                                           "method of the same name on the child class.");
                          }
                      }
                  }
              }
          }
  
          //Fail if we have any ambiguous timers
          if (ambiguousTimer != null) {
  
              throw new EJBConfigurationException("CNTR0314: The " + bmd.j2eeName.getComponent()
                                                  + " enterprise bean in the " + bmd.j2eeName.getModule()
                                                  + " module has an automatic timer configured in the deployment descriptor targeting the " + ambiguousTimer
                                                  + " method, but does not indicate if the targeted method accepts zero or one parameters, and both"
                                                  + " zero and one parameter versions of the method exist in the bean's class hierarchy, so the"
                                                  + " EJB container is unable to determine which of the methods the timer must target.");
          }
  
          //At this point we have determined which group (0 or 1 parm)
          //each methodName targetted by unspecified xml timers belongs to.
          //
          //Now, add the timers targeting these methodNames to the
          //correct 0 or 1 parm list.
          for (String methodTargetedByUnspecifiedParms : timersUnspecifiedParmByMethodName.keySet()) {
              Integer paramCount = unspecParamCounts.get(methodTargetedByUnspecifiedParms);
              if (paramCount == null) {
                  //An unspecified timer was defined in xml, but we failed to associated
                  //that with a Method in the bean's class heirarchy
                  Tr.error(tc, "AUTOMATIC_TIMER_METHOD_NOT_FOUND_CNTR0210E",
                           new Object[] { bmd.j2eeName.getComponent(), bmd.j2eeName.getModule(), methodTargetedByUnspecifiedParms });
  
                  throw new EJBConfigurationException("CNTR0210: The " + bmd.j2eeName.getComponent()
                                                      + " enterprise bean in the " + bmd.j2eeName.getModule()
                                                      + " module has an automatic timer configured in the deployment descriptor for the " + methodTargetedByUnspecifiedParms
                                                      + " method, but no timeout callback method with that name was found.");
              } else if (paramCount == 0) {
                  addUnspecifiedTimersToMap(timers0ParmByMethodName,
                                            methodTargetedByUnspecifiedParms,
                                            timersUnspecifiedParmByMethodName);
              } else {
                  addUnspecifiedTimersToMap(timers1ParmByMethodName,
                                            methodTargetedByUnspecifiedParms,
                                            timersUnspecifiedParmByMethodName);
              }
          }
  
          if (isTraceOn) {
              if (tc.isDebugEnabled()) {
                  Tr.debug(tc, "List of xml timers explicitly specifiying 0 parm: **" + timers0ParmByMethodName + "**");
                  Tr.debug(tc, "List of xml timers explicitly specifiying 1 parms: **" + timers1ParmByMethodName + "**");
              }
              if (tc.isEntryEnabled()) {
                  Tr.exit(tc, "mapUnspecifiedTimers");
              }
          }
  
      }