List<Service> buildServices(@Nullable Object servicesRaw) {
    if (null == servicesRaw) {
      return ImmutableList.of();
    }
    List<Service> services = new ArrayList<>();
    for (Map<String, Object> serviceAsMap: (Collection<Map<String, Object>>)servicesRaw) {
      String serviceName = (String)serviceAsMap.get(NAME);
      Object componentsRaw = serviceAsMap.get(COMPONENTS);
      Object filtersRaw = serviceAsMap.get(FILTERS);
      services.add(Service.create(serviceName,
          buildQuickLinkFilters(filtersRaw),
          buildComponents(componentsRaw)));
    }
    return services;
  }
@param globalFiltersRaw The data in the request belonging to the "quicklinks_profile/filters" key.
@param serviceFiltersRaw The data in the request belonging to "quicklinks_profile/services"
@return The quicklinks profile as Json encoded string.
@throws QuickLinksProfileEvaluationException when the received data defines an invalid profile. This can be of various
   reasons: the received data is has invalid structure, critical data is missing or there are contradicting filter
   rules in the profile
ambari-server/src/main/java/org/apache/ambari/server/state/quicklinksprofile/QuickLinksProfileBuilder.java