code: public static String generateObjectName(Object obj, String sourceName, String operation, String desiredName) {
      if (Strings.isNullOrEmpty(desiredName)) {
  
        if (Strings.isNullOrEmpty(sourceName)) {
          return generateUniqueName(obj);
  
        } else if (Strings.isNullOrEmpty(operation)) {
          desiredName = sourceName;
  
        } else {
          desiredName = String.format("%s_%s", sourceName, operation);
        }
  
      }
  
      desiredName = desiredName.replace("-", "_");
      return (Strings.isNullOrEmpty(desiredName) || desiredName.length() > MAX_DESIRED_NAME_LEN) ? generateUniqueName(obj)
          : ensureUniqueness(desiredName);
    }
docs: Heuristic: if the source/parent already has a table name then we can add something that identifies the operation.
  Plus a unique extension if needed. If the starting name is already too long, we call that a degenerate case, for
  which we go back to UUID-based. All this is overridden if the caller specifies a desired name. For the desired name
  we still attach an extension if needed to make it unique.
  
  @param obj         object to be named, no hyphens
  @param sourceName  the name of the source object, if any, based on which we will generate the name
  @param operation   the name/brief description of the operation, if any, which we would use as an extension to the sourceName
  @param desiredName the desired name to be used, if any
  @return