@Override public boolean isAvailable(Resource resource) { checkNotNull(resource); checkArgument(resource instanceof DiscreteResource || resource instanceof ContinuousResource); // check if it's registered or not. Versioned<Set<Resource>> v = childMap.get(resource.parent().get()); if (v == null || !v.value().contains(resource)) { return false; } if (resource instanceof DiscreteResource) { // check if already consumed return getConsumers((DiscreteResource) resource).isEmpty(); } else { ContinuousResource requested = (ContinuousResource) resource; ContinuousResource registered = v.value() .stream() .filter(c -> c.id().equals(resource.id())) .findFirst() .map(c -> (ContinuousResource) c) .get(); if (registered.value() < requested.value()) { // Capacity < requested, can never satisfy return false; } // check if there's enough left return isAvailable(requested); } }