diff --git a/mozen/pom.xml b/mozen/pom.xml index dfe5cd84531de1119e98c0d253c2477ce9d7687d..fdf4046af0716ba3137c286b9fa0b8f582104e90 100644 --- a/mozen/pom.xml +++ b/mozen/pom.xml @@ -46,6 +46,11 @@ <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> + <dependency> + <groupId>com.github.paulcwarren</groupId> + <artifactId>spring-content-fs-boot-starter</artifactId> + <version>1.0.0.M10</version> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java index 61de3c2273708badff2081a9ee3737105551b8bd..50e8f3eed4bc01013845714ce3f79543791cd608 100644 --- a/mozen/src/main/java/mozen/business/IModelManager.java +++ b/mozen/src/main/java/mozen/business/IModelManager.java @@ -1,5 +1,6 @@ package mozen.business; +import java.io.InputStream; import java.util.Collection; import org.springframework.web.multipart.MultipartFile; @@ -20,5 +21,7 @@ public interface IModelManager { Model getModel(long id); Collection<Model> getModels(); + InputStream getModelFile(long id) throws Exception; + SearchResult findModel(String name, int page, int size, String sort, Collection<String> tagsName); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java index cdb7f5fa8d5d4010aa620b5913cb27cf9d02deb8..963a66ac6ac05fb5fc5f3b3074a05dde04c57193 100644 --- a/mozen/src/main/java/mozen/business/ModelManager.java +++ b/mozen/src/main/java/mozen/business/ModelManager.java @@ -1,5 +1,6 @@ package mozen.business; +import java.io.InputStream; import java.util.Collection; import java.util.Date; import java.util.HashSet; @@ -20,6 +21,7 @@ import mozen.messages.SearchResult; import mozen.model.Tag; import mozen.model.User; import mozen.repos.ModelRepository; +import mozen.repos.ModelStore; import mozen.repos.TagRepository; import mozen.utils.Md5Utils; import mozen.utils.UserHelper; @@ -33,6 +35,9 @@ public class ModelManager implements IModelManager { @Autowired private TagRepository tagRepo; + @Autowired + private ModelStore modelStore; + @Override public Model addModel(ModelMessage message, User user) throws Exception { Model model = new Model(); @@ -48,7 +53,8 @@ public class ModelManager implements IModelManager { model.setParameterCount(message.getParameterCount()); // Standardise la mesure de performance. - // C'est bancale mais difficile de trier autrement en mélangeant les unitées de performances + // C'est bancale mais difficile de trier autrement en mélangeant les unitées de + // performances if (message.getPerformanceLowerIsBetter()) { model.setPerformanceIndex(message.getPerformance()); } else { @@ -85,7 +91,7 @@ public class ModelManager implements IModelManager { throw new Exception("Not the author"); model.setChecksum(Md5Utils.getMD5(file)); - model.setFile(file.getBytes()); + modelStore.setContent(model, file.getInputStream()); model.setFileName(file.getOriginalFilename()); model.setFileType(file.getContentType()); @@ -101,12 +107,16 @@ public class ModelManager implements IModelManager { if (!UserHelper.isAuthor(model.getAuthor(), user)) throw new Exception("Not the author"); - if (message.getName() != null) model.setName(message.getName()); - if (message.getShortDescription() != null) model.setShortDescription(message.getShortDescription()); - if (message.getLongDescription() != null) model.setLongDescription(message.getLongDescription()); - + if (message.getName() != null) + model.setName(message.getName()); + if (message.getShortDescription() != null) + model.setShortDescription(message.getShortDescription()); + if (message.getLongDescription() != null) + model.setLongDescription(message.getLongDescription()); + model.setPerformance(message.getPerformance()); - if(message.getPerformanceUnit() != null) model.setPerformanceUnit(message.getPerformanceUnit()); + if (message.getPerformanceUnit() != null) + model.setPerformanceUnit(message.getPerformanceUnit()); model.setParameterCount(message.getParameterCount()); if (message.getTags() != null) { @@ -151,16 +161,25 @@ public class ModelManager implements IModelManager { @Override public SearchResult findModel(String name, int page, int size, String sort, Collection<String> tagsName) { Pageable paging; - + // Tri dans le bon sens selon l'attribut switch (sort) { - case "votes": paging = PageRequest.of(page - 1, size, Sort.by(sort).descending()); break; - case "lastModified": paging = PageRequest.of(page - 1, size, Sort.by(sort).descending()); break; - case "performance": paging = PageRequest.of(page - 1, size, Sort.by("performanceIndex")); break; - case "parameterCount": paging = PageRequest.of(page - 1, size, Sort.by(sort)); break; - default: paging = PageRequest.of(page - 1, size, Sort.by("name")); + case "votes": + paging = PageRequest.of(page - 1, size, Sort.by(sort).descending()); + break; + case "lastModified": + paging = PageRequest.of(page - 1, size, Sort.by(sort).descending()); + break; + case "performance": + paging = PageRequest.of(page - 1, size, Sort.by("performanceIndex")); + break; + case "parameterCount": + paging = PageRequest.of(page - 1, size, Sort.by(sort)); + break; + default: + paging = PageRequest.of(page - 1, size, Sort.by("name")); } - + Page<Model> resultPage; if (tagsName == null) { resultPage = modelRepo.findByNameContainingIgnoreCase(name, paging); @@ -168,7 +187,7 @@ public class ModelManager implements IModelManager { Collection<Tag> tags = tagRepo.findByNameIn(tagsName); resultPage = modelRepo.findDistinctByNameContainingIgnoreCaseAndTagsIn(name, tags, paging); } - + SearchResult result = new SearchResult(); if (resultPage.hasContent()) { result.setTotalResult((int) resultPage.getTotalElements()); @@ -182,16 +201,28 @@ public class ModelManager implements IModelManager { } return result; } - + @Override public Model getModel(long id) { Optional<Model> model = modelRepo.findById(id); - if (model.isPresent()) return model.get(); - else return null; + if (model.isPresent()) + return model.get(); + else + return null; } @Override public Collection<Model> getModels() { return modelRepo.findAll(); } + + @Override + public InputStream getModelFile(long id) throws Exception { + Model model = getModel(id); + + if (model == null) + throw new Exception("Unknown model"); + + return modelStore.getContent(model); + } } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/model/Model.java b/mozen/src/main/java/mozen/model/Model.java index 077b0ba0759008e10a790945a34571bea401f405..1be7cc0fca871a12bcce9c3e948084726e97b3b6 100644 --- a/mozen/src/main/java/mozen/model/Model.java +++ b/mozen/src/main/java/mozen/model/Model.java @@ -13,7 +13,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinTable; -import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @@ -25,6 +24,10 @@ import javax.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; +import org.springframework.content.commons.annotations.ContentId; +import org.springframework.content.commons.annotations.ContentLength; +import org.springframework.content.commons.annotations.MimeType; + @Entity @Table public class Model implements Serializable{ @@ -80,18 +83,19 @@ public class Model implements Serializable{ @Column private int parameterCount; - @Lob - @Column(columnDefinition="BLOB") - private byte[] file; - - @Basic - @Column - private String fileType; - @Basic @Column private String fileName; + @ContentId + private String contentId; + + @ContentLength + private long contentLength; + + @MimeType + private String fileType; + @Basic @Column private String checksum; @@ -121,7 +125,7 @@ public class Model implements Serializable{ public Model() { } - public Model(Long id, String name, String shortDescription, String longDescription, Date added, Date lastModified, int votes, double performance, String performanceUnit, double performanceIndex, int parameterCount, byte[] file, String fileType, String fileName, String checksum, boolean isVerified, User author, Set<Tag> tags, Set<CustomLayer> customLayers, Set<Comment> comments) { + public Model(Long id, String name, String shortDescription, String longDescription, Date added, Date lastModified, int votes, double performance, String performanceUnit, double performanceIndex, int parameterCount, String fileName, String contentId, long contentLength, String fileType, String checksum, boolean isVerified, User author, Set<Tag> tags, Set<CustomLayer> customLayers, Set<Comment> comments) { this.id = id; this.name = name; this.shortDescription = shortDescription; @@ -133,9 +137,10 @@ public class Model implements Serializable{ this.performanceUnit = performanceUnit; this.performanceIndex = performanceIndex; this.parameterCount = parameterCount; - this.file = file; - this.fileType = fileType; this.fileName = fileName; + this.contentId = contentId; + this.contentLength = contentLength; + this.fileType = fileType; this.checksum = checksum; this.isVerified = isVerified; this.author = author; @@ -210,12 +215,21 @@ public class Model implements Serializable{ } @JsonIgnore - public byte[] getFile() { - return this.file; + public String getContentId() { + return this.contentId; + } + + public void setContentId(String contentId) { + this.contentId = contentId; + } + + @JsonIgnore + public long getContentLength() { + return this.contentLength; } - public void setFile(byte[] file) { - this.file = file; + public void setContentLength(long contentLength) { + this.contentLength = contentLength; } public User getAuthor() { diff --git a/mozen/src/main/java/mozen/repos/ModelStore.java b/mozen/src/main/java/mozen/repos/ModelStore.java new file mode 100644 index 0000000000000000000000000000000000000000..e660a90d2199dfeda52e5e2c1ef96a26a5a43968 --- /dev/null +++ b/mozen/src/main/java/mozen/repos/ModelStore.java @@ -0,0 +1,9 @@ +package mozen.repos; + +import org.springframework.content.commons.repository.ContentStore; + +import mozen.model.Model; + +public interface ModelStore extends ContentStore<Model, String>{ + +} \ No newline at end of file diff --git a/mozen/src/main/java/mozen/web/ModelController.java b/mozen/src/main/java/mozen/web/ModelController.java index 69e852234d001f660f062d01a29400225dd6d720..559bf7ea5c1206c4d422e0337885f23ed37ebd80 100644 --- a/mozen/src/main/java/mozen/web/ModelController.java +++ b/mozen/src/main/java/mozen/web/ModelController.java @@ -5,7 +5,7 @@ import java.util.Collection; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -166,7 +166,7 @@ public class ModelController { return ResponseEntity.ok() .contentType(MediaType.parseMediaType(model.getFileType())) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + model.getName() + "\"") - .body(new ByteArrayResource(model.getFile())); + .body(new InputStreamResource(modelManager.getModelFile(id))); } catch (Exception e) { response.setError(true); response.setMessage(e.getMessage()); diff --git a/mozen/src/main/resources/application.properties b/mozen/src/main/resources/application.properties index a848592deb106ac5b6d3cf376c275ba51beb4f6c..4d10c8991625874e9442803c1b173e43dd415bca 100644 --- a/mozen/src/main/resources/application.properties +++ b/mozen/src/main/resources/application.properties @@ -22,11 +22,11 @@ server.port=8181 #spring.jpa.hibernate.ddl-auto=update # DOCKER + MARIADB -#spring.datasource.url=jdbc:mariadb://mozen_mariadb:3306/MOZEN_DB -#spring.datasource.username=mozen_user -#spring.datasource.password=1234 -#spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -#spring.jpa.hibernate.ddl-auto=update +spring.datasource.url=jdbc:mariadb://mozen_mariadb:3306/MOZEN_DB +spring.datasource.username=mozen_user +spring.datasource.password=1234 +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update spring.servlet.multipart.max-file-size=10GB spring.servlet.multipart.max-request-size=10GB