diff --git a/source/java/org/alfresco/repo/webdav/MoveMethod.java b/source/java/org/alfresco/repo/webdav/MoveMethod.java index 71e9371714..87ebd0560a 100644 --- a/source/java/org/alfresco/repo/webdav/MoveMethod.java +++ b/source/java/org/alfresco/repo/webdav/MoveMethod.java @@ -198,7 +198,7 @@ public class MoveMethod extends HierarchicalMethod } // ALF-7079 fix, if destination exists then its content is updated with source content and source is deleted if // this is a move - if (destFileInfo != null && !sourceParentNodeRef.equals(destParentNodeRef)) + if (!sourceFileInfo.isFolder() && destFileInfo != null && !sourceParentNodeRef.equals(destParentNodeRef)) { copyContentOnly(sourceFileInfo, destFileInfo, fileFolderService); fileFolderService.setHidden(destFileInfo.getNodeRef(), false); diff --git a/source/test-java/org/alfresco/repo/webdav/MoveMethodTest.java b/source/test-java/org/alfresco/repo/webdav/MoveMethodTest.java index 0135013144..f4f7fe0ab2 100644 --- a/source/test-java/org/alfresco/repo/webdav/MoveMethodTest.java +++ b/source/test-java/org/alfresco/repo/webdav/MoveMethodTest.java @@ -18,6 +18,10 @@ */ package org.alfresco.repo.webdav; +import static org.junit.Assert.fail; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -26,15 +30,27 @@ import java.util.Arrays; import java.util.List; import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.ApplicationContextHelper; +import org.alfresco.util.GUID; +import org.junit.After; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.context.ApplicationContext; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; @@ -46,12 +62,14 @@ import org.springframework.mock.web.MockHttpServletResponse; @RunWith(MockitoJUnitRunner.class) public class MoveMethodTest { + private static ApplicationContext ctx; + private MoveMethod moveMethod; private @Mock WebDAVHelper davHelper; private MockHttpServletRequest req; private MockHttpServletResponse resp; private NodeRef rootNode; - private @Mock FileFolderService fileFolderService; + private @Mock FileFolderService mockFileFolderService; private @Mock WebDAVLockService davLockService; private String destPath; private String sourcePath; @@ -59,7 +77,35 @@ public class MoveMethodTest private NodeRef sourceParentNodeRef; private NodeRef destParentNodeRef; private NodeRef sourceNodeRef; - + + private SearchService searchService; + private FileFolderService fileFolderService; + private NodeService nodeService; + private TransactionService transactionService; + private WebDAVHelper webDAVHelper; + + private NodeRef companyHomeNodeRef; + + @BeforeClass + public static void setUpBeforeClass() throws Exception + { + ctx = ApplicationContextHelper.getApplicationContext(new String[] + { + "classpath:alfresco/application-context.xml", "classpath:alfresco/web-scripts-application-context.xml", + "classpath:alfresco/remote-api-context.xml" + }); + } + + @After + public void tearDown() + { + moveMethod = null; + req = null; + resp = null; + + AuthenticationUtil.clearCurrentSecurityContext(); + } + @Before public void setUp() throws Exception { @@ -92,7 +138,7 @@ public class MoveMethodTest sourcePath = "/path/to/source.doc"; moveMethod.m_strPath = sourcePath; - when(davHelper.getFileFolderService()).thenReturn(fileFolderService); + when(davHelper.getFileFolderService()).thenReturn(mockFileFolderService); List sourcePathSplit = Arrays.asList("path", "to", "source.doc"); when(davHelper.splitAllPaths(sourcePath)).thenReturn(sourcePathSplit); @@ -102,10 +148,10 @@ public class MoveMethodTest when(davHelper.splitAllPaths(destPath)).thenReturn(destPathSplit); - when(fileFolderService.resolveNamePath(rootNode, sourcePathSplit)).thenReturn(sourceFileInfo); + when(mockFileFolderService.resolveNamePath(rootNode, sourcePathSplit)).thenReturn(sourceFileInfo); FileInfo destFileInfo = Mockito.mock(FileInfo.class); - when(fileFolderService.resolveNamePath(rootNode, destPathSplit)).thenReturn(destFileInfo); + when(mockFileFolderService.resolveNamePath(rootNode, destPathSplit)).thenReturn(destFileInfo); sourceParentNodeRef = new NodeRef("workspace://SpacesStore/parent"); destParentNodeRef = new NodeRef("workspace://SpacesStore/parent"); @@ -114,6 +160,29 @@ public class MoveMethodTest sourceNodeRef = new NodeRef("workspace://SpacesStore/sourcefile"); when(davHelper.getLockService()).thenReturn(davLockService); + + searchService = ctx.getBean("SearchService", SearchService.class); + fileFolderService = ctx.getBean("FileFolderService", FileFolderService.class); + nodeService = ctx.getBean("NodeService", NodeService.class); + transactionService = ctx.getBean("transactionService", TransactionService.class); + webDAVHelper = ctx.getBean("webDAVHelper", WebDAVHelper.class); + + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + + companyHomeNodeRef = transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public NodeRef execute() throws Throwable + { + // find "Company Home" + StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); + ResultSet resultSet = searchService.query(storeRef, SearchService.LANGUAGE_LUCENE, "PATH:\"/app:company_home\""); + NodeRef result = resultSet.getNodeRef(0); + resultSet.close(); + + return result; + } + }); } @@ -122,9 +191,9 @@ public class MoveMethodTest { moveMethod.moveOrCopy(sourceNodeRef, sourceParentNodeRef, destParentNodeRef, "dest.doc"); - verify(fileFolderService).rename(sourceNodeRef, "dest.doc"); + verify(mockFileFolderService).rename(sourceNodeRef, "dest.doc"); verify(davLockService).unlock(sourceNodeRef); - verify(fileFolderService, never()).create(destParentNodeRef, "dest.doc", ContentModel.TYPE_CONTENT); + verify(mockFileFolderService, never()).create(destParentNodeRef, "dest.doc", ContentModel.TYPE_CONTENT); } @@ -138,8 +207,51 @@ public class MoveMethodTest moveMethod.moveOrCopy(sourceNodeRef, sourceParentNodeRef, destParentNodeRef, "dest.doc"); - verify(fileFolderService).rename(sourceNodeRef, "dest.doc"); + verify(mockFileFolderService).rename(sourceNodeRef, "dest.doc"); verify(davLockService).unlock(sourceNodeRef); - verify(fileFolderService, never()).create(destParentNodeRef, "dest.doc", ContentModel.TYPE_CONTENT); + verify(mockFileFolderService, never()).create(destParentNodeRef, "dest.doc", ContentModel.TYPE_CONTENT); + } + + @Test + public void testMNT_9662() + { + transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + @Override + public Object execute() throws Throwable + { + // create test folder with name that doesn't match getDAVHelper().isRenameShuffle() + FileInfo testFileInfo = fileFolderService.create(companyHomeNodeRef, "folder-" + GUID.generate().substring(29), ContentModel.TYPE_FOLDER); + + req = new MockHttpServletRequest(WebDAV.METHOD_MOVE, "/alfresco/webdav/" + testFileInfo.getName()); + resp = new MockHttpServletResponse(); + req.setServerPort(8080); + req.setServletPath("/webdav"); + + moveMethod = new MoveMethod(); + moveMethod.setDetails(req, resp, webDAVHelper, companyHomeNodeRef); + + // generate new name that matches getDAVHelper().isRenameShuffle() + String newName = GUID.generate().substring(28); + req.addHeader(WebDAV.HEADER_DESTINATION, "http://localhost:8080/alfresco/webdav/" + newName); + + try + { + moveMethod.execute(); + + assertTrue(nodeService.exists(testFileInfo.getNodeRef())); + assertEquals(newName, nodeService.getProperty(testFileInfo.getNodeRef(), ContentModel.PROP_NAME)); + } + catch (WebDAVServerException e) + { + fail("Fail to rename folder: " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage())); + } + finally + { + nodeService.deleteNode(testFileInfo.getNodeRef()); + } + return null; + } + }); } }