From 7802d4d1dc180c196861aa22e535366f12f515a7 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Thu, 26 Feb 2015 07:46:57 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud) 98073: Merged 5.0.N (5.0.2) to HEAD-BUG-FIX (5.1/Cloud) 97984: Merged V4.2-BUG-FIX (4.2.5) to 5.0.N (5.0.2) 97763: Merged DEV to V4.2-BUG-FIX 96388: MNT-13183 : Folder accessed through WebDAV is empty when a document is locked through CIFS access Detect "AlfrescoLockKeeperImpl" and then create new LockInfo object. 97572: MNT-13183 : Folder accessed through WebDAV is empty when a document is locked through CIFS access Added marker for webdav lock. Added new junit test. 97725: MNT-13183 : Folder accessed through WebDAV is empty when a document is locked through CIFS access Corrected some code. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@98102 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/webdav/LockInfoImpl.java | 25 +++++++++++++------ .../repo/webdav/WebDAVLockServiceImpl.java | 8 +++--- .../webdav/WebDAVLockServiceImplTest.java | 25 +++++++++++++++++++ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/source/java/org/alfresco/repo/webdav/LockInfoImpl.java b/source/java/org/alfresco/repo/webdav/LockInfoImpl.java index da8dc6defa..45282afe92 100644 --- a/source/java/org/alfresco/repo/webdav/LockInfoImpl.java +++ b/source/java/org/alfresco/repo/webdav/LockInfoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2015 Alfresco Software Limited. * * This file is part of Alfresco * @@ -40,6 +40,8 @@ public class LockInfoImpl implements Serializable, LockInfo { private static final long serialVersionUID = 1L; + public static final String ADDINFO_WEBDAV_MARKER = "WebDAV_LockInfo"; + // Exclusive lock token private String exclusiveLockToken = null; @@ -264,20 +266,29 @@ public class LockInfoImpl implements Serializable, LockInfo { throw new RuntimeException("Unable to generate JSON for " + toString(), e); } - return json; + return ADDINFO_WEBDAV_MARKER + ":" + json; } public static LockInfo fromJSON(String json) { ObjectMapper objectMapper = new ObjectMapper(); - try + + if (json != null && json.startsWith(ADDINFO_WEBDAV_MARKER)) { - LockInfo lockInfo = objectMapper.readValue(json, LockInfoImpl.class); - return lockInfo; + try + { + json = json.substring(ADDINFO_WEBDAV_MARKER.length() + 1); + LockInfo lockInfo = objectMapper.readValue(json, LockInfoImpl.class); + return lockInfo; + } + catch (Throwable e) + { + throw new IllegalArgumentException("Unable to parse JSON from [" + json + "]", e); + } } - catch (Throwable e) + else { - throw new RuntimeException("Unable to parse JSON from [" + json + "]", e); + throw new IllegalArgumentException("Was not detected WEBDAV_LOCK marker."); } } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVLockServiceImpl.java b/source/java/org/alfresco/repo/webdav/WebDAVLockServiceImpl.java index 987fb88d55..23bdc9877e 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVLockServiceImpl.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVLockServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2015 Alfresco Software Limited. * * This file is part of Alfresco * @@ -343,14 +343,16 @@ public class WebDAVLockServiceImpl implements WebDAVLockService if (lockState != null) { String additionalInfo = lockState.getAdditionalInfo(); - if (additionalInfo != null) + + try { lockInfo = LockInfoImpl.fromJSON(additionalInfo); } - else + catch (IllegalArgumentException e) { lockInfo = new LockInfoImpl(); } + lockInfo.setExpires(lockState.getExpires()); lockInfo.setOwner(lockState.getOwner()); } diff --git a/source/test-java/org/alfresco/repo/webdav/WebDAVLockServiceImplTest.java b/source/test-java/org/alfresco/repo/webdav/WebDAVLockServiceImplTest.java index e90e53cc79..295a95f2f2 100644 --- a/source/test-java/org/alfresco/repo/webdav/WebDAVLockServiceImplTest.java +++ b/source/test-java/org/alfresco/repo/webdav/WebDAVLockServiceImplTest.java @@ -2,6 +2,8 @@ package org.alfresco.repo.webdav; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; @@ -203,4 +205,27 @@ public class WebDAVLockServiceImplTest lockInfo = davLockService.getLockInfo(nodeRef3); assertEquals(null, lockInfo); } + + @Test + public void mnt13183LockInfo() + { + // CIFS lock node to 1 hour + lockService.lock(nodeRef1, LockType.WRITE_LOCK, 3600, Lifetime.EPHEMERAL, "lock_info_that_is_not_from_webdav"); + + // WebDAV get lock info + LockInfo lockInfoNodeRef1 = davLockService.getLockInfo(nodeRef1); + assertNull("exclusiveLockToken is null", lockInfoNodeRef1.getExclusiveLockToken()); + + String user = AuthenticationUtil.getFullyAuthenticatedUser(); + + // WebDav lock, check marker + davLockService.lock(nodeRef2, user, 3600); + + LockState lockState2 = lockService.getLockState(nodeRef2); + assertNotNull("lockState is not null", lockState2); + + String additionalInfo2 = lockState2.getAdditionalInfo(); + assertNotNull("additionalInfo is not null", additionalInfo2); + assertTrue("Check WEBDAV_LOCK marker", additionalInfo2.startsWith(LockInfoImpl.ADDINFO_WEBDAV_MARKER)); + } }