/**
* 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.service.test;
import com.liferay.portal.kernel.concurrent.ThreadPoolExecutor;
import com.liferay.portal.kernel.executor.PortalExecutorManager;
import com.liferay.portal.kernel.executor.PortalExecutorManagerUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.messaging.BaseDestination;
import com.liferay.portal.kernel.messaging.Destination;
import com.liferay.portal.kernel.messaging.DestinationNames;
import com.liferay.portal.kernel.messaging.MessageBus;
import com.liferay.portal.kernel.messaging.MessageBusUtil;
import com.liferay.portal.kernel.messaging.SynchronousDestination;
import com.liferay.portal.kernel.messaging.sender.SynchronousMessageSender;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.scheduler.SchedulerEngineHelper;
import com.liferay.portal.kernel.scheduler.SchedulerEngineHelperUtil;
import com.liferay.portal.kernel.search.SearchEngineHelperUtil;
import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal;
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.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextThreadLocal;
import com.liferay.portal.kernel.test.ReflectionTestUtil;
import com.liferay.portal.kernel.test.util.RoleTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.LocaleThreadLocal;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.ProxyUtil;
import com.liferay.portal.kernel.util.ReflectionUtil;
import com.liferay.portal.model.impl.PortletImpl;
import com.liferay.portal.repository.liferayrepository.LiferayRepository;
import com.liferay.portal.tools.DBUpgrader;
import com.liferay.portal.util.PortalInstances;
import com.liferay.registry.Filter;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.registry.dependency.ServiceDependencyListener;
import com.liferay.registry.dependency.ServiceDependencyManager;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.osgi.framework.Constants;
/**
* @author Brian Wing Shun Chan
* @author Michael Young
* @author Alexander Chow
* @author Manuel de la Peña
*/
public class ServiceTestUtil {
public static final int RETRY_COUNT = 10;
public static final int THREAD_COUNT = 10;
/**
* @deprecated As of 7.0.0
*/
@Deprecated
public static void addResourcePermission(
Role role, String resourceName, int scope, String primKey,
String actionId)
throws Exception {
RoleTestUtil.addResourcePermission(
role, resourceName, scope, primKey, actionId);
}
/**
* @deprecated As of 7.0.0
*/
@Deprecated
public static void addResourcePermission(
String roleName, String resourceName, int scope, String primKey,
String actionId)
throws Exception {
RoleTestUtil.addResourcePermission(
roleName, resourceName, scope, primKey, actionId);
}
/**
* @deprecated As of 7.0.0
*/
@Deprecated
public static Role addRole(String roleName, int roleType) throws Exception {
return RoleTestUtil.addRole(roleName, roleType);
}
/**
* @deprecated As of 7.0.0
*/
@Deprecated
public static Role addRole(
String roleName, int roleType, String resourceName, int scope,
String primKey, String actionId)
throws Exception {
return RoleTestUtil.addRole(
roleName, roleType, resourceName, scope, primKey, actionId);
}
public static void initMainServletServices() {
// Upgrade
try {
DBUpgrader.upgrade();
}
catch (Throwable t) {
_log.error(t, t);
}
// Messaging
MessageBusUtil messageBusUtil = new MessageBusUtil();
messageBusUtil.setSynchronousMessageSenderMode(
SynchronousMessageSender.Mode.DEFAULT);
// Scheduler
ServiceDependencyManager schedulerServiceDependencyManager =
new ServiceDependencyManager();
schedulerServiceDependencyManager.addServiceDependencyListener(
new ServiceDependencyListener() {
@Override
public void dependenciesFulfilled() {
try {
SchedulerEngineHelperUtil.start();
}
catch (Exception e) {
_log.error(e, e);
}
}
@Override
public void destroy() {
}
});
final Registry registry = RegistryUtil.getRegistry();
Filter filter = registry.getFilter(
"(objectClass=com.liferay.portal.scheduler.quartz.internal." +
"QuartzSchemaManager)");
schedulerServiceDependencyManager.registerDependencies(
new Class<?>[] {SchedulerEngineHelper.class},
new Filter[] {filter});
// Verify
try {
DBUpgrader.verify();
}
catch (Exception e) {
_log.error(e, e);
}
}
public static void initPermissions() {
try {
PortalInstances.addCompanyId(TestPropsValues.getCompanyId());
setUser(TestPropsValues.getUser());
}
catch (Exception e) {
_log.error(e, e);
}
}
public static void initServices() {
// Thread locals
_setThreadLocals();
// Search engine
try {
SearchEngineHelperUtil.initialize(TestPropsValues.getCompanyId());
}
catch (Exception e) {
_log.error(e, e);
}
}
public static void initStaticServices() {
// Indexers
PortalRegisterTestUtil.registerIndexers();
// Messaging
if (TestPropsValues.DL_FILE_ENTRY_PROCESSORS_TRIGGER_SYNCHRONOUSLY) {
ServiceDependencyManager serviceDependencyManager =
new ServiceDependencyManager();
Filter audioProcessorFilter = _registerDestinationFilter(
DestinationNames.DOCUMENT_LIBRARY_AUDIO_PROCESSOR);
Filter imageProcessFilter = _registerDestinationFilter(
DestinationNames.DOCUMENT_LIBRARY_IMAGE_PROCESSOR);
Filter pdfProcessorFilter = _registerDestinationFilter(
DestinationNames.DOCUMENT_LIBRARY_PDF_PROCESSOR);
Filter rawMetaDataProcessorFilter = _registerDestinationFilter(
DestinationNames.DOCUMENT_LIBRARY_RAW_METADATA_PROCESSOR);
Filter videoProcessorFilter = _registerDestinationFilter(
DestinationNames.DOCUMENT_LIBRARY_VIDEO_PROCESSOR);
serviceDependencyManager.registerDependencies(
audioProcessorFilter, imageProcessFilter, pdfProcessorFilter,
rawMetaDataProcessorFilter, videoProcessorFilter);
serviceDependencyManager.waitForDependencies();
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_AUDIO_PROCESSOR);
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_IMAGE_PROCESSOR);
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_PDF_PROCESSOR);
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_RAW_METADATA_PROCESSOR);
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_SYNC_EVENT_PROCESSOR);
_replaceWithSynchronousDestination(
DestinationNames.DOCUMENT_LIBRARY_VIDEO_PROCESSOR);
}
// Shutdown
Registry registry = RegistryUtil.getRegistry();
HashMap<String, Object> messageBusProperties = new HashMap<>();
messageBusProperties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
registry.registerService(
MessageBus.class, _messageBusWrapper, messageBusProperties);
if (MessageBusUtil.getMessageBus() != _messageBusWrapper) {
throw new IllegalStateException("MessageBus should be set");
}
HashMap<String, Object> portalExecutorManagerProperties =
new HashMap<>();
portalExecutorManagerProperties.put(
Constants.SERVICE_RANKING, Integer.MAX_VALUE);
registry.registerService(
PortalExecutorManager.class, _portalExecutorManagerWrapper,
portalExecutorManagerProperties);
if (PortalExecutorManagerUtil.getPortalExecutorManager() !=
_portalExecutorManagerWrapper) {
throw new IllegalStateException(
"PortalExecutorManager should be set");
}
// Class names
_checkClassNames();
// Resource actions
try {
_checkResourceActions();
}
catch (Exception e) {
_log.error(e, e);
}
// Workflow
PortalRegisterTestUtil.registerWorkflowHandlers();
// Company
if (!ArrayUtil.contains(
PortalInstances.getWebIds(), TestPropsValues.COMPANY_WEB_ID)) {
try {
CompanyLocalServiceUtil.checkCompany(
TestPropsValues.COMPANY_WEB_ID);
}
catch (Exception e) {
_log.error(e, e);
}
}
}
public static Date newDate() throws Exception {
return new Date();
}
public static Date newDate(int month, int day, int year) throws Exception {
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DATE, day);
calendar.set(Calendar.YEAR, year);
return calendar.getTime();
}
public static void setUser(User user) throws Exception {
if (user == null) {
return;
}
PrincipalThreadLocal.setName(user.getUserId());
PermissionChecker permissionChecker =
PermissionCheckerFactoryUtil.create(user);
PermissionThreadLocal.setPermissionChecker(permissionChecker);
}
private static void _checkClassNames() {
PortalUtil.getClassNameId(LiferayRepository.class.getName());
}
private static void _checkResourceActions() throws Exception {
for (int i = 0; i < 200; i++) {
String portletId = String.valueOf(i);
Portlet portlet = new PortletImpl();
portlet.setPortletId(portletId);
portlet.setPortletModes(new HashMap<String, Set<String>>());
ResourceActionsUtil.check(portletId);
}
}
private static Filter _registerDestinationFilter(String destinationName) {
Registry registry = RegistryUtil.getRegistry();
return registry.getFilter(
"(&(destination.name=" + destinationName + ")(objectClass=" +
Destination.class.getName() + "))");
}
private static void _replaceWithSynchronousDestination(String name) {
BaseDestination baseDestination = new SynchronousDestination();
baseDestination.setName(name);
MessageBus messageBus = MessageBusUtil.getMessageBus();
Destination oldDestination = messageBus.getDestination(name);
messageBus.replace(baseDestination, false);
ThreadPoolExecutor threadPoolExecutor =
PortalExecutorManagerUtil.getPortalExecutor(
oldDestination.getName(), false);
if (threadPoolExecutor == null) {
return;
}
threadPoolExecutor.shutdown();
try {
if (!threadPoolExecutor.awaitTermination(
TestPropsValues.CI_TEST_TIMEOUT_TIME,
TimeUnit.MILLISECONDS)) {
throw new IllegalStateException(
"Destination " + oldDestination.getName() +
" shutdown timeout");
}
}
catch (InterruptedException ie) {
ReflectionUtil.throwException(ie);
}
}
private static void _setThreadLocals() {
LocaleThreadLocal.setThemeDisplayLocale(new Locale("en", "US"));
ServiceContext serviceContext = new ServiceContext();
serviceContext.setPathMain("path");
serviceContext.setPortalURL("http://tests:8080");
ServiceContextThreadLocal.pushServiceContext(serviceContext);
}
private static final Log _log = LogFactoryUtil.getLog(
ServiceTestUtil.class);
private static final MessageBus _messageBusWrapper =
(MessageBus)ProxyUtil.newProxyInstance(
MessageBus.class.getClassLoader(),
new Class<?>[] {MessageBus.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if ("shutdown".equals(method.getName()) &&
(args.length == 1)) {
args[0] = Boolean.FALSE;
}
return method.invoke(_messageBus, args);
}
private final MessageBus _messageBus =
MessageBusUtil.getMessageBus();
});
private static final PortalExecutorManager _portalExecutorManagerWrapper =
(PortalExecutorManager)ProxyUtil.newProxyInstance(
PortalExecutorManager.class.getClassLoader(),
new Class<?>[] {PortalExecutorManager.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (!"shutdown".equals(method.getName()) ||
(args.length != 1)) {
return method.invoke(_portalExecutorManager, args);
}
Map<String, ThreadPoolExecutor> threadPoolExecutors =
ReflectionTestUtil.getFieldValue(
_portalExecutorManager, "_threadPoolExecutors");
for (Map.Entry<String, ThreadPoolExecutor> entry :
threadPoolExecutors.entrySet()) {
ThreadPoolExecutor threadPoolExecutor =
entry.getValue();
threadPoolExecutor.shutdown();
try {
if (!threadPoolExecutor.awaitTermination(
TestPropsValues.CI_TEST_TIMEOUT_TIME,
TimeUnit.MILLISECONDS)) {
throw new TimeoutException(
"Thread pool executor " + entry.getKey() +
" termination waiting timeout");
}
}
catch (InterruptedException ie) {
ReflectionUtil.throwException(ie);
}
}
return null;
}
private final PortalExecutorManager _portalExecutorManager =
PortalExecutorManagerUtil.getPortalExecutorManager();
});
}