code: protected Collection<Asset> getFilteredAssets(Collection<ResourceType> types, Collection<String> productIds, Visibility visibility, Collection<String> productVersions,
                                                    boolean unboundedMaxVersion) throws IOException, RequestFailureException {
          Map<FilterableAttribute, Collection<String>> filters = new HashMap<FilterableAttribute, Collection<String>>();
          if (types != null && !types.isEmpty()) {
              Collection<String> typeValues = new HashSet<String>();
              for (ResourceType type : types) {
                  typeValues.add(type.getValue());
              }
              filters.put(FilterableAttribute.TYPE, typeValues);
          }
          filters.put(FilterableAttribute.PRODUCT_ID, productIds);
          if (visibility != null) {
              filters.put(FilterableAttribute.VISIBILITY, Collections.singleton(visibility.toString()));
          }
          filters.put(FilterableAttribute.PRODUCT_MIN_VERSION, productVersions);
  
          if (unboundedMaxVersion) {
              filters.put(FilterableAttribute.PRODUCT_HAS_MAX_VERSION, Collections.singleton(Boolean.FALSE.toString()));
          }
          return getFilteredAssets(filters);
      }
docs: Implementation for the filtered get methods {@link #getAssets(Collection, String, Visibility, String)} and
  {@link #getAssetsWithUnboundedMaxVersion(Collection, String, Visibility)}.
  
  @param types
  The types to look for or <code>null</code> will return all types
  @param productIds The product IDs to look for or <code>null</code> will return assets for any product ID
  @param visibility The visibility to look for or <code>null</code> will return all visibility values (or none)
  @param productVersions The value of the minimum version in the appliesToFilterInfo to look for
  @param unboundedMaxVersion <code>true</code> if
  @return
  @throws IOException
  @throws RequestFailureException