package com.vtence.molecule.middlewares;
import com.vtence.molecule.Application;
import com.vtence.molecule.Request;
import com.vtence.molecule.Response;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class StaticAssets extends AbstractMiddleware {
private final Application fileServer;
private final List<String> urls = new ArrayList<>();
private String indexFile = "index.html";
public StaticAssets(Application fileServer, String... urls) {
this.fileServer = fileServer;
serve(urls);
}
public StaticAssets serve(String... urls) {
this.urls.addAll(Arrays.asList(urls));
return this;
}
public StaticAssets index(String indexFile) {
this.indexFile = indexFile;
return this;
}
public void handle(Request request, Response response) throws Exception {
if (canServe(request.path())) {
serve(request, response);
} else {
forward(request, response);
}
}
private void serve(Request request, Response response) throws Exception {
if (targetsDirectory(request)) {
request.path(request.path() + indexFile);
}
fileServer.handle(request, response);
}
private boolean targetsDirectory(Request request) {
return request.path().endsWith("/");
}
private boolean canServe(String path) throws Exception {
return routeDefinedFor(path).isPresent();
}
private Optional<String> routeDefinedFor(String path) {
return urls.stream().filter(path::startsWith).findFirst();
}
}