diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index e27523c9a2..3bcc1068aa 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -282,6 +282,9 @@ + + + diff --git a/config/alfresco/dbscripts/upgrade/1.4/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-1.4-2.sql b/config/alfresco/dbscripts/upgrade/1.4/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-1.4-2.sql index 60ad676333..aeebaced5e 100644 --- a/config/alfresco/dbscripts/upgrade/1.4/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-1.4-2.sql +++ b/config/alfresco/dbscripts/upgrade/1.4/org.hibernate.dialect.MySQLInnoDBDialect/AlfrescoSchemaUpdate-1.4-2.sql @@ -27,6 +27,8 @@ CREATE TABLE alf_transaction ( KEY FKB8761A3A9AE340B7 (server_id), CONSTRAINT FKB8761A3A9AE340B7 FOREIGN KEY (server_id) REFERENCES alf_server (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- add index for perfromance +create index ug_index_142_1 on alf_transaction (change_txn_id); insert into alf_transaction ( server_id, change_txn_id @@ -41,6 +43,8 @@ UPDATE alf_node_status ns SET ns.transaction_id = ( select t.id from alf_transaction t where t.change_txn_id = ns.change_txn_id ); +-- remove index added for performance + ALTER TABLE alf_node_status DROP COLUMN change_txn_id, ADD CONSTRAINT FK71C2002B9E57C13D FOREIGN KEY (transaction_id) REFERENCES alf_transaction (id), @@ -48,7 +52,7 @@ ALTER TABLE alf_node_status ALTER TABLE alf_node_status DROP COLUMN deleted ;(optional) - +drop index ug_index_142_1 on alf_transaction; -- -- Record script finish -- diff --git a/config/alfresco/messages/patch-service.properties b/config/alfresco/messages/patch-service.properties index cbeed23b3b..5d58f903e1 100644 --- a/config/alfresco/messages/patch-service.properties +++ b/config/alfresco/messages/patch-service.properties @@ -2,6 +2,7 @@ patch.service.not_relevant=Not relevant to schema {0} patch.executer.checking=Checking for patches to apply ... patch.executer.no_patches_required=No patches were required. +patch.executer.system_readonly=Patches cannot be applied to a read-only system. Possible incompatibilities may exist between the application code and the existing data. patch.executer.not_executed =\n=== Recorded patch (not executed) === \nID: {0}\nRESULT: \n{1}\n===================================== patch.executer.executed =\n=== Applied patch === \nID: {0}\nRESULT: \n{1}\n===================================== patch.executer.failed =\n=== Failed to apply patch === \nID: {0}\nRESULT: \n{1}\n===================================== diff --git a/config/alfresco/model/permissionDefinitions.xml b/config/alfresco/model/permissionDefinitions.xml index 60465b61fd..2c47b10a21 100644 --- a/config/alfresco/model/permissionDefinitions.xml +++ b/config/alfresco/model/permissionDefinitions.xml @@ -308,9 +308,6 @@ - - - diff --git a/source/java/org/alfresco/repo/admin/patch/PatchExecuter.java b/source/java/org/alfresco/repo/admin/patch/PatchExecuter.java index b6cce98e30..0a0859cbce 100644 --- a/source/java/org/alfresco/repo/admin/patch/PatchExecuter.java +++ b/source/java/org/alfresco/repo/admin/patch/PatchExecuter.java @@ -29,6 +29,7 @@ import java.util.List; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.i18n.I18NUtil; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.AbstractLifecycleBean; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,6 +45,7 @@ public class PatchExecuter extends AbstractLifecycleBean { private static final String MSG_CHECKING = "patch.executer.checking"; private static final String MSG_NO_PATCHES_REQUIRED = "patch.executer.no_patches_required"; + private static final String MSG_SYSTEM_READ_ONLY = "patch.executer.system_readonly"; private static final String MSG_NOT_EXECUTED = "patch.executer.not_executed"; private static final String MSG_EXECUTED = "patch.executer.executed"; private static final String MSG_FAILED = "patch.executer.failed"; @@ -51,6 +53,7 @@ public class PatchExecuter extends AbstractLifecycleBean private static Log logger = LogFactory.getLog(PatchExecuter.class); private PatchService patchService; + private TransactionService transactionService; /** * @param patchService the server that actually executes the patches @@ -59,12 +62,27 @@ public class PatchExecuter extends AbstractLifecycleBean { this.patchService = patchService; } - + + /** + * @param transactionService provides the system read-only state + */ + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + /** * Ensures that all outstanding patches are applied. */ public void applyOutstandingPatches() { + // Avoid read-only systems + if (transactionService.isReadOnly()) + { + logger.warn(I18NUtil.getMessage(MSG_SYSTEM_READ_ONLY)); + return; + } + logger.info(I18NUtil.getMessage(MSG_CHECKING)); Date before = new Date(System.currentTimeMillis() - 60000L); // 60 seconds ago diff --git a/source/java/org/alfresco/repo/node/integrity/AssocSourceMultiplicityIntegrityEvent.java b/source/java/org/alfresco/repo/node/integrity/AssocSourceMultiplicityIntegrityEvent.java index 7864851abd..7d1c47f69a 100644 --- a/source/java/org/alfresco/repo/node/integrity/AssocSourceMultiplicityIntegrityEvent.java +++ b/source/java/org/alfresco/repo/node/integrity/AssocSourceMultiplicityIntegrityEvent.java @@ -101,6 +101,7 @@ public class AssocSourceMultiplicityIntegrityEvent extends AbstractIntegrityEven { IntegrityRecord result = new IntegrityRecord( "Association type does not exist: \n" + + " Target Node: " + targetNodeRef + "\n" + " Target Node Type: " + targetNodeTypeQName + "\n" + " Association Type: " + assocTypeQName); eventResults.add(result); @@ -156,6 +157,7 @@ public class AssocSourceMultiplicityIntegrityEvent extends AbstractIntegrityEven String parentOrSourceStr = (assocDef.isChild() ? "parent" : "source"); IntegrityRecord result = new IntegrityRecord( "The association " + parentOrSourceStr + " multiplicity has been violated: \n" + + " Target Node: " + targetNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required " + parentOrSourceStr + " Multiplicity: " + getMultiplicityString(mandatory, allowMany) + "\n" + " Actual " + parentOrSourceStr + " Multiplicity: " + actualSize); diff --git a/source/java/org/alfresco/repo/node/integrity/AssocSourceTypeIntegrityEvent.java b/source/java/org/alfresco/repo/node/integrity/AssocSourceTypeIntegrityEvent.java index aa92609858..0e59c6829d 100644 --- a/source/java/org/alfresco/repo/node/integrity/AssocSourceTypeIntegrityEvent.java +++ b/source/java/org/alfresco/repo/node/integrity/AssocSourceTypeIntegrityEvent.java @@ -82,6 +82,7 @@ public class AssocSourceTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "Association type does not exist: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Source Node Type: " + sourceNodeTypeQName + "\n" + " Association Type: " + assocTypeQName); eventResults.add(result); @@ -110,6 +111,7 @@ public class AssocSourceTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "The association source type is incorrect: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required Source Type: " + sourceDef.getName() + "\n" + " Actual Source Type: " + sourceNodeTypeQName); @@ -133,6 +135,7 @@ public class AssocSourceTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "The association source is missing the aspect required for this association: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required Source Aspect: " + sourceDef.getName() + "\n" + " Actual Source Aspects: " + sourceAspects); @@ -143,6 +146,7 @@ public class AssocSourceTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "Unknown ClassDefinition subclass on the source definition: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Association: " + assocDef + "\n" + " Source Definition: " + sourceDef.getName()); eventResults.add(result); diff --git a/source/java/org/alfresco/repo/node/integrity/AssocTargetMultiplicityIntegrityEvent.java b/source/java/org/alfresco/repo/node/integrity/AssocTargetMultiplicityIntegrityEvent.java index 03d31658df..71f957205a 100644 --- a/source/java/org/alfresco/repo/node/integrity/AssocTargetMultiplicityIntegrityEvent.java +++ b/source/java/org/alfresco/repo/node/integrity/AssocTargetMultiplicityIntegrityEvent.java @@ -101,6 +101,7 @@ public class AssocTargetMultiplicityIntegrityEvent extends AbstractIntegrityEven { IntegrityRecord result = new IntegrityRecord( "Association type does not exist: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Source Node Type: " + sourceNodeTypeQName + "\n" + " Association Type: " + assocTypeQName); eventResults.add(result); @@ -156,6 +157,7 @@ public class AssocTargetMultiplicityIntegrityEvent extends AbstractIntegrityEven String childOrTargetStr = (assocDef.isChild() ? "child" : "target"); IntegrityRecord result = new IntegrityRecord( "The association " + childOrTargetStr + " multiplicity has been violated: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required " + childOrTargetStr + " Multiplicity: " + getMultiplicityString(mandatory, allowMany) + "\n" + " Actual " + childOrTargetStr + " Multiplicity: " + actualSize); diff --git a/source/java/org/alfresco/repo/node/integrity/AssocTargetRoleIntegrityEvent.java b/source/java/org/alfresco/repo/node/integrity/AssocTargetRoleIntegrityEvent.java index c448910107..0c20187fa8 100644 --- a/source/java/org/alfresco/repo/node/integrity/AssocTargetRoleIntegrityEvent.java +++ b/source/java/org/alfresco/repo/node/integrity/AssocTargetRoleIntegrityEvent.java @@ -55,6 +55,7 @@ public class AssocTargetRoleIntegrityEvent extends AbstractIntegrityEvent { QName assocTypeQName = getTypeQName(); QName assocQName = getQName(); + NodeRef sourceNodeRef = getNodeRef(); // get the association def AssociationDefinition assocDef = getAssocDef(eventResults, assocTypeQName); @@ -80,7 +81,7 @@ public class AssocTargetRoleIntegrityEvent extends AbstractIntegrityEvent ChildAssociationDefinition childAssocDef = (ChildAssociationDefinition) assocDef; // perform required checks - checkAssocQNameRegex(eventResults, childAssocDef, assocQName); + checkAssocQNameRegex(eventResults, childAssocDef, assocQName, sourceNodeRef); } /** @@ -89,7 +90,8 @@ public class AssocTargetRoleIntegrityEvent extends AbstractIntegrityEvent protected void checkAssocQNameRegex( List eventResults, ChildAssociationDefinition assocDef, - QName assocQName) + QName assocQName, + NodeRef sourceNodeRef) { // check the association name QName assocRoleQName = assocDef.getTargetRoleName(); @@ -101,6 +103,7 @@ public class AssocTargetRoleIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "The association name does not match the allowed role names: \n" + + " Source Node: " + sourceNodeRef + "\n" + " Association: " + assocDef + "\n" + " Allowed roles: " + rolePattern + "\n" + " Name assigned: " + assocRoleQName); diff --git a/source/java/org/alfresco/repo/node/integrity/AssocTargetTypeIntegrityEvent.java b/source/java/org/alfresco/repo/node/integrity/AssocTargetTypeIntegrityEvent.java index d0994e4091..520c401114 100644 --- a/source/java/org/alfresco/repo/node/integrity/AssocTargetTypeIntegrityEvent.java +++ b/source/java/org/alfresco/repo/node/integrity/AssocTargetTypeIntegrityEvent.java @@ -82,6 +82,7 @@ public class AssocTargetTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "Association type does not exist: \n" + + " Target Node: " + targetNodeRef + "\n" + " Target Node Type: " + targetNodeTypeQName + "\n" + " Association Type: " + assocTypeQName); eventResults.add(result); @@ -110,6 +111,7 @@ public class AssocTargetTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "The association target type is incorrect: \n" + + " Target Node: " + targetNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required Target Type: " + targetDef.getName() + "\n" + " Actual Target Type: " + targetNodeTypeQName); @@ -133,6 +135,7 @@ public class AssocTargetTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "The association target is missing the aspect required for this association: \n" + + " Target Node: " + targetNodeRef + "\n" + " Association: " + assocDef + "\n" + " Required Target Aspect: " + targetDef.getName() + "\n" + " Actual Target Aspects: " + targetAspects); @@ -143,6 +146,7 @@ public class AssocTargetTypeIntegrityEvent extends AbstractIntegrityEvent { IntegrityRecord result = new IntegrityRecord( "Unknown ClassDefinition subclass on the target definition: \n" + + " Target Node: " + targetNodeRef + "\n" + " Association: " + assocDef + "\n" + " Source Definition: " + targetDef.getName()); eventResults.add(result); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java index c0a6aa905d..798e7f2403 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java @@ -97,19 +97,9 @@ public class LuceneCategoryServiceImpl implements CategoryService { StringBuilder luceneQuery = new StringBuilder(64); - if (!mode.equals(Mode.ALL)) - { - luceneQuery.append(mode.equals(Mode.SUB_CATEGORIES) ? "-" : "").append("PATH:\""); - luceneQuery.append(buildXPath(nodeService.getPath(categoryRef))).append("/"); - if (depth.equals(Depth.ANY)) - { - luceneQuery.append("/"); - } - luceneQuery.append("member").append("\" "); - } - - if (!mode.equals(Mode.MEMBERS)) + switch(mode) { + case ALL: luceneQuery.append("PATH:\""); luceneQuery.append(buildXPath(nodeService.getPath(categoryRef))).append("/"); if (depth.equals(Depth.ANY)) @@ -117,6 +107,26 @@ public class LuceneCategoryServiceImpl implements CategoryService luceneQuery.append("/"); } luceneQuery.append("*").append("\" "); + break; + case MEMBERS: + luceneQuery.append("PATH:\""); + luceneQuery.append(buildXPath(nodeService.getPath(categoryRef))).append("/"); + if (depth.equals(Depth.ANY)) + { + luceneQuery.append("/"); + } + luceneQuery.append("member").append("\" "); + break; + case SUB_CATEGORIES: + luceneQuery.append("+PATH:\""); + luceneQuery.append(buildXPath(nodeService.getPath(categoryRef))).append("/"); + if (depth.equals(Depth.ANY)) + { + luceneQuery.append("/"); + } + luceneQuery.append("*").append("\" "); + luceneQuery.append("+TYPE:\"" + ContentModel.TYPE_CATEGORY.toString() + "\""); + break; } resultSet = indexerAndSearcher.getSearcher(categoryRef.getStoreRef(), false).query(categoryRef.getStoreRef(), "lucene", luceneQuery.toString(), null, null); diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryTest2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryTest2.java index be06f36072..687f902113 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryTest2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryTest2.java @@ -664,7 +664,96 @@ public class LuceneCategoryTest2 extends TestCase tx.rollback(); } - + + public void xtestManyCategories() throws Exception + { + TransactionService transactionService = serviceRegistry.getTransactionService(); + UserTransaction tx = transactionService.getUserTransaction(); + + tx.begin(); + long start = System.nanoTime(); + int startCount = categoryService.getRootCategories(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), + ContentModel.ASPECT_GEN_CLASSIFIABLE).size(); + System.out.println("1 Query complete in "+(System.nanoTime()-start)/1e9f); + tx.commit(); + + tx = transactionService.getUserTransaction(); + + tx.begin(); + start = System.nanoTime(); + startCount = categoryService.getRootCategories(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), + ContentModel.ASPECT_GEN_CLASSIFIABLE).size(); + System.out.println("2 Query complete in "+(System.nanoTime()-start)/1e9f); + tx.commit(); + + for (int i = 0; i < 0; i++) + { + tx = transactionService.getUserTransaction(); + tx.begin(); + categoryService.createRootCategory(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), ContentModel.ASPECT_GEN_CLASSIFIABLE, "first" + i); + tx.commit(); + } + + for (int j = 0; j < 10; j++) + { + tx = transactionService.getUserTransaction(); + tx.begin(); + for (int i = 0; i < 1; i++) + { + NodeRef topref = categoryService.createRootCategory(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(),ContentModel.ASPECT_GEN_CLASSIFIABLE, "third" + (j*100)+ i); + for(int k = 0; k < 5; k++) + { + NodeRef oneRef = categoryService.createCategory(topref, "child_"+i+"_"+j+"_"+k); + for(int l = 0; l < 5; l++) + { + NodeRef twoRef = categoryService.createCategory(oneRef, "child_"+i+"_"+j+"_"+k+"_"+l); + for(int m = 0; m < 5; m++) + { + NodeRef threeRef = categoryService.createCategory(twoRef, "child_"+i+"_"+j+"_"+k+"_"+l+"_"+m); + for(int n = 0; n < 5; n++) + { + NodeRef fourRef = categoryService.createCategory(threeRef, "child_"+i+"_"+j+"_"+k+"_"+l+"_"+m+"_"+n); + for(int o = 0; o < 5; o++) + { + NodeRef fiveRef = categoryService.createCategory(fourRef, "child_"+i+"_"+j+"_"+k+"_"+l+"_"+m+"_"+n+"_"+o); + for(int p = 0; p < 5; p++) + { + NodeRef sixRef = categoryService.createCategory(fiveRef, "child_"+i+"_"+j+"_"+k+"_"+l+"_"+m+"_"+n+"_"+o+"_"+p); + } + } + } + } + } + } + } + tx.commit(); + } + + tx = transactionService.getUserTransaction(); + tx.begin(); + start = System.nanoTime(); + assertEquals(startCount + 10, categoryService.getRootCategories(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), + ContentModel.ASPECT_GEN_CLASSIFIABLE).size()); + System.out.println("3 Query complete in "+(System.nanoTime()-start)/1e9f); + tx.commit(); + + tx = transactionService.getUserTransaction(); + tx.begin(); + start = System.nanoTime(); + assertEquals(startCount + 10, categoryService.getRootCategories(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), + ContentModel.ASPECT_GEN_CLASSIFIABLE).size()); + System.out.println("4 Query complete in "+(System.nanoTime()-start)/1e9f); + tx.commit(); + + tx = transactionService.getUserTransaction(); + tx.begin(); + start = System.nanoTime(); + ResultSet set = searcher.query(serviceRegistry.getPersonService().getPeopleContainer().getStoreRef(), "lucene", "@"+LuceneQueryParser.escape(ContentModel.ASPECT_GEN_CLASSIFIABLE.toString())+":second*"); + System.out.println("Query complete in "+(System.nanoTime()-start)/1e9f); + tx.commit(); + + } + private int getTotalScore(ResultSet results) { int totalScore = 0; diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java index d90efac3f6..17ad87324a 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest2.java @@ -373,13 +373,14 @@ public class LuceneTest2 extends TestCase getOrderProperties()).getChildRef(); Map properties = new HashMap(); - properties.put(ContentModel.PROP_CONTENT, new ContentData(null, "text/plain", 0L, "UTF-16")); + properties.put(ContentModel.PROP_CONTENT, new ContentData(null, "text/plain", 0L, "UTF-8")); n14 = nodeService.createNode(n13, ASSOC_TYPE_QNAME, QName.createQName("{namespace}fourteen"), ContentModel.TYPE_CONTENT, properties).getChildRef(); // nodeService.addAspect(n14, DictionaryBootstrap.ASPECT_QNAME_CONTENT, // properties); ContentWriter writer = contentService.getWriter(n14, ContentModel.PROP_CONTENT, true); + writer.setEncoding("UTF-8"); // InputStream is = // this.getClass().getClassLoader().getResourceAsStream("test.doc"); // writer.putContent(is); diff --git a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java index 97c51b3c3a..2e16b96857 100644 --- a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java +++ b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java @@ -93,6 +93,27 @@ public class PermissionServiceTest extends AbstractPermissionTest "andy", AccessStatus.ALLOWED); } + public void testDefaultModelPermissions() + { + runAs("admin"); + + NodeRef n1 = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, + QName.createQName("{namespace}one"), ContentModel.TYPE_FOLDER).getChildRef(); + + runAs("andy"); + assertTrue(permissionService.hasPermission(n1, getPermission(PermissionService.CONTRIBUTOR)) == AccessStatus.DENIED); + + runAs("admin"); + + permissionService.setPermission(new SimplePermissionEntry(n1, getPermission(PermissionService.CONTRIBUTOR), + "andy", AccessStatus.ALLOWED)); + + + runAs("andy"); + assertTrue(permissionService.hasPermission(n1, getPermission(PermissionService.CONTRIBUTOR)) == AccessStatus.ALLOWED); + + } + public void testSystemUserPermissions() { AuthenticationUtil.setSystemUserAsCurrentUser(); @@ -1883,6 +1904,8 @@ public class PermissionServiceTest extends AbstractPermissionTest } + + // TODO: Test permissions on missing nodes } diff --git a/source/java/org/alfresco/repo/security/permissions/impl/model/PermissionModelTest.java b/source/java/org/alfresco/repo/security/permissions/impl/model/PermissionModelTest.java index 6b304f4e10..f1ea6bc17a 100644 --- a/source/java/org/alfresco/repo/security/permissions/impl/model/PermissionModelTest.java +++ b/source/java/org/alfresco/repo/security/permissions/impl/model/PermissionModelTest.java @@ -63,7 +63,7 @@ public class PermissionModelTest extends AbstractPermissionTest Set grantees = permissionModelDAO.getGranteePermissions(new SimplePermissionReference(QName.createQName("cm", "cmobject", namespacePrefixResolver), "Contributor")); - assertEquals(17, grantees.size()); + assertEquals(14, grantees.size()); } public void testIncludePermissionGroups3()