diff --git a/source/test-java/org/alfresco/opencmis/CMISTest.java b/source/test-java/org/alfresco/opencmis/CMISTest.java index 3a653b9457..36b0ba57cc 100644 --- a/source/test-java/org/alfresco/opencmis/CMISTest.java +++ b/source/test-java/org/alfresco/opencmis/CMISTest.java @@ -1,3 +1,4 @@ + /* * #%L * Alfresco Repository @@ -26,135 +27,140 @@ package org.alfresco.opencmis; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.Serializable; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.alfresco.model.ContentModel; -import org.alfresco.opencmis.dictionary.CMISDictionaryService; -import org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper; -import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper; -import org.alfresco.opencmis.search.CMISQueryOptions; -import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode; -import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; -import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; -import org.alfresco.repo.audit.AuditComponent; -import org.alfresco.repo.audit.AuditServiceImpl; -import org.alfresco.repo.audit.UserAuditFilter; -import org.alfresco.repo.audit.model.AuditModelRegistryImpl; -import org.alfresco.repo.content.MimetypeMap; -import org.alfresco.repo.dictionary.DictionaryDAO; -import org.alfresco.repo.dictionary.M2Model; -import org.alfresco.repo.domain.audit.AuditDAO; -import org.alfresco.repo.domain.node.NodeDAO; -import org.alfresco.repo.model.Repository; -import org.alfresco.repo.node.archive.NodeArchiveService; -import org.alfresco.repo.security.authentication.AuthenticationContext; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.repo.tenant.TenantAdminService; -import org.alfresco.repo.tenant.TenantService; -import org.alfresco.repo.tenant.TenantUtil; -import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork; -import org.alfresco.repo.transaction.RetryingTransactionHelper; -import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; -import org.alfresco.repo.version.VersionableAspectTest; -import org.alfresco.repo.workflow.WorkflowDeployer; -import org.alfresco.service.cmr.action.ActionCondition; -import org.alfresco.service.cmr.action.ActionService; -import org.alfresco.service.cmr.dictionary.AspectDefinition; -import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.lock.LockService; -import org.alfresco.service.cmr.lock.LockType; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.ContentService; -import org.alfresco.service.cmr.repository.ContentWriter; -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.rule.Rule; -import org.alfresco.service.cmr.rule.RuleService; -import org.alfresco.service.cmr.rule.RuleType; -import org.alfresco.service.cmr.search.SearchService; -import org.alfresco.service.cmr.security.AccessPermission; -import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.AuthorityType; -import org.alfresco.service.cmr.security.PermissionService; -import org.alfresco.service.cmr.tagging.TaggingService; -import org.alfresco.service.cmr.version.Version; -import org.alfresco.service.cmr.version.VersionService; -import org.alfresco.service.cmr.version.VersionType; -import org.alfresco.service.cmr.workflow.WorkflowAdminService; -import org.alfresco.service.cmr.workflow.WorkflowService; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; -import org.alfresco.service.transaction.TransactionService; -import org.alfresco.util.ApplicationContextHelper; -import org.alfresco.util.Pair; -import org.apache.chemistry.opencmis.commons.PropertyIds; -import org.apache.chemistry.opencmis.commons.data.Ace; -import org.apache.chemistry.opencmis.commons.data.AllowableActions; -import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement; -import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData; -import org.apache.chemistry.opencmis.commons.data.ObjectData; -import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData; -import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList; -import org.apache.chemistry.opencmis.commons.data.ObjectList; -import org.apache.chemistry.opencmis.commons.data.ObjectParentData; -import org.apache.chemistry.opencmis.commons.data.Properties; -import org.apache.chemistry.opencmis.commons.data.PropertyData; -import org.apache.chemistry.opencmis.commons.data.RepositoryInfo; -import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition; -import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition; -import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer; -import org.apache.chemistry.opencmis.commons.enums.AclPropagation; -import org.apache.chemistry.opencmis.commons.enums.Action; -import org.apache.chemistry.opencmis.commons.enums.ChangeType; -import org.apache.chemistry.opencmis.commons.enums.CmisVersion; -import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships; -import org.apache.chemistry.opencmis.commons.enums.UnfileObject; -import org.apache.chemistry.opencmis.commons.enums.VersioningState; -import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException; -import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; -import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlListImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.CmisExtensionElementImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.ExtensionDataImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIdImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerImpl; -import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringImpl; -import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory; -import org.apache.chemistry.opencmis.commons.server.CallContext; -import org.apache.chemistry.opencmis.commons.server.CmisService; -import org.apache.chemistry.opencmis.commons.spi.Holder; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.ApplicationContext; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.Serializable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.alfresco.model.ContentModel; +import org.alfresco.opencmis.dictionary.CMISDictionaryService; +import org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper; +import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper; +import org.alfresco.opencmis.search.CMISQueryOptions; +import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode; +import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; +import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; +import org.alfresco.repo.audit.AuditComponent; +import org.alfresco.repo.audit.AuditComponentImpl; +import org.alfresco.repo.audit.AuditServiceImpl; +import org.alfresco.repo.audit.UserAuditFilter; +import org.alfresco.repo.audit.model.AuditModelRegistryImpl; +import org.alfresco.repo.batch.BatchProcessWorkProvider; +import org.alfresco.repo.batch.BatchProcessor; +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.dictionary.DictionaryDAO; +import org.alfresco.repo.dictionary.M2Model; +import org.alfresco.repo.domain.audit.AuditDAO; +import org.alfresco.repo.domain.node.NodeDAO; +import org.alfresco.repo.model.Repository; +import org.alfresco.repo.node.archive.NodeArchiveService; +import org.alfresco.repo.security.authentication.AuthenticationContext; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.repo.tenant.TenantAdminService; +import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.tenant.TenantUtil; +import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.repo.version.VersionableAspectTest; +import org.alfresco.repo.workflow.WorkflowDeployer; +import org.alfresco.service.cmr.action.ActionCondition; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.dictionary.AspectDefinition; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.lock.LockService; +import org.alfresco.service.cmr.lock.LockType; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.ContentService; +import org.alfresco.service.cmr.repository.ContentWriter; +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.rule.Rule; +import org.alfresco.service.cmr.rule.RuleService; +import org.alfresco.service.cmr.rule.RuleType; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.security.AccessPermission; +import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; +import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.tagging.TaggingService; +import org.alfresco.service.cmr.version.Version; +import org.alfresco.service.cmr.version.VersionService; +import org.alfresco.service.cmr.version.VersionType; +import org.alfresco.service.cmr.workflow.WorkflowAdminService; +import org.alfresco.service.cmr.workflow.WorkflowService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.ApplicationContextHelper; +import org.alfresco.util.Pair; +import org.apache.chemistry.opencmis.commons.PropertyIds; +import org.apache.chemistry.opencmis.commons.data.Ace; +import org.apache.chemistry.opencmis.commons.data.AllowableActions; +import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement; +import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData; +import org.apache.chemistry.opencmis.commons.data.ObjectData; +import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData; +import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList; +import org.apache.chemistry.opencmis.commons.data.ObjectList; +import org.apache.chemistry.opencmis.commons.data.ObjectParentData; +import org.apache.chemistry.opencmis.commons.data.Properties; +import org.apache.chemistry.opencmis.commons.data.PropertyData; +import org.apache.chemistry.opencmis.commons.data.RepositoryInfo; +import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition; +import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition; +import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer; +import org.apache.chemistry.opencmis.commons.enums.AclPropagation; +import org.apache.chemistry.opencmis.commons.enums.Action; +import org.apache.chemistry.opencmis.commons.enums.ChangeType; +import org.apache.chemistry.opencmis.commons.enums.CmisVersion; +import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships; +import org.apache.chemistry.opencmis.commons.enums.UnfileObject; +import org.apache.chemistry.opencmis.commons.enums.VersioningState; +import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException; +import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; +import org.apache.chemistry.opencmis.commons.exceptions.CmisUpdateConflictException; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlListImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.CmisExtensionElementImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.ExtensionDataImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyDecimalDefinitionImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIdImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerDefinitionImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyIntegerImpl; +import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringImpl; +import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory; +import org.apache.chemistry.opencmis.commons.server.CallContext; +import org.apache.chemistry.opencmis.commons.server.CmisService; +import org.apache.chemistry.opencmis.commons.spi.Holder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.ApplicationContext; import org.springframework.extensions.webscripts.GUID; /** @@ -164,7 +170,9 @@ import org.springframework.extensions.webscripts.GUID; * */ public class CMISTest -{ +{ + private static Log logger = LogFactory.getLog(CMISTest.class); + private static final QName TEST_START_TASK = QName.createQName("http://www.alfresco.org/model/workflow/test/1.0", "startTaskVarScriptAssign"); private static final QName TEST_WORKFLOW_TASK = QName.createQName("http://www.alfresco.org/model/workflow/test/1.0", "assignVarTask"); @@ -196,6 +204,7 @@ public class CMISTest private TenantService tenantService; private SearchService searchService; private java.util.Properties globalProperties; + private AuditComponentImpl auditComponent; private AlfrescoCmisServiceFactory factory; @@ -374,7 +383,8 @@ public class CMISTest this.tenantAdminService = (TenantAdminService) ctx.getBean("tenantAdminService"); this.tenantService = (TenantService) ctx.getBean("tenantService"); this.searchService = (SearchService) ctx.getBean("SearchService"); - + this.auditComponent = (AuditComponentImpl) ctx.getBean("auditComponent"); + this.globalProperties = (java.util.Properties) ctx.getBean("global-properties"); this.globalProperties.setProperty(VersionableAspectTest.AUTO_VERSION_PROPS_KEY, "true"); } @@ -2649,7 +2659,7 @@ public class CMISTest Holder changeLogToken = new Holder(); changeLogToken.setValue(actualToken); - ObjectList changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("0")); + ObjectList changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("10")); List events = changeLog.getObjects(); int count = events.size(); // it should be 3 entries: 1 for previous folder create, 1 new CREATE (for document create) @@ -2677,7 +2687,7 @@ public class CMISTest changeLogToken = new Holder(); changeLogToken.setValue(actualToken2); - changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("0")); + changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("10")); events = changeLog.getObjects(); count = events.size(); assertEquals(2, count); @@ -2698,7 +2708,7 @@ public class CMISTest changeLogToken = new Holder(); changeLogToken.setValue(actualToken3); - changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("0")); + changeLog = CMISTest.this.cmisConnector.getContentChanges(changeLogToken, new BigInteger("10")); events = changeLog.getObjects(); count = events.size(); assertEquals(2, count); @@ -3578,5 +3588,127 @@ public class CMISTest auditSubsystem.destroy(); AuthenticationUtil.popAuthentication(); } + } + + @Test + public void testMNT16375() throws Exception + { + setupAudit(); + + AuthenticationUtil.pushAuthentication(); + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + + withCmisService(new CmisServiceCallback() + { + @Override + public Void execute(CmisService cmisService) + { + long start = System.currentTimeMillis(); + + List repositories = cmisService.getRepositoryInfos(null); + + long end = System.currentTimeMillis(); + + logger.info("time = " + (end - start) + "ms"); + + assertNotNull(repositories); + assertTrue(repositories.size() > 0); + + return null; + } + }, CmisVersion.CMIS_1_1); + } + + //@Test + public void populate() throws Exception + { + setupAudit(); + + final NodeRef companyHomeNodeRef = repositoryHelper.getCompanyHome(); + final int batchSize = 100; + final int totalWork = 500000; + + BatchProcessor.BatchProcessWorker worker = new BatchProcessor.BatchProcessWorker() + { + public String getIdentifier(String folder) + { + return folder; + } + + public void beforeProcess() throws Throwable + { + AuthenticationUtil.pushAuthentication(); + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + } + + public void afterProcess() throws Throwable + { + AuthenticationUtil.popAuthentication(); + } + + public void process(final String guid) throws Throwable + { + Map auditData = new HashMap<>(); + HashMap data = new HashMap<>(); + data.put("nodeRef", "workspace://SpacesStore/" + guid); + data.put("objectId", guid); + auditData.put("/CMISChangeLog/CREATED/result/value", data); + auditDAO.createAuditEntry(2l, System.currentTimeMillis(), "admin", auditData); + + // perform CREATED, UPDATED, SECURITY, DELETED CMIS change type actions +// FileInfo folderInfo = fileFolderService.create(companyHomeNodeRef, folder, ContentModel.TYPE_FOLDER); +// nodeService.setProperty(folderInfo.getNodeRef(), ContentModel.PROP_NAME, folder); +// assertNotNull(folderInfo); +// +// String content = GUID.generate(); +// FileInfo document = fileFolderService.create(folderInfo.getNodeRef(), content, ContentModel.TYPE_CONTENT); +// assertNotNull(document); +// nodeService.setProperty(document.getNodeRef(), ContentModel.PROP_NAME, content); +// +// permissionService.setPermission(document.getNodeRef(), "SomeAuthority", PermissionService.EXECUTE_CONTENT, true); +// +// fileFolderService.delete(document.getNodeRef()); +// fileFolderService.delete(folderInfo.getNodeRef()); + } + }; + + BatchProcessWorkProvider provider = new BatchProcessWorkProvider() + { + private int counter = 0; + + @Override + public int getTotalEstimatedWorkSize() + { + return totalWork; + } + + @Override + public Collection getNextWork() + { + if(counter < totalWork) + { + counter += batchSize; + List guids = new ArrayList<>(batchSize); + for(int i = 0; i < batchSize; i++) + { + guids.add(GUID.generate()); + } + + return guids; + } + else + { + return Collections.emptyList(); + } + } + }; + + new BatchProcessor( + "CMISTest.createAuditEntries", + transactionService.getRetryingTransactionHelper(), + provider, + 4, batchSize, + ctx, + logger, 100).process(worker, true); } } diff --git a/source/test-java/org/alfresco/repo/domain/audit/AuditDAOTest.java b/source/test-java/org/alfresco/repo/domain/audit/AuditDAOTest.java index 46a20b706b..f227e5c464 100644 --- a/source/test-java/org/alfresco/repo/domain/audit/AuditDAOTest.java +++ b/source/test-java/org/alfresco/repo/domain/audit/AuditDAOTest.java @@ -564,13 +564,13 @@ public class AuditDAOTest extends TestCase createItem(info1, 14); - auditDAO.findAuditEntries(preDeleteCallback, new AuditQueryParameters(), -1); + auditDAO.findAuditEntries(preDeleteCallback, new AuditQueryParameters(), Integer.MAX_VALUE); assertEquals(5, preDeleteCallback.numEntries(app1)); assertEquals(2, preDeleteCallback.numEntries(app2)); auditDAO.deleteAuditEntries(app1Id, t1, t2); - auditDAO.findAuditEntries(resultsCallback, new AuditQueryParameters(), -1); + auditDAO.findAuditEntries(resultsCallback, new AuditQueryParameters(), Integer.MAX_VALUE); assertEquals("Two entries should have been deleted from app1", 3, resultsCallback.numEntries(app1)); assertEquals("No entries should have been deleted from app2", 2, resultsCallback.numEntries(app2)); return null;