package core.aws.resource;
import com.amazonaws.regions.Regions;
import core.aws.resource.image.AMI;
import core.aws.resource.image.Image;
import core.aws.resource.image.Images;
import core.aws.resource.vpc.Subnet;
import core.aws.resource.vpc.SubnetType;
import core.aws.resource.vpc.VPC;
import core.aws.util.StreamHelper;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
/**
* @author neo
*/
public class Resources {
private final List<Resource> resources = new ArrayList<>();
public final VPC vpc;
public Resources() {
vpc = new VPC();
resources.add(vpc);
}
public <T extends Resource> Optional<T> find(Class<T> resourceClass, String resourceId) {
return resources.stream().flatMap(StreamHelper.instanceOf(resourceClass))
.filter(resource -> resource.id.equals(resourceId))
.reduce(StreamHelper.onlyOne());
}
public <T extends Resource> T get(Class<T> resourceClass, String resourceId) {
return find(resourceClass, resourceId)
.orElseThrow(() -> new Error("can not find resource, resourceClass=" + resourceClass + ", resourceId=" + resourceId));
}
public <T extends Resource> Optional<T> onlyOne(Class<T> resourceClass) {
return resources.stream().flatMap(StreamHelper.instanceOf(resourceClass)).reduce(StreamHelper.onlyOne());
}
public <T extends Resource> T add(T resource) {
resources.add(resource);
return resource;
}
public AMI ami(Regions region, String imageId) {
Optional<Image> image = find(Image.class, imageId);
if (image.isPresent()) return image.get();
return get(Images.class, region.getName()).ami(imageId);
}
public Optional<Subnet> firstPublicSubnet() {
return resources.stream().flatMap(StreamHelper.instanceOf(Subnet.class))
.filter(resource -> resource.type == SubnetType.PUBLIC).findFirst();
}
public void validate() {
resources.forEach(resource -> resource.validate(this));
}
public Stream<Resource> stream() {
return resources.stream();
}
}