From a5d07e10693b0667f36ff1821959e4a85b48287c Mon Sep 17 00:00:00 2001 From: Britt Park Date: Tue, 23 May 2006 16:39:21 +0000 Subject: [PATCH] Morning merge. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2959 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/messages/lock-service.properties | 4 +- config/alfresco/public-services-context.xml | 6 +++ .../public-services-security-context.xml | 3 +- .../server/config/ServerConfiguration.java | 3 +- .../filesys/smb/server/repo/CifsHelper.java | 23 +++++---- .../smb/server/repo/ContentContext.java | 20 ++++++++ .../smb/server/repo/ContentDiskDriver.java | 26 ++++++++-- .../smb/server/repo/FileStateTable.java | 48 +++++++++++++++++-- .../server/win32/Win32NetBIOSLanaMonitor.java | 2 +- .../alfresco/repo/cache/EhCacheTracerJob.java | 24 ++++++++-- .../filefolder/FileFolderServiceImpl.java | 10 +++- .../repo/security/authority/AuthorityDAO.java | 8 ++++ .../security/authority/AuthorityDAOImpl.java | 7 +++ .../authority/AuthorityServiceImpl.java | 5 ++ .../authority/AuthorityServiceTest.java | 2 + .../authority/SimpleAuthorityServiceImpl.java | 5 ++ .../authority/SimpleAuthorityServiceTest.java | 6 ++- .../cmr/security/AuthorityService.java | 8 ++++ 18 files changed, 179 insertions(+), 31 deletions(-) diff --git a/config/alfresco/messages/lock-service.properties b/config/alfresco/messages/lock-service.properties index 013dd290dd..8db9ddd99c 100644 --- a/config/alfresco/messages/lock-service.properties +++ b/config/alfresco/messages/lock-service.properties @@ -2,5 +2,5 @@ lock_service.insufficent_privileges=You have insufficent privileges to release the lock on the node (id: {0}). The node is locked by another user. lock_service.node_locked=The node (id: {0}) could not be locked since it is already locked by another user. -lock_service.no_op=Can not perform operation since the node (id:{0}) is locked by another user. -lock_service.no_op2=Can not perform operation {0} since the node (id:{1}) is locked by another user. +lock_service.no_op=Can not perform operation since the node (id:{0}) is locked. +lock_service.no_op2=Can not perform operation {0} since the node (id:{1}) is locked. diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 3169bd93d2..475d0fbc5e 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -807,6 +807,12 @@ + PROPAGATION_NOT_SUPPORTED, readOnly + PROPAGATION_NOT_SUPPORTED, readOnly + PROPAGATION_NOT_SUPPORTED, readOnly + PROPAGATION_NOT_SUPPORTED, readOnly + PROPAGATION_NOT_SUPPORTED, readOnly + PROPAGATION_NOT_SUPPORTED, readOnly ${server.transaction.mode.default} diff --git a/config/alfresco/public-services-security-context.xml b/config/alfresco/public-services-security-context.xml index d9fb30d910..f0a67b5db6 100644 --- a/config/alfresco/public-services-security-context.xml +++ b/config/alfresco/public-services-security-context.xml @@ -44,7 +44,7 @@ - + @@ -578,6 +578,7 @@ org.alfresco.service.cmr.security.AuthorityService.getContainingAuthorities=ACL_ALLOW org.alfresco.service.cmr.security.AuthorityService.getShortName=ACL_ALLOW org.alfresco.service.cmr.security.AuthorityService.getName=ACL_ALLOW + org.alfresco.service.cmr.security.AuthorityService.authorityExists=ACL_METHOD.ROLE_ADMINISTRATOR diff --git a/source/java/org/alfresco/filesys/server/config/ServerConfiguration.java b/source/java/org/alfresco/filesys/server/config/ServerConfiguration.java index 82eceba926..b496d631dc 100644 --- a/source/java/org/alfresco/filesys/server/config/ServerConfiguration.java +++ b/source/java/org/alfresco/filesys/server/config/ServerConfiguration.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.Enumeration; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import java.util.TimeZone; @@ -1743,7 +1744,7 @@ public class ServerConfiguration implements ApplicationListener if (platformStr == null || platformStr.length() == 0) return platformTypes; - StringTokenizer token = new StringTokenizer(platformStr.toUpperCase(), ","); + StringTokenizer token = new StringTokenizer(platformStr.toUpperCase(Locale.ENGLISH), ","); String typ = null; try diff --git a/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java b/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java index 75aac16253..ed7823580e 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/CifsHelper.java @@ -214,16 +214,21 @@ public class CifsHelper // Check the lock status of the file - if ( hasLockedFilesAsOffline()) - { - String lockTypeStr = (String) nodeProperties.get(ContentModel.PROP_LOCK_TYPE); + String lockTypeStr = (String) nodeProperties.get(ContentModel.PROP_LOCK_TYPE); - if ( lockTypeStr != null) - { - // File is locked so mark it as offline - - fileInfo.setFileAttributes(fileInfo.getFileAttributes() + FileAttribute.NTOffline); - } + if ( lockTypeStr != null) + { + // File is locked so mark it as read-only and offline + + int attr = fileInfo.getFileAttributes(); + + if (( attr & FileAttribute.ReadOnly) == 0) + attr += FileAttribute.ReadOnly; + + if ( hasLockedFilesAsOffline()) + attr += FileAttribute.NTOffline; + + fileInfo.setFileAttributes( attr); } } diff --git a/source/java/org/alfresco/filesys/smb/server/repo/ContentContext.java b/source/java/org/alfresco/filesys/smb/server/repo/ContentContext.java index b024f5233c..d774b28437 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/ContentContext.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/ContentContext.java @@ -226,4 +226,24 @@ public class ContentContext extends DiskDeviceContext { m_urlFileName = urlFileName; } + + /** + * Close the filesystem context + */ + public void CloseContext() { + + // Check if file states are enabled + + if ( hasStateTable()) + { + // Shutdown the file state checker thread + + getStateTable().shutdownRequest(); + } + + // Call the base class + + super.CloseContext(); + } + } diff --git a/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java b/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java index 3da4def1b7..e37eab5004 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/ContentDiskDriver.java @@ -519,20 +519,24 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface { // Get the file information for the node + session.beginTransaction(transactionService, true); finfo = cifsHelper.getFileInformation(nodeRef); // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("getInfo using cached noderef for path " + path); } // If the required node was not in the state cache, the parent folder node might be - session.beginTransaction(transactionService, true); if ( finfo == null) { + // Start a transaction + + session.beginTransaction(transactionService, true); + String[] paths = FileName.splitPath( path); if ( paths[0] != null && paths[0].length() > 1) @@ -548,7 +552,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("getInfo using cached noderef for parent " + path); } } @@ -906,6 +910,13 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface if ( params.hasAccessMode(AccessMode.NTDelete) && permissionService.hasPermission(nodeRef, PermissionService.DELETE) == AccessStatus.DENIED) throw new AccessDeniedException("No delete access to " + params.getFullPath()); + + // Check if the file has a lock + + String lockTypeStr = (String) nodeService.getProperty( nodeRef, ContentModel.PROP_LOCK_TYPE); + + if ( params.hasAccessMode(AccessMode.NTWrite) && lockTypeStr != null) + throw new AccessDeniedException("File is locked, no write access to " + params.getFullPath()); // Check if there is a file state for the file @@ -1042,7 +1053,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // DEBUG - if ( logger.isDebugEnabled()) + if ( logger.isInfoEnabled()) logger.debug("Create file using cached noderef for path " + paths[0]); } } @@ -1084,6 +1095,7 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface " node: " + nodeRef + "\n" + " network file: " + netFile); } + return netFile; } catch (org.alfresco.repo.security.permissions.AccessDeniedException ex) @@ -1860,6 +1872,12 @@ public class ContentDiskDriver implements DiskInterface, IOCtlInterface // check that the node exists if (nodeService.exists(fstate.getNodeRef())) { + // Bump the file states expiry time + + fstate.setExpiryTime(System.currentTimeMillis() + FileState.DefTimeout); + + // Return the cached noderef + return fstate.getNodeRef(); } else diff --git a/source/java/org/alfresco/filesys/smb/server/repo/FileStateTable.java b/source/java/org/alfresco/filesys/smb/server/repo/FileStateTable.java index d2563f3669..835fb04e03 100644 --- a/source/java/org/alfresco/filesys/smb/server/repo/FileStateTable.java +++ b/source/java/org/alfresco/filesys/smb/server/repo/FileStateTable.java @@ -50,6 +50,14 @@ public class FileStateTable implements Runnable private long m_cacheTimer = 2 * 60000L; // 2 minutes default + // File state checker thread + + private Thread m_thread; + + // Shutdown request flag + + private boolean m_shutdown; + /** * Class constructor */ @@ -59,10 +67,10 @@ public class FileStateTable implements Runnable // Start the expired file state checker thread - Thread th = new Thread(this); - th.setDaemon(true); - th.setName("FileStateExpire"); - th.start(); + m_thread = new Thread(this); + m_thread.setDaemon(true); + m_thread.setName("FileStateExpire"); + m_thread.start(); } /** @@ -366,7 +374,9 @@ public class FileStateTable implements Runnable // Loop forever - while (true) + m_shutdown = false; + + while ( m_shutdown == false) { // Sleep for the required interval @@ -379,6 +389,18 @@ public class FileStateTable implements Runnable { } + // Check for shutdown + + if ( m_shutdown == true) + { + // Debug + + if ( logger.isDebugEnabled()) + logger.debug("FileStateExpire thread closing"); + + return; + } + try { @@ -401,6 +423,22 @@ public class FileStateTable implements Runnable } } + /** + * Request the file state checker thread to shutdown + */ + public final void shutdownRequest() { + m_shutdown = true; + + if ( m_thread != null) + { + try { + m_thread.interrupt(); + } + catch (Exception ex) { + } + } + } + /** * Dump the state cache entries to the specified stream */ diff --git a/source/java/org/alfresco/filesys/smb/server/win32/Win32NetBIOSLanaMonitor.java b/source/java/org/alfresco/filesys/smb/server/win32/Win32NetBIOSLanaMonitor.java index a0341b122e..e7cec88150 100644 --- a/source/java/org/alfresco/filesys/smb/server/win32/Win32NetBIOSLanaMonitor.java +++ b/source/java/org/alfresco/filesys/smb/server/win32/Win32NetBIOSLanaMonitor.java @@ -160,7 +160,7 @@ public class Win32NetBIOSLanaMonitor extends Thread m_listeners = new LanaListener[len]; } - else if ( lana > m_listeners.length) + else if ( lana >= m_listeners.length) { // Extend the LANA listener array diff --git a/source/java/org/alfresco/repo/cache/EhCacheTracerJob.java b/source/java/org/alfresco/repo/cache/EhCacheTracerJob.java index e9717bee1f..2113fb4b3c 100644 --- a/source/java/org/alfresco/repo/cache/EhCacheTracerJob.java +++ b/source/java/org/alfresco/repo/cache/EhCacheTracerJob.java @@ -81,7 +81,7 @@ public class EhCacheTracerJob implements Job } long maxHeapSize = Runtime.getRuntime().maxMemory(); - long totalSize = 0L; + long allCachesTotalSize = 0L; double estimatedMaxSize = 0L; // get all the caches String[] cacheNames = cacheManager.getCacheNames(); @@ -97,16 +97,19 @@ public class EhCacheTracerJob implements Job CacheAnalysis analysis = new CacheAnalysis(cache); logger.debug(analysis); // get the size - totalSize += analysis.getSize(); - estimatedMaxSize += Double.isNaN(analysis.getEstimatedMaxSize()) ? 0.0 : analysis.getEstimatedMaxSize(); + allCachesTotalSize += analysis.getSize(); + double cacheEstimatedMaxSize = analysis.getEstimatedMaxSize(); + estimatedMaxSize += (Double.isNaN(cacheEstimatedMaxSize) || Double.isInfinite(cacheEstimatedMaxSize)) + ? 0.0 + : cacheEstimatedMaxSize; } // check the size - double sizePercentage = (double)totalSize / (double)maxHeapSize * 100.0; + double sizePercentage = (double)allCachesTotalSize / (double)maxHeapSize * 100.0; double maxSizePercentage = estimatedMaxSize / (double)maxHeapSize * 100.0; String msg = String.format( "EHCaches currently consume %5.2f MB or %3.2f percent of system VM size. \n" + "The estimated maximum size is %5.2f MB or %3.2f percent of system VM size.", - (double)totalSize / 1024.0 / 1024.0, + (double)allCachesTotalSize / 1024.0 / 1024.0, sizePercentage, estimatedMaxSize / 1024.0 / 1024.0, maxSizePercentage); @@ -156,11 +159,22 @@ public class EhCacheTracerJob implements Job { // calculate the cache deep size - EHCache 1.1 is always returning 0L List keys = cache.getKeys(); + // only count a maximum of 1000 entities + int count = 0; for (Serializable key : keys) { Element element = cache.get(key); size += getSize(element); + count++; + if (count >= 50) + { + break; + } } + + // the size must be multiplied by the ratio of the count to actual size + size = count > 0 ? (long) ((double)size * ((double)keys.size()/(double)count)) : 0L; + sizeMB = (double)size/1024.0/1024.0; maxSize = cache.getMaxElementsInMemory(); currentSize = cache.getMemoryStoreSize(); diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index a717802b40..6494d26f4a 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -518,8 +518,14 @@ public class FileFolderServiceImpl implements FileFolderService qname, true); } - // changed the name property - nodeService.setProperty(targetNodeRef, ContentModel.PROP_NAME, newName); + + // Only update the name if it has changed + String currentName = (String)nodeService.getProperty(targetNodeRef, ContentModel.PROP_NAME); + if (currentName.equals(newName) == false) + { + // changed the name property + nodeService.setProperty(targetNodeRef, ContentModel.PROP_NAME, newName); + } // get the details after the operation FileInfo afterFileInfo = toFileInfo(targetNodeRef); diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityDAO.java b/source/java/org/alfresco/repo/security/authority/AuthorityDAO.java index 1e2c5365b9..ff72501824 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityDAO.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityDAO.java @@ -88,4 +88,12 @@ public interface AuthorityDAO * @return */ Set getAllAuthorities(AuthorityType type); + + /** + * Test if an authority already exists. + * + * @param name + * @return + */ + boolean authorityExists(String name); } diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java b/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java index 190cf744ef..ed3c483556 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityDAOImpl.java @@ -89,6 +89,13 @@ public class AuthorityDAOImpl implements AuthorityDAO this.userToAuthorityCache = userToAuthorityCache; } + public boolean authorityExists(String name) + { + NodeRef ref = getAuthorityOrNull(name); + return ref != null; + } + + public void addAuthority(String parentName, String childName) { NodeRef parentRef = getAuthorityOrNull(parentName); diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java b/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java index bdac935c5d..ca8a0d1cd1 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityServiceImpl.java @@ -241,4 +241,9 @@ public class AuthorityServiceImpl implements AuthorityService authorityDAO.removeAuthority(parentName, childName); } + public boolean authorityExists(String name) + { + return authorityDAO.authorityExists(name); + } + } diff --git a/source/java/org/alfresco/repo/security/authority/AuthorityServiceTest.java b/source/java/org/alfresco/repo/security/authority/AuthorityServiceTest.java index c07bb6f060..4bf6925881 100644 --- a/source/java/org/alfresco/repo/security/authority/AuthorityServiceTest.java +++ b/source/java/org/alfresco/repo/security/authority/AuthorityServiceTest.java @@ -237,9 +237,11 @@ public class AuthorityServiceTest extends TestCase String auth4; String auth5; + assertFalse(pubAuthorityService.authorityExists(pubAuthorityService.getName(AuthorityType.GROUP, "one"))); assertEquals(0, pubAuthorityService.getAllAuthorities(AuthorityType.GROUP).size()); assertEquals(0, pubAuthorityService.getAllRootAuthorities(AuthorityType.GROUP).size()); auth1 = pubAuthorityService.createAuthority(AuthorityType.GROUP, null, "one"); + assertTrue(pubAuthorityService.authorityExists(auth1)); assertEquals(1, pubAuthorityService.getAllAuthorities(AuthorityType.GROUP).size()); assertEquals(1, pubAuthorityService.getAllRootAuthorities(AuthorityType.GROUP).size()); auth2 = pubAuthorityService.createAuthority(AuthorityType.GROUP, null, "two"); diff --git a/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceImpl.java b/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceImpl.java index 5c7047d96d..28974f8d7a 100644 --- a/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceImpl.java +++ b/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceImpl.java @@ -207,4 +207,9 @@ public class SimpleAuthorityServiceImpl implements AuthorityService } + public boolean authorityExists(String name) + { + return false; + } + } diff --git a/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceTest.java b/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceTest.java index f6b5c8a57e..bb233ae9a8 100644 --- a/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceTest.java +++ b/source/java/org/alfresco/repo/security/authority/SimpleAuthorityServiceTest.java @@ -21,6 +21,7 @@ import javax.transaction.UserTransaction; import junit.framework.TestCase; import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.MutableAuthenticationDao; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.security.AuthenticationService; @@ -91,7 +92,7 @@ public class SimpleAuthorityServiceTest extends TestCase @Override protected void tearDown() throws Exception { - authenticationService.clearCurrentSecurityContext(); + AuthenticationUtil.clearCurrentSecurityContext(); tx.rollback(); super.tearDown(); } @@ -106,6 +107,8 @@ public class SimpleAuthorityServiceTest extends TestCase public void testAdminUser() { + assertFalse(authorityService.authorityExists("woof")); + authenticationComponent.setCurrentUser("admin"); assertTrue(authorityService.hasAdminAuthority()); assertTrue(pubAuthorityService.hasAdminAuthority()); @@ -119,6 +122,7 @@ public class SimpleAuthorityServiceTest extends TestCase public void testAuthorities() { + assertFalse(pubAuthorityService.authorityExists("woof")); assertEquals(1, pubAuthorityService.getAllAuthorities(AuthorityType.ADMIN).size()); assertTrue(pubAuthorityService.getAllAuthorities(AuthorityType.ADMIN).contains( PermissionService.ADMINISTRATOR_AUTHORITY)); diff --git a/source/java/org/alfresco/service/cmr/security/AuthorityService.java b/source/java/org/alfresco/service/cmr/security/AuthorityService.java index c23348d855..14b6d28572 100644 --- a/source/java/org/alfresco/service/cmr/security/AuthorityService.java +++ b/source/java/org/alfresco/service/cmr/security/AuthorityService.java @@ -171,5 +171,13 @@ public interface AuthorityService * @return */ public String getName(AuthorityType type, String shortName); + + /** + * Check if an authority exists. + * + * @param name (the long name). + * @return + */ + public boolean authorityExists(String name); }