Added support for result set meta data

Added size limits for result sets
Updated/improved comments

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2573 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Andrew Hind
2006-03-23 15:14:22 +00:00
parent 75ce410028
commit 57e7a4f77e
16 changed files with 705 additions and 30 deletions

View File

@@ -31,11 +31,14 @@ import net.sf.acegisecurity.ConfigAttribute;
import net.sf.acegisecurity.ConfigAttributeDefinition;
import net.sf.acegisecurity.afterinvocation.AfterInvocationProvider;
import org.alfresco.repo.search.SimpleResultSetMetaData;
import org.alfresco.repo.security.permissions.impl.SimplePermissionReference;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
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.LimitBy;
import org.alfresco.service.cmr.search.PermissionEvaluationMode;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.AuthenticationService;
@@ -336,25 +339,55 @@ public class ACLEntryAfterInvocationProvider implements AfterInvocationProvider,
ResultSet returnedObject) throws AccessDeniedException
{
FilteringResultSet filteringResultSet = new FilteringResultSet((ResultSet) returnedObject);
if (returnedObject == null)
{
return null;
}
FilteringResultSet filteringResultSet = new FilteringResultSet(returnedObject);
List<ConfigAttributeDefintion> supportedDefinitions = extractSupportedDefinitions(config);
Integer maxSize = null;
if(returnedObject.getResultSetMetaData().getSearchParameters().getLimitBy() == LimitBy.FINAL_SIZE)
{
maxSize = new Integer(returnedObject.getResultSetMetaData().getSearchParameters().getLimit());
}
if (supportedDefinitions.size() == 0)
{
return returnedObject;
if(maxSize == null)
{
return returnedObject;
}
else if (returnedObject.length() > maxSize.intValue())
{
for(int i = 0; i < maxSize.intValue(); i++)
{
filteringResultSet.setIncluded(i, true);
}
filteringResultSet.setResultSetMetaData(new SimpleResultSetMetaData(LimitBy.FINAL_SIZE, PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters()));
}
else
{
for(int i = 0; i < maxSize.intValue(); i++)
{
filteringResultSet.setIncluded(i, true);
}
filteringResultSet.setResultSetMetaData(new SimpleResultSetMetaData(LimitBy.UNLIMITED, PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters()));
}
}
for (int i = 0; i < returnedObject.length(); i++)
{
// All permission checks must pass
filteringResultSet.setIncluded(i, true);
for (ConfigAttributeDefintion cad : supportedDefinitions)
{
filteringResultSet.setIncluded(i, true);
NodeRef testNodeRef = null;
if (cad.typeString.equals(AFTER_ACL_NODE))
{
@@ -365,15 +398,25 @@ public class ACLEntryAfterInvocationProvider implements AfterInvocationProvider,
testNodeRef = returnedObject.getChildAssocRef(i).getParentRef();
}
if (filteringResultSet.getIncluded(i)
if (filteringResultSet.getIncluded(i)
&& (testNodeRef != null)
&& (permissionService.hasPermission(testNodeRef, cad.required.toString()) == AccessStatus.DENIED))
{
filteringResultSet.setIncluded(i, false);
}
}
// Bug out if we are limiting by size
if((maxSize != null) && (filteringResultSet.length() > maxSize.intValue()))
{
// Renove the last match to fix the correct size
filteringResultSet.setIncluded(i, false);
filteringResultSet.setResultSetMetaData(new SimpleResultSetMetaData(LimitBy.FINAL_SIZE, PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters()));
return filteringResultSet;
}
}
filteringResultSet.setResultSetMetaData(new SimpleResultSetMetaData(LimitBy.UNLIMITED, PermissionEvaluationMode.EAGER, returnedObject.getResultSetMetaData().getSearchParameters()));
return filteringResultSet;
}

View File

@@ -25,6 +25,7 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetMetaData;
import org.alfresco.service.cmr.search.ResultSetRow;
public class FilteringResultSet extends ACLEntryAfterInvocationProvider implements ResultSet
@@ -32,6 +33,8 @@ public class FilteringResultSet extends ACLEntryAfterInvocationProvider implemen
private ResultSet unfiltered;
private BitSet inclusionMask;
private ResultSetMetaData resultSetMetaData;
FilteringResultSet(ResultSet unfiltered)
{
@@ -244,4 +247,15 @@ public class FilteringResultSet extends ACLEntryAfterInvocationProvider implemen
}
public ResultSetMetaData getResultSetMetaData()
{
return resultSetMetaData;
}
public void setResultSetMetaData(ResultSetMetaData resultSetMetaData)
{
this.resultSetMetaData = resultSetMetaData;
}
}