package eu.eudat.controllers; import eu.eudat.logic.managers.MetricsManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.userguide.UserGuide; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import static eu.eudat.types.Authorities.ADMIN; @RestController @CrossOrigin @RequestMapping(value = {"/api/userguide/"}) public class UserGuideController { private Environment environment; @Autowired public UserGuideController(Environment environment) { this.environment = environment; } @RequestMapping(path = "{lang}", method = RequestMethod.GET ) public ResponseEntity getUserGuide(@PathVariable(name = "lang") String lang) throws IOException { long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); MetricsManager.calculateValue("languages", (int) files); Stream walk = Files.walk(Paths.get(this.environment.getProperty("userguide.path"))); List result = walk.filter(Files::isRegularFile) .map(Path::toString).collect(Collectors.toList()); String fileName = result.stream().filter(guide -> guide.contains("_" + lang)).findFirst().orElse(null); if (fileName == null) { fileName = result.stream().filter(guide -> guide.contains("_en")).findFirst().get(); } InputStream is = new FileInputStream(fileName); String[] filepath = fileName.split("\\.")[0].split("\\\\"); String simplename = filepath[filepath.length - 1]; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentLength(is.available()); responseHeaders.setContentType(MediaType.TEXT_HTML); responseHeaders.set("Content-Disposition", "attachment;filename=" + simplename); responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); byte[] content = new byte[is.available()]; is.read(content); is.close(); return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK); } @RequestMapping(value = "current", method = RequestMethod.POST) public @ResponseBody ResponseEntity> updateGuide(@RequestBody UserGuide guide, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws Exception { String fileName = this.environment.getProperty("userguide.path") + guide.getName() + ".html"; OutputStream os = new FileOutputStream(fileName); os.write(guide.getHtml().getBytes()); os.close(); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Updated").payload("Updated")); } }