Morning merge.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2959 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park 2006-05-23 16:39:21 +00:00
parent 7440ae18a6
commit a5d07e1069
18 changed files with 179 additions and 31 deletions

View File

@ -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.

View File

@ -807,6 +807,12 @@
</property>
<property name="transactionAttributes">
<props>
<prop key="getCurrentUserName">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="invalidateUserSession">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="invalidateTicket">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="getCurrentTicket">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="clearCurrentSecurityContext">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="isCurrentUserTheSystemUser">PROPAGATION_NOT_SUPPORTED, readOnly</prop>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>

View File

@ -44,7 +44,7 @@
</bean>
<bean id="permissionServiceImpl" class="org.alfresco.repo.security.permissions.impl.PermissionServiceImpl">
<bean id="permissionServiceImpl" class="org.alfresco.repo.security.permissions.impl.AllowPermissionServiceImpl">
<property name="nodeService">
<ref bean="nodeService" />
</property>
@ -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
</value>
</property>
</bean>

View File

@ -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

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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

View File

@ -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
*/

View File

@ -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

View File

@ -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<Serializable> 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();

View File

@ -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);

View File

@ -88,4 +88,12 @@ public interface AuthorityDAO
* @return
*/
Set<String> getAllAuthorities(AuthorityType type);
/**
* Test if an authority already exists.
*
* @param name
* @return
*/
boolean authorityExists(String name);
}

View File

@ -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);

View File

@ -241,4 +241,9 @@ public class AuthorityServiceImpl implements AuthorityService
authorityDAO.removeAuthority(parentName, childName);
}
public boolean authorityExists(String name)
{
return authorityDAO.authorityExists(name);
}
}

View File

@ -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");

View File

@ -207,4 +207,9 @@ public class SimpleAuthorityServiceImpl implements AuthorityService
}
public boolean authorityExists(String name)
{
return false;
}
}

View File

@ -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));

View File

@ -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);
}