diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java index 7a28a9f816131dbe48bee482addd01fd0bafcc12..e8df52b28de83d713d15ce5efd6f10dae8f3eef4 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/DocumentFileProcessingService.java @@ -67,6 +67,7 @@ import ch.unige.aou.exception.AouDownloadException; import ch.unige.aou.message.DocumentFileMessage; import ch.unige.aou.model.publication.DocumentFile; import ch.unige.aou.model.publication.DocumentFile.DocumentFileStatus; +import ch.unige.aou.model.tool.CleanTool; @Service @ConditionalOnBean(AdminController.class) @@ -373,6 +374,8 @@ public class DocumentFileProcessingService extends AouService { if (dotExtension != null) { fileName = name + dotExtension; } + //Replace blank spaces and + characters with underscore + fileName = CleanTool.cleanFileName(fileName); // Deduplicate filename with a suffix number if it is already used by another documentFile List<String> otherDocumentFilenames = documentFile.getPublication().getDocumentFiles().stream() diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java index 438f547283d9d3df058927c358e41abf3885ac37..c8e83b539749e1b5497c08159cdf7575fb320a94 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/ArxivImportService.java @@ -82,7 +82,7 @@ import ch.unige.aou.service.rest.JournalTitleRemoteService; public class ArxivImportService extends MetadataAndFileImportService { private static final Logger log = LoggerFactory.getLogger(ArxivImportService.class); - private static final String ARXIV_FILE_NAME = "-from-arxiv.pdf"; + private static final String ARXIV_FILE_NAME = "_from_arxiv.pdf"; private static final String XPATH_ARXIV = "/default:feed/default:entry"; private static final String XPATH_ERROR_VALUE = "Error"; @@ -126,7 +126,7 @@ public class ArxivImportService extends MetadataAndFileImportService { documentFile.setDocumentFileType(documentFileType); documentFile.setMimetype(mimeType); documentFile.setIsImported(true); - documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + ARXIV_FILE_NAME); + documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + ARXIV_FILE_NAME)); try { documentFile.setSourceData(new URI(filePath)); diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java index 797c88785cd8d400e1343515ae006bac6b08247e..033aea51e68b08b9c5f8f6650ddf8b55e71b4781 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/DoiCrossrefImportService.java @@ -93,7 +93,7 @@ import ch.unige.aou.service.rest.OpenAireService; @ConditionalOnBean(AdminController.class) public class DoiCrossrefImportService extends MetadataAndFileImportService { - private static final String CROSSREF_FILE_NAME = "-from-crossref.pdf"; + private static final String CROSSREF_FILE_NAME = "_from_crossref.pdf"; private static final Logger log = LoggerFactory.getLogger(DoiCrossrefImportService.class); @@ -175,7 +175,7 @@ public class DoiCrossrefImportService extends MetadataAndFileImportService { documentFile.setMimetype(mimeType); documentFile.setIsImported(true); documentFile.setLicense(license); - documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + CROSSREF_FILE_NAME); + documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + CROSSREF_FILE_NAME)); try { documentFile.setSourceData(new URI(fileUrl)); diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java index 09fd90bdeb244662b2d970f567b3b30c17c471ad..30f6f534223a982eb4384e9f440561e31a8eb880 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/EuropePmcImportService.java @@ -74,6 +74,7 @@ import ch.unige.aou.model.publication.DocumentFile; import ch.unige.aou.model.publication.DocumentFileType; import ch.unige.aou.model.publication.Publication; import ch.unige.aou.model.settings.License; +import ch.unige.aou.model.tool.CleanTool; import ch.unige.aou.model.xml.deposit.v2_4.Contributor; import ch.unige.aou.model.xml.deposit.v2_4.DepositDoc; import ch.unige.aou.model.xml.deposit.v2_4.Funding; @@ -88,7 +89,7 @@ public class EuropePmcImportService extends MetadataAndFileImportService { private static final Logger log = LoggerFactory.getLogger(EuropePmcImportService.class); - private static final String EUROPE_PMC_FILE_NAME = "-from-europePmc.pdf"; + private static final String EUROPE_PMC_FILE_NAME = "_from_europePmc.pdf"; private static final String XPATH_DEFAULT_ROOT = "/responseWrapper/resultList/result[pmcid='VALUE']"; private static final String XPATH_HAS_SUPPLEMENTARY_FILES = EuropePmcImportService.XPATH_DEFAULT_ROOT + "/hasSuppl"; @@ -247,7 +248,7 @@ public class EuropePmcImportService extends MetadataAndFileImportService { documentFile.setAccessLevel(DocumentFile.AccessLevel.PUBLIC); documentFile.setDocumentFileType(documentFileType); documentFile.setMimetype("application/pdf"); - documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + EUROPE_PMC_FILE_NAME); + documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + EUROPE_PMC_FILE_NAME)); documentFile.setLicense(license); documentFile.setIsImported(true); try { diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java index 0c75c1d7b5c5c0cc46bfc30143de0b61c7d8e710..821eb6bd8eed1e2b8359193a7f1033c5917e8b30 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/InspireHepImportService.java @@ -77,7 +77,7 @@ import ch.unige.aou.service.rest.JournalTitleRemoteService; @Service @ConditionalOnBean(AdminController.class) public class InspireHepImportService extends MetadataAndFileImportService { - private static final String INSPIRE_HEP_FILE_NAME = "-from-inspireHep.pdf"; + private static final String INSPIRE_HEP_FILE_NAME = "_from_inspireHep.pdf"; private static final Logger log = LoggerFactory.getLogger(InspireHepImportService.class); private String apiArxivUrl; @@ -429,7 +429,7 @@ public class InspireHepImportService extends MetadataAndFileImportService { documentFile.setMimetype(file.getMimetype()); documentFile.setIsImported(true); documentFile.setLicense(license); - documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + INSPIRE_HEP_FILE_NAME); + documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + INSPIRE_HEP_FILE_NAME)); try { documentFile.setSourceData(new URI(fileUrl)); diff --git a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java index 2c92a84260498ecf807ba2f84776b669dba6b3b1..adcea23cdb9783d9a24b128a87a0765ca2509b9f 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/service/metadata/imports/UnpaywallImportService.java @@ -52,6 +52,7 @@ import ch.unige.aou.model.publication.DocumentFile; import ch.unige.aou.model.publication.DocumentFileType; import ch.unige.aou.model.publication.Publication; import ch.unige.aou.model.settings.License; +import ch.unige.aou.model.tool.CleanTool; import ch.unige.aou.model.xml.deposit.v2_4.DepositDoc; import ch.unige.aou.service.DownloadService; import ch.unige.aou.service.MetadataService; @@ -66,7 +67,7 @@ public class UnpaywallImportService extends MetadataAndFileImportService { private String unpaywallApiUrl; private String unpaywallEmail; - private static final String UNPAYWALL_FILE_NAME = "-from-unpaywall.pdf"; + private static final String UNPAYWALL_FILE_NAME = "_from_sunpaywall.pdf"; private static final String LICENSE_OTHER_AO = "OTHER-OA"; private static final String LICENSE = "license"; @@ -167,7 +168,7 @@ public class UnpaywallImportService extends MetadataAndFileImportService { documentFile.setAccessLevel(accessLevel); documentFile.setDocumentFileType(this.getDocumentFileTypeFromUnpaywallVersion(version)); documentFile.setMimetype("application/pdf"); - documentFile.setFileName(publication.getSubtype().getName().replace(" ", "-") + UNPAYWALL_FILE_NAME); + documentFile.setFileName(CleanTool.cleanFileName(publication.getSubtype().getName() + UNPAYWALL_FILE_NAME)); documentFile.setIsImported(true); this.saveDocumentFileIfSourceDataValid(documentFile); } catch (URISyntaxException e) { diff --git a/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java b/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java index b0880ebcab432e60759e0c2b5ad9f2601f46e25b..704df56411cc00bfe4b3415048072051ed5b6a39 100644 --- a/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java +++ b/AoU-Model/src/main/java/ch/unige/aou/model/tool/CleanTool.java @@ -108,6 +108,14 @@ public class CleanTool { return value; } + public static String cleanFileName(String value) { + if (!StringTool.isNullOrEmpty(value)) { + value = value.replaceAll("\\s+", "_"); + value = value.replaceAll("\\+", "_"); + } + return value; + } + public static String restoreAllowedHtmlTags(String value, List<String> allowedTags) { if (!StringTool.isNullOrEmpty(value)) { for (String tag : allowedTags) { diff --git a/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java b/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java index 3aa2b96326eb293709b5f748f403d46fb8e14efc..aaf9dbdfb0cd50ed0f11a3dee92fff70e6e63696 100644 --- a/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java +++ b/AoU-Model/src/test/java/ch/unige/aou/test/tool/CleanToolTest.java @@ -366,4 +366,12 @@ class CleanToolTest { assertEquals("Let"s go !", CleanTool.cleanQuotes("Let »s go !")); assertEquals("Let"s go !", CleanTool.cleanQuotes("Let« s go !")); } + + @Test + void cleanFileName() { + assertEquals("picture.jpeg", CleanTool.cleanFileName("picture.jpeg")); + assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture+geneve.jpeg")); + assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture_geneve.jpeg")); + assertEquals("picture_geneve.jpeg", CleanTool.cleanFileName("picture geneve.jpeg")); + } }