/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.workflow.kaleo.runtime.integration.impl.internal.test;
import com.liferay.blogs.model.BlogsEntry;
import com.liferay.blogs.service.BlogsEntryLocalServiceUtil;
import com.liferay.dynamic.data.lists.model.DDLRecord;
import com.liferay.dynamic.data.lists.model.DDLRecordConstants;
import com.liferay.dynamic.data.lists.model.DDLRecordSet;
import com.liferay.dynamic.data.lists.model.DDLRecordSetConstants;
import com.liferay.dynamic.data.lists.service.DDLRecordLocalServiceUtil;
import com.liferay.dynamic.data.lists.service.DDLRecordSetLocalServiceUtil;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.storage.StorageType;
import com.liferay.dynamic.data.mapping.test.util.DDMFormTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMFormValuesTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestHelper;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMTemplateTestUtil;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.model.JournalFolder;
import com.liferay.journal.model.JournalFolderConstants;
import com.liferay.journal.service.JournalArticleLocalServiceUtil;
import com.liferay.journal.service.JournalFolderLocalServiceUtil;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.OrganizationConstants;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.RoleConstants;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.UserNotificationDeliveryConstants;
import com.liferay.portal.kernel.model.UserNotificationEvent;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil;
import com.liferay.portal.kernel.service.RoleLocalServiceUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserGroupRoleLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.service.UserNotificationEventLocalServiceUtil;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalServiceUtil;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.test.util.UserTestUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.workflow.WorkflowDefinitionManagerUtil;
import com.liferay.portal.kernel.workflow.WorkflowException;
import com.liferay.portal.kernel.workflow.WorkflowInstance;
import com.liferay.portal.kernel.workflow.WorkflowInstanceManagerUtil;
import com.liferay.portal.kernel.workflow.WorkflowTask;
import com.liferay.portal.kernel.workflow.WorkflowTaskManagerUtil;
import com.liferay.portal.test.log.CaptureAppender;
import com.liferay.portal.test.log.Log4JLoggerTestUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import org.apache.log4j.Level;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
/**
* @author InĂ¡cio Nery
*/
public abstract class BaseWorkflowTaskManagerTestCase {
@Before
public void setUp() throws Exception {
group = GroupTestUtil.addGroup();
serviceContext = ServiceContextTestUtil.getServiceContext(
group.getGroupId());
_originalPermissionChecker =
PermissionThreadLocal.getPermissionChecker();
setUpUsers();
setUpWorkflow();
}
@After
public void tearDown() throws PortalException {
PermissionThreadLocal.setPermissionChecker(_originalPermissionChecker);
}
protected void activateSingleApproverWorkflow(
long groupId, String className, long classPK, long typePK)
throws PortalException {
activateWorkflow(
groupId, className, classPK, typePK, "Single Approver", 1);
}
protected void activateSingleApproverWorkflow(
String className, long classPK, long typePK)
throws PortalException {
activateWorkflow(
group.getGroupId(), className, classPK, typePK, "Single Approver",
1);
}
protected void activateWorkflow(
long groupId, String className, long classPK, long typePK,
String workflowDefinitionName, int workflowDefinitionVersion)
throws PortalException {
WorkflowDefinitionLinkLocalServiceUtil.updateWorkflowDefinitionLink(
adminUser.getUserId(), TestPropsValues.getCompanyId(), groupId,
className, classPK, typePK, workflowDefinitionName,
workflowDefinitionVersion);
}
protected void activateWorkflow(
String className, long classPK, long typePK,
String workflowDefinitionName, int workflowDefinitionVersion)
throws PortalException {
activateWorkflow(
group.getGroupId(), className, classPK, typePK,
workflowDefinitionName, workflowDefinitionVersion);
}
protected BlogsEntry addBlogsEntry() throws PortalException {
return addBlogsEntry(adminUser);
}
protected BlogsEntry addBlogsEntry(User user) throws PortalException {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
return BlogsEntryLocalServiceUtil.addEntry(
user.getUserId(), StringUtil.randomString(),
StringUtil.randomString(), new Date(), serviceContext);
}
}
protected JournalArticle addJournalArticle(long folderId) throws Exception {
DDMStructure ddmStructure = DDMStructureTestUtil.addStructure(
group.getGroupId(), JournalArticle.class.getName());
return addJournalArticle(folderId, ddmStructure);
}
protected JournalArticle addJournalArticle(
long folderId, DDMStructure ddmStructure)
throws Exception {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
DDMTemplate ddmTemplate = DDMTemplateTestUtil.addTemplate(
group.getGroupId(), ddmStructure.getStructureId(),
PortalUtil.getClassNameId(JournalArticle.class));
Map<Locale, String> titleMap = new HashMap<>();
titleMap.put(
LocaleUtil.getDefault(), RandomTestUtil.randomString());
Map<Locale, String> descriptionMap = new HashMap<>();
descriptionMap.put(
LocaleUtil.getDefault(), RandomTestUtil.randomString());
String content = DDMStructureTestUtil.getSampleStructuredContent();
return JournalArticleLocalServiceUtil.addArticle(
adminUser.getUserId(), group.getGroupId(), folderId, titleMap,
descriptionMap, content, ddmStructure.getStructureKey(),
ddmTemplate.getTemplateKey(), serviceContext);
}
}
protected JournalFolder addJournalFolder() throws PortalException {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
return JournalFolderLocalServiceUtil.addFolder(
adminUser.getUserId(), group.getGroupId(),
JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID,
RandomTestUtil.randomString(), RandomTestUtil.randomString(),
serviceContext);
}
}
protected JournalFolder addJournalFolder(
long ddmStructureId, int restrictionType)
throws PortalException {
long[] ddmStructureIds = {ddmStructureId};
JournalFolder folder = addJournalFolder();
return JournalFolderLocalServiceUtil.updateFolder(
adminUser.getUserId(), group.getGroupId(), folder.getFolderId(),
JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID,
RandomTestUtil.randomString(), RandomTestUtil.randomString(),
ddmStructureIds, restrictionType, false, serviceContext);
}
protected DDLRecord addRecord(DDLRecordSet recordSet)
throws PortalException {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
DDMForm ddmForm = DDMFormTestUtil.createDDMForm(
RandomTestUtil.randomString());
DDMFormValues ddmFormValues = createDDMFormValues(ddmForm);
return DDLRecordLocalServiceUtil.addRecord(
adminUser.getUserId(), group.getGroupId(),
recordSet.getRecordSetId(),
DDLRecordConstants.DISPLAY_INDEX_DEFAULT, ddmFormValues,
serviceContext);
}
}
protected DDLRecordSet addRecordSet() throws Exception {
DDMForm ddmForm = DDMFormTestUtil.createDDMForm(
RandomTestUtil.randomString());
DDMStructureTestHelper ddmStructureTestHelper =
new DDMStructureTestHelper(
PortalUtil.getClassNameId(DDLRecordSet.class), group);
DDMStructure ddmStructure = ddmStructureTestHelper.addStructure(
ddmForm, StorageType.JSON.toString());
Map<Locale, String> nameMap = new HashMap<>();
nameMap.put(LocaleUtil.US, RandomTestUtil.randomString());
return DDLRecordSetLocalServiceUtil.addRecordSet(
adminUser.getUserId(), group.getGroupId(),
ddmStructure.getStructureId(), null, nameMap, null,
DDLRecordSetConstants.MIN_DISPLAY_ROWS_DEFAULT,
DDLRecordSetConstants.SCOPE_DYNAMIC_DATA_LISTS, serviceContext);
}
protected void assignWorkflowTaskToUser(User user, User assigneeUser)
throws Exception {
assignWorkflowTaskToUser(user, assigneeUser, null);
}
protected void assignWorkflowTaskToUser(
User user, User assigneeUser, String taskName)
throws Exception {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
WorkflowTask workflowTask = getWorkflowTask(user, taskName, false);
PermissionChecker userPermissionChecker =
PermissionCheckerFactoryUtil.create(user);
PermissionThreadLocal.setPermissionChecker(userPermissionChecker);
WorkflowTaskManagerUtil.assignWorkflowTaskToUser(
group.getCompanyId(), user.getUserId(),
workflowTask.getWorkflowTaskId(), assigneeUser.getUserId(),
StringPool.BLANK, null, null);
}
}
protected void checkUserNotificationEventsByUsers(User... users) {
for (User user : users) {
List<UserNotificationEvent> userNotificationEvents =
UserNotificationEventLocalServiceUtil.
getArchivedUserNotificationEvents(
user.getUserId(),
UserNotificationDeliveryConstants.TYPE_WEBSITE, false);
Assert.assertEquals(
userNotificationEvents.toString(), 1,
userNotificationEvents.size());
UserNotificationEvent userNotificationEvent =
userNotificationEvents.get(0);
userNotificationEvent.setArchived(true);
UserNotificationEventLocalServiceUtil.updateUserNotificationEvent(
userNotificationEvent);
}
}
protected void checkWorkflowInstance(String className, long classPK)
throws WorkflowException {
List<WorkflowInstance> workflowInstances =
WorkflowInstanceManagerUtil.getWorkflowInstances(
adminUser.getCompanyId(), adminUser.getUserId(), className,
classPK, true, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
Assert.assertEquals(
workflowInstances.toString(), 1, workflowInstances.size());
}
protected void completeWorkflowTask(User user, String transition)
throws Exception {
completeWorkflowTask(user, transition, null);
}
protected void completeWorkflowTask(
User user, String transition, String taskName)
throws Exception {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_MAIL_ENGINE_CLASS_NAME, Level.OFF)) {
WorkflowTask workflowTask = getWorkflowTask(user, taskName, false);
PermissionChecker userPermissionChecker =
PermissionCheckerFactoryUtil.create(user);
PermissionThreadLocal.setPermissionChecker(userPermissionChecker);
WorkflowTaskManagerUtil.completeWorkflowTask(
group.getCompanyId(), user.getUserId(),
workflowTask.getWorkflowTaskId(), transition, StringPool.BLANK,
null);
}
}
protected DDMFormValues createDDMFormValues(DDMForm ddmForm) {
DDMFormValues ddmFormValues = DDMFormValuesTestUtil.createDDMFormValues(
ddmForm);
DDMFormFieldValue ddmFormFieldValue =
DDMFormValuesTestUtil.createLocalizedDDMFormFieldValue(
RandomTestUtil.randomString(), StringPool.BLANK);
ddmFormValues.addDDMFormFieldValue(ddmFormFieldValue);
return ddmFormValues;
}
protected void createJoinXorWorkflow() throws Exception {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_PROXY_MESSAGE_LISTENER_CLASS_NAME, Level.OFF)) {
WorkflowDefinitionManagerUtil.getWorkflowDefinition(
adminUser.getCompanyId(), JOIN_XOR, 1);
}
catch (WorkflowException we) {
String content = read("join-xor-definition.xml");
WorkflowDefinitionManagerUtil.deployWorkflowDefinition(
adminUser.getCompanyId(), adminUser.getUserId(), JOIN_XOR,
content.getBytes());
}
}
protected Organization createOrganization() throws PortalException {
return createOrganization(
OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID);
}
protected Organization createOrganization(long parentOrganizationId)
throws PortalException {
Organization organization =
OrganizationLocalServiceUtil.addOrganization(
adminUser.getUserId(), parentOrganizationId,
StringUtil.randomString(), true);
_organizations.add(0, organization);
return organization;
}
protected void createScriptedAssignmentWorkflow() throws Exception {
try (CaptureAppender captureAppender =
Log4JLoggerTestUtil.configureLog4JLogger(
_PROXY_MESSAGE_LISTENER_CLASS_NAME, Level.OFF)) {
WorkflowDefinitionManagerUtil.getWorkflowDefinition(
adminUser.getCompanyId(), SCRIPTED_SINGLE_APPROVER, 1);
}
catch (WorkflowException we) {
String content = read(
"single-approver-definition-scripted-assignment.xml");
WorkflowDefinitionManagerUtil.deployWorkflowDefinition(
adminUser.getCompanyId(), adminUser.getUserId(),
SCRIPTED_SINGLE_APPROVER, content.getBytes());
}
}
protected User createUser(String roleName) throws Exception {
return createUser(roleName, group);
}
protected User createUser(String roleName, Group group) throws Exception {
User user = UserTestUtil.addUser(group.getGroupId());
_users.add(user);
Role role = RoleLocalServiceUtil.getRole(
TestPropsValues.getCompanyId(), roleName);
UserLocalServiceUtil.addRoleUser(role.getRoleId(), user);
long[] userIds = {user.getUserId()};
UserGroupRoleLocalServiceUtil.addUserGroupRoles(
userIds, group.getGroupId(), role.getRoleId());
return user;
}
protected void deactivateWorkflow(
long groupId, String className, long classPK, long typePK)
throws PortalException {
WorkflowDefinitionLinkLocalServiceUtil.updateWorkflowDefinitionLink(
adminUser.getUserId(), TestPropsValues.getCompanyId(), groupId,
className, classPK, typePK, null);
}
protected void deactivateWorkflow(
String className, long classPK, long typePK)
throws PortalException {
deactivateWorkflow(group.getGroupId(), className, classPK, typePK);
}
protected String getBasePath() {
return "com/liferay/portal/workflow/kaleo/dependencies/";
}
protected WorkflowTask getWorkflowTask() throws WorkflowException {
return getWorkflowTask(adminUser, null, false);
}
protected WorkflowTask getWorkflowTask(
User user, String taskName, boolean completed)
throws WorkflowException {
List<WorkflowTask> workflowTasks = new ArrayList<>();
workflowTasks.addAll(
WorkflowTaskManagerUtil.getWorkflowTasksByUserRoles(
user.getCompanyId(), user.getUserId(), completed,
QueryUtil.ALL_POS, QueryUtil.ALL_POS, null));
workflowTasks.addAll(
WorkflowTaskManagerUtil.getWorkflowTasksByUser(
user.getCompanyId(), user.getUserId(), completed,
QueryUtil.ALL_POS, QueryUtil.ALL_POS, null));
for (WorkflowTask workflowTask : workflowTasks) {
if (Objects.equals(taskName, workflowTask.getName())) {
return workflowTask;
}
}
Assert.assertEquals(workflowTasks.toString(), 1, workflowTasks.size());
return workflowTasks.get(0);
}
protected String read(String fileName) throws Exception {
Class<?> clazz = getClass();
return StringUtil.read(
clazz.getClassLoader(), getBasePath() + fileName);
}
protected void setUpUsers() throws Exception {
adminUser = createUser(RoleConstants.ADMINISTRATOR);
portalContentReviewerUser = createUser(
RoleConstants.PORTAL_CONTENT_REVIEWER);
siteAdminUser = createUser(RoleConstants.SITE_ADMINISTRATOR);
}
protected void setUpWorkflow() throws Exception {
createJoinXorWorkflow();
createScriptedAssignmentWorkflow();
}
protected static final String JOIN_XOR = "Join Xor";
protected static final String ORGANIZATION_CONTENT_REVIEWER =
"Organization Content Reviewer";
protected static final String SCRIPTED_SINGLE_APPROVER =
"Scripted Single Approver";
protected User adminUser;
@DeleteAfterTestRun
protected Group group;
protected User portalContentReviewerUser;
protected ServiceContext serviceContext;
protected User siteAdminUser;
private static final String _MAIL_ENGINE_CLASS_NAME =
"com.liferay.util.mail.MailEngine";
private static final String _PROXY_MESSAGE_LISTENER_CLASS_NAME =
"com.liferay.portal.kernel.messaging.proxy.ProxyMessageListener";
@DeleteAfterTestRun
private final List<Organization> _organizations = new ArrayList<>();
private PermissionChecker _originalPermissionChecker;
@DeleteAfterTestRun
private final List<User> _users = new ArrayList<>();
}