mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
Merged 5.1.0 (5.1.0.6) to 5.1.N (5.1.2)
127235 cturlica: MNT-16292: Unzipped files which have folders do not get the cm:titled aspect applied - updated ImporterActionExecuter to add titled aspect - added test case for change and refactored test class git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.1.N/root@127307 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -301,10 +301,17 @@ public class ImporterActionExecuter extends ActionExecuterAbstractBase
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
String folderName = file.getName();
|
||||||
|
|
||||||
// create a folder based on the folder name
|
// create a folder based on the folder name
|
||||||
FileInfo folderInfo = this.fileFolderService.create(root, file.getName(), ContentModel.TYPE_FOLDER);
|
FileInfo folderInfo = this.fileFolderService.create(root, folderName, ContentModel.TYPE_FOLDER);
|
||||||
NodeRef folderRef = folderInfo.getNodeRef();
|
NodeRef folderRef = folderInfo.getNodeRef();
|
||||||
|
|
||||||
|
// add titled aspect
|
||||||
|
Map<QName, Serializable> titledProps = new HashMap<QName, Serializable>(1, 1.0f);
|
||||||
|
titledProps.put(ContentModel.PROP_TITLE, folderName);
|
||||||
|
this.nodeService.addAspect(folderRef, ContentModel.ASPECT_TITLED, titledProps);
|
||||||
|
|
||||||
// add the uifacets aspect for the read/edit properties screens
|
// add the uifacets aspect for the read/edit properties screens
|
||||||
this.nodeService.addAspect(folderRef, ApplicationModel.ASPECT_UIFACETS, null);
|
this.nodeService.addAspect(folderRef, ApplicationModel.ASPECT_UIFACETS, null);
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.action.executer;
|
package org.alfresco.repo.action.executer;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
@@ -50,6 +51,8 @@ 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;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,57 +62,86 @@ import org.junit.Test;
|
|||||||
*/
|
*/
|
||||||
public class ImporterActionExecuterTest
|
public class ImporterActionExecuterTest
|
||||||
{
|
{
|
||||||
|
// Rule to initialise the default Alfresco spring configuration
|
||||||
|
public static ApplicationContextInit ctx = new ApplicationContextInit();
|
||||||
|
|
||||||
private static final String FILE_NAME = "import-archive-test/SuspiciousPathsArchive.zip";
|
private static final String FILE_NAME = "import-archive-test/SuspiciousPathsArchive.zip";
|
||||||
|
|
||||||
|
private static ContentService contentService;
|
||||||
|
private static ImporterActionExecuter importerActionExecuter;
|
||||||
|
private static NodeService nodeService;
|
||||||
|
private static ServiceRegistry serviceRegistry;
|
||||||
|
|
||||||
|
private static StoreRef storeRef;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() throws Exception
|
||||||
|
{
|
||||||
|
serviceRegistry = ctx.getApplicationContext().getBean(ServiceRegistry.SERVICE_REGISTRY, ServiceRegistry.class);
|
||||||
|
contentService = serviceRegistry.getContentService();
|
||||||
|
nodeService = serviceRegistry.getNodeService();
|
||||||
|
importerActionExecuter = ctx.getApplicationContext().getBean(ImporterActionExecuter.NAME, ImporterActionExecuter.class);
|
||||||
|
|
||||||
|
AuthenticationUtil.setRunAsUserSystem();
|
||||||
|
|
||||||
|
// we need a store
|
||||||
|
storeRef = serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<StoreRef>()
|
||||||
|
{
|
||||||
|
public StoreRef execute()
|
||||||
|
{
|
||||||
|
StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.nanoTime());
|
||||||
|
return storeRef;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDown()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
serviceRegistry.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
public Void execute()
|
||||||
|
{
|
||||||
|
if (storeRef != null)
|
||||||
|
{
|
||||||
|
nodeService.deleteStore(storeRef);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AuthenticationUtil.clearCurrentSecurityContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testImportArchiveWithSuspiciousPaths() throws IOException
|
public void testImportArchiveWithSuspiciousPaths() throws IOException
|
||||||
{
|
{
|
||||||
final ApplicationContextInit applicationContextInit = new ApplicationContextInit();
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
final ServiceRegistry serviceRegistry = (ServiceRegistry) applicationContextInit.getApplicationContext().getBean(ServiceRegistry.SERVICE_REGISTRY);
|
|
||||||
final NodeService nodeService = serviceRegistry.getNodeService();
|
|
||||||
final ContentService contentService = serviceRegistry.getContentService();
|
|
||||||
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
|
|
||||||
|
|
||||||
|
|
||||||
URL url = AbstractContentTransformerTest.class.getClassLoader().getResource(FILE_NAME);
|
|
||||||
final File file = new File(url.getFile());
|
|
||||||
|
|
||||||
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
||||||
{
|
{
|
||||||
public Void execute()
|
public Void execute()
|
||||||
{
|
{
|
||||||
AuthenticationUtil.setRunAsUserSystem();
|
|
||||||
|
|
||||||
StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.nanoTime());
|
|
||||||
|
|
||||||
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
|
||||||
|
|
||||||
NodeRef zipFileNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN,
|
NodeRef zipFileNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN,
|
||||||
QName.createQName("http://www.alfresco.org/test/ImporterActionExecuterTest", "testAssocQName1"),
|
QName.createQName("http://www.alfresco.org/test/ImporterActionExecuterTest", "testAssocQName1"), ContentModel.TYPE_CONTENT).getChildRef();
|
||||||
ContentModel.TYPE_CONTENT).getChildRef();
|
|
||||||
|
|
||||||
NodeRef targetFolderNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN,
|
NodeRef targetFolderNodeRef = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN,
|
||||||
QName.createQName("http://www.alfresco.org/test/ImporterActionExecuterTest", "testAssocQName2"),
|
QName.createQName("http://www.alfresco.org/test/ImporterActionExecuterTest", "testAssocQName2"), ContentModel.TYPE_FOLDER).getChildRef();
|
||||||
ContentModel.TYPE_FOLDER).getChildRef();
|
|
||||||
|
|
||||||
contentService.getWriter(zipFileNodeRef, ContentModel.PROP_CONTENT, true).putContent(file);
|
putContent(zipFileNodeRef, FILE_NAME);
|
||||||
|
|
||||||
ContentData contentData = (ContentData) nodeService.getProperty(zipFileNodeRef, ContentModel.PROP_CONTENT);
|
Action action = createAction(zipFileNodeRef, "ImporterActionExecuterTestActionDefinition", targetFolderNodeRef);
|
||||||
ContentData newContentData = ContentData.setMimetype(contentData, MimetypeMap.MIMETYPE_ZIP);
|
|
||||||
|
|
||||||
nodeService.setProperty(zipFileNodeRef, ContentModel.PROP_CONTENT, newContentData);
|
|
||||||
|
|
||||||
Action action = new ActionImpl(zipFileNodeRef, GUID.generate(), "ImporterActionExecuterTestActionDefinition");
|
|
||||||
action.setParameterValue(ImporterActionExecuter.PARAM_DESTINATION_FOLDER, targetFolderNodeRef);
|
|
||||||
action.setParameterValue(ImporterActionExecuter.PARAM_ENCODING, "UTF-8");
|
|
||||||
|
|
||||||
ImporterActionExecuter executer = new ImporterActionExecuter();
|
|
||||||
executer.setNodeService(nodeService);
|
|
||||||
executer.setContentService(contentService);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
executer.execute(action, zipFileNodeRef);
|
importerActionExecuter.execute(action, zipFileNodeRef);
|
||||||
fail("An AlfrescoRuntimeException should have occured.");
|
fail("An AlfrescoRuntimeException should have occured.");
|
||||||
}
|
}
|
||||||
catch (AlfrescoRuntimeException e)
|
catch (AlfrescoRuntimeException e)
|
||||||
@@ -120,13 +152,81 @@ public class ImporterActionExecuterTest
|
|||||||
{
|
{
|
||||||
nodeService.deleteNode(targetFolderNodeRef);
|
nodeService.deleteNode(targetFolderNodeRef);
|
||||||
nodeService.deleteNode(zipFileNodeRef);
|
nodeService.deleteNode(zipFileNodeRef);
|
||||||
nodeService.deleteStore(storeRef);
|
|
||||||
|
|
||||||
AuthenticationUtil.clearCurrentSecurityContext();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MNT-16292: Unzipped files which have folders do not get the cm:titled
|
||||||
|
* aspect applied
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testImportHasTitledAspectForFolders() throws IOException
|
||||||
|
{
|
||||||
|
final RetryingTransactionHelper retryingTransactionHelper = serviceRegistry.getRetryingTransactionHelper();
|
||||||
|
|
||||||
|
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
public Void execute()
|
||||||
|
{
|
||||||
|
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/folderCmTitledAspectArchive.zip");
|
||||||
|
|
||||||
|
Action action = createAction(zipFileNodeRef, "ImporterActionExecuterTestActionDefinition", targetFolderNodeRef);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
importerActionExecuter.execute(action, zipFileNodeRef);
|
||||||
|
|
||||||
|
// check if import succeeded
|
||||||
|
NodeRef importedFolder = nodeService.getChildByName(targetFolderNodeRef, ContentModel.ASSOC_CONTAINS, "folderCmTitledAspectArchive");
|
||||||
|
assertNotNull("import action failed", importedFolder);
|
||||||
|
|
||||||
|
// check if aspect is set
|
||||||
|
boolean hasAspectTitled = nodeService.hasAspect(importedFolder, ContentModel.ASPECT_TITLED);
|
||||||
|
assertTrue("folder didn't get the cm:titled aspect applied", hasAspectTitled);
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
final File file = new File(url.getFile());
|
||||||
|
|
||||||
|
contentService.getWriter(zipFileNodeRef, ContentModel.PROP_CONTENT, true).putContent(file);
|
||||||
|
|
||||||
|
ContentData contentData = (ContentData) nodeService.getProperty(zipFileNodeRef, ContentModel.PROP_CONTENT);
|
||||||
|
ContentData newContentData = ContentData.setMimetype(contentData, MimetypeMap.MIMETYPE_ZIP);
|
||||||
|
|
||||||
|
nodeService.setProperty(zipFileNodeRef, ContentModel.PROP_CONTENT, newContentData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Action createAction(NodeRef nodeRef, String actionDefinitionName, NodeRef targetNodeRef)
|
||||||
|
{
|
||||||
|
Action action = new ActionImpl(nodeRef, GUID.generate(), actionDefinitionName);
|
||||||
|
action.setParameterValue(ImporterActionExecuter.PARAM_DESTINATION_FOLDER, targetNodeRef);
|
||||||
|
action.setParameterValue(ImporterActionExecuter.PARAM_ENCODING, "UTF-8");
|
||||||
|
|
||||||
|
return action;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Reference in New Issue
Block a user