/**
   * Return the text of the license that the user has granted/must grant before for submit the item.
   * The license text is build using the template defined for the collection if any or the wide site
   * configuration. In the license text the following substitution can be used. {0} the eperson
   * firstname<br>
   * {1} the eperson lastname<br>
   * {2} the eperson email<br>
   * {3} the current date<br>
   * {4} the collection object that will be formatted using the appropriate LicenseArgumentFormatter
   * plugin (if defined)<br>
   * {5} the item object that will be formatted using the appropriate LicenseArgumentFormatter
   * plugin (if defined)<br>
   * {6} the eperson object that will be formatted using the appropriate LicenseArgumentFormatter
   * plugin (if defined)<br>
   * {x} any addition argument supplied wrapped in the LicenseArgumentFormatter based on his type
   * (map key)
   *
   * @see LicenseArgumentFormatter
   * @param locale
   * @param collection
   * @param item
   * @param eperson
   * @param additionalInfo
   * @return the license text obtained substituting the provided argument in the license template
   */
  public static String getLicenseText(
      Locale locale,
      Collection collection,
      Item item,
      EPerson eperson,
      Map<String, Object> additionalInfo) {
    Formatter formatter = new Formatter(locale);

    // EPerson firstname, lastname, email and the current date
    // will be available as separate arguments to make more simple produce
    // "tradition" text license
    // collection, item and eperson object will be also available
    int numArgs = 7 + (additionalInfo != null ? additionalInfo.size() : 0);
    Object[] args = new Object[numArgs];
    args[0] = eperson.getFirstName();
    args[1] = eperson.getLastName();
    args[2] = eperson.getEmail();
    args[3] = new java.util.Date();
    args[4] = new FormattableArgument("collection", collection);
    args[5] = new FormattableArgument("item", item);
    args[6] = new FormattableArgument("eperson", eperson);

    if (additionalInfo != null) {
      int i = 7; // Start is next index after previous args
      for (Map.Entry<String, Object> info : additionalInfo.entrySet()) {
        args[i] = new FormattableArgument(info.getKey(), info.getValue());
        i++;
      }
    }

    String licenseTemplate = collection.getLicense();

    return formatter.format(licenseTemplate, args).toString();
  }