diff --git a/pom.xml b/pom.xml index f8a0691fb15ab140541fdb859f9a0ad97cba5627..a86343008d8275dbaedd9bb7a5733469467c6e76 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,12 @@ spring-security-oauth2-jose - + + org.springdoc + springdoc-openapi-ui + 1.6.9 + + com.fasterxml.jackson.core jackson-databind diff --git a/src/main/java/es/bsc/inb/ades/rest/api/controllers/DocumentController.java b/src/main/java/es/bsc/inb/ades/rest/api/controllers/DocumentController.java deleted file mode 100644 index d1d7d9bcb1d9099729aa64735f19d0b9eee138db..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/controllers/DocumentController.java +++ /dev/null @@ -1,170 +0,0 @@ -package es.bsc.inb.ades.rest.api.controllers; - -import java.security.Principal; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import es.bsc.inb.ades.rest.api.model.Document; -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; -import es.bsc.inb.ades.rest.api.model.DocumentTracking; -import es.bsc.inb.ades.rest.api.model.Status; -import es.bsc.inb.ades.rest.api.services.DocumentService; - - -@RestController -@CrossOrigin(origins="*") -public class DocumentController { - - - - @Autowired - public DocumentService documentService; - - @RequestMapping("/documents") - public List findAll() { - return documentService.findAll(); - } - - @RequestMapping("/documents/{id}") - public DocumentAnnotations find(@PathVariable(value="id") Long id) { - return documentService.findDocumentAnnotationsByDocumentId(id); - } - - @RequestMapping("/document_data/{id}") - public Document findDocument(@PathVariable(value="id") Long id) { - return documentService.findByDocumentId(id); - } - - @RequestMapping("/documents/{id}/srdomain") - public DocumentAnnotations findDocumentSRDomain(@PathVariable(value="id") Long id) { - return documentService.findDocumentSRDomainByDocumentId(id); - } - -// @RequestMapping("/documents/{id}") -// public Document find2(@PathVariable(value="id") Long id) { -// return documentService.findByDocumentId2(id); -// } - - @RequestMapping("/documents/{id}/finding/{findingId}") - public String findFinding(@PathVariable(value="id") Long id, @PathVariable(value="findingId") Integer findingId) { - String snippet = documentService.findFindingEvidenceByDocumentIdAndFindingId(id, findingId); - return snippet; - } - - @RequestMapping("/documents/{id}/findings/{findingIds}") - public String findFindings(@PathVariable(value="id") Long id, @PathVariable(value="findingIds") List findingIds) { - //String snippet = documentService.findFindingEvidenceByDocumentIdAndFindingId(id, findingId); - //return snippet; - return ""; - } - - @RequestMapping("/documents/{id}/move/{status}") - public String moveDocument(@PathVariable(value="id") Long id, @PathVariable(value="status") Status status) { - documentService.moveDocument(id, status); - return "true"; - } - - - - @RequestMapping("/documents/{id}/setExportSRDomain/{srDomainId}/{export_srDomain}") - public String setExportFinding(@PathVariable(value="id") Long id, @PathVariable(value="srDomainId") Integer srDomainId, @PathVariable(value="export_srDomain") Boolean export_srDomain) { - documentService.setExportSRDomainFinding(id, srDomainId, export_srDomain); - return "true"; - } - - @RequestMapping("/documents/{id}/srFindingValidation/{srDomainId}/{status}") - public String setSRFindingValidation(@PathVariable(value="id") Long id, @PathVariable(value="srDomainId") Integer srDomainId, @PathVariable(value="status") String status) { - documentService.setValidationSRDomainFinding(id, srDomainId, status); - return "true"; - } - - @RequestMapping("/documents/{id}/findingValidation/{findingId}/{status}") - public String setFindingValidation(@PathVariable(value="id") Long id, @PathVariable(value="findingId") Integer findingId, @PathVariable(value="status") String status) { - documentService.setFindingValidation(id, findingId, status); - return "true"; - } - - @RequestMapping("/documents/{id}/sentence/{sentenceId}") - public String findSentence(@PathVariable(value="id") Long id, @PathVariable(value="sentenceId") Integer sentenceId) { - String snippet = documentService.findSentenceEvidenceByDocumentIdAndSentenceId(id, sentenceId); - return snippet; - } - - @RequestMapping("/documents/{id}/evidence/findings") - public String findAllFindingEvidence(@PathVariable(value="id") Long id) { - String snippet = documentService.findFindingsEvidenceByDocumentId(id); - return snippet; - } - - @RequestMapping("/documents/{id}/evidence/all") - public String findAllEvidence(@PathVariable(value="id") Long id) { - String snippet = documentService.findAllEvidenceByDocumentId(id); - return snippet; - } - - @RequestMapping("/documents/{id}/evidence/sentences") - public String findSentencesEvidence(@PathVariable(value="id") Long id) { - String snippet = documentService.findSentencesEvidenceByDocumentId(id); - //String snippet = documentService.findAllEvidenceByDocumentId(id); - return snippet; - } - - @RequestMapping("/documents/{id}/text") - public String findDocumentText(@PathVariable(value="id") Long id) { - String snippet = documentService.findTextByDocumentId(id); - return snippet; - } - -// @RequestMapping("/documents/{id}/finding2/{findingId}") -// public String findFinding2(@PathVariable(value="id") Long id, @PathVariable(value="findingId") Integer findingId) { -// String snippet = documentService.findTextSnippetByDocumentIdAndFindingId2(id, findingId); -// return snippet; -// } - - @RequestMapping(value = "/documents/export/{id}") - public ResponseEntity generateReport(@PathVariable("id") long documentId){ - String filename = "Study_Report_" + documentId +".txt"; - byte[] content = documentService.exportDocumentAnnotation(documentId); - HttpHeaders head = new HttpHeaders(); - head.setContentType(MediaType.parseMediaType("text/plain")); - head.add("content-disposition", "attachment; filename="+filename); - head.setContentDispositionFormData(filename, filename); - head.setCacheControl("must-revalidate, post-check=0, pre-check=0"); - return new ResponseEntity<>(content, head,HttpStatus.OK); - } - - @RequestMapping(value = "/documents/remove/{id}") - public String removeDocument(@PathVariable("id") long documentId){ - documentService.removeDocument(documentId); - return "true"; - } - - @RequestMapping(value = "/documents/restore/{id}") - public String restoreDocument(@PathVariable("id") long documentId){ - documentService.restoreDocument(documentId); - return "true"; - } - - @RequestMapping("/documents/{id}/tracking") - public DocumentTracking findTrackings(@PathVariable(value="id") Long id) { - return documentService.findTrackings(id); - } - - - - - - -} \ No newline at end of file diff --git a/src/main/java/es/bsc/inb/ades/rest/api/controllers/LivenessController.java b/src/main/java/es/bsc/inb/ades/rest/api/controllers/LivenessController.java deleted file mode 100644 index 05e09822afbecb10b6a377d77adfb38703ac98f5..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/controllers/LivenessController.java +++ /dev/null @@ -1,25 +0,0 @@ -package es.bsc.inb.ades.rest.api.controllers; - -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@CrossOrigin("*") -@RestController -public class LivenessController { - - @GetMapping(path = "/liveness") - public String liveness() { - return "true"; - } - - @GetMapping(path = "/readiness") - public String readeness() { - return "true"; - } - - @GetMapping(path = "/hello") - public String hello() { - return "holita"; - } -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Status.java b/src/main/java/es/bsc/inb/ades/rest/api/model/Status.java deleted file mode 100644 index afbb3606ded52ed02c0f348ffc0277865251d673..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Status.java +++ /dev/null @@ -1,5 +0,0 @@ -package es.bsc.inb.ades.rest.api.model; - -public enum Status { - DRAFT, IN_PROGRESS, FINISHED, CLOSED -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryCustom.java b/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryCustom.java deleted file mode 100644 index 4951ad57111eb7cc4ea4108c0c7a7dddef5baad0..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryCustom.java +++ /dev/null @@ -1,24 +0,0 @@ -package es.bsc.inb.ades.rest.api.repository; - -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; -import es.bsc.inb.ades.rest.api.model.Finding; - -/** - * Custom Interface for Document - * @author jcorvi - * - */ -public interface DocumentRepositoryCustom { - /** - * - * @return - */ - Finding findByDocumentIdAndFindingId(Long id); - - /** - * - * @return - */ - DocumentAnnotations findByDocumentDataById(Long id); - -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepositoryCustom.java b/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepositoryCustom.java deleted file mode 100644 index a9c9b6ec197a1f4b286ca6014489d275776b26e0..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepositoryCustom.java +++ /dev/null @@ -1,5 +0,0 @@ -package es.bsc.inb.ades.rest.api.repository; - -public interface DocumentTrackingRepositoryCustom { - -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfig.java b/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfig.java deleted file mode 100644 index 51715bc1b2f8181855103e0a32f895b929fff8a0..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package es.bsc.inb.ades.rest.api.security; - -//@KeycloakConfiguration -public class SecurityConfig /*extends KeycloakWebSecurityConfigurerAdapter*/ -{ - -// /** -// * Registers the KeycloakAuthenticationProvider with the authentication manager. -// */ -// @Autowired -// public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { -// auth.authenticationProvider(keycloakAuthenticationProvider()); -// } -// -// /** -// * Defines the session authentication strategy. -// */ -// @Bean -// @Override -// protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { -// return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); -// } -// -// @Override -// protected void configure(HttpSecurity http) throws Exception -// { -// super.configure(http); -// http.authorizeRequests() -// .antMatchers("/greeting").hasRole("user") -// //.antMatchers("/admin*").hasRole("ADMIN") http://localhost:8087/greeting -// .anyRequest().permitAll(); -// } -// -// @Bean -// public KeycloakSpringBootConfigResolver KeycloakConfigResolver() { -// return new KeycloakSpringBootConfigResolver(); -// } - -} - - diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfiguration.java b/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfiguration.java deleted file mode 100644 index 2a8dfb3372397bcdcbe3b42cf69a86c748a9192e..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/SecurityConfiguration.java +++ /dev/null @@ -1,18 +0,0 @@ -package es.bsc.inb.ades.rest.api.security; - -import org.springframework.context.annotation.Configuration; -//import org.springframework.security.config.annotation.web.builders.HttpSecurity; -//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -@Configuration -public class SecurityConfiguration /*extends WebSecurityConfigurerAdapter */{ - - -// @Override -// public void configure(HttpSecurity http) throws Exception { -// http.authorizeRequests() -// .anyRequest().authenticated() -// .and() -// .oauth2Login(); -// } - -} \ No newline at end of file diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/WebController.java b/src/main/java/es/bsc/inb/ades/rest/api/security/WebController.java deleted file mode 100644 index b675377acfbc09a047fe2695b56caa562ed50e01..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/WebController.java +++ /dev/null @@ -1,22 +0,0 @@ -package es.bsc.inb.ades.rest.api.security; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.security.Principal; -@Controller -public class WebController { - - @RequestMapping("/api/v1/nada") - public String index(Model model, Principal principal) { - return "login correct"; - } - @GetMapping("/greeting") - public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) { - model.addAttribute("name", name); - return "index"; - } - -} \ No newline at end of file diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/AuthenticationBean.java b/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/AuthenticationBean.java deleted file mode 100644 index 7f26752ac3bc33139ca0795d8fd648906007da94..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/AuthenticationBean.java +++ /dev/null @@ -1,24 +0,0 @@ -package es.bsc.inb.ades.rest.api.security.basic.inmemory; - -public class AuthenticationBean { - - private String message; - - public AuthenticationBean(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public String toString() { - return String.format("HelloWorldBean [message=%s]", message); - } - -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/BasicAuthenticationController.java b/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/BasicAuthenticationController.java deleted file mode 100644 index 014039723efa1dcefca281007b1a47316e5fbb9c..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/BasicAuthenticationController.java +++ /dev/null @@ -1,17 +0,0 @@ -package es.bsc.inb.ades.rest.api.security.basic.inmemory; - -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -//Controller -@CrossOrigin() -@RestController -public class BasicAuthenticationController { - - @GetMapping(path = "/basicauth") - public AuthenticationBean helloWorldBean() { - //throw new RuntimeException("Some Error has Happened! Contact Support at ***-***"); - return new AuthenticationBean("You are authenticated"); - } -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/SecurityConfig.java b/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/SecurityConfig.java deleted file mode 100644 index 68ae896b735bf85237f929bab89e48c66060f441..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/basic/inmemory/SecurityConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package es.bsc.inb.ades.rest.api.security.basic.inmemory; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -//@Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - http.cors().and().csrf().disable(). - //http.csrf().disable(). - - authorizeRequests(). - antMatchers(HttpMethod.OPTIONS, "/**").permitAll(). - antMatchers(HttpMethod.GET, "/liveness").permitAll(). - antMatchers(HttpMethod.GET, "/readiness").permitAll().anyRequest().authenticated() - .and().httpBasic(); - - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication().withUser("admin").password("{noop}eTRAN2019!").roles("USER"); - for (int i = 1; i < 41; i++) { - auth.inMemoryAuthentication().withUser("user"+i).password("{noop}user"+i+"2021!").roles("USER"); - } - } -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/services/FileService.java b/src/main/java/es/bsc/inb/ades/rest/api/services/FileService.java deleted file mode 100644 index b9fd2e54749a4e80cc718c9006c19a4cde447969..0000000000000000000000000000000000000000 --- a/src/main/java/es/bsc/inb/ades/rest/api/services/FileService.java +++ /dev/null @@ -1,48 +0,0 @@ -package es.bsc.inb.ades.rest.api.services; - -import org.springframework.core.io.Resource; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.List; -import java.util.stream.Stream; - -public interface FileService { - - /* - Metodo para crear la carpeta donde vamos a guardar los archivos - */ - public void init(); - - /* - Metodo para guardar los archivos - */ - public void save(MultipartFile file); - - /* - Metodo para cargar un archivo - */ - public Resource load(String filename); - - /* - Metodo para borrar todos los archivos cada vez que se inicie el servidor - */ - public void deleteAll(); - - /* - Metodo para Cargar todos los archivos - */ - public Stream loadAll(); - - /* - Metodo para Borrar un archivo - */ - public String deleteFile(String filename); - /** - * - * @param files - * @return - */ - public List validate(MultipartFile[] files, Boolean allow_duplicates); -} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/App.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/App.java similarity index 79% rename from src/main/java/es/bsc/inb/ades/rest/api/App.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/App.java index 8e738bf16ce4b05bea565bfb112a73199e9285f2..5b31e1f0c692aa310a8db00b8c099367a42d89b5 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/App.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/App.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api; +package es.bsc.inb.etransafe.pretox.rest.api; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan("es.bsc.inb.ades") +@ComponentScan("es.bsc.inb.etransafe") public class App { public static void main(String[] args) { diff --git a/src/main/java/es/bsc/inb/ades/rest/api/config/Config.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/Config.java similarity index 65% rename from src/main/java/es/bsc/inb/ades/rest/api/config/Config.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/Config.java index 892c188c398cf3d14e61b91e5508047795627ea7..76adc7ba379fb66468c7167c6fe36f965fbae4c0 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/config/Config.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/Config.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.config; +package es.bsc.inb.etransafe.pretox.rest.api.config; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/es/bsc/inb/ades/rest/api/config/PersistenceJPAConfig.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/PersistenceJPAConfig.java similarity index 77% rename from src/main/java/es/bsc/inb/ades/rest/api/config/PersistenceJPAConfig.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/PersistenceJPAConfig.java index 7ba7893c9be98d5a466cff598e4906dc6ffd9d24..8e80e7b0d78179a682621e05e240d0c1911c779e 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/config/PersistenceJPAConfig.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/config/PersistenceJPAConfig.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.config; +package es.bsc.inb.etransafe.pretox.rest.api.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/DocumentController.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/DocumentController.java new file mode 100644 index 0000000000000000000000000000000000000000..0f86156391552656e674b96d3c141142bc651dd6 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/DocumentController.java @@ -0,0 +1,164 @@ +package es.bsc.inb.etransafe.pretox.rest.api.controllers; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentAnnotations; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentTracking; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainDocument; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainFinding; +import es.bsc.inb.etransafe.pretox.rest.api.model.ReportStatus; +import es.bsc.inb.etransafe.pretox.rest.api.services.DocumentService; + + +@RestController +@CrossOrigin(origins="*") +@RequestMapping("/documents") +public class DocumentController { + + @Autowired + public DocumentService documentService; + + @PutMapping(value ="/{id}/srfinding/update") + public ResponseEntity updateFinding(@PathVariable(value="id") Long id,@RequestBody SRDomainFinding srDomainFinding) { + return new ResponseEntity(documentService.saveFinding(id, srDomainFinding), HttpStatus.OK); + } + + @PutMapping(value ="/{id}/srfinding/add") + public ResponseEntity addFinding(@PathVariable(value="id") Long id, @RequestBody SRDomainFinding srDomainFinding) { + return new ResponseEntity(documentService.addFinding(id, srDomainFinding), HttpStatus.OK); + } + + @GetMapping + public ResponseEntity> findAll() { + return new ResponseEntity>(documentService.findAll(), HttpStatus.OK); + } + + @GetMapping(value ="/{id}") + public ResponseEntity find(@PathVariable(value="id") Long id) { + return new ResponseEntity(documentService.findDocumentAnnotationsByDocumentId(id), HttpStatus.OK); + } + + @GetMapping(value = "/srdomain/{id}") + public ResponseEntity findSRDomainDocument(@PathVariable(value="id") Long id) { + return new ResponseEntity(documentService.findSRDomainDocumentByDocumentId(id), HttpStatus.OK); + } + +// @GetMapping(value = "/document_data/{id}") +// public Document findDocument(@PathVariable(value="id") Long id) { +// return documentService.findByDocumentId(id); +// } + +// @GetMapping(value = "/{id}/srdomain") +// public ResponseEntity findDocumentSRDomain(@PathVariable(value="id") Long id) { +// return new ResponseEntity(documentService.findDocumentSRDomainByDocumentId(id), HttpStatus.OK); +// } + + @PutMapping(value = "/{id}/move/{status}") + public ResponseEntity moveDocument(@PathVariable(value="id") Long id, @PathVariable(value="status") ReportStatus status) { + documentService.moveDocument(id, status); + return new ResponseEntity(HttpStatus.OK); + } + + @PutMapping(value = "/{id}/srfinding/{srFindingId}/export/{export}") + public ResponseEntity setExportFinding(@PathVariable(value="id") Long id, @PathVariable(value="srFindingId") Integer srDomainId, @PathVariable(value="export") Boolean export_srDomain) { + documentService.setExportSRDomainFinding(id, srDomainId, export_srDomain); + return new ResponseEntity(HttpStatus.OK); + } + + @PutMapping(value = "/{id}/srfinding/{srFindingId}/validation/{status}") + public ResponseEntity setSRFindingValidation(@PathVariable(value="id") Long id, @PathVariable(value="srFindingId") Integer srDomainId, @PathVariable(value="status") String status) { + documentService.setValidationSRDomainFinding(id, srDomainId, status); + return new ResponseEntity(HttpStatus.OK); + } + +// @RequestMapping(value = "/{id}/findingValidation/{findingId}/{status}") +// public String setFindingValidation(@PathVariable(value="id") Long id, @PathVariable(value="findingId") Integer findingId, @PathVariable(value="status") String status) { +// documentService.setFindingValidation(id, findingId, status); +// return "true"; +// } + + + + @GetMapping(value = "/{id}/evidence/sentences") + public ResponseEntity findSentencesEvidence(@PathVariable(value="id") Long id) { + String snippet = documentService.findSentencesEvidenceByDocumentId(id); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{id}/evidence/sentence/{sentenceId}") + public ResponseEntity findSentence(@PathVariable(value="id") Long id, @PathVariable(value="sentenceId") Integer sentenceId) { + String snippet = documentService.findSentenceEvidenceByDocumentIdAndSentenceId(id, sentenceId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{id}/evidence/findings") + public ResponseEntity findAllFindingEvidence(@PathVariable(value="id") Long id) { + String snippet = documentService.findFindingsEvidenceByDocumentId(id); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{id}/evidence/finding/{findingId}") + public ResponseEntity findFinding(@PathVariable(value="id") Long id, @PathVariable(value="findingId") Integer findingId) { + String snippet = documentService.findFindingEvidenceByDocumentIdAndFindingId(id, findingId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + + + @GetMapping(value = "/{id}/evidence/all") + public ResponseEntity findAllEvidence(@PathVariable(value="id") Long id) { + String snippet = documentService.findAllEvidenceByDocumentId(id); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{id}/text") + public ResponseEntity findDocumentText(@PathVariable(value="id") Long id) { + String snippet = documentService.findTextByDocumentId(id); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + + @GetMapping(value = "/export/{id}") + public ResponseEntity generateReport(@PathVariable("id") long documentId){ + String filename = "Study_Report_" + documentId +".txt"; + byte[] content = documentService.exportDocumentAnnotation(documentId); + HttpHeaders head = new HttpHeaders(); + head.setContentType(MediaType.parseMediaType("text/plain")); + head.add("content-disposition", "attachment; filename="+filename); + head.setContentDispositionFormData(filename, filename); + head.setCacheControl("must-revalidate, post-check=0, pre-check=0"); + return new ResponseEntity<>(content, head,HttpStatus.OK); + } + + @DeleteMapping(value = "/remove/{id}") + public ResponseEntity removeDocument(@PathVariable("id") long documentId){ + documentService.removeDocument(documentId); + return new ResponseEntity(HttpStatus.OK); + } + + @GetMapping(value = "/restore/{id}") + public ResponseEntity restoreDocument(@PathVariable("id") long documentId){ + documentService.restoreDocument(documentId); + return new ResponseEntity(HttpStatus.OK); + } + + @GetMapping(value = "/{id}/tracking") + public ResponseEntity findTrackings(@PathVariable(value="id") Long id) { + return new ResponseEntity(documentService.findTrackings(id), HttpStatus.OK); + } +} \ No newline at end of file diff --git a/src/main/java/es/bsc/inb/ades/rest/api/controllers/FileController.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/FileController.java similarity index 50% rename from src/main/java/es/bsc/inb/ades/rest/api/controllers/FileController.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/FileController.java index 9e10790fc63b609bb1f0383fa8d6ece79fa8e78a..5f28c967922b2254f39fd0c100303d58b3729355 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/controllers/FileController.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/FileController.java @@ -1,29 +1,21 @@ -package es.bsc.inb.ades.rest.api.controllers; +package es.bsc.inb.etransafe.pretox.rest.api.controllers; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder; -import es.bsc.inb.ades.rest.api.model.FileMessage; -import es.bsc.inb.ades.rest.api.model.FileModel; -import es.bsc.inb.ades.rest.api.services.FileService; +import es.bsc.inb.etransafe.pretox.rest.api.services.FileService; @Controller @CrossOrigin("*") @@ -56,36 +48,7 @@ public class FileController { } } - @GetMapping("/files") - public ResponseEntity> getFiles(){ - List fileInfos = fileService.loadAll().map(path -> { - String filename = path.getFileName().toString(); - String url = MvcUriComponentsBuilder.fromMethodName(FileController.class, "getFile", - path.getFileName().toString()).build().toString(); - return new FileModel(filename, url); - }).collect(Collectors.toList()); - - return ResponseEntity.status(HttpStatus.OK).body(fileInfos); - } - - - @GetMapping("/files/{filename:.+}") - public ResponseEntity getFile(@PathVariable String filename){ - Resource file = fileService.load(filename); - return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, - "attachment; filename=\""+file.getFilename() + "\"").body(file); - } - - @GetMapping("/delete/{filename:.+}") - public ResponseEntity deleteFile(@PathVariable String filename) { - String message = ""; - try { - message = fileService.deleteFile(filename); - return ResponseEntity.status(HttpStatus.OK).body(new FileMessage(message)); - } catch (Exception e) { - - return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new FileMessage(message)); - } - } - + + + } diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/LivenessController.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/LivenessController.java new file mode 100644 index 0000000000000000000000000000000000000000..3e265d4eb1d3a41592dee4b47f131bcce6faebdc --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/LivenessController.java @@ -0,0 +1,23 @@ +package es.bsc.inb.etransafe.pretox.rest.api.controllers; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin("*") +@RestController +public class LivenessController { + + @GetMapping(path = "/liveness") + public ResponseEntity liveness() { + return new ResponseEntity(HttpStatus.OK); + } + + @GetMapping(path = "/readiness") + public ResponseEntity readeness() { + return new ResponseEntity(HttpStatus.OK); + } + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/ReportController.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/ReportController.java new file mode 100644 index 0000000000000000000000000000000000000000..987fe12d7d532068ee618c756f92d37194780317 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/controllers/ReportController.java @@ -0,0 +1,156 @@ +package es.bsc.inb.etransafe.pretox.rest.api.controllers; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ByteArrayResource; +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.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; +import es.bsc.inb.etransafe.pretox.rest.api.services.DocumentService; +import es.bsc.inb.etransafe.pretox.rest.api.services.ReportService; +import es.bsc.inb.etransafe.pretox.rest.api.services.TextualEvidenceService; + + +@RestController +@CrossOrigin(origins="*") +@RequestMapping("/reports") +public class ReportController { + + @Autowired + ReportService reportService; + + @Autowired + DocumentService documentService; + + @Autowired + TextualEvidenceService textualEvidenceService; + + @PostMapping("/upload") + public ResponseEntity uploadLegacyReports(@RequestParam("files")MultipartFile[] files){ + List messages = new ArrayList(); + List reports = new ArrayList(); + try{ + List fileNames = new ArrayList<>(); + List errors = reportService.validateUpload(files); + if(errors.size()==0) { + messages.add("The legacy reports were uploaded correctly:"); + Arrays.asList(files).stream().forEach(file->{ + try { + Report report = reportService.upload(file); + messages.add(report.getFileName()); + reports.add(report); + } catch (IOException e) { + messages.clear(); + errors.add("There was an IOException problem uploading the report: " + file.getName()); + e.printStackTrace(); + } + fileNames.add(file.getOriginalFilename()); + }); + } + if(errors.size()!=0) { + errors.add("Validation fail, no legacy report was uploaded."); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors); + } + return ResponseEntity.status(HttpStatus.OK).body(reports); + }catch (Exception e){ + e.printStackTrace(); + messages.add("An error occurred while uploading legacy reports."); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(messages); + } + } + + @GetMapping("/download/{gridFSId}") + public ResponseEntity download(@PathVariable String gridFSId) throws IOException { + Report legacyReport = reportService.download(gridFSId); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(legacyReport.getFileType() )) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + legacyReport.getFileName() + "\"") + .body(new ByteArrayResource(legacyReport.getFile())); + } + + @GetMapping + public ResponseEntity> listLegacyReports() throws IOException { + List list = reportService.list(); + return ResponseEntity.ok().body(list); + } + + @DeleteMapping(value = "/remove/{id}") + public ResponseEntity removeDocument(@PathVariable("id") String reportId){ + return ResponseEntity.ok().body(reportService.remove(reportId)); + } + + @PostMapping(value = "/restore/{id}") + public ResponseEntity restoreDocument(@PathVariable("id") String reportId){ + return ResponseEntity.ok().body(reportService.restore(reportId)); + } + + @GetMapping(value ="/{reportId}") + public ResponseEntity find(@PathVariable(value="reportId") String reportId) { + return new ResponseEntity(reportService.findById(reportId), HttpStatus.OK); + } + + @GetMapping(value ="/{reportId}/section/{sectionId}") + public ResponseEntity findBySectionId(@PathVariable(value="reportId") String reportId, @PathVariable(value="sectionId") Long sectionId) { + return new ResponseEntity(reportService.findReportByIdAndSectionById(reportId, sectionId), HttpStatus.OK); + } + + @GetMapping(value = "/{reportId}/text") + public ResponseEntity findReportText(@PathVariable(value="reportId") String reportId) { + String snippet = textualEvidenceService.findTextByReportId(reportId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{sectionId}/evidence/finding/{findingId}") + public ResponseEntity findFinding(@PathVariable(value="sectionId") Long sectionId, @PathVariable(value="findingId") Integer findingId) { + String snippet = textualEvidenceService.findFindingEvidenceByDocumentAnnotationsIdAndFindingId(sectionId, findingId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{sectionId}/evidence/sentence/{sentenceId}") + public ResponseEntity findSentence(@PathVariable(value="sectionId") Long sectionId, @PathVariable(value="sentenceId") Integer sentenceId) { + String snippet = textualEvidenceService.findSentenceEvidenceByDocumentAnnotationsIdAndSentenceId(sectionId, sentenceId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{reportId}/evidence/findings") + public ResponseEntity findAllFindingEvidenceByReport(@PathVariable(value="reportId") String reportId) { + String snippet = textualEvidenceService.findFindingsEvidenceByReportId(reportId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{reportId}/section/{sectionId}/evidence/findings") + public ResponseEntity findAllFindingEvidenceByDocumentAnnotations(@PathVariable(value="reportId") String reportId, @PathVariable(value="sectionId") Long sectionId) { + String snippet = textualEvidenceService.findFindingsEvidenceByDocumentAnnotationsId(sectionId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{reportId}/evidence/sentences") + public ResponseEntity findSentencesEvidenceByReport(@PathVariable(value="reportId") String reportId) { + String snippet = textualEvidenceService.findSentencesEvidenceByReportId(reportId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + @GetMapping(value = "/{reportId}/section/{sectionId}/evidence/sentences") + public ResponseEntity findSentencesEvidenceBySection(@PathVariable(value="reportId") String reportId, @PathVariable(value="sectionId") Long sectionId) { + String snippet = textualEvidenceService.findSentencesEvidenceByDocumentAnnotationsId(sectionId); + return new ResponseEntity(snippet, HttpStatus.OK); + } + + +} \ No newline at end of file diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Action.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Action.java similarity index 62% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Action.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Action.java index 7116b1a31e64e0d4109509183b693d0c5fdc4235..c79685046bd24392aec6a7a7cb5d81f8f14419c2 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Action.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Action.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; public enum Action { MOVE, REJECT, ACCEPT, EXPORT_SR_FINDING, NOT_EXPORT_SR_FINDING diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Annotation.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Annotation.java similarity index 96% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Annotation.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Annotation.java index 33ffa9422d7ef54b38c40c2c8d068cb06369b01f..cd5fe43f0a3a8414b4d76d7576fe447a217d5916 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Annotation.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Annotation.java @@ -1,11 +1,11 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.ArrayList; import java.util.List; import org.springframework.data.mongodb.core.mapping.Field; -import es.bsc.inb.ades.rest.api.util.VisualizationHTMLUtil; +import es.bsc.inb.etransafe.pretox.rest.api.util.VisualizationHTMLUtil; /** * diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Document.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Document.java similarity index 85% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Document.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Document.java index bff1e3c00a9812c26ea3d7c782e40c12f34c2007..754b6b71882a62f26ca74002a2e26fe26b574187 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Document.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Document.java @@ -1,10 +1,7 @@ -package es.bsc.inb.ades.rest.api.model; - -import java.util.List; +package es.bsc.inb.etransafe.pretox.rest.api.model; import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Field; @org.springframework.data.mongodb.core.mapping.Document(collection="documents") @@ -24,7 +21,7 @@ public class Document{ private String fileName; - private Status status; + private ReportStatus status; private RecordState recordState; @@ -65,12 +62,12 @@ public class Document{ this.name = name; } - public Status getStatus() { - if(status==null)return Status.DRAFT; + public ReportStatus getStatus() { + if(status==null)return ReportStatus.CURATION_DRAFT; return status; } - public void setStatus(Status status) { + public void setStatus(ReportStatus status) { this.status = status; } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/DocumentAnnotations.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentAnnotations.java similarity index 65% rename from src/main/java/es/bsc/inb/ades/rest/api/model/DocumentAnnotations.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentAnnotations.java index 8552ed6f01b7f2f0c3a94c649afb25188aa75f66..dceadf3eb0da85528093cfe61fa0dadec390aa77 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/DocumentAnnotations.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentAnnotations.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.ArrayList; import java.util.List; @@ -21,11 +21,9 @@ public class DocumentAnnotations { @Field("relevant_sentences") private ArrayList relevantSentences; - private ArrayList findings; + private List srDomainFindings; - private List srdomainfindings; - - private Status status; + private ReportStatus status; public DocumentAnnotations() {} @@ -62,32 +60,21 @@ public class DocumentAnnotations { this.documentId = documentId; } - public ArrayList getFindings() { - return findings; - } - - public void setFindings(ArrayList findings) { - this.findings = findings; - } - - public List getSrdomainfindings() { - return srdomainfindings; + public List getSrDomainFindings() { + return srDomainFindings; } - public void setSrdomainfindings(List srdomainfindings) { - this.srdomainfindings = srdomainfindings; + public void setSrDomainFindings(List srDomainFindings) { + this.srDomainFindings = srDomainFindings; } - public Status getStatus() { - if(status==null)return Status.DRAFT; + public ReportStatus getStatus() { + if(status==null)return ReportStatus.CURATION_DRAFT; return status; } - public void setStatus(Status status) { + public void setStatus(ReportStatus status) { this.status = status; } - - - } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/DocumentTracking.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentTracking.java similarity index 95% rename from src/main/java/es/bsc/inb/ades/rest/api/model/DocumentTracking.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentTracking.java index 69a6d4d0c3243351cc9027d3a77799ac123d585d..bc844488270bb7554c0aad6743a31c3039469679 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/DocumentTracking.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/DocumentTracking.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Feature.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Feature.java similarity index 87% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Feature.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Feature.java index 5722fde8976a93f7cfabe4eac991ec338913a26d..49478b5e858eaf940e7ec7a30897dffc28ccd2a8 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Feature.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Feature.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; /** * * @author jcorvi diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/FileMessage.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileMessage.java similarity index 84% rename from src/main/java/es/bsc/inb/ades/rest/api/model/FileMessage.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileMessage.java index f000e463f40f59f5b18cc135eaa0d5e1a7fbe757..0d51e3e2fee9ccfbc0d7239b5b6cc40bde72da1a 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/FileMessage.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileMessage.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; public class FileMessage { diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/FileModel.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileModel.java similarity index 90% rename from src/main/java/es/bsc/inb/ades/rest/api/model/FileModel.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileModel.java index 8d2c5ae93e8c09c08b5986b4f7bea8d342097016..d9ad2478994b068b2aa016a574d4e3b9b3b702b6 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/FileModel.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/FileModel.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; /** * File model diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Finding.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Finding.java similarity index 98% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Finding.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Finding.java index 2834940219cde491d2e442d96159c7a2eb66c6c1..d4f40198192252ae88f5f943bfa8eda1be2fd98c 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Finding.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Finding.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.ArrayList; import java.util.List; @@ -436,7 +436,7 @@ public class Finding { public String getTrackingSummary() { - return findingId.toString(); + return findingId==null?"":findingId.toString(); } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/RecordState.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RecordState.java similarity index 50% rename from src/main/java/es/bsc/inb/ades/rest/api/model/RecordState.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RecordState.java index 51ab40a5f2f1b42f80138ebdbbd3efbd2db04916..b050f95a1148e83ab3dfa437022e5f15381f9701 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/RecordState.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RecordState.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; public enum RecordState { diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/RelevantSentence.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RelevantSentence.java similarity index 99% rename from src/main/java/es/bsc/inb/ades/rest/api/model/RelevantSentence.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RelevantSentence.java index 995de73ef59abfb9e6201771b0bd5982c0df7d5f..7a4afbcc76e745fc984dfae56e9d09cc57753cb8 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/RelevantSentence.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/RelevantSentence.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Report.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Report.java new file mode 100644 index 0000000000000000000000000000000000000000..0857ac8a90fb44594ab069c90f264c36d3933149 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Report.java @@ -0,0 +1,140 @@ +package es.bsc.inb.etransafe.pretox.rest.api.model; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.DBRef; + + +@org.springframework.data.mongodb.core.mapping.Document(collection="reports") +public class Report { + + @Id + private String id; + + private Date uploadDate; + + private String fileName; + + private String name; + + private String fileType; + + private String fileSize; + + //This field is only for response, the file is stored in the gridFS object + private byte[] file; + + private String gridFSId; + + private ReportStatus status; + + private RecordState recordState; + + private Boolean hasSections; + + @DBRef + private List
sections; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public byte[] getFile() { + return file; + } + + public void setFile(byte[] file) { + this.file = file; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileSize() { + return fileSize; + } + + public void setFileSize(String fileSize) { + this.fileSize = fileSize; + } + + public Date getUploadDate() { + return uploadDate; + } + + public void setUploadDate(Date uploadDate) { + this.uploadDate = uploadDate; + } + + public String getGridFSId() { + return gridFSId; + } + + public void setGridFSId(String gridFSId) { + this.gridFSId = gridFSId; + } + + public ReportStatus getStatus() { + return status; + } + + public void setStatus(ReportStatus status) { + this.status = status; + } + + public RecordState getRecordState() { + return recordState; + } + + public void setRecordState(RecordState recordState) { + this.recordState = recordState; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List
getSections() { + return sections; + } + + public void setSections(List
sections) { + this.sections = sections; + } + + public Boolean getHasSections() { + return hasSections; + } + + public void setHasSections(Boolean hasSections) { + this.hasSections = hasSections; + } + + + + + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/ReportStatus.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/ReportStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..142b1a0b9f94c080ddfb92d96ea67c860f795c9f --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/ReportStatus.java @@ -0,0 +1,13 @@ +package es.bsc.inb.etransafe.pretox.rest.api.model; + +public enum ReportStatus { + //workflow + WORKFLOW_WAITING,WORKFLOW_READY,WORKFLOW_RUNNING,WORKFLOW_COMPLETED,WORKFLOW_FAIL, + //curation + CURATION_DRAFT, CURATION_IN_PROGRESS, CURATION_FINISHED, CURATION_CLOSED, + + //just for old data that is already stored in mongo database, should not be used and has to be removed + DRAFT, IN_PROGRESS, FINISHED, CLOSED, + WAITING,READY,RUNNING,COMPLETED,FAIL, + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainDocument.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainDocument.java new file mode 100644 index 0000000000000000000000000000000000000000..ed0a0e1af1c74b16a87b7853138bf4c44adbaaa9 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainDocument.java @@ -0,0 +1,91 @@ +package es.bsc.inb.etransafe.pretox.rest.api.model; + +import java.util.List; + +public class SRDomainDocument { + + private Long documentId; + + private String name; + + private String processDate; + + private String fileName; + + private ReportStatus status; + + private List srDomainFindings; + + private RecordState recordState; + + private Long pretoxDocumentId; + + public SRDomainDocument() { + super(); + } + + public Long getDocumentId() { + return documentId; + } + + public void setDocumentId(Long documentId) { + this.documentId = documentId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ReportStatus getStatus() { + if(status==null)return ReportStatus.CURATION_DRAFT; + return status; + } + + public void setStatus(ReportStatus status) { + this.status = status; + } + + public String getProcessDate() { + return processDate; + } + + public void setProcessDate(String processDate) { + this.processDate = processDate; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public RecordState getRecordState() { + return recordState; + } + + public void setRecordState(RecordState recordState) { + this.recordState = recordState; + } + + public List getSrDomainFindings() { + return srDomainFindings; + } + + public void setSrDomainFindings(List srDomainFindings) { + this.srDomainFindings = srDomainFindings; + } + + public Long getPretoxDocumentId() { + return pretoxDocumentId; + } + + public void setPretoxDocumentId(Long pretoxDocumentId) { + this.pretoxDocumentId = pretoxDocumentId; + } +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/SRDomainFinding.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFinding.java similarity index 53% rename from src/main/java/es/bsc/inb/ades/rest/api/model/SRDomainFinding.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFinding.java index bd2b6da2a2604182b3bbf854af2a11b9351230cc..014e51d781f63967cda9f1d1f94f13f489cc2f62 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/SRDomainFinding.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFinding.java @@ -1,328 +1,299 @@ -package es.bsc.inb.ades.rest.api.model; - -import org.apache.tomcat.util.bcel.classfile.Constant; - -import es.bsc.inb.ades.rest.api.util.Constants; +package es.bsc.inb.etransafe.pretox.rest.api.model; /** - * This class describes a finding in SR-Domain format. - * No textual evidence. + * This class describes a finding in SR-Domain format. No textual evidence. + * * @author javi * */ -public class SRDomainFinding implements Cloneable{ - - private String STUDYID=""; - private String DOMAIN=""; - private String SRSEQ=""; - private String SRRISK=""; - private String SPGRPCD=""; - private String GRPLBL=""; - private String SRGRPDOS=""; - private String SRSEX=""; - private String SRSTDY=""; - private String SRSTPHSE=""; - private String SROBSTDY=""; - private String SRENDY=""; - private String SRENPHSE=""; - private String SROBENDY=""; - private String SRDOMAIN=""; - private String SRDOMAIN_DESC=""; - private String SRSPEC=""; - private String SRSPEC_DESC=""; - private String SRTSTCD=""; - private String SRTSTCD_DESC=""; - private String SRFNDG=""; - private String SRFNDG_DESC=""; - private String SRORES=""; - private String SROBSV=""; - private String SROBSV_DESC=""; - private String SROBSQ=""; - private String SRSEV=""; - private String SRPCNT=""; - private String SRSIGF=""; - private String SRTRTEF=""; - private String SRCOMNT=""; +public class SRDomainFinding implements Cloneable { + + private String STUDYID = ""; // Study Identifier + private String DOMAIN = ""; // Domain Abbreviation + private String SRSEQ = ""; // Sequence number + private String SRRISK = ""; // Risk Level Associated with this Group/Sex + private String SPGRPCD = ""; // Sponsor-Defined Group Code + private String SRGRPNAM = ""; // Group Name + private String SRGRPDOS = ""; // Group Dose Level + private String SRSEX = ""; // Sex + private String SRSTDY = ""; // Study Day of Start of Finding + private String SRSTPHSE = ""; // Study Phase of first Observation + private String SROBSTDY = ""; // Start Phase Day of Observation + private String SRENDY = ""; // Study Day of End of Finding + private String SRENPHSE = ""; // Study Phase of last Observation + private String SROBENDY = ""; // End Phase Day of Observation + private String SRDOMAIN = ""; // Domain of Finding + private String SRSPEC = ""; // Specimen of Finding + private String SRTSTCD = ""; // Test Short Name + private String SRFNDG = ""; // Finding + private String SRORES = ""; // Observation (original result) + private String SROBSV = ""; // Manifestation of Finding + private String SROBSQ = ""; // Observation Qualifier + private String SRSEV = ""; // Severity of Finding + private String SRPCNT = ""; // Scale of this Finding + private String SRSIGF = ""; // Statistical Significance + private String SRTRTEF = ""; // Treatment-Related? + private String SRCOMNT = ""; // Comment private Boolean export; private Integer findingId; private Integer srDomainId; - private String status="non_curated"; - - - - - public String getStatus() { + private SRDomainFindingStatus status = SRDomainFindingStatus.non_curated; + + public SRDomainFindingStatus getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(SRDomainFindingStatus status) { this.status = status; } - public String getSrdomain_value() { - if(Constants.SEND_DOMAIN_NAMES.get(SRDOMAIN)!=null) { - return Constants.SEND_DOMAIN_NAMES.get(SRDOMAIN) + "(" + SRDOMAIN + ")"; - }else if(SRDOMAIN==null || SRDOMAIN.equals("")) { - return ""; - }else { - return SRDOMAIN; - } - - } - - public String getSrfndg_value() { - if(SRFNDG ==null || SRFNDG.equals("")) { - return SRORES; - } - return SRFNDG_DESC + "(" + SRFNDG + ")"; - } - - public String getSrtstcd_value() { - if(SRTSTCD ==null || SRTSTCD.equals("")) { - return SRTSTCD_DESC; - } - return SRTSTCD_DESC + "(" + SRTSTCD + ")"; - } - - public String getSrobsv_value() { - if(SROBSV ==null || SROBSV.equals("")) { - return SROBSV_DESC; - } - return SROBSV_DESC + "(" + SROBSV + ")"; - } - - public String getSrspec_value() { - if(SRSPEC ==null || SRSPEC.equals("")) { - return SRSPEC_DESC; - } - return SRSPEC_DESC + "(" + SRSPEC + ")"; - } - - - public String getSTUDYID() { return STUDYID; } + public void setSTUDYID(String sTUDYID) { STUDYID = sTUDYID; } + public String getDOMAIN() { return DOMAIN; } + public void setDOMAIN(String dOMAIN) { DOMAIN = dOMAIN; } + public String getSRSEQ() { return SRSEQ; } + public void setSRSEQ(String sRSEQ) { SRSEQ = sRSEQ; } + public String getSRRISK() { return SRRISK; } + public void setSRRISK(String sRRISK) { SRRISK = sRRISK; } + public String getSPGRPCD() { return SPGRPCD; } + public void setSPGRPCD(String sPGRPCD) { SPGRPCD = sPGRPCD; } - public String getGRPLBL() { - return GRPLBL; - } - public void setGRPLBL(String gRPLBL) { - GRPLBL = gRPLBL; - } + public String getSRGRPDOS() { return SRGRPDOS; } + public void setSRGRPDOS(String sRGRPDOS) { SRGRPDOS = sRGRPDOS; } + public String getSRSEX() { return SRSEX; } + public void setSRSEX(String sRSEX) { SRSEX = sRSEX; } + public String getSRSTDY() { return SRSTDY; } + public void setSRSTDY(String sRSTDY) { SRSTDY = sRSTDY; } + public String getSRSTPHSE() { return SRSTPHSE; } + public void setSRSTPHSE(String sRSTPHSE) { SRSTPHSE = sRSTPHSE; } + public String getSROBSTDY() { return SROBSTDY; } + public void setSROBSTDY(String sROBSTDY) { SROBSTDY = sROBSTDY; } + public String getSRENDY() { return SRENDY; } + public void setSRENDY(String sRENDY) { SRENDY = sRENDY; } + public String getSRENPHSE() { return SRENPHSE; } + public void setSRENPHSE(String sRENPHSE) { SRENPHSE = sRENPHSE; } + public String getSROBENDY() { return SROBENDY; } + public void setSROBENDY(String sROBENDY) { SROBENDY = sROBENDY; } + public String getSRDOMAIN() { return SRDOMAIN; } + public void setSRDOMAIN(String sRDOMAIN) { SRDOMAIN = sRDOMAIN; } + public String getSRSPEC() { return SRSPEC; } + public void setSRSPEC(String sRSPEC) { SRSPEC = sRSPEC; } + public String getSRTSTCD() { return SRTSTCD; } + public void setSRTSTCD(String sRTSTCD) { SRTSTCD = sRTSTCD; } + public String getSRFNDG() { return SRFNDG; } + public void setSRFNDG(String sRFNDG) { SRFNDG = sRFNDG; } + public String getSRORES() { return SRORES; } + public void setSRORES(String sRORES) { SRORES = sRORES; } + public String getSROBSV() { return SROBSV; } - - + public void setSROBSV(String sROBSV) { + SROBSV = sROBSV; + } + public String getSROBSQ() { return SROBSQ; } + public void setSROBSQ(String sROBSQ) { SROBSQ = sROBSQ; } + public String getSRSEV() { return SRSEV; } + public void setSRSEV(String sRSEV) { SRSEV = sRSEV; } + public String getSRPCNT() { return SRPCNT; } + public void setSRPCNT(String sRPCNT) { SRPCNT = sRPCNT; } + public String getSRSIGF() { return SRSIGF; } + public void setSRSIGF(String sRSIGF) { SRSIGF = sRSIGF; } + public String getSRTRTEF() { return SRTRTEF; } + public void setSRTRTEF(String sRTRTEF) { SRTRTEF = sRTRTEF; } + public String getSRCOMNT() { return SRCOMNT; } + public void setSRCOMNT(String sRCOMNT) { SRCOMNT = sRCOMNT; } - public void setSRDOMAIN_DESC(String sRDOMAIN_DESC) { - SRDOMAIN_DESC = sRDOMAIN_DESC; - } - public void setSROBSV(String sROBSV) { - SROBSV = sROBSV; - } - - public String getSRDOMAIN_DESC() { - return SRDOMAIN_DESC; - } - - public String getSRSPEC_DESC() { - return SRSPEC_DESC; - } - public void setSRSPEC_DESC(String sRSPEC_DESC) { - SRSPEC_DESC = sRSPEC_DESC; - } - public String getSRTSTCD_DESC() { - return SRTSTCD_DESC; - } - public void setSRTSTCD_DESC(String sRTSTCD_DESC) { - SRTSTCD_DESC = sRTSTCD_DESC; - } - public String getSRFNDG_DESC() { - return SRFNDG_DESC; - } - public void setSRFNDG_DESC(String sRFNDG_DESC) { - SRFNDG_DESC = sRFNDG_DESC; - } - public String getSROBSV_DESC() { - return SROBSV_DESC; - } - public void setSROBSV_DESC(String sROBSV_DESC) { - SROBSV_DESC = sROBSV_DESC; - } + public Boolean getExport() { - if(export==null)return true; + if (export == null) + return true; return export; } + public void setExport(Boolean export) { this.export = export; } + public Integer getSrDomainId() { return srDomainId; } + public void setSrDomainId(Integer srDomainId) { this.srDomainId = srDomainId; } + public Integer getFindingId() { return findingId; } + public void setFindingId(Integer findingId) { this.findingId = findingId; } + public SRDomainFinding clone() { try { - return (SRDomainFinding)super.clone(); + return (SRDomainFinding) super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } + + public String getSRGRPNAM() { + return SRGRPNAM; + } + + public void setSRGRPNAM(String sRGRPNAM) { + SRGRPNAM = sRGRPNAM; + } + public String getTrackingSummary() { - String summary = SRSEQ ; - return summary; + return SRSEQ; } - + } diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFindingStatus.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFindingStatus.java new file mode 100644 index 0000000000000000000000000000000000000000..d5878b58645f8bda535b1cb9684ef4e2dfe3e8bd --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/SRDomainFindingStatus.java @@ -0,0 +1,5 @@ +package es.bsc.inb.etransafe.pretox.rest.api.model; + +public enum SRDomainFindingStatus { + non_curated, rejected, accepted, added; +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Section.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Section.java new file mode 100644 index 0000000000000000000000000000000000000000..ed39ac9ad7725f67f055af83076a38b32949fbb4 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Section.java @@ -0,0 +1,91 @@ +package es.bsc.inb.etransafe.pretox.rest.api.model; + +import org.bson.types.ObjectId; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Field; + +@org.springframework.data.mongodb.core.mapping.Document(collection="sections") +public class Section{ + @Field("_id") + @Id + private ObjectId _id; + + @Field("id") + private Long id; + + private String name; + + private String text; + + private String processDate; + + private String fileName; + + @DBRef + private DocumentAnnotations annotations; + + public Section() { + super(); + } + + public ObjectId get_id() { + return _id; + } + + public void set_id(ObjectId _id) { + this._id = _id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getProcessDate() { + return processDate; + } + + public void setProcessDate(String processDate) { + this.processDate = processDate; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public DocumentAnnotations getAnnotations() { + return annotations; + } + + public void setAnnotations(DocumentAnnotations annotations) { + this.annotations = annotations; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + + +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/model/Tracking.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Tracking.java similarity index 94% rename from src/main/java/es/bsc/inb/ades/rest/api/model/Tracking.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Tracking.java index 94a6cafdef609d2e63988812757d91a3526f30e6..84bf18bae5e0b9f0be5b638e4429e1f181aaba08 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/model/Tracking.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/model/Tracking.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.model; +package es.bsc.inb.etransafe.pretox.rest.api.model; import java.util.Date; diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepository.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepository.java similarity index 64% rename from src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepository.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepository.java index 38a021cb399bc8307422040c0b37248357e86119..d0f4a4612f3b77b3b513a71e2ce423c542124e2e 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepository.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepository.java @@ -1,13 +1,15 @@ -package es.bsc.inb.ades.rest.api.repository; +package es.bsc.inb.etransafe.pretox.rest.api.repository; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentAnnotations; @Repository public interface DocumentAnnotationsRepository extends DocumentAnnotationsRepositoryCustom, MongoRepository { + DocumentAnnotations findByDocumentId(String id); + DocumentAnnotations findByDocumentId(Long id); } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepositoryCustom.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepositoryCustom.java similarity index 68% rename from src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepositoryCustom.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepositoryCustom.java index 8cddfbe84c237a22d0b47ba77af82b181cc0454f..3c6aa15376a047aa19da2e6f63f17714798d28f9 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentAnnotationsRepositoryCustom.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentAnnotationsRepositoryCustom.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.repository; +package es.bsc.inb.etransafe.pretox.rest.api.repository; /** * Custom Interface for Document diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepository.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepository.java similarity index 82% rename from src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepository.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepository.java index 0a7317ad4c15e9aedd4356c758baef7d0a3626db..284629019dc92ecf7cce2f5ab8ab548f75920ce8 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepository.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepository.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.repository; +package es.bsc.inb.etransafe.pretox.rest.api.repository; import java.util.List; @@ -6,7 +6,7 @@ import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; -import es.bsc.inb.ades.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; @Repository public interface DocumentRepository extends DocumentRepositoryCustom, MongoRepository { diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryCustom.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..1937003af64e3d0f97e31b4f88c3f827905191ab --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryCustom.java @@ -0,0 +1,10 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +/** + * Custom Interface for Document + * @author jcorvi + * + */ +public interface DocumentRepositoryCustom { + +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryImpl.java similarity index 65% rename from src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryImpl.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryImpl.java index 260542d08814ad4d76de31ca14c18e33830d4a0a..4b86c8b4e7a833cfc9d344ee6596d5f23cb4e000 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentRepositoryImpl.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentRepositoryImpl.java @@ -1,9 +1,8 @@ -package es.bsc.inb.ades.rest.api.repository; +package es.bsc.inb.etransafe.pretox.rest.api.repository; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; @@ -12,9 +11,8 @@ import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; -import es.bsc.inb.ades.rest.api.model.Document; -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; -import es.bsc.inb.ades.rest.api.model.Finding; +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.Section; /** * Custom implementation of DocumentRepository @@ -40,19 +38,6 @@ public class DocumentRepositoryImpl implements DocumentRepositoryCustom{ List documents = mongoTemplate.find(query, Document.class); return documents; } - - - public DocumentAnnotations findByDocumentDataById(Long id) { - Query query = new Query(); - query.addCriteria(Criteria.where("name").is("0370138_pub-for-GGA.tei.xml")); - query.fields().include("annotations"); - List annotations = mongoTemplate.find(query, DocumentAnnotations.class); - return annotations.get(0); - } - - public Finding findByDocumentIdAndFindingId(Long id) { - return null; - } public String findDocumentTextSubstringByDocumentId(Long id, Integer start, Integer end) { @@ -66,15 +51,11 @@ public class DocumentRepositoryImpl implements DocumentRepositoryCustom{ Aggregation aggregation = Aggregation .newAggregation(matchOperation, projectionOperation); - AggregationResults aggregationResults - = mongoTemplate.aggregate(aggregation, "documents", Document.class); + AggregationResults
aggregationResults + = mongoTemplate.aggregate(aggregation, "sections", Section.class); return aggregationResults.getMappedResults().get(0).getText(); - -// BasicQuery query = new BasicQuery("{ age : { $lt : 50 }, accounts.balance : { $gt : 1000.00 }}"); -// List result = mongoTemplate.find(query, Person.class); - } - + } } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepository.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepository.java similarity index 72% rename from src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepository.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepository.java index 126b1f050475e2ce020c8331145a0e9d2379a9d1..19d7f6dd01cfe1648af1d057f4eab07571d39200 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/repository/DocumentTrackingRepository.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepository.java @@ -1,9 +1,9 @@ -package es.bsc.inb.ades.rest.api.repository; +package es.bsc.inb.etransafe.pretox.rest.api.repository; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; -import es.bsc.inb.ades.rest.api.model.DocumentTracking; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentTracking; @Repository public interface DocumentTrackingRepository extends DocumentTrackingRepositoryCustom, MongoRepository { diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepositoryCustom.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepositoryCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..d3db001f9165a3fd994c6c3db71d0857ac10f023 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/DocumentTrackingRepositoryCustom.java @@ -0,0 +1,5 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +public interface DocumentTrackingRepositoryCustom { + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepository.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..81e0ca20af76b49ad4fc978a272447dd5db32be4 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepository.java @@ -0,0 +1,17 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; + +@Repository +public interface ReportRepository extends ReportRepositoryCustom, MongoRepository { + + List findByFileName(String name); + + Optional findById(String reportId); +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryCustom.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..ceafc2a35c326d6f6fa0c7b09f4dbcef7c32de90 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryCustom.java @@ -0,0 +1,16 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +import java.util.List; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; + +/** + * Custom Interface for Report repository + * @author jcorvi + * + */ +public interface ReportRepositoryCustom { + + public List findAllActiveReports(); + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..01a79e9fb283ce92d5a075713fd78daa72812f4c --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/ReportRepositoryImpl.java @@ -0,0 +1,41 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; + +/** + * Custom implementation of DocumentRepository + * @author jcorvi + * + */ +public class ReportRepositoryImpl implements ReportRepositoryCustom{ + + @Autowired + MongoTemplate mongoTemplate; + + public List findAllActiveReports(){ + Query query = new Query(); + query.fields().include("id"); + query.fields().include("fileName"); + query.fields().include("gridFSId"); + query.fields().include("uploadDate"); + query.fields().include("status"); + query.fields().include("recordState"); + query.fields().include("hasSections"); + query.addCriteria(Criteria.where("recordState").ne("DELETED")); + //Sort sort = new Sort(Sort.Direction.ASC, "name"); + //query.with(sort); + List reports = mongoTemplate.find(query, Report.class); + return reports; + } + + + + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepository.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..f47a410be886feeff5df5600c3966caf8f241083 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepository.java @@ -0,0 +1,19 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +import java.util.Optional; + +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; +import es.bsc.inb.etransafe.pretox.rest.api.model.Section; + + + +@Repository +public interface SectionRepository extends SectionRepositoryCustom, MongoRepository { + + Optional
findById(Long sectionId); + + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryCustom.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..f4f8818f26b4732138193498122ad41de62047cb --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryCustom.java @@ -0,0 +1,12 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +/** + * Custom Interface for Document + * @author jcorvi + * + */ +public interface SectionRepositoryCustom { + + String findSectionTextSubstringByDocumentId(Long id, Integer start, Integer end); + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4f1d31ec687ae342e5507c9bd56e5dae9c08551d --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/repository/SectionRepositoryImpl.java @@ -0,0 +1,36 @@ +package es.bsc.inb.etransafe.pretox.rest.api.repository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.Aggregation; +import org.springframework.data.mongodb.core.aggregation.AggregationResults; +import org.springframework.data.mongodb.core.aggregation.MatchOperation; +import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; +import org.springframework.data.mongodb.core.query.Criteria; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Section; + +public class SectionRepositoryImpl implements SectionRepositoryCustom{ + + @Autowired + MongoTemplate mongoTemplate; + + public String findSectionTextSubstringByDocumentId(Long id, Integer start, Integer end) { + MatchOperation matchOperation = Aggregation + .match(new Criteria("id").is(id)); + + ProjectionOperation projectionOperation = Aggregation + .project("text") + .andExpression("substr(text, " + start + " ," + end + ")").as("text"); + + Aggregation aggregation = Aggregation + .newAggregation(matchOperation, projectionOperation); + + AggregationResults
aggregationResults + = mongoTemplate.aggregate(aggregation, "sections", Section.class); + + return aggregationResults.getMappedResults().get(0).getText(); + + } + +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/security/pkce/SecurityConfig.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/security/pkce/SecurityConfig.java similarity index 73% rename from src/main/java/es/bsc/inb/ades/rest/api/security/pkce/SecurityConfig.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/security/pkce/SecurityConfig.java index 7bfef2b3e9dbb033347acc2396a2db685e57a98b..5f1363b300b8d7e6d02f195f83d6479d2bad54a8 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/security/pkce/SecurityConfig.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/security/pkce/SecurityConfig.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.security.pkce; +package es.bsc.inb.etransafe.pretox.rest.api.security.pkce; @@ -19,7 +19,13 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests() .antMatchers(HttpMethod.GET, "/liveness").permitAll() .antMatchers(HttpMethod.GET, "/readiness").permitAll() + .antMatchers(HttpMethod.GET, "/reports/**").permitAll() .antMatchers(HttpMethod.GET, "/documents/restore/*").permitAll() + .antMatchers(HttpMethod.GET, "/reports/restore/*").permitAll() + .antMatchers(HttpMethod.GET, "/api-docs").permitAll() + .antMatchers(HttpMethod.GET, "/api-docs/**").permitAll() + .antMatchers(HttpMethod.GET, "/api.html").permitAll() + .antMatchers(HttpMethod.GET, "/swagger-ui/**").permitAll() .anyRequest().authenticated() .and() .sessionManagement() diff --git a/src/main/java/es/bsc/inb/ades/rest/api/services/DocumentService.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentService.java similarity index 59% rename from src/main/java/es/bsc/inb/ades/rest/api/services/DocumentService.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentService.java index c1d632c460513dc25aa09d821ae32100132aa16c..5dc1a76cff53da7bc0b52b421bc2420ea92a11c0 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/services/DocumentService.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentService.java @@ -1,11 +1,13 @@ -package es.bsc.inb.ades.rest.api.services; +package es.bsc.inb.etransafe.pretox.rest.api.services; import java.util.List; -import es.bsc.inb.ades.rest.api.model.Document; -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; -import es.bsc.inb.ades.rest.api.model.DocumentTracking; -import es.bsc.inb.ades.rest.api.model.Status; +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentAnnotations; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentTracking; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainDocument; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainFinding; +import es.bsc.inb.etransafe.pretox.rest.api.model.ReportStatus; public interface DocumentService { @@ -24,7 +26,7 @@ public interface DocumentService { DocumentAnnotations findDocumentAnnotationsByDocumentId(Long id); - DocumentAnnotations findDocumentSRDomainByDocumentId(Long id); + SRDomainDocument findSRDomainDocumentByDocumentId(Long id); String findSentenceEvidenceByDocumentIdAndSentenceId(Long id, Integer sentenceId); @@ -44,11 +46,15 @@ public interface DocumentService { Boolean setFindingValidation(Long id, Integer findingId,String status); - Status moveDocument(Long id, Status status); + ReportStatus moveDocument(Long id, ReportStatus status); DocumentTracking findTrackings(Long documentId); void removeDocument(long documentId); - void restoreDocument(long documentId); + void restoreDocument(long documentId); + + SRDomainFinding saveFinding(Long documentId, SRDomainFinding srDomainFinding); + + SRDomainFinding addFinding(Long documentId, SRDomainFinding srDomainFinding); } diff --git a/src/main/java/es/bsc/inb/ades/rest/api/services/DocumentServiceImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentServiceImpl.java similarity index 78% rename from src/main/java/es/bsc/inb/ades/rest/api/services/DocumentServiceImpl.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentServiceImpl.java index e007ac084bc428169152fb51063bc6fa1da5f08d..fadeb3d68f34cb56a930547c88bfa4b2106f7ce5 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/services/DocumentServiceImpl.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/DocumentServiceImpl.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.services; +package es.bsc.inb.etransafe.pretox.rest.api.services; import java.nio.charset.Charset; import java.security.Principal; @@ -10,10 +10,8 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Service; @@ -21,22 +19,23 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.nimbusds.jwt.JWT; -import es.bsc.inb.ades.rest.api.model.Action; -import es.bsc.inb.ades.rest.api.model.Annotation; -import es.bsc.inb.ades.rest.api.model.Document; -import es.bsc.inb.ades.rest.api.model.DocumentAnnotations; -import es.bsc.inb.ades.rest.api.model.DocumentTracking; -import es.bsc.inb.ades.rest.api.model.Finding; -import es.bsc.inb.ades.rest.api.model.RecordState; -import es.bsc.inb.ades.rest.api.model.SRDomainFinding; -import es.bsc.inb.ades.rest.api.model.Status; -import es.bsc.inb.ades.rest.api.model.Tracking; -import es.bsc.inb.ades.rest.api.repository.DocumentAnnotationsRepository; -import es.bsc.inb.ades.rest.api.repository.DocumentRepository; -import es.bsc.inb.ades.rest.api.repository.DocumentTrackingRepository; -import es.bsc.inb.ades.rest.api.util.Constants; +import es.bsc.inb.etransafe.pretox.rest.api.model.Action; +import es.bsc.inb.etransafe.pretox.rest.api.model.Annotation; +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentAnnotations; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentTracking; +import es.bsc.inb.etransafe.pretox.rest.api.model.Finding; +import es.bsc.inb.etransafe.pretox.rest.api.model.RecordState; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainDocument; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainFinding; +import es.bsc.inb.etransafe.pretox.rest.api.model.SRDomainFindingStatus; +import es.bsc.inb.etransafe.pretox.rest.api.model.ReportStatus; +import es.bsc.inb.etransafe.pretox.rest.api.model.Tracking; +import es.bsc.inb.etransafe.pretox.rest.api.repository.DocumentAnnotationsRepository; +import es.bsc.inb.etransafe.pretox.rest.api.repository.DocumentRepository; +import es.bsc.inb.etransafe.pretox.rest.api.repository.DocumentTrackingRepository; +import es.bsc.inb.etransafe.pretox.rest.api.util.Constants; @Service @@ -71,25 +70,34 @@ public class DocumentServiceImpl implements DocumentService { public String findDocumentTextSubstringByDocumentId(Long id, Integer start, Integer end) { return documentRepository.findDocumentTextSubstringByDocumentId(id, start, end); } - + //not used anymore public DocumentAnnotations findDocumentAnnotationsByDocumentId(Long id) { - return documentAnnotationsRepository.findByDocumentId(id); + //return documentAnnotationsRepository.findByDocumentId(id); + return null; } - public DocumentAnnotations findDocumentSRDomainByDocumentId(Long id) { - DocumentAnnotations docAnno = documentAnnotationsRepository.findByDocumentId(id); - List srdomains = new ArrayList(); - for (Annotation sentence : docAnno.getRelevantSentences()) { + + public SRDomainDocument findSRDomainDocumentByDocumentId(Long id) { + DocumentAnnotations documentAnnotations = documentAnnotationsRepository.findByDocumentId(id); + SRDomainDocument srdomainDocument = new SRDomainDocument(); + List srDomainFindings = documentAnnotations.getSrDomainFindings(); + if (srDomainFindings == null) { + srDomainFindings = new ArrayList<>(); + } + + for (Annotation sentence : documentAnnotations.getRelevantSentences()) { for (Finding finding : sentence.getFindings()) { - for (SRDomainFinding sr : finding.getSrDomainFindings()) { - srdomains.add(sr); + for (SRDomainFinding srFinding : finding.getSrDomainFindings()) { + srDomainFindings.add(srFinding); } } } - docAnno.setSrdomainfindings(srdomains); - docAnno.setRelevantSentences(null); - docAnno.setFindings(null); - return docAnno; + + srdomainDocument.setName(documentAnnotations.getName()); + srdomainDocument.setStatus(documentAnnotations.getStatus()); + srdomainDocument.setSrDomainFindings(srDomainFindings); + srdomainDocument.setPretoxDocumentId(documentAnnotations.getDocumentId()); + return srdomainDocument; } public Document findByDocumentId2(Long id) { @@ -140,7 +148,7 @@ public class DocumentServiceImpl implements DocumentService { } if(srDomainFindingelected!=null) { //https://stackoverflow.com/questions/47699646/updating-replacing-a-deeply-nested-object-in-mongodb-with-spring-data-mongodb - srDomainFindingelected.setStatus(status); + srDomainFindingelected.setStatus(SRDomainFindingStatus.valueOf(status)); documentAnnotationsRepository.save(documentAnnotations); createTracking(id, Action.ACCEPT, srDomainFindingelected.getTrackingSummary()); return true; @@ -325,7 +333,7 @@ public class DocumentServiceImpl implements DocumentService { retStr.append(srDomainFinding.getSPGRPCD()==null?"":srDomainFinding.getSPGRPCD()); retStr.append("|"); //GRPLBL --> Sponsor-defined Group Name, "low dose", "mid dose" - retStr.append(srDomainFinding.getGRPLBL()==null?"":srDomainFinding.getGRPLBL()); + retStr.append(srDomainFinding.getSRGRPNAM()==null?"":srDomainFinding.getSRGRPNAM()); retStr.append("|"); //SRGRPDOS --> Group Dose Level, "20 mg/kg" retStr.append(srDomainFinding.getSRGRPDOS()==null?"":srDomainFinding.getSRGRPDOS()); @@ -421,195 +429,7 @@ public class DocumentServiceImpl implements DocumentService { json_to_return.add("entities", entities); return gsonBuilder.toJson(json_to_return).toString(); } - - - -// /** -// * Generate the evidence snippet for a findind -// * @param text -// * @param findingSelected -// * @return -// */ -// private void generateFindingEvidence(JsonObject evidence, Finding findingSelected) { -// List all = findingSelected.generateSortedAnnotationsAll(); -// JsonArray entities = new JsonArray(); -// JsonArray attributes = new JsonArray(); -// JsonArray relations = new JsonArray(); -// int t = 1; -// int a = 1; -// int r = 1; -// String id_finding = ""; -// for (Annotation annotation : all) { -// JsonArray values = new JsonArray(); -// String type = annotation.getFeature("ANNOTATION_TYPE"); -// values.add("T"+t); -// values.add(type); -// JsonArray offste = new JsonArray(); -// JsonArray offste2 = new JsonArray(); -// offste.add(annotation.getStartOffset()); -// offste.add(annotation.getEndOffset()); -// offste2.add(offste); -// values.add(offste2); -// entities.add(values); -// if(type.equals("FINDING") || type.equals("STUDY_TESTCD") ) { -// id_finding = "T"+t; -// JsonArray values_a = new JsonArray(); -// values_a.add("A"+a); -// values_a.add("Notorious"); -// values_a.add(id_finding); -// attributes.add(values_a); -// a++; -// }else { -// JsonArray values_r = new JsonArray(); -// values_r.add("R"+r); -// values_r.add("Relation"); -// JsonArray values_r_e = new JsonArray(); -// JsonArray values_r_e_v = new JsonArray(); -// values_r_e_v.add("Entity"); -// values_r_e_v.add(id_finding); -// values_r_e.add(values_r_e_v); -// JsonArray values_r_e_v_2 = new JsonArray(); -// values_r_e_v_2.add("Subentity"); -// values_r_e_v_2.add("T"+t); -// values_r_e.add(values_r_e_v_2); -// values_r.add(values_r_e); -// relations.add(values_r); -// r++; -// } -// t++; -// } -// evidence.add("entities", entities); -// evidence.add("attributes", attributes); -// evidence.add("relations", relations); -// } -// -// /** -// * -// * @param text -// * @param findingSelected -// * @return -// */ -// private String generateFindingSnippet2(String text, Finding findingSelected) { -// Gson gsonBuilder = new GsonBuilder().create(); -// JsonObject finding = new JsonObject(); -// finding.addProperty("text", text); -// List all = findingSelected.generateSortedAnnotationsAll(); -// JsonArray entities = new JsonArray(); -// JsonArray attributes = new JsonArray(); -// JsonArray relations = new JsonArray(); -// int t = 1; -// int a = 1; -// int r = 1; -// String id_finding = ""; -// for (Annotation annotation : all) { -// JsonArray values = new JsonArray(); -// String type = annotation.getFeature("ANNOTATION_TYPE"); -// values.add("T"+t); -// values.add(type); -// JsonArray offste = new JsonArray(); -// JsonArray offste2 = new JsonArray(); -// offste.add(annotation.getStartOffset()); -// offste.add(annotation.getEndOffset()); -// offste2.add(offste); -// values.add(offste2); -// entities.add(values); -// if(type.equals("FINDING") || type.equals("STUDY_TESTCD") ) { -// id_finding = "T"+t; -// JsonArray values_a = new JsonArray(); -// values_a.add("A"+a); -// values_a.add("Notorious"); -// values_a.add(id_finding); -// attributes.add(values_a); -// a++; -// }else { -// JsonArray values_r = new JsonArray(); -// values_r.add("R"+r); -// values_r.add("Relation"); -// JsonArray values_r_e = new JsonArray(); -// JsonArray values_r_e_v = new JsonArray(); -// values_r_e_v.add("Entity"); -// values_r_e_v.add(id_finding); -// values_r_e.add(values_r_e_v); -// JsonArray values_r_e_v_2 = new JsonArray(); -// values_r_e_v_2.add("Subentity"); -// values_r_e_v_2.add("T"+t); -// values_r_e.add(values_r_e_v_2); -// values_r.add(values_r_e); -// relations.add(values_r); -// r++; -// } -// t++; -// } -// finding.add("entities", entities); -// finding.add("attributes", attributes); -// finding.add("relations", relations); -// return gsonBuilder.toJson(finding).toString(); -// } - -// /** -// * -// * @param text -// * @param findingSelected -// * @return -// */ -// private String generateFindingsSnippet4(String text, List findings) { -// Gson gsonBuilder = new GsonBuilder().create(); -// JsonObject findings_evidence = new JsonObject(); -// findings_evidence.addProperty("text", text); -// JsonArray entities = new JsonArray(); -// JsonArray attributes = new JsonArray(); -// JsonArray relations = new JsonArray(); -// int t = 1; -// int a = 1; -// int r = 1; -// for (Finding findingSelected : findings) { -// List all = findingSelected.generateSortedAnnotationsAll(); -// String id_finding = ""; -// for (Annotation annotation : all) { -// JsonArray values = new JsonArray(); -// String type = annotation.getFeature("ANNOTATION_TYPE"); -// values.add("T"+t); -// values.add(type); -// JsonArray offste = new JsonArray(); -// JsonArray offste2 = new JsonArray(); -// offste.add(annotation.getStartOffset()); -// offste.add(annotation.getEndOffset()); -// offste2.add(offste); -// values.add(offste2); -// entities.add(values); -// if(type.equals("FINDING") || type.equals("STUDY_TESTCD") ) { -// id_finding = "T"+t; -// JsonArray values_a = new JsonArray(); -// values_a.add("A"+a); -// values_a.add("Notorious"); -// values_a.add(id_finding); -// attributes.add(values_a); -// a++; -// }else { -// JsonArray values_r = new JsonArray(); -// values_r.add("R"+r); -// values_r.add("Relation"); -// JsonArray values_r_e = new JsonArray(); -// JsonArray values_r_e_v = new JsonArray(); -// values_r_e_v.add("Entity"); -// values_r_e_v.add(id_finding); -// values_r_e.add(values_r_e_v); -// JsonArray values_r_e_v_2 = new JsonArray(); -// values_r_e_v_2.add("Subentity"); -// values_r_e_v_2.add("T"+t); -// values_r_e.add(values_r_e_v_2); -// values_r.add(values_r_e); -// relations.add(values_r); -// r++; -// } -// t++; -// } -// findings_evidence.add("entities", entities); -// findings_evidence.add("attributes", attributes); -// findings_evidence.add("relations", relations); -// } -// return gsonBuilder.toJson(findings_evidence).toString(); -// } + /** * Generate the snippet only of the text without annotations. @@ -979,14 +799,14 @@ public class DocumentServiceImpl implements DocumentService { } @Override - public Status moveDocument(Long id, Status status) { + public ReportStatus moveDocument(Long id, ReportStatus status) { Document document = this.findByDocumentId(id); DocumentAnnotations documentAnnotation = this.findDocumentAnnotationsByDocumentId(id); document.setStatus(status); documentAnnotation.setStatus(status); documentRepository.save(document); documentAnnotationsRepository.save(documentAnnotation); - createTracking(id, Action.MOVE, status.toString()); + createTracking(id, Action.MOVE, status.toString()); return status; } @@ -1046,5 +866,41 @@ public class DocumentServiceImpl implements DocumentService { public void setRequest(HttpServletRequest request) { this.request = request; } - + + @Override + public SRDomainFinding saveFinding(Long documentId, SRDomainFinding srDomainFinding) { + DocumentAnnotations documentAnnotations = this.findDocumentAnnotationsByDocumentId(documentId); + SRDomainFinding srDomainFinding2 = findSRDomainFinding(documentAnnotations, srDomainFinding.getSrDomainId()); + BeanUtils.copyProperties(srDomainFinding, srDomainFinding2); + documentAnnotationsRepository.save(documentAnnotations); + return srDomainFinding; + } + + private SRDomainFinding findSRDomainFinding(DocumentAnnotations documentAnnotations, Integer id) { + for (Annotation annotation : documentAnnotations.getRelevantSentences()) { + for (Finding finding : annotation.getFindings()) { + for (SRDomainFinding srDomainFinding : finding.getSrDomainFindings()) { + if(srDomainFinding.getSrDomainId().equals(id)) { + return srDomainFinding; + } + } + + } + } + return null; + } + + @Override + public SRDomainFinding addFinding(Long documentId, SRDomainFinding srDomainFinding) { + DocumentAnnotations documentAnnotations = this.findDocumentAnnotationsByDocumentId(documentId); + List srdomainfindings = documentAnnotations.getSrDomainFindings(); + if (srdomainfindings == null) { + srdomainfindings = new ArrayList<>(); + documentAnnotations.setSrDomainFindings(srdomainfindings); + } + + srdomainfindings.add(srDomainFinding); + documentAnnotationsRepository.save(documentAnnotations); + return srDomainFinding; + } } diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileService.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileService.java new file mode 100644 index 0000000000000000000000000000000000000000..e1a2a03d14c0fe9f5666155cdfbe2613841b14e2 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileService.java @@ -0,0 +1,26 @@ +package es.bsc.inb.etransafe.pretox.rest.api.services; + +import java.util.List; + +import org.springframework.web.multipart.MultipartFile; + +public interface FileService { + + + /* + Metodo para guardar los archivos + */ + public void save(MultipartFile file); + + /* + Metodo para Borrar un archivo + */ + public String deleteFile(String filename); + /** + * + * @param files + * @return + */ + public List validate(MultipartFile[] files, Boolean allow_duplicates); + +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/services/FileServiceImp.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileServiceImp.java similarity index 76% rename from src/main/java/es/bsc/inb/ades/rest/api/services/FileServiceImp.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileServiceImp.java index 1aafb88b050d6761142478ad40663ed430442245..1474e6ab3e8a69ab116796b7def2f9b4a86b20fb 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/services/FileServiceImp.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/FileServiceImp.java @@ -1,29 +1,9 @@ -package es.bsc.inb.ades.rest.api.services; +package es.bsc.inb.etransafe.pretox.rest.api.services; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.bson.Document; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.stereotype.Service; -import org.springframework.util.FileSystemUtils; -import org.springframework.web.multipart.MultipartFile; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; - -import es.bsc.inb.ades.rest.api.model.RecordState; - import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; -import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -34,7 +14,20 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Stream; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.IOUtils; +import org.bson.Document; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.gridfs.GridFsOperations; +import org.springframework.data.mongodb.gridfs.GridFsTemplate; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; @Service public class FileServiceImp implements FileService { @@ -48,15 +41,12 @@ public class FileServiceImp implements FileService { @Autowired DocumentService documentService; - @Override - public void init() { - try { - Files.createDirectory(root); - } catch (IOException e) { - throw new RuntimeException("No se puede inicializar la carpeta uploads"); - } - } + @Autowired + private GridFsOperations operations; + @Autowired + private GridFsTemplate gridFsTemplate; + /** * Execute process in a document * @param file @@ -82,13 +72,31 @@ public class FileServiceImp implements FileService { e.printStackTrace(); } } + + /** + * Execute process in a document + * @param file + * @param outputGATEFile + * @throws ResourceInstantiationException + * @throws IOException + * @throws JsonGenerationException + * @throws InvalidOffsetException + */ + public String saveLegacyReport(MultipartFile file) throws IOException{ + DBObject metadata = new BasicDBObject(); + metadata.put("fileSize", file.getSize()); + metadata.put("type", "legacy_report"); + Object fileID = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType(), metadata); + return fileID.toString(); + } + /** * return if document id exist in database. * @param doc */ private Boolean documentIdExist(Document doc) { Long documentId = doc.getLong("id"); - es.bsc.inb.ades.rest.api.model.Document document = documentService.findByDocumentId(documentId); + es.bsc.inb.etransafe.pretox.rest.api.model.Document document = documentService.findByDocumentId(documentId); if(document!=null) { return true; } @@ -101,48 +109,14 @@ public class FileServiceImp implements FileService { */ private Boolean documentNameExist(Document doc) { String name = doc.getString("name"); - List documents = documentService.findByDocumentsName(name); + List documents = documentService.findByDocumentsName(name); if(documents!=null && documents.size()>0) { return true; } return false; } - @Override - public Resource load(String filename) { - try { - Path file = root.resolve(filename); - Resource resource = new UrlResource(file.toUri()); - - if(resource.exists() || resource.isReadable()){ - return resource; - }else{ - throw new RuntimeException("No se puede leer el archivo "); - } - - }catch (MalformedURLException e){ - throw new RuntimeException("Error: " + e.getMessage()); - } - } - @Override - public void deleteAll() { - FileSystemUtils.deleteRecursively(root.toFile()); - } - - @Override - public Stream loadAll(){ - //Files.walk recorre nuestras carpetas (uploads) buscando los archivos - // el 1 es la profundidad o nivel que queremos recorrer - // :: Referencias a metodos - // Relativize sirve para crear una ruta relativa entre la ruta dada y esta ruta - try{ - return Files.walk(this.root,1).filter(path -> !path.equals(this.root)) - .map(this.root::relativize); - }catch (RuntimeException | IOException e){ - throw new RuntimeException("No se pueden cargar los archivos "); - } - } @Override public String deleteFile(String filename){ @@ -158,7 +132,6 @@ public class FileServiceImp implements FileService { @Override public List validate(MultipartFile[] files, Boolean allow_duplicates) { List errors = new ArrayList(); - Map map = new HashMap(); List annotations_files = new ArrayList(); List documents_files = new ArrayList(); List documents_files_multipart = new ArrayList(); @@ -250,4 +223,6 @@ public class FileServiceImp implements FileService { return new ArrayList(errors); } + + } diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportService.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportService.java new file mode 100644 index 0000000000000000000000000000000000000000..b9a596bf93f45d3ad9347133dcaefc66e6942e96 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportService.java @@ -0,0 +1,66 @@ +package es.bsc.inb.etransafe.pretox.rest.api.services; + +import java.io.IOException; +import java.util.List; + +import org.springframework.web.multipart.MultipartFile; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; + +public interface ReportService { + + + /** + * Save legacy report + * @param file + */ + public Report upload(MultipartFile file) throws IOException; + /** + * Validate legacy report save + * @param files + * @param allow_duplicates + * @return + */ + public List validateUpload(MultipartFile[] files); + + /** + * download legacy report content, + * @param id + * @return + * @throws IOException + * @throws IllegalStateException + */ + public Report download(String id) throws IllegalStateException, IOException; + /** + * List of reports. + * @return + */ + public List list(); + /** + * Remove report + * @param documentId + * @return + */ + public Report remove(String reportId); + /** + * Restore report + * @param documentId + * @return + */ + public Report restore(String reportId); + /** + * + * @param id + * @return + */ + public Report findById(String id); + /** + * + * @param reportId + * @param sectionId + * @return + */ + public Report findReportByIdAndSectionById(String reportId, Long sectionId); + + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportServiceImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..35de1b0c002dc1bcf4da393bda9578d9983c48a9 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/ReportServiceImpl.java @@ -0,0 +1,143 @@ +package es.bsc.inb.etransafe.pretox.rest.api.services; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.bson.types.ObjectId; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.gridfs.GridFsOperations; +import org.springframework.data.mongodb.gridfs.GridFsTemplate; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.client.gridfs.model.GridFSFile; + +import es.bsc.inb.etransafe.pretox.rest.api.model.RecordState; +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; +import es.bsc.inb.etransafe.pretox.rest.api.model.ReportStatus; +import es.bsc.inb.etransafe.pretox.rest.api.model.Section; +import es.bsc.inb.etransafe.pretox.rest.api.repository.ReportRepository; + +@Service +public class ReportServiceImpl implements ReportService { + + @Autowired + ReportRepository reportRepository; + + @Autowired + private GridFsOperations operations; + + @Autowired + private GridFsTemplate gridFsTemplate; + + /** + * Execute process in a document + * + * @param file + * @param outputGATEFile + * @throws ResourceInstantiationException + * @throws IOException + * @throws JsonGenerationException + * @throws InvalidOffsetException + */ + public Report upload(MultipartFile file) throws IOException { + DBObject metadata = new BasicDBObject(); + metadata.put("fileSize", file.getSize()); + metadata.put("type", "legacy_report"); + ObjectId fileID = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType(), + metadata); + GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(fileID))); + Report report = new Report(); + if (gridFSFile != null && gridFSFile.getMetadata() != null) { + report.setFileName(gridFSFile.getFilename()); + report.setName(gridFSFile.getFilename().replace(".pdf", "")); + report.setFileType(gridFSFile.getMetadata().get("_contentType").toString()); + report.setFileSize(gridFSFile.getMetadata().get("fileSize").toString()); + report.setGridFSId(fileID.toString()); + report.setUploadDate(gridFSFile.getUploadDate()); + report.setStatus(ReportStatus.WORKFLOW_READY); + report.setRecordState(RecordState.ACTIVE); + } + reportRepository.save(report); + return report; + } + + @Override + public List validateUpload(MultipartFile[] files) { + List errors = new ArrayList(); + for (MultipartFile multipartFile : files) { + if (!multipartFile.getOriginalFilename().endsWith(".pdf")) { + errors.add("Only pdf files are allowed to upload" + multipartFile.getOriginalFilename() + "."); + } else { + List reports = reportRepository.findByFileName(multipartFile.getOriginalFilename()); + boolean isRepeated = reports != null && reports.stream().anyMatch(report -> report.getRecordState() == RecordState.ACTIVE); + if (isRepeated) { + errors.add("There is an active report with the file name already in the database: " + + multipartFile.getOriginalFilename() + "."); + } + } + } + + return errors; + } + + @Override + public Report download(String id) throws IllegalStateException, IOException { + GridFSFile gridFSFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id))); + Report loadFile = new Report(); + if (gridFSFile != null && gridFSFile.getMetadata() != null) { + loadFile.setFileName(gridFSFile.getFilename()); + loadFile.setFileType(gridFSFile.getMetadata().get("_contentType").toString()); + loadFile.setFileSize(gridFSFile.getMetadata().get("fileSize").toString()); + loadFile.setFile(IOUtils.toByteArray(operations.getResource(gridFSFile).getInputStream())); + } + return loadFile; + } + + @Override + public List list() { + return reportRepository.findAllActiveReports(); + } + + @Override + public Report remove(String reportId) { + Report report = this.findById(reportId); + report.setRecordState(RecordState.DELETED); + return reportRepository.save(report); + } + + @Override + public Report findById(String reportId) { + return reportRepository.findById(reportId).get(); + } + + @Override + public Report restore(String reportId) { + Report report = this.findById(reportId); + report.setRecordState(RecordState.ACTIVE); + return reportRepository.save(report); + } + + @Override + public Report findReportByIdAndSectionById(String reportId, Long sectionId) { + Report report = reportRepository.findById(reportId).get(); + Section selected = null; + for (Section section : report.getSections()) { + if(section.getId().equals(sectionId)) { + selected = section; + } + } + report.getSections().clear(); + report.getSections().add(selected); + return report; + } + + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceService.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceService.java new file mode 100644 index 0000000000000000000000000000000000000000..cd481521279f6f6cdf6e997b5aa0e9b3470457d3 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceService.java @@ -0,0 +1,19 @@ +package es.bsc.inb.etransafe.pretox.rest.api.services; + +public interface TextualEvidenceService { + + String findTextByReportId(String id); + + String findFindingEvidenceByDocumentAnnotationsIdAndFindingId(Long documentAnnotationsId, Integer findingId); + + String findSentenceEvidenceByDocumentAnnotationsIdAndSentenceId(Long documentAnnotationsId, Integer sentenceId); + + String findFindingsEvidenceByReportId(String reportId); + + String findSentencesEvidenceByReportId(String reportId); + + String findFindingsEvidenceByDocumentAnnotationsId(Long documentAnnotationsId); + + String findSentencesEvidenceByDocumentAnnotationsId(Long documentAnnotationsId); + +} diff --git a/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceServiceImpl.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..355071c5bd81aba72796e76be08a34022f1dd403 --- /dev/null +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/services/TextualEvidenceServiceImpl.java @@ -0,0 +1,400 @@ +package es.bsc.inb.etransafe.pretox.rest.api.services; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import es.bsc.inb.etransafe.pretox.rest.api.model.Annotation; +import es.bsc.inb.etransafe.pretox.rest.api.model.Document; +import es.bsc.inb.etransafe.pretox.rest.api.model.DocumentAnnotations; +import es.bsc.inb.etransafe.pretox.rest.api.model.Finding; +import es.bsc.inb.etransafe.pretox.rest.api.model.Report; +import es.bsc.inb.etransafe.pretox.rest.api.model.Section; +import es.bsc.inb.etransafe.pretox.rest.api.repository.DocumentAnnotationsRepository; +import es.bsc.inb.etransafe.pretox.rest.api.repository.ReportRepository; +import es.bsc.inb.etransafe.pretox.rest.api.repository.SectionRepository; +import es.bsc.inb.etransafe.pretox.rest.api.util.Constants; + +@Service +public class TextualEvidenceServiceImpl implements TextualEvidenceService{ + + @Autowired + ReportRepository reportRepository; + @Autowired + DocumentAnnotationsRepository documentAnnotationsRepository; + @Autowired + SectionRepository sectionRepository; + + /** + * Return plain text of the report + */ + @Override + public String findTextByReportId(String reportId) { + Report report = reportRepository.findById(reportId).get(); + if(report.getSections()!=null && report.getSections().size()>0) { + return generateOnlyTextSnippet(report.getSections().get(0).getText()); + } + return null; + } + + + + + public String findDocumentTextSubstringByDocumentId(Long id, Integer start, Integer end) { + return sectionRepository.findSectionTextSubstringByDocumentId(id, start, end); + } + + + + @Override + public String findFindingsEvidenceByReportId(String reportId) { + Report report = reportRepository.findById(reportId).get(); + if(report.getSections()!=null && report.getSections().size()>0) { + Section section = report.getSections().get(0); + return this.generateAllFindingsEvidenceSnippet(section.getText(), section.getAnnotations().getRelevantSentences()); + } + return ""; + } + + @Override + public String findSentencesEvidenceByReportId(String reportId) { + Report report = reportRepository.findById(reportId).get(); + if(report.getSections()!=null && report.getSections().size()>0) { + Section section = report.getSections().get(0); + return this.generateAllRelevantSentenceEvidenceSnippet(section.getText(), section.getAnnotations().getRelevantSentences()); + } + return ""; + } + + @Override + public String findFindingsEvidenceByDocumentAnnotationsId(Long sectionId) { + Section section = sectionRepository.findById(sectionId).get(); + return this.generateAllFindingsEvidenceSnippet(section.getText(), section.getAnnotations().getRelevantSentences()); + } + + @Override + public String findSentencesEvidenceByDocumentAnnotationsId(Long sectionId) { + Section section = sectionRepository.findById(sectionId).get(); + return this.generateAllRelevantSentenceEvidenceSnippet(section.getText(), section.getAnnotations().getRelevantSentences()); + } + + + /** + * Generate finding snippet + * @param text + * @param findingSelected + * @return + */ + private String generateFindingSnippet(String text, Finding findingSelected,int start_off ,int start_annotation_aux) { + Gson gsonBuilder = new GsonBuilder().create(); + JsonObject finding = new JsonObject(); + finding.addProperty("text", text); + List all = findingSelected.generateSortedAnnotationsAll(); + JsonArray entities = new JsonArray(); + JsonArray attributes = new JsonArray(); + JsonArray relations = new JsonArray(); + int t = 1; + int a = 1; + int r = 1; + String id_finding = ""; + for (Annotation annotation : all) { + JsonArray values = new JsonArray(); + String type = annotation.getFeature("ANNOTATION_TYPE"); + + //working add features to comment + String id = "T"+t; + String source = annotation.getFeature("SOURCES"); + if(source!=null && !source.equals("")) { + id = id + " - SOURCE: " + source; + } + //values.add(id); + + values.add("T"+t); + values.add(type); + JsonArray offste = new JsonArray(); + JsonArray offste2 = new JsonArray(); + + //slice for subtext manipulation + int annotation_text_size = annotation.getEndOffset() - annotation.getStartOffset(); + annotation.setStartOffset(start_off + Constants.POINTS_INT + (annotation.getStartOffset()-start_annotation_aux)); + annotation.setEndOffset(annotation.getStartOffset() + annotation_text_size); + + offste.add(annotation.getStartOffset()); + offste.add(annotation.getEndOffset()); + offste2.add(offste); + values.add(offste2); + entities.add(values); + if(type.equals("FINDING") || type.equals("STUDY_TESTCD") ) { + id_finding = "T"+t; + JsonArray values_a = new JsonArray(); + values_a.add("A"+a); + values_a.add("Notorious"); + values_a.add(id_finding); + attributes.add(values_a); + a++; + }else { + JsonArray values_r = new JsonArray(); + values_r.add("R"+r); + values_r.add("Relation"); + JsonArray values_r_e = new JsonArray(); + JsonArray values_r_e_v = new JsonArray(); + values_r_e_v.add("Entity"); + values_r_e_v.add(id_finding); + values_r_e.add(values_r_e_v); + JsonArray values_r_e_v_2 = new JsonArray(); + values_r_e_v_2.add("Subentity"); + values_r_e_v_2.add("T"+t); + values_r_e.add(values_r_e_v_2); + values_r.add(values_r_e); + relations.add(values_r); + r++; + } + t++; + } + finding.add("entities", entities); + finding.add("attributes", attributes); + finding.add("relations", relations); + return gsonBuilder.toJson(finding).toString(); + } + + + @Override + public String findSentenceEvidenceByDocumentAnnotationsIdAndSentenceId(Long documentAnnotationId, Integer sentenceId) { + DocumentAnnotations documentAnnotations = documentAnnotationsRepository.findByDocumentId(documentAnnotationId); + Annotation annotation = null; + for (Annotation sentence : documentAnnotations.getRelevantSentences()) { + if(sentence.getId().equals(sentenceId)) { + annotation = sentence; + break; + } + } + if(annotation!=null) { + int text_size = annotation.getEndOffset() - annotation.getStartOffset(); + int start_ = 0; + int start_off = 0; + if(annotation.getStartOffset()-Constants.SLICE_START >= 0) { + start_ = annotation.getStartOffset()-Constants.SLICE_START; + start_off = Constants.SLICE_START; + }else { + start_off = annotation.getStartOffset(); + } + String subtext = this.findDocumentTextSubstringByDocumentId(documentAnnotationId, start_ , text_size + Constants.SLICE_END); + subtext = Constants.POINTS + subtext + Constants.POINTS; + annotation.setStartOffset(start_off + Constants.POINTS_INT); + annotation.setEndOffset(start_off + Constants.POINTS_INT + text_size); + return this.generateSentenceSnippet(subtext, annotation); + } + return ""; + } + + /** + * Generate the evidence snippet for a sentence + * + * @param text + * @param findingSelected + * @return + */ + private String generateSentenceSnippet(String text, Annotation sentence) { + Gson gsonBuilder = new GsonBuilder().create(); + JsonObject json_to_return = new JsonObject(); + json_to_return.addProperty("text", text); + JsonArray entities = new JsonArray(); + String id_sentence = "T"+sentence.getId()+ " - SCORE: " + sentence.getFeature("PRETOX_REL_SCORE"); + JsonArray values = new JsonArray(); + values.add(id_sentence); + values.add("RELEVANT_SENTENCE"); + JsonArray offste = new JsonArray(); + JsonArray offste2 = new JsonArray(); + offste.add(sentence.getStartOffset()); + offste.add(sentence.getEndOffset()); + offste2.add(offste); + values.add(offste2); + entities.add(values); + json_to_return.add("entities", entities); + return gsonBuilder.toJson(json_to_return).toString(); + } + + + + /** + * Generate the evidence of view all button. + * @param text + * @param findingSelected + * @return + */ + private String generateAllFindingsEvidenceSnippet(String text, List sentences) { + Gson gsonBuilder = new GsonBuilder().create(); + JsonObject findings_evidence = new JsonObject(); + findings_evidence.addProperty("text", text); + JsonArray entities = new JsonArray(); + JsonArray attributes = new JsonArray(); + JsonArray relations = new JsonArray(); + int t = 1; + int a = 1; + int r = 1; + for (Annotation sentenceAnnotation : sentences) { + if(sentenceAnnotation.getFindings()!=null) { + for (Finding findingSelected : sentenceAnnotation.getFindings()) { + List all = findingSelected.generateSortedAnnotationsAll(); + String id_finding = ""; + for (Annotation annotation : all) { + JsonArray values = new JsonArray(); + String type = annotation.getFeature("ANNOTATION_TYPE"); + String id = "T"+t; + + //TODO source +// String source = annotation.getFeature("SOURCES"); +// if(source!=null && !source.equals("")) { +// id = id + " - SOURCE: " + source; +// } +// values.add("T"+t+ " - SOURCE: " + source); + + values.add(id); + values.add(type); + JsonArray offste = new JsonArray(); + JsonArray offste2 = new JsonArray(); + offste.add(annotation.getStartOffset()); + offste.add(annotation.getEndOffset()); + offste2.add(offste); + values.add(offste2); + entities.add(values); + if(type.equals("FINDING") || type.equals("STUDY_TESTCD") ) { + id_finding = "T"+t; + JsonArray values_a = new JsonArray(); + values_a.add("A"+a); + values_a.add("Notorious"); + values_a.add(id_finding); + attributes.add(values_a); + a++; + }else { + JsonArray values_r = new JsonArray(); + values_r.add("R"+r); + values_r.add("Relation"); + JsonArray values_r_e = new JsonArray(); + JsonArray values_r_e_v = new JsonArray(); + values_r_e_v.add("Entity"); + values_r_e_v.add(id_finding); + values_r_e.add(values_r_e_v); + JsonArray values_r_e_v_2 = new JsonArray(); + values_r_e_v_2.add("Subentity"); + values_r_e_v_2.add("T"+t); + values_r_e.add(values_r_e_v_2); + values_r.add(values_r_e); + relations.add(values_r); + r++; + } + t++; + } + } + } + + } + findings_evidence.add("entities", entities); + findings_evidence.add("attributes", attributes); + findings_evidence.add("relations", relations); + return gsonBuilder.toJson(findings_evidence).toString(); + } + + + /** + * Generate the relevant sentences snippet + * @param text + * @param sentences + * @return + */ + private String generateAllRelevantSentenceEvidenceSnippet(String text, List sentences) { + Gson gsonBuilder = new GsonBuilder().create(); + JsonObject relevant_evidence = new JsonObject(); + relevant_evidence.addProperty("text", text); + JsonArray entities = new JsonArray(); + //JsonArray attributes = new JsonArray(); + //JsonArray comments = new JsonArray(); + int t = 1; + for (Annotation sentenceAnnotation : sentences) { + JsonArray values_sentence = new JsonArray(); + values_sentence.add("T"+t); + //values_sentence.add("T"+t + " - SCORE: " + sentenceAnnotation.getFeature("PRETOX_REL_SCORE")); + values_sentence.add("RELEVANT_SENTENCE"); + JsonArray offste_sentence = new JsonArray(); + JsonArray offste2_sentence = new JsonArray(); + offste_sentence.add(sentenceAnnotation.getStartOffset()); + offste_sentence.add(sentenceAnnotation.getEndOffset()); + offste2_sentence.add(offste_sentence); + values_sentence.add(offste2_sentence); + entities.add(values_sentence); + //entities.add("other thing"); + t++; + relevant_evidence.add("entities", entities); + //relevant_evidence.add("attributes", attributes); + //relevant_evidence.add("comments", comments); + } + + return gsonBuilder.toJson(relevant_evidence).toString(); + } + + + + /** + * Generate the snippet only of the text without annotations. + * @param text + * @return + */ + private String generateOnlyTextSnippet(String text) { + Gson gsonBuilder = new GsonBuilder().create(); + JsonObject findings_evidence = new JsonObject(); + findings_evidence.addProperty("text", text); + JsonArray entities = new JsonArray(); + JsonArray attributes = new JsonArray(); + JsonArray relations = new JsonArray(); + findings_evidence.add("entities", entities); + findings_evidence.add("attributes", attributes); + findings_evidence.add("relations", relations); + return gsonBuilder.toJson(findings_evidence).toString(); + } + + + @Override + public String findFindingEvidenceByDocumentAnnotationsIdAndFindingId(Long documentAnnotationsId, Integer findingId) { + DocumentAnnotations documentAnnotations = documentAnnotationsRepository.findByDocumentId(documentAnnotationsId); + Finding findingSelected = null; + Annotation sentenceRelevantText = null; + for (Annotation annotation : documentAnnotations.getRelevantSentences()) { + for (Finding finding : annotation.getFindings()) { + if(finding.getFindingId().equals(findingId)) { + findingSelected = finding; + sentenceRelevantText = annotation; + break; + } + } + } + if(findingSelected!=null) { + //I removed relevant text as atribute so ... + //Annotation annotation = findingSelected.getRelevant_text(); + Annotation annotation = sentenceRelevantText; + int text_size = annotation.getEndOffset() - annotation.getStartOffset(); + int start_ = 0; + int start_off = 0; + if(annotation.getStartOffset()-Constants.SLICE_START >= 0) { + start_ = annotation.getStartOffset()-Constants.SLICE_START; + start_off = Constants.SLICE_START; + }else { + start_off = annotation.getStartOffset(); + } + String subtext = this.findDocumentTextSubstringByDocumentId(documentAnnotationsId, start_, text_size + Constants.SLICE_END); + subtext = Constants.POINTS + subtext + Constants.POINTS; + int start_annotation_aux = annotation.getStartOffset(); + annotation.setStartOffset(Constants.SLICE_START + Constants.POINTS_INT); + annotation.setEndOffset(Constants.SLICE_START + Constants.POINTS_INT + text_size); + return this.generateFindingSnippet(subtext, findingSelected, start_off, start_annotation_aux); + } + return ""; + } + + +} diff --git a/src/main/java/es/bsc/inb/ades/rest/api/util/Constants.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/Constants.java similarity index 94% rename from src/main/java/es/bsc/inb/ades/rest/api/util/Constants.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/Constants.java index 13caede0d343d42a6a70725b70340d8962983686..5a2844dcd2c74b1e7e5b7334a1bef87167af4bdf 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/util/Constants.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/Constants.java @@ -1,4 +1,4 @@ -package es.bsc.inb.ades.rest.api.util; +package es.bsc.inb.etransafe.pretox.rest.api.util; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/es/bsc/inb/ades/rest/api/util/VisualizationHTMLUtil.java b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/VisualizationHTMLUtil.java similarity index 97% rename from src/main/java/es/bsc/inb/ades/rest/api/util/VisualizationHTMLUtil.java rename to src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/VisualizationHTMLUtil.java index f81953242783960d589b3c0350f3c86d101edce9..de358e0d8d62263ffc42fea564c30642633b1b59 100644 --- a/src/main/java/es/bsc/inb/ades/rest/api/util/VisualizationHTMLUtil.java +++ b/src/main/java/es/bsc/inb/etransafe/pretox/rest/api/util/VisualizationHTMLUtil.java @@ -1,7 +1,7 @@ -package es.bsc.inb.ades.rest.api.util; +package es.bsc.inb.etransafe.pretox.rest.api.util; -import es.bsc.inb.ades.rest.api.model.Annotation; -import es.bsc.inb.ades.rest.api.model.Feature; +import es.bsc.inb.etransafe.pretox.rest.api.model.Annotation; +import es.bsc.inb.etransafe.pretox.rest.api.model.Feature; public class VisualizationHTMLUtil { diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 5b31d2b7691cecf6419c7e46346b57514f2ab539..58bf9452995b305f058d8ce657a06116222b8ad2 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,8 +1,15 @@ spring.application.name =ades_rest_api server.servlet.context-path=/pretoxapi +springdoc.api-docs.path=/api-docs +springdoc.swagger-ui.path=/api.html #Spring Boot Port server.port = ${SERVER_PORT} #PRETOX Database spring.data.mongodb.uri=${MONGO_URI} #KEYCLOCK configuration variables spring.security.oauth2.resourceserver.jwt.jwk-set-uri=${OAUTH2_RS_CERTS} +#spring upload configuration +spring.servlet.multipart.enabled = true +spring.servlet.multipart.max-file-size = 200MB +spring.servlet.multipart.max-request-size = 200MB +