StaticController.java 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package com.provectus.kafka.ui.controller;
  2. import com.provectus.kafka.ui.util.ResourceUtil;
  3. import java.util.concurrent.atomic.AtomicReference;
  4. import lombok.RequiredArgsConstructor;
  5. import lombok.SneakyThrows;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.core.io.Resource;
  9. import org.springframework.http.ResponseEntity;
  10. import org.springframework.web.bind.annotation.GetMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. import org.springframework.web.server.ServerWebExchange;
  13. import reactor.core.publisher.Mono;
  14. @RestController
  15. @RequiredArgsConstructor
  16. @Slf4j
  17. public class StaticController {
  18. @Value("classpath:static/index.html")
  19. private Resource indexFile;
  20. @Value("classpath:static/manifest.json")
  21. private Resource manifestFile;
  22. private final AtomicReference<String> renderedIndexFile = new AtomicReference<>();
  23. private final AtomicReference<String> renderedManifestFile = new AtomicReference<>();
  24. @GetMapping(value = "/index.html", produces = {"text/html"})
  25. public Mono<ResponseEntity<String>> getIndex(ServerWebExchange exchange) {
  26. return Mono.just(ResponseEntity.ok(getRenderedFile(exchange, renderedIndexFile, indexFile)));
  27. }
  28. @GetMapping(value = "/manifest.json", produces = {"application/json"})
  29. public Mono<ResponseEntity<String>> getManifest(ServerWebExchange exchange) {
  30. return Mono.just(ResponseEntity.ok(getRenderedFile(exchange, renderedManifestFile, manifestFile)));
  31. }
  32. public String getRenderedFile(ServerWebExchange exchange, AtomicReference<String> renderedFile, Resource file) {
  33. String rendered = renderedFile.get();
  34. if (rendered == null) {
  35. rendered = buildFile(file, exchange.getRequest().getPath().contextPath().value());
  36. if (renderedFile.compareAndSet(null, rendered)) {
  37. return rendered;
  38. } else {
  39. return renderedFile.get();
  40. }
  41. } else {
  42. return rendered;
  43. }
  44. }
  45. @SneakyThrows
  46. private String buildFile(Resource file, String contextPath) {
  47. return ResourceUtil.readAsString(file)
  48. .replace("\"/assets/", "\"" + contextPath + "/assets/")
  49. .replace("\"/favicon/", "\"" + contextPath + "/favicon/")
  50. .replace("/manifest.json", contextPath + "/manifest.json")
  51. .replace("window.basePath = ''", "window.basePath=\"" + contextPath + "\"");
  52. }
  53. }