mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-09-17 14:21:39 +00:00
[MNT-24623] fix for unzipping zip files having accent chars (#3321)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
|||||||
* #%L
|
* #%L
|
||||||
* Alfresco Repository
|
* Alfresco Repository
|
||||||
* %%
|
* %%
|
||||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
* Copyright (C) 2005 - 2025 Alfresco Software Limited
|
||||||
* %%
|
* %%
|
||||||
* This file is part of the Alfresco software.
|
* This file is part of the Alfresco software.
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
@@ -34,6 +34,10 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
import org.alfresco.repo.action.ActionImpl;
|
import org.alfresco.repo.action.ActionImpl;
|
||||||
@@ -44,7 +48,6 @@ import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
|||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
import org.alfresco.service.cmr.repository.ContentData;
|
|
||||||
import org.alfresco.service.cmr.repository.ContentService;
|
import org.alfresco.service.cmr.repository.ContentService;
|
||||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
@@ -53,15 +56,13 @@ import org.alfresco.service.cmr.repository.StoreRef;
|
|||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.alfresco.util.GUID;
|
import org.alfresco.util.GUID;
|
||||||
import org.alfresco.util.test.junitrules.ApplicationContextInit;
|
import org.alfresco.util.test.junitrules.ApplicationContextInit;
|
||||||
import org.junit.AfterClass;
|
|
||||||
import org.junit.BeforeClass;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains tests for {@link ImporterActionExecuter}.
|
* This class contains tests for {@link ImporterActionExecuter}.
|
||||||
*
|
*
|
||||||
* @author abalmus
|
* @author abalmus
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert")
|
||||||
public class ImporterActionExecuterTest
|
public class ImporterActionExecuterTest
|
||||||
{
|
{
|
||||||
// Rule to initialise the default Alfresco spring configuration
|
// Rule to initialise the default Alfresco spring configuration
|
||||||
@@ -87,8 +88,7 @@ public class ImporterActionExecuterTest
|
|||||||
AuthenticationUtil.setRunAsUserSystem();
|
AuthenticationUtil.setRunAsUserSystem();
|
||||||
|
|
||||||
// we need a store
|
// we need a store
|
||||||
storeRef = serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<StoreRef>()
|
storeRef = serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<StoreRef>() {
|
||||||
{
|
|
||||||
public StoreRef execute()
|
public StoreRef execute()
|
||||||
{
|
{
|
||||||
StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.nanoTime());
|
StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.nanoTime());
|
||||||
@@ -102,8 +102,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>()
|
serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
{
|
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
if (storeRef != null)
|
if (storeRef != null)
|
||||||
@@ -125,8 +124,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
{
|
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
||||||
@@ -162,8 +160,7 @@ public class ImporterActionExecuterTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MNT-16292: Unzipped files which have folders do not get the cm:titled
|
* MNT-16292: Unzipped files which have folders do not get the cm:titled aspect applied
|
||||||
* aspect applied
|
|
||||||
*
|
*
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@@ -172,8 +169,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
{
|
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
||||||
@@ -190,7 +186,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
importerActionExecuter.execute(action, zipFileNodeRef);
|
importerActionExecuter.execute(action, zipFileNodeRef);
|
||||||
|
|
||||||
// check if import succeeded
|
// check if import succeeded
|
||||||
NodeRef importedFolder = nodeService.getChildByName(targetFolderNodeRef, ContentModel.ASSOC_CONTAINS, "folderCmTitledAspectArchive");
|
NodeRef importedFolder = nodeService.getChildByName(targetFolderNodeRef, ContentModel.ASSOC_CONTAINS, "folderCmTitledAspectArchive");
|
||||||
assertNotNull("import action failed", importedFolder);
|
assertNotNull("import action failed", importedFolder);
|
||||||
|
|
||||||
@@ -199,7 +195,7 @@ public class ImporterActionExecuterTest
|
|||||||
assertTrue("folder didn't get the cm:titled aspect applied", hasAspectTitled);
|
assertTrue("folder didn't get the cm:titled aspect applied", hasAspectTitled);
|
||||||
|
|
||||||
// MNT-17017 check ContentModel.PROP_TITLE is not set on the top level folder, just like Share
|
// MNT-17017 check ContentModel.PROP_TITLE is not set on the top level folder, just like Share
|
||||||
String title = (String)nodeService.getProperty(importedFolder, ContentModel.PROP_TITLE);
|
String title = (String) nodeService.getProperty(importedFolder, ContentModel.PROP_TITLE);
|
||||||
assertNull("The title should not have cm:title set", title);
|
assertNull("The title should not have cm:title set", title);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -224,8 +220,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
{
|
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
||||||
@@ -270,8 +265,7 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
{
|
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
||||||
@@ -306,11 +300,51 @@ public class ImporterActionExecuterTest
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnzipZipFileHavingAccentCharInFolderName() throws IOException
|
||||||
|
{
|
||||||
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>() {
|
||||||
|
@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)
|
private void putContent(NodeRef zipFileNodeRef, String resource)
|
||||||
{
|
{
|
||||||
URL url = AbstractContentTransformerTest.class.getClassLoader().getResource(resource);
|
URL url = AbstractContentTransformerTest.class.getClassLoader().getResource(resource);
|
||||||
final File file = new File(url.getFile());
|
final File file = new File(url.getFile());
|
||||||
|
|
||||||
ContentWriter writer = contentService.getWriter(zipFileNodeRef, ContentModel.PROP_CONTENT, true);
|
ContentWriter writer = contentService.getWriter(zipFileNodeRef, ContentModel.PROP_CONTENT, true);
|
||||||
writer.setMimetype(MimetypeMap.MIMETYPE_ZIP);
|
writer.setMimetype(MimetypeMap.MIMETYPE_ZIP);
|
||||||
writer.putContent(file);
|
writer.putContent(file);
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user