package com.kodcu.controller;
import com.kodcu.config.LocationConfigBean;
import com.kodcu.other.Current;
import com.kodcu.service.DirectoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.Optional;
import static org.springframework.web.bind.annotation.RequestMethod.*;
/**
* Created by usta on 05.09.2015.
*/
@Controller
public class DynamicResource {
private final Current current;
private final DirectoryService directoryService;
private final FileService fileService;
private final CommonResource commonResource;
private final LocationConfigBean locationConfigBean;
private final ApplicationController controller;
@Autowired
public DynamicResource(Current current, DirectoryService directoryService, FileService fileService, CommonResource commonResource, LocationConfigBean locationConfigBean, ApplicationController controller) {
this.current = current;
this.directoryService = directoryService;
this.fileService = fileService;
this.commonResource = commonResource;
this.locationConfigBean = locationConfigBean;
this.controller = controller;
}
@RequestMapping(value = {"/afx/dynamic", "/afx/dynamic/**", "/afx/dynamic/*.*"}, method = {GET, HEAD, OPTIONS, POST}, produces = "*/*", consumes = "*/*")
@ResponseBody
public void onrequest(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "p", required = false) String p) {
Payload payload = new Payload(request, response);
payload.setPattern("/afx/dynamic/");
if (Objects.nonNull(p)) {
if (p.contains("asciidoctor-default.css")) {
Optional<String> stylesheetDefault = Optional.ofNullable(locationConfigBean.getStylesheetDefault());
processResource(payload, stylesheetDefault);
return;
} else if (p.contains("asciidoctor-default-overrides.css")) {
Optional<String> stylesheetDefault = Optional.ofNullable(locationConfigBean.getStylesheetOverrides());
processResource(payload, stylesheetDefault);
return;
}
}
if (payload.getFinalURI().contains("MathJax.js")) {
Optional<String> mathjax = Optional.ofNullable(locationConfigBean.getMathjax());
processResource(payload, mathjax);
} else {
Path path = directoryService.findPathInPublic(payload.getFinalURI());
if (Files.exists(path)) {
fileService.processFile(payload, path);
} else {
commonResource.processPayload(payload);
}
}
}
private void processResource(Payload payload, Optional<String> resourceOptional) {
Optional<String> httpOptional = resourceOptional
.map(String::trim)
.filter(e -> e.startsWith("http"));
Optional<Path> pathOptional = resourceOptional
.filter(e -> !e.isEmpty())
.filter(e -> !e.startsWith("http"))
.map(String::trim)
.map(Paths::get)
.filter(Files::exists)
.filter(e -> !Files.isDirectory(e));
if (httpOptional.isPresent()) {
payload.sendRedirect(httpOptional.get());
} else if (pathOptional.isPresent()) {
Path path = pathOptional.get();
fileService.processFile(payload, path);
} else {
fileService.processFile(payload, controller.getConfigPath().resolve("public").resolve(payload.getFinalURI()));
}
}
}