From 003e822bcf796e9da0506e83f8236bbccad47b27 Mon Sep 17 00:00:00 2001 From: kem Date: Wed, 3 May 2023 11:41:58 +0100 Subject: [PATCH] #10: Update getPalette to load palette file from kbInstallFolder rather than /static/data. Create new getImage REST method to get an image stored in kbInstallFolder (icons folder). --- .../systemmodeller/rest/ModelController.java | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/main/java/uk/ac/soton/itinnovation/security/systemmodeller/rest/ModelController.java b/src/main/java/uk/ac/soton/itinnovation/security/systemmodeller/rest/ModelController.java index 9c4425ca..3970e477 100644 --- a/src/main/java/uk/ac/soton/itinnovation/security/systemmodeller/rest/ModelController.java +++ b/src/main/java/uk/ac/soton/itinnovation/security/systemmodeller/rest/ModelController.java @@ -32,7 +32,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; -import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.rmi.UnexpectedException; import java.text.SimpleDateFormat; import java.util.Date; @@ -53,13 +54,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.jena.query.Dataset; import org.keycloak.representations.idm.UserRepresentation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -80,7 +81,6 @@ import uk.ac.soton.itinnovation.security.modelquerier.dto.RiskCalcResultsDB; import uk.ac.soton.itinnovation.security.modelvalidator.ModelValidator; import uk.ac.soton.itinnovation.security.modelvalidator.Progress; -import uk.ac.soton.itinnovation.security.semanticstore.AStoreWrapper; import uk.ac.soton.itinnovation.security.semanticstore.IStoreWrapper; import uk.ac.soton.itinnovation.security.semanticstore.util.SparqlHelper; import uk.ac.soton.itinnovation.security.systemmodeller.auth.KeycloakAdminClient; @@ -101,15 +101,9 @@ import uk.ac.soton.itinnovation.security.systemmodeller.rest.exceptions.UserForbiddenFromDomainException; import uk.ac.soton.itinnovation.security.systemmodeller.semantics.ModelObjectsHelper; import uk.ac.soton.itinnovation.security.systemmodeller.semantics.StoreModelManager; -import uk.ac.soton.itinnovation.security.systemmodeller.util.PaletteGenerator; import uk.ac.soton.itinnovation.security.systemmodeller.util.ReportGenerator; import uk.ac.soton.itinnovation.security.systemmodeller.util.SecureUrlHelper; -import uk.ac.soton.itinnovation.security.modelquerier.util.ModelStack; -import uk.ac.soton.itinnovation.security.modelquerier.JenaQuerierDB; -import uk.ac.soton.itinnovation.security.modelquerier.dto.ModelExportDB; -import uk.ac.soton.itinnovation.security.semanticstore.JenaTDBStoreWrapper; - /** * Includes all operations of the Model Controller Service. */ @@ -139,6 +133,9 @@ public class ModelController { @Value("${admin-role}") public String adminRole; + @Value("${knowledgebases.install.folder}") + private String kbInstallFolder; + /** * Take the user IDs of the model owner, editor and modifier and look up the current username for them */ @@ -511,23 +508,11 @@ public ResponseEntity> getModelRiskVector(@PathVaria String ontology = model.getDomainGraph().substring(model.getDomainGraph().lastIndexOf("/")+1); try { - String paletteFile = "/static/data/palette-" + ontology + ".json"; - URL paletteResource = this.getClass().getResource(paletteFile); - if (paletteResource == null) { - logger.warn("Palette missing: {}", paletteFile); - logger.warn("Creating now.."); - boolean paletteCreated = PaletteGenerator.createPalette(model.getDomainGraph(), modelObjectsHelper); - - if (paletteCreated) { - //try to load resource again - paletteResource = this.getClass().getResource(paletteFile); - } - - if (!paletteCreated || paletteResource == null) { - throw new NotFoundErrorException("Could not create new palette"); - } - } - map = objectMapper.readValue(new File(paletteResource.getPath()), Map.class); + String domainModelFolderPath = kbInstallFolder + File.separator + ontology; + String paletteFile = "palette.json"; + File palette = new File(domainModelFolderPath, paletteFile); + logger.info("Loading palette file: {}", palette.getAbsolutePath()); + map = objectMapper.readValue(palette, Map.class); } catch (IOException e) { logger.error("Could not read palette", e); throw new NotFoundErrorException("Could not load palette"); @@ -535,6 +520,17 @@ public ResponseEntity> getModelRiskVector(@PathVaria return ResponseEntity.ok().body(map); } + @RequestMapping(value = "/images/{domainModel}/{image}" , method = RequestMethod.GET) + public ResponseEntity getImage(@PathVariable String domainModel, @PathVariable String image) throws IOException { + String imageFile = kbInstallFolder + File.separator + domainModel + File.separator + "icons" + File.separator + image; + Path path = new File(imageFile).toPath(); + FileSystemResource resource = new FileSystemResource(path); + + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(Files.probeContentType(path))) + .body(resource); + } + /** * This method forces a checkout even if another user is currently editing a model, as for example * when a user chooses the option to take over editing of a model.