Merged V3.0 to HEAD

12349: Tweaked the Hibernate session helper to prevent initially-large sessions from drowning the flush code
  12452: MT - fix ETHREEOH-1056
  12453: MT - fix ETHREEOH-886
  12460: MT - fix ETHREEOH-1013


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12536 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2008-12-22 16:42:39 +00:00
parent 38ba58dede
commit c4e9d6f97b
8 changed files with 118 additions and 42 deletions

View File

@@ -85,7 +85,7 @@
view:childName="${spaces.templates.rss.childname}"> view:childName="${spaces.templates.rss.childname}">
<view:acl> <view:acl>
<view:ace view:access="ALLOWED"> <view:ace view:access="ALLOWED">
<view:authority>guest</view:authority> <view:authority>${alfresco_user_store.guestusername}</view:authority>
<view:permission>Consumer</view:permission> <view:permission>Consumer</view:permission>
</view:ace> </view:ace>
</view:acl> </view:acl>
@@ -121,7 +121,7 @@
<cm:folder view:childName="${spaces.guest_home.childname}"> <cm:folder view:childName="${spaces.guest_home.childname}">
<view:acl view:inherit="false"> <view:acl view:inherit="false">
<view:ace view:access="ALLOWED"> <view:ace view:access="ALLOWED">
<view:authority>guest</view:authority> <view:authority>${alfresco_user_store.guestusername}</view:authority>
<view:permission>Consumer</view:permission> <view:permission>Consumer</view:permission>
</view:ace> </view:ace>
<view:ace view:access="ALLOWED"> <view:ace view:access="ALLOWED">

View File

@@ -14,7 +14,7 @@
<!-- Apply Read access to Guest on root node of Spaces Store --> <!-- Apply Read access to Guest on root node of Spaces Store -->
<view:acl> <view:acl>
<view:ace view:access="ALLOWED"> <view:ace view:access="ALLOWED">
<view:authority>guest</view:authority> <view:authority>${alfresco_user_store.guestusername}</view:authority>
<view:permission>Read</view:permission> <view:permission>Read</view:permission>
</view:ace> </view:ace>
</view:acl> </view:acl>
@@ -44,7 +44,7 @@
<cm:person view:childName="cm:${alfresco_user_store.guestusername}"> <cm:person view:childName="cm:${alfresco_user_store.guestusername}">
<view:acl> <view:acl>
<view:ace view:access="ALLOWED"> <view:ace view:access="ALLOWED">
<view:authority>guest</view:authority> <view:authority>${alfresco_user_store.guestusername}</view:authority>
<view:permission>Read</view:permission> <view:permission>Read</view:permission>
</view:ace> </view:ace>
</view:acl> </view:acl>

View File

@@ -302,7 +302,7 @@
<ref bean="hibernateSessionHelper"/> <ref bean="hibernateSessionHelper"/>
</property> </property>
<property name="nodeService"> <property name="nodeService">
<ref bean="nodeService"/> <ref bean="dbNodeService"/>
</property> </property>
</bean> </bean>

View File

@@ -44,7 +44,6 @@ import org.alfresco.repo.domain.DbAuthority;
import org.alfresco.repo.domain.DbPermission; import org.alfresco.repo.domain.DbPermission;
import org.alfresco.repo.domain.Node; import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.QNameDAO; import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.repo.node.db.hibernate.HibernateNodeDaoServiceImpl;
import org.alfresco.repo.security.permissions.ACEType; import org.alfresco.repo.security.permissions.ACEType;
import org.alfresco.repo.security.permissions.ACLCopyMode; import org.alfresco.repo.security.permissions.ACLCopyMode;
import org.alfresco.repo.security.permissions.ACLType; import org.alfresco.repo.security.permissions.ACLType;
@@ -80,7 +79,7 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
*/ */
public class AclDaoComponentImpl extends HibernateDaoSupport implements AclDaoComponent public class AclDaoComponentImpl extends HibernateDaoSupport implements AclDaoComponent
{ {
private static Log logger = LogFactory.getLog(HibernateNodeDaoServiceImpl.class); private static Log logger = LogFactory.getLog(AclDaoComponentImpl.class);
static String QUERY_GET_PERMISSION = "permission.GetPermission"; static String QUERY_GET_PERMISSION = "permission.GetPermission";

View File

@@ -31,12 +31,9 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import org.alfresco.util.GUID; import org.alfresco.util.GUID;
import org.hibernate.CacheMode;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.engine.EntityKey; import org.hibernate.engine.EntityKey;
import com.sun.corba.se.spi.legacy.connection.GetEndPointInfoAgainException;
/** /**
* Support to (optionally) listen to hibernate events generated by a hibernate session. The tracking is bound to a * Support to (optionally) listen to hibernate events generated by a hibernate session. The tracking is bound to a
* transaction resource * transaction resource
@@ -71,18 +68,13 @@ public class HibernateSessionHelperResource implements HibernateSessionHelperRes
public void mark(Session session) public void mark(Session session)
{ {
Thread thread = Thread.currentThread();
String guid = GUID.generate(); String guid = GUID.generate();
mark(session, guid); mark(session, guid);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void mark(Session session, String label) public void mark(Session session, String label)
{ {
session.flush();
if (label == null) if (label == null)
{ {
throw new HibernateSessionHelperResourceException("Null key is not supported"); throw new HibernateSessionHelperResourceException("Null key is not supported");
@@ -99,10 +91,26 @@ public class HibernateSessionHelperResource implements HibernateSessionHelperRes
} }
HashSet<EntityKey> mark = new HashSet<EntityKey>((Set<EntityKey>) session.getStatistics().getEntityKeys()); HashSet<EntityKey> mark = new HashSet<EntityKey>((Set<EntityKey>) session.getStatistics().getEntityKeys());
// If the mark is too large, then the flush process will be excessive.
if (mark.size() > 1000)
{
// The session is to big. Use the mark to as a basis for cleaning out the session.
if (currentMark == null)
{
// The session is just too big
SessionSizeResourceManager.clear(session);
}
else
{
reset(session);
}
// Get the mark list again
mark = new HashSet<EntityKey>((Set<EntityKey>) session.getStatistics().getEntityKeys());
}
marks.put(label, mark); marks.put(label, mark);
currentMark = label; currentMark = label;
//System.out.println("Mark "+marks.size()+" "+currentMark);
} }
public void removeMark(Session session) public void removeMark(Session session)
@@ -205,11 +213,6 @@ public class HibernateSessionHelperResource implements HibernateSessionHelperRes
{ {
if (!check.contains(key)) if (!check.contains(key))
{ {
if (!key.getEntityName().startsWith("org.alfresco"))
{
System.out.println("Oops: " + key.getEntityName());
}
if(key.getEntityName().equals(QNameEntityImpl.class.getName())) if(key.getEntityName().equals(QNameEntityImpl.class.getName()))
{ {
//System.out.println("Skipping: " + key.getEntityName()); //System.out.println("Skipping: " + key.getEntityName());

View File

@@ -38,6 +38,7 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.importer.view.NodeContext;
import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition; import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition;
@@ -966,6 +967,27 @@ public class ImporterComponent
return boundProperties; return boundProperties;
} }
/**
* Bind permissions - binds authorities
*
* @param properties
* @return
*/
private List<AccessPermission> bindPermissions(List<AccessPermission> permissions)
{
List<AccessPermission> boundPermissions = new ArrayList<AccessPermission>(permissions.size());
for (AccessPermission permission : permissions)
{
AccessPermission ace = new NodeContext.ACE(permission.getAccessStatus(),
bindPlaceHolder(permission.getAuthority(), binding),
permission.getPermission());
boundPermissions.add(ace);
}
return boundPermissions;
}
/** /**
* Bind property value * Bind property value
@@ -1249,7 +1271,8 @@ public class ImporterComponent
AccessStatus writePermission = permissionService.hasPermission(nodeRef, PermissionService.CHANGE_PERMISSIONS); AccessStatus writePermission = permissionService.hasPermission(nodeRef, PermissionService.CHANGE_PERMISSIONS);
if (authenticationService.isCurrentUserTheSystemUser() || writePermission.equals(AccessStatus.ALLOWED)) if (authenticationService.isCurrentUserTheSystemUser() || writePermission.equals(AccessStatus.ALLOWED))
{ {
permissions = node.getAccessControlEntries(); permissions = bindPermissions(node.getAccessControlEntries());
for (AccessPermission permission : permissions) for (AccessPermission permission : permissions)
{ {
permissionService.setPermission(nodeRef, permission.getAuthority(), permission.getPermission(), permission.getAccessStatus().equals(AccessStatus.ALLOWED)); permissionService.setPermission(nodeRef, permission.getAuthority(), permission.getPermission(), permission.getAccessStatus().equals(AccessStatus.ALLOWED));
@@ -1433,7 +1456,9 @@ public class ImporterComponent
{ {
permissionService.setInheritParentPermissions(existingNodeRef, false); permissionService.setInheritParentPermissions(existingNodeRef, false);
} }
permissions = node.getAccessControlEntries();
permissions = bindPermissions(node.getAccessControlEntries());
for (AccessPermission permission : permissions) for (AccessPermission permission : permissions)
{ {
permissionService.setPermission(existingNodeRef, permission.getAuthority(), permission.getPermission(), permission.getAccessStatus().equals(AccessStatus.ALLOWED)); permissionService.setPermission(existingNodeRef, permission.getAuthority(), permission.getPermission(), permission.getAccessStatus().equals(AccessStatus.ALLOWED));
@@ -1584,5 +1609,4 @@ public class ImporterComponent
{ {
} }
} }
} }

View File

@@ -375,10 +375,7 @@ public class NodeContext extends ElementContext
permission = PermissionService.CONSUMER; permission = PermissionService.CONSUMER;
} }
ACE ace = new ACE(); ACE ace = new ACE(accessStatus, authority, permission);
ace.accessStatus = accessStatus;
ace.authority = authority;
ace.permission = permission;
accessControlEntries.add(ace); accessControlEntries.add(ace);
} }
@@ -502,12 +499,18 @@ public class NodeContext extends ElementContext
/** /**
* Access Control Entry * Access Control Entry
*/ */
private class ACE implements AccessPermission public static class ACE implements AccessPermission
{ {
private AccessStatus accessStatus; private AccessStatus accessStatus;
private String authority; private String authority;
private String permission; private String permission;
private int position;
public ACE(AccessStatus accessStatus, String authority, String permission)
{
this.accessStatus = accessStatus;
this.authority = authority;
this.permission = permission;
}
/* /*
* (non-Javadoc) * (non-Javadoc)

View File

@@ -107,6 +107,9 @@ public class MultiTDemoTest extends TestCase
public static final String DEFAULT_ADMIN_UN = "admin"; public static final String DEFAULT_ADMIN_UN = "admin";
public static final String DEFAULT_ADMIN_PW = "admin"; public static final String DEFAULT_ADMIN_PW = "admin";
public static final String DEFAULT_GUEST_UN = "guest";
public static final String DEFAULT_GUEST_PW = "thiscanbeanything";
public static final String TEST_USER1 = "alice"; public static final String TEST_USER1 = "alice";
public static final String TEST_USER2 = "bob"; public static final String TEST_USER2 = "bob";
public static final String TEST_USER3 = "eve"; public static final String TEST_USER3 = "eve";
@@ -176,7 +179,7 @@ public class MultiTDemoTest extends TestCase
if (! tenantAdminService.existsTenant(tenantDomain)) if (! tenantAdminService.existsTenant(tenantDomain))
{ {
//tenantAdminService.createTenant(tenantDomain, DEFAULT_ADMIN_PW.toCharArray(), ROOT_DIR + "/" + tenantDomain); //tenantAdminService.createTenant(tenantDomain, DEFAULT_ADMIN_PW.toCharArray(), ROOT_DIR + "/" + tenantDomain);
tenantAdminService.createTenant(tenantDomain, DEFAULT_ADMIN_PW.toCharArray(), null); // use default root dir tenantAdminService.createTenant(tenantDomain, (DEFAULT_ADMIN_PW+" "+tenantDomain).toCharArray(), null); // use default root dir
logger.info("Created tenant " + tenantDomain); logger.info("Created tenant " + tenantDomain);
} }
@@ -220,12 +223,12 @@ public class MultiTDemoTest extends TestCase
{ {
public Object doWork() throws Exception public Object doWork() throws Exception
{ {
createUser(TEST_USER1, tenantDomain, "welcome"); createUser(TEST_USER1, tenantDomain, TEST_USER1+" "+tenantDomain);
createUser(TEST_USER2, tenantDomain, "welcome"); createUser(TEST_USER2, tenantDomain, TEST_USER2+" "+tenantDomain);
if (tenantDomain.equals(TEST_TENANT_DOMAIN2)) if (tenantDomain.equals(TEST_TENANT_DOMAIN2))
{ {
createUser(TEST_USER3, tenantDomain, "welcome"); createUser(TEST_USER3, tenantDomain, TEST_USER3+" "+tenantDomain);
} }
return null; return null;
@@ -279,9 +282,9 @@ public class MultiTDemoTest extends TestCase
} }
} }
public void testLoginUsers() throws Throwable public void testLoginTenantUsers() throws Throwable
{ {
logger.info("Login demo users"); logger.info("Login tenant users");
try try
{ {
@@ -289,13 +292,13 @@ public class MultiTDemoTest extends TestCase
for (final String tenantDomain : tenants) for (final String tenantDomain : tenants)
{ {
loginLogoutUser(tenantService.getDomainUser(TEST_USER1, tenantDomain), "welcome"); loginLogoutUser(tenantService.getDomainUser(TEST_USER1, tenantDomain), TEST_USER1+" "+tenantDomain);
loginLogoutUser(tenantService.getDomainUser(TEST_USER2, tenantDomain), "welcome"); loginLogoutUser(tenantService.getDomainUser(TEST_USER2, tenantDomain), TEST_USER2+" "+tenantDomain);
if (tenantDomain.equals(TEST_TENANT_DOMAIN2)) if (tenantDomain.equals(TEST_TENANT_DOMAIN2))
{ {
loginLogoutUser(tenantService.getDomainUser(TEST_USER3, tenantDomain), "welcome"); loginLogoutUser(tenantService.getDomainUser(TEST_USER3, tenantDomain), TEST_USER3+" "+tenantDomain);
} }
} }
} }
@@ -308,13 +311,57 @@ public class MultiTDemoTest extends TestCase
} }
} }
public void testLoginTenantGuests() throws Throwable
{
logger.info("Login tenant guests");
try
{
AuthenticationUtil.clearCurrentSecurityContext();
for (final String tenantDomain : tenants)
{
loginLogoutUser(tenantService.getDomainUser(DEFAULT_GUEST_UN, tenantDomain), DEFAULT_GUEST_UN);
}
}
catch (Throwable t)
{
StringWriter stackTrace = new StringWriter();
t.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace.toString());
throw t;
}
}
public void testLoginTenantAdmin() throws Throwable
{
logger.info("Login tenant admins");
try
{
AuthenticationUtil.clearCurrentSecurityContext();
for (final String tenantDomain : tenants)
{
loginLogoutUser(tenantService.getDomainUser(TenantService.ADMIN_BASENAME, tenantDomain), DEFAULT_ADMIN_PW+" "+tenantDomain);
}
}
catch (Throwable t)
{
StringWriter stackTrace = new StringWriter();
t.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace.toString());
throw t;
}
}
public void testCreateGroups() public void testCreateGroups()
{ {
logger.info("Create demo groups"); logger.info("Create demo groups");
for (final String tenantDomain : tenants) for (final String tenantDomain : tenants)
{ {
String tenantAdminName = tenantService.getDomainUser("admin", tenantDomain); String tenantAdminName = tenantService.getDomainUser(TenantService.ADMIN_BASENAME, tenantDomain);
AuthenticationUtil.runAs(new RunAsWork<Object>() AuthenticationUtil.runAs(new RunAsWork<Object>()
{ {
@@ -505,7 +552,7 @@ public class MultiTDemoTest extends TestCase
{ {
public Object doWork() throws Exception public Object doWork() throws Exception
{ {
NodeRef personNodeRef = createUser(TEST_USER4, tenantDomain, "welcome"); NodeRef personNodeRef = createUser(TEST_USER4, tenantDomain, TEST_USER4+" "+tenantDomain);
// Test nodeRef property // Test nodeRef property
NodeRef homeFolderNodeRef = (NodeRef)nodeService.getProperty(personNodeRef, ContentModel.PROP_HOMEFOLDER); NodeRef homeFolderNodeRef = (NodeRef)nodeService.getProperty(personNodeRef, ContentModel.PROP_HOMEFOLDER);