package games.strategy.engine.data.util; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Arrays; import java.util.Objects; import games.strategy.engine.data.GameData; import games.strategy.engine.data.Resource; import games.strategy.engine.data.ResourceCollection; import games.strategy.engine.data.ResourceList; import games.strategy.triplea.Constants; /** * A collection of methods that operate on or return resource collections. */ public final class ResourceCollectionUtils { private ResourceCollectionUtils() { // do nothing } /** * Returns a copy of the specified resource collection filtered to exclude the blacklisted resources. * * @param unfiltered The resource collection to filter; must not be {@code null}. * @param resources The blacklisted resources to exclude; must not be {@code null}. * * @return The filtered resource collection; never {@code null}. * * @throws IllegalArgumentException If {@code resources} contains a {@code null} element. */ public static ResourceCollection exclude(final ResourceCollection unfiltered, final Resource... resources) { checkNotNull(unfiltered); checkNotNull(resources); checkArgument(Arrays.stream(resources).noneMatch(Objects::isNull), "resources must not contain null"); final ResourceCollection filtered = new ResourceCollection(unfiltered); Arrays.stream(resources).forEach(filtered::removeAllOfResource); return filtered; } /** * Returns a copy of the specified resource collection filtered to exclude the blacklisted resources with the given * names. * * @param unfiltered The resource collection to filter; must not be {@code null}. * @param names The names of the blacklisted resources to exclude; must not be {@code null}. * * @return The filtered resource collection; never {@code null}. * * @throws IllegalArgumentException If {@code names} contains a {@code null} element. */ public static ResourceCollection exclude(final ResourceCollection unfiltered, final String... names) { checkNotNull(unfiltered); checkNotNull(names); checkArgument(Arrays.stream(names).noneMatch(Objects::isNull), "names must not contain null"); return exclude(unfiltered, mapNamesToResources(unfiltered.getData(), names)); } private static Resource[] mapNamesToResources(final GameData data, final String[] names) { data.acquireReadLock(); try { final ResourceList gameResources = data.getResourceList(); return Arrays.stream(names) .map(gameResources::getResource) .filter(Objects::nonNull) .toArray(Resource[]::new); } finally { data.releaseReadLock(); } } /** * Returns a copy of the specified resource collection filtered to include only resources that can be used to make * production purchases. * * @param unfiltered The resource collection to filter; must not be {@code null}. * * @return The filtered resource collection; never {@code null}. */ public static ResourceCollection getProductionResources(final ResourceCollection unfiltered) { checkNotNull(unfiltered); return exclude(unfiltered, Constants.TECH_TOKENS, Constants.VPS); } }