private boolean checkProperties(Type type, Request request, Predicate predicate)
      throws UnsupportedPropertyException {
    Set<String> requestPropertyIds = request == null ? new HashSet<>() :
        PropertyHelper.getAssociatedPropertyIds(request);

    if (predicate != null) {
      requestPropertyIds.addAll(PredicateHelper.getPropertyIds(predicate));
    }

    if (requestPropertyIds.size() > 0) {
      ResourceProvider provider = ensureResourceProvider(type);
      requestPropertyIds = provider.checkPropertyIds(requestPropertyIds);

      if (requestPropertyIds.size() > 0) {
        List<PropertyProvider> propertyProviders = ensurePropertyProviders(type);
        for (PropertyProvider propertyProvider : propertyProviders) {
          requestPropertyIds = propertyProvider.checkPropertyIds(requestPropertyIds);
          if (requestPropertyIds.size() == 0) {
            return false;
          }
        }
        throw new UnsupportedPropertyException(type, requestPropertyIds);
      }
    }
    return true;
  }
Check to make sure that all the property ids specified in the given request and
predicate are supported by the resource provider or property providers for the
given type.

@param type       the resource type
@param request    the request
@param predicate  the predicate

@return true if all of the properties specified in the request and predicate are supported by
        the resource provider for the given type; false if any of the properties specified in
        the request and predicate are not supported by the resource provider but are supported
        by a property provider for the given type.

@throws UnsupportedPropertyException thrown if any of the properties specified in the request
                                     and predicate are not supported by either the resource
                                     provider or a property provider for the given type
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterControllerImpl.java