diff --git a/repository/src/main/java/org/alfresco/repo/action/executer/ImporterActionExecuter.java b/repository/src/main/java/org/alfresco/repo/action/executer/ImporterActionExecuter.java index ab9897ed9a..b0b93c7172 100644 --- a/repository/src/main/java/org/alfresco/repo/action/executer/ImporterActionExecuter.java +++ b/repository/src/main/java/org/alfresco/repo/action/executer/ImporterActionExecuter.java @@ -456,7 +456,7 @@ public class ImporterActionExecuter extends ActionExecuterAbstractBase } else { - File newdir = new File(extractDir + entry.getName()); + File newdir = new File(extractDir + StringUtils.stripAccents(entry.getName()).replaceAll("\\?", "_")); newdir.mkdirs(); } } diff --git a/repository/src/test/java/org/alfresco/repo/action/executer/ImporterActionExecuterTest.java b/repository/src/test/java/org/alfresco/repo/action/executer/ImporterActionExecuterTest.java index 4ed456799d..f636f9f8b1 100644 --- a/repository/src/test/java/org/alfresco/repo/action/executer/ImporterActionExecuterTest.java +++ b/repository/src/test/java/org/alfresco/repo/action/executer/ImporterActionExecuterTest.java @@ -62,6 +62,7 @@ import org.alfresco.util.test.junitrules.ApplicationContextInit; * * @author abalmus */ +@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") public class ImporterActionExecuterTest { // Rule to initialise the default Alfresco spring configuration @@ -299,6 +300,46 @@ public class ImporterActionExecuterTest }); } + @Test + public void testUnzipZipFileHavingAccentCharInFolderName() throws IOException + { + final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper(); + + retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback() { + @Override + public Void execute() throws Throwable + + { + NodeRef rootNodeRef = nodeService.getRootNode(storeRef); + + // create test data + NodeRef zipFileNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, ContentModel.ASSOC_CHILDREN, ContentModel.TYPE_CONTENT).getChildRef(); + NodeRef targetFolderNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, ContentModel.ASSOC_CHILDREN, ContentModel.TYPE_FOLDER).getChildRef(); + + putContent(zipFileNodeRef, "import-archive-test/accentCharTestZip.zip"); + + Action action = createAction(zipFileNodeRef, "ImporterActionExecuterTestActionDefinition", targetFolderNodeRef); + + try + { + importerActionExecuter.setUncompressedBytesLimit("100000"); + importerActionExecuter.execute(action, zipFileNodeRef); + NodeRef importedFolder = nodeService.getChildByName(targetFolderNodeRef, ContentModel.ASSOC_CONTAINS, "accentCharTestZip"); + assertNotNull("unzip action failed", importedFolder); + assertTrue("multiple folder structure created", nodeService.getChildAssocs(importedFolder).size() == 1); + } + finally + { + // clean test data + nodeService.deleteNode(targetFolderNodeRef); + nodeService.deleteNode(zipFileNodeRef); + } + + return null; + } + }); + } + private void putContent(NodeRef zipFileNodeRef, String resource) { URL url = AbstractContentTransformerTest.class.getClassLoader().getResource(resource); diff --git a/repository/src/test/resources/import-archive-test/accentCharTestZip.zip b/repository/src/test/resources/import-archive-test/accentCharTestZip.zip new file mode 100644 index 0000000000..87850d8b8a Binary files /dev/null and b/repository/src/test/resources/import-archive-test/accentCharTestZip.zip differ