/**
   * Add users and roles to the string representation of a JSON msg.
   *
   * @param base
   * @param singleRoles
   * @param groupRoles
   * @param users
   * @return the base String with the necessary fields to add users and roles
   */
  private String concatUsersAndRoles(
      String base,
      Collection<String> singleRoles,
      Collection<String> groupRoles,
      Collection<String> users) {

    // insert roles to users mapping
    JSONObject res = new JSONObject(base);

    JSONArray userArray = new JSONArray(users);

    for (String role : singleRoles) {
      JSONObject o = new JSONObject();
      o.put("title", "Role: " + role);
      o.put("type", "string");
      o.put("enum", userArray);
      o.put("required", true);
      res.getJSONObject("schema").put(SINGLE_USER_KEY_PREFIX + role, o);
    }

    for (String role : groupRoles) {
      JSONObject items = new JSONObject();
      items.put("type", "string");
      items.put("enum", userArray);

      JSONObject o = new JSONObject();
      o.put("title", "Group Role: " + role);
      o.put("type", "array");
      o.put("items", items);
      o.put("minItems", 1);
      o.put("required", true);
      res.getJSONObject("schema").put(GROUP_USER_KEY_PREFIX + role, o);
    }

    JSONObject rolesForm = new JSONObject();
    rolesForm.put("type", "fieldset");
    rolesForm.put("title", "Roles Assignment");

    JSONArray items = new JSONArray();
    for (String role : singleRoles) {
      JSONObject o = new JSONObject();
      o.put("key", SINGLE_USER_KEY_PREFIX + role);
      items.put(o);
    }
    for (String role : groupRoles) {
      JSONObject o = new JSONObject();
      o.put("key", GROUP_USER_KEY_PREFIX + role);
      o.put("type", "checkboxes");
      items.put(o);
    }

    rolesForm.put("items", items);

    JSONArray form = res.getJSONArray("form");
    // remove this object and insert it back at the end
    Object submitButton = form.remove(form.length() - 1);
    form.put(rolesForm);
    form.put(submitButton);

    return res.toString();
  }