All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.object.internal.deployer.ObjectDefinitionDeployerImpl Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.object.internal.deployer;

import com.liferay.account.service.AccountEntryLocalService;
import com.liferay.account.service.AccountEntryOrganizationRelLocalService;
import com.liferay.asset.kernel.service.AssetEntryLocalService;
import com.liferay.frontend.taglib.servlet.taglib.ScreenNavigationCategory;
import com.liferay.frontend.taglib.servlet.taglib.ScreenNavigationEntry;
import com.liferay.notification.handler.NotificationHandler;
import com.liferay.notification.term.evaluator.NotificationTermEvaluator;
import com.liferay.object.constants.ObjectActionTriggerConstants;
import com.liferay.object.deployer.ObjectDefinitionDeployer;
import com.liferay.object.internal.layout.tab.screen.navigation.category.ObjectLayoutTabScreenNavigationCategory;
import com.liferay.object.internal.notification.handler.ObjectDefinitionNotificationHandler;
import com.liferay.object.internal.notification.term.contributor.ObjectDefinitionNotificationTermEvaluator;
import com.liferay.object.internal.related.models.ObjectEntry1to1ObjectRelatedModelsProviderImpl;
import com.liferay.object.internal.related.models.ObjectEntry1toMObjectRelatedModelsPredicateProviderImpl;
import com.liferay.object.internal.related.models.ObjectEntry1toMObjectRelatedModelsProviderImpl;
import com.liferay.object.internal.related.models.ObjectEntryMtoMObjectRelatedModelsPredicateProviderImpl;
import com.liferay.object.internal.related.models.ObjectEntryMtoMObjectRelatedModelsProviderImpl;
import com.liferay.object.internal.rest.context.path.RESTContextPathResolverImpl;
import com.liferay.object.internal.search.spi.model.index.contributor.ObjectEntryModelDocumentContributor;
import com.liferay.object.internal.search.spi.model.index.contributor.ObjectEntryModelIndexerWriterContributor;
import com.liferay.object.internal.search.spi.model.query.contributor.ObjectEntryKeywordQueryContributor;
import com.liferay.object.internal.search.spi.model.query.contributor.ObjectEntryModelPreFilterContributor;
import com.liferay.object.internal.search.spi.model.result.contributor.ObjectEntryModelSummaryContributor;
import com.liferay.object.internal.security.permission.ObjectEntrySharingPermissionChecker;
import com.liferay.object.internal.security.permission.resource.ObjectEntryModelResourcePermission;
import com.liferay.object.internal.security.permission.resource.ObjectEntryPortletResourcePermissionLogic;
import com.liferay.object.internal.security.permission.resource.util.ObjectDefinitionResourcePermissionUtil;
import com.liferay.object.internal.uad.anonymizer.ObjectEntryUADAnonymizer;
import com.liferay.object.internal.uad.display.ObjectEntryUADDisplay;
import com.liferay.object.internal.uad.exporter.ObjectEntryUADExporter;
import com.liferay.object.internal.workflow.ObjectEntryWorkflowHandler;
import com.liferay.object.model.ObjectAction;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.model.ObjectEntry;
import com.liferay.object.model.ObjectLayout;
import com.liferay.object.model.ObjectRelationship;
import com.liferay.object.related.models.ObjectRelatedModelsPredicateProvider;
import com.liferay.object.related.models.ObjectRelatedModelsProviderRegistryUtil;
import com.liferay.object.rest.context.path.RESTContextPathResolver;
import com.liferay.object.scope.ObjectScopeProviderRegistry;
import com.liferay.object.service.ObjectActionLocalService;
import com.liferay.object.service.ObjectDefinitionLocalService;
import com.liferay.object.service.ObjectEntryLocalService;
import com.liferay.object.service.ObjectEntryService;
import com.liferay.object.service.ObjectFieldLocalService;
import com.liferay.object.service.ObjectFolderLocalService;
import com.liferay.object.service.ObjectLayoutLocalService;
import com.liferay.object.service.ObjectLayoutTabLocalService;
import com.liferay.object.service.ObjectRelationshipLocalService;
import com.liferay.object.service.ObjectViewLocalService;
import com.liferay.object.service.persistence.ObjectDefinitionPersistence;
import com.liferay.object.tree.Edge;
import com.liferay.object.tree.Node;
import com.liferay.object.tree.ObjectDefinitionTreeFactory;
import com.liferay.object.tree.Tree;
import com.liferay.petra.reflect.ReflectionUtil;
import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.db.partition.util.DBPartitionUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.security.permission.ResourceActions;
import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission;
import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermissionLogic;
import com.liferay.portal.kernel.security.permission.resource.PortletResourcePermission;
import com.liferay.portal.kernel.security.permission.resource.PortletResourcePermissionFactory;
import com.liferay.portal.kernel.service.GroupLocalService;
import com.liferay.portal.kernel.service.ListTypeLocalService;
import com.liferay.portal.kernel.service.OrganizationLocalService;
import com.liferay.portal.kernel.service.PersistedModelLocalService;
import com.liferay.portal.kernel.service.PortletLocalService;
import com.liferay.portal.kernel.service.ResourcePermissionLocalService;
import com.liferay.portal.kernel.service.UserGroupRoleLocalService;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService;
import com.liferay.portal.kernel.util.HashMapDictionaryBuilder;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.workflow.WorkflowHandler;
import com.liferay.portal.language.override.service.PLOEntryLocalService;
import com.liferay.portal.search.batch.DynamicQueryBatchIndexingActionableFactory;
import com.liferay.portal.search.localization.SearchLocalizationHelper;
import com.liferay.portal.search.spi.model.index.contributor.ModelDocumentContributor;
import com.liferay.portal.search.spi.model.index.contributor.ModelIndexerWriterContributor;
import com.liferay.portal.search.spi.model.query.contributor.KeywordQueryContributor;
import com.liferay.portal.search.spi.model.query.contributor.ModelPreFilterContributor;
import com.liferay.portal.search.spi.model.registrar.ModelSearchConfigurator;
import com.liferay.portal.search.spi.model.result.contributor.ModelSummaryContributor;
import com.liferay.sharing.security.permission.SharingPermissionChecker;
import com.liferay.sharing.security.permission.resource.SharingModelResourcePermissionConfigurator;
import com.liferay.user.associated.data.anonymizer.UADAnonymizer;
import com.liferay.user.associated.data.display.UADDisplay;
import com.liferay.user.associated.data.exporter.UADExporter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

/**
 * @author Brian Wing Shun Chan
 * @author Marco Leo
 */
public class ObjectDefinitionDeployerImpl implements ObjectDefinitionDeployer {

	public ObjectDefinitionDeployerImpl(
		AccountEntryLocalService accountEntryLocalService,
		AccountEntryOrganizationRelLocalService
			accountEntryOrganizationRelLocalService,
		AssetEntryLocalService assetEntryLocalService,
		BundleContext bundleContext,
		DynamicQueryBatchIndexingActionableFactory
			dynamicQueryBatchIndexingActionableFactory,
		GroupLocalService groupLocalService,
		ListTypeLocalService listTypeLocalService,
		ObjectActionLocalService objectActionLocalService,
		ObjectDefinitionLocalService objectDefinitionLocalService,
		ObjectEntryLocalService objectEntryLocalService,
		ObjectEntryService objectEntryService,
		ObjectFieldLocalService objectFieldLocalService,
		ObjectFolderLocalService objectFolderLocalService,
		ObjectLayoutLocalService objectLayoutLocalService,
		ObjectLayoutTabLocalService objectLayoutTabLocalService,
		ObjectRelationshipLocalService objectRelationshipLocalService,
		ObjectScopeProviderRegistry objectScopeProviderRegistry,
		ObjectViewLocalService objectViewLocalService,
		OrganizationLocalService organizationLocalService,
		PLOEntryLocalService ploEntryLocalService, Portal portal,
		PortletLocalService portletLocalService,
		ResourceActions resourceActions, UserLocalService userLocalService,
		ResourcePermissionLocalService resourcePermissionLocalService,
		SearchLocalizationHelper searchLocalizationHelper,
		SharingModelResourcePermissionConfigurator
			sharingModelResourcePermissionConfigurator,
		WorkflowDefinitionLinkLocalService workflowDefinitionLinkLocalService,
		ModelPreFilterContributor workflowStatusModelPreFilterContributor,
		UserGroupRoleLocalService userGroupRoleLocalService) {

		_accountEntryLocalService = accountEntryLocalService;
		_accountEntryOrganizationRelLocalService =
			accountEntryOrganizationRelLocalService;
		_assetEntryLocalService = assetEntryLocalService;
		_bundleContext = bundleContext;
		_dynamicQueryBatchIndexingActionableFactory =
			dynamicQueryBatchIndexingActionableFactory;
		_groupLocalService = groupLocalService;
		_listTypeLocalService = listTypeLocalService;
		_objectActionLocalService = objectActionLocalService;
		_objectDefinitionLocalService = objectDefinitionLocalService;
		_objectEntryLocalService = objectEntryLocalService;
		_objectEntryService = objectEntryService;
		_objectFieldLocalService = objectFieldLocalService;
		_objectFolderLocalService = objectFolderLocalService;
		_objectLayoutLocalService = objectLayoutLocalService;
		_objectLayoutTabLocalService = objectLayoutTabLocalService;
		_objectRelationshipLocalService = objectRelationshipLocalService;
		_objectScopeProviderRegistry = objectScopeProviderRegistry;
		_objectViewLocalService = objectViewLocalService;
		_organizationLocalService = organizationLocalService;
		_ploEntryLocalService = ploEntryLocalService;
		_portal = portal;
		_portletLocalService = portletLocalService;
		_resourceActions = resourceActions;
		_userLocalService = userLocalService;
		_resourcePermissionLocalService = resourcePermissionLocalService;
		_searchLocalizationHelper = searchLocalizationHelper;
		_sharingModelResourcePermissionConfigurator =
			sharingModelResourcePermissionConfigurator;
		_workflowDefinitionLinkLocalService =
			workflowDefinitionLinkLocalService;
		_workflowStatusModelPreFilterContributor =
			workflowStatusModelPreFilterContributor;
		_userGroupRoleLocalService = userGroupRoleLocalService;

		_objectDefinitionTreeFactory = new ObjectDefinitionTreeFactory(
			_objectDefinitionLocalService, _objectRelationshipLocalService);
	}

	@Override
	public Map>> deploy(
		long companyId, List objectDefinitions) {

		Map>> serviceRegistrationsMap =
			new ConcurrentHashMap<>();

		Map> objectActionsMap =
			_objectActionLocalService.getObjectActionsMap(
				companyId, true, ObjectActionTriggerConstants.KEY_STANDALONE);
		Map> objectLayoutsMap =
			_objectLayoutLocalService.getObjectLayoutsMap(companyId);
		Map> objectRelationshipsMap =
			_objectRelationshipLocalService.getObjectRelationshipsMap(
				companyId);

		for (ObjectDefinition objectDefinition : objectDefinitions) {
			long objectDefinitionId = objectDefinition.getObjectDefinitionId();

			serviceRegistrationsMap.put(
				DBPartitionUtil.getPartitionKey(objectDefinitionId),
				_deploy(
					objectDefinition,
					objectLayoutsMap.getOrDefault(
						objectDefinitionId, Collections.emptyList()),
					objectRelationshipsMap.getOrDefault(
						objectDefinitionId, Collections.emptyList()),
					objectActionsMap.getOrDefault(
						objectDefinitionId, Collections.emptyList())));
		}

		return serviceRegistrationsMap;
	}

	@Override
	public List> deploy(
		ObjectDefinition objectDefinition) {

		return _deploy(objectDefinition, null, null, null);
	}

	@Override
	public synchronized void undeploy(ObjectDefinition objectDefinition) {
		_unregister(_getServiceRegistrationKey(objectDefinition, null));

		for (String serviceRegistrationKey : _serviceRegistrations.keySet()) {
			if (serviceRegistrationKey.startsWith(
					_getServiceRegistrationKey(objectDefinition, null) +
						StringPool.POUND)) {

				_unregister(serviceRegistrationKey);
			}
		}
	}

	private List> _deploy(
		ObjectDefinition objectDefinition, List objectLayouts,
		List objectRelationships,
		List standaloneObjectActions) {

		if (objectDefinition.isUnmodifiableSystemObject()) {
			return Collections.emptyList();
		}

		try {
			ObjectDefinitionResourcePermissionUtil.populateResourceActions(
				_objectActionLocalService, objectDefinition,
				(ObjectDefinitionPersistence)
					_objectDefinitionLocalService.getBasePersistence(),
				_objectDefinitionTreeFactory, _portletLocalService,
				_resourceActions, standaloneObjectActions);
		}
		catch (Exception exception) {
			return ReflectionUtil.throwException(exception);
		}

		List> serviceRegistrations = new ArrayList<>();

		if (objectDefinition.isEnableIndexSearch()) {
			ObjectEntryModelIndexerWriterContributor
				objectEntryModelIndexerWriterContributor =
					new ObjectEntryModelIndexerWriterContributor(
						_dynamicQueryBatchIndexingActionableFactory,
						objectDefinition.getObjectDefinitionId(),
						_objectEntryLocalService);
			ObjectEntryModelSummaryContributor
				objectEntryModelSummaryContributor =
					new ObjectEntryModelSummaryContributor();

			Collections.addAll(
				serviceRegistrations,
				_bundleContext.registerService(
					KeywordQueryContributor.class,
					new ObjectEntryKeywordQueryContributor(
						objectDefinition, _objectFieldLocalService,
						_objectViewLocalService, _searchLocalizationHelper),
					HashMapDictionaryBuilder.put(
						"component.name",
						ObjectEntryKeywordQueryContributor.class.getName()
					).put(
						"indexer.class.name", objectDefinition.getClassName()
					).build()),
				_bundleContext.registerService(
					ModelDocumentContributor.class,
					new ObjectEntryModelDocumentContributor(
						_accountEntryOrganizationRelLocalService,
						objectDefinition.getClassName(),
						_objectDefinitionLocalService, _objectEntryLocalService,
						_objectFieldLocalService, _objectFolderLocalService),
					HashMapDictionaryBuilder.put(
						"indexer.class.name", objectDefinition.getClassName()
					).build()),
				_bundleContext.registerService(
					ModelPreFilterContributor.class,
					new ObjectEntryModelPreFilterContributor(
						_workflowStatusModelPreFilterContributor),
					HashMapDictionaryBuilder.put(
						"indexer.class.name", objectDefinition.getClassName()
					).build()),
				_bundleContext.registerService(
					ModelSearchConfigurator.class,
					new ModelSearchConfigurator() {

						@Override
						public String getClassName() {
							return objectDefinition.getClassName();
						}

						@Override
						public long getCompanyId() {
							return objectDefinition.getCompanyId();
						}

						@Override
						public ModelIndexerWriterContributor
							getModelIndexerWriterContributor() {

							return objectEntryModelIndexerWriterContributor;
						}

						@Override
						public ModelSummaryContributor
							getModelSummaryContributor() {

							return objectEntryModelSummaryContributor;
						}

					},
					null));
		}

		Collections.addAll(
			serviceRegistrations,
			_bundleContext.registerService(
				NotificationHandler.class,
				new ObjectDefinitionNotificationHandler(objectDefinition),
				HashMapDictionaryBuilder.put(
					"class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				NotificationTermEvaluator.class,
				new ObjectDefinitionNotificationTermEvaluator(
					_listTypeLocalService, objectDefinition,
					_objectDefinitionLocalService, _objectEntryLocalService,
					_objectFieldLocalService, _objectRelationshipLocalService,
					_userLocalService),
				HashMapDictionaryBuilder.put(
					"class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				ObjectRelatedModelsPredicateProvider.class,
				new ObjectEntry1toMObjectRelatedModelsPredicateProviderImpl(
					objectDefinition, _objectFieldLocalService),
				null),
			_bundleContext.registerService(
				ObjectRelatedModelsPredicateProvider.class,
				new ObjectEntryMtoMObjectRelatedModelsPredicateProviderImpl(
					objectDefinition, _objectFieldLocalService),
				null),
			_bundleContext.registerService(
				PersistedModelLocalService.class, _objectEntryLocalService,
				MapUtil.singletonDictionary(
					"model.class.name", objectDefinition.getClassName())),
			_bundleContext.registerService(
				RESTContextPathResolver.class,
				new RESTContextPathResolverImpl(
					objectDefinition,
					_objectScopeProviderRegistry.getObjectScopeProvider(
						objectDefinition.getScope()),
					false),
				HashMapDictionaryBuilder.put(
					"model.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				UADAnonymizer.class,
				new ObjectEntryUADAnonymizer(
					_assetEntryLocalService, objectDefinition,
					_objectEntryLocalService, _resourcePermissionLocalService),
				null),
			_bundleContext.registerService(
				UADDisplay.class,
				new ObjectEntryUADDisplay(
					_groupLocalService, objectDefinition,
					_objectEntryLocalService, _objectScopeProviderRegistry,
					_portal),
				null),
			_bundleContext.registerService(
				UADExporter.class,
				new ObjectEntryUADExporter(
					objectDefinition, _objectEntryLocalService),
				null),
			_bundleContext.registerService(
				WorkflowHandler.class,
				new ObjectEntryWorkflowHandler(
					objectDefinition, _objectEntryLocalService,
					_workflowDefinitionLinkLocalService),
				HashMapDictionaryBuilder.put(
					"model.class.name", objectDefinition.getClassName()
				).build()),
			ObjectRelatedModelsProviderRegistryUtil.register(
				_bundleContext, objectDefinition,
				new ObjectEntryMtoMObjectRelatedModelsProviderImpl(
					objectDefinition, _objectEntryService,
					_objectRelationshipLocalService)),
			ObjectRelatedModelsProviderRegistryUtil.register(
				_bundleContext, objectDefinition,
				new ObjectEntry1toMObjectRelatedModelsProviderImpl(
					objectDefinition, _objectEntryService,
					_objectFieldLocalService, _objectRelationshipLocalService)),
			ObjectRelatedModelsProviderRegistryUtil.register(
				_bundleContext, objectDefinition,
				new ObjectEntry1to1ObjectRelatedModelsProviderImpl(
					objectDefinition, _objectEntryService,
					_objectFieldLocalService,
					_objectRelationshipLocalService)));

		if (!objectDefinition.isRootDescendantNode()) {
			ConsumerSupplier>
				consumerSupplier = new ConsumerSupplier<>();
			PortletResourcePermission portletResourcePermission =
				PortletResourcePermissionFactory.create(
					objectDefinition.getResourceName(),
					new ObjectEntryPortletResourcePermissionLogic(
						_accountEntryLocalService, _groupLocalService,
						_objectDefinitionLocalService,
						_organizationLocalService));

			ModelResourcePermission modelResourcePermission =
				new ObjectEntryModelResourcePermission(
					_accountEntryLocalService,
					_accountEntryOrganizationRelLocalService,
					_groupLocalService, objectDefinition.getClassName(),
					_objectActionLocalService, _objectDefinitionLocalService,
					_objectEntryLocalService, consumerSupplier,
					_objectFieldLocalService, portletResourcePermission,
					_resourcePermissionLocalService,
					_userGroupRoleLocalService);

			serviceRegistrations.add(
				_bundleContext.registerService(
					ModelResourcePermission.class, modelResourcePermission,
					HashMapDictionaryBuilder.put(
						"com.liferay.object", "true"
					).put(
						"model.class.name", objectDefinition.getClassName()
					).build()));

			serviceRegistrations.add(
				_bundleContext.registerService(
					PortletResourcePermission.class, portletResourcePermission,
					HashMapDictionaryBuilder.put(
						"com.liferay.object", "true"
					).put(
						"resource.name", objectDefinition.getResourceName()
					).build()));

			_sharingModelResourcePermissionConfigurator.configure(
				modelResourcePermission, consumerSupplier);

			serviceRegistrations.add(
				_bundleContext.registerService(
					SharingPermissionChecker.class,
					new ObjectEntrySharingPermissionChecker(
						modelResourcePermission),
					HashMapDictionaryBuilder.put(
						"com.liferay.object", "true"
					).put(
						"model.class.name", objectDefinition.getClassName()
					).build()));
		}

		ObjectLayout objectLayout = null;

		if (objectLayouts == null) {
			objectLayout = _objectLayoutLocalService.fetchDefaultObjectLayout(
				objectDefinition.getObjectDefinitionId());
		}
		else if (!objectLayouts.isEmpty()) {
			objectLayout = objectLayouts.get(0);
		}

		if (objectLayout != null) {
			_objectLayoutTabLocalService.
				registerObjectLayoutTabScreenNavigationCategories(
					objectDefinition, objectLayout.getObjectLayoutTabs());
		}

		_objectRelationshipLocalService.
			registerObjectRelationshipsRelatedInfoCollectionProviders(
				objectDefinition, _objectDefinitionLocalService,
				objectRelationships);

		try {
			if (objectDefinition.isRootNode()) {
				_registerRootObjectLayoutTabScreenNavigationCategories(
					objectDefinition.getRootObjectDefinitionId());
			}
		}
		catch (PortalException portalException) {
			return ReflectionUtil.throwException(portalException);
		}

		return serviceRegistrations;
	}

	private String _getServiceRegistrationKey(
		ObjectDefinition objectDefinition,
		ObjectRelationship objectRelationship) {

		String serviceRegistrationKey = StringBundler.concat(
			"ROOT_OBJECT_LAYOUT_TAB#", objectDefinition.getCompanyId(),
			StringPool.POUND, objectDefinition.getObjectDefinitionId());

		if (objectRelationship == null) {
			return serviceRegistrationKey;
		}

		return StringBundler.concat(
			serviceRegistrationKey, StringPool.POUND,
			objectRelationship.getObjectRelationshipId());
	}

	private void _registerRootObjectLayoutTabScreenNavigationCategories(
			long rootObjectDefinitionId)
		throws PortalException {

		Tree tree = _objectDefinitionTreeFactory.create(rootObjectDefinitionId);

		Iterator iterator = tree.iterator();

		while (iterator.hasNext()) {
			Node node = iterator.next();

			ObjectDefinition objectDefinition =
				_objectDefinitionLocalService.fetchObjectDefinition(
					node.getPrimaryKey());

			if (objectDefinition == null) {
				continue;
			}

			List childNodes = node.getChildNodes();

			if (ListUtil.isEmpty(childNodes)) {
				_registerRootObjectLayoutTabScreenNavigationCategory(
					objectDefinition, null);

				continue;
			}

			for (int i = childNodes.size() - 1; i >= 0; i--) {
				Node childNode = childNodes.get(i);

				Edge edge = childNode.getEdge();

				_registerRootObjectLayoutTabScreenNavigationCategory(
					objectDefinition,
					_objectRelationshipLocalService.fetchObjectRelationship(
						edge.getObjectRelationshipId()));
			}

			_registerRootObjectLayoutTabScreenNavigationCategory(
				objectDefinition, null);
		}
	}

	private void _registerRootObjectLayoutTabScreenNavigationCategory(
		ObjectDefinition objectDefinition,
		ObjectRelationship objectRelationship) {

		_serviceRegistrations.computeIfAbsent(
			_getServiceRegistrationKey(objectDefinition, objectRelationship),
			serviceRegistrationKey -> _bundleContext.registerService(
				new String[] {
					ScreenNavigationCategory.class.getName(),
					ScreenNavigationEntry.class.getName()
				},
				new ObjectLayoutTabScreenNavigationCategory(
					objectDefinition, null, objectRelationship),
				null));
	}

	private void _unregister(String serviceRegistrationKey) {
		ServiceRegistration serviceRegistration =
			_serviceRegistrations.remove(serviceRegistrationKey);

		if (serviceRegistration != null) {
			serviceRegistration.unregister();
		}
	}

	private final AccountEntryLocalService _accountEntryLocalService;
	private final AccountEntryOrganizationRelLocalService
		_accountEntryOrganizationRelLocalService;
	private final AssetEntryLocalService _assetEntryLocalService;
	private final BundleContext _bundleContext;
	private final DynamicQueryBatchIndexingActionableFactory
		_dynamicQueryBatchIndexingActionableFactory;
	private final GroupLocalService _groupLocalService;
	private final ListTypeLocalService _listTypeLocalService;
	private final ObjectActionLocalService _objectActionLocalService;
	private final ObjectDefinitionLocalService _objectDefinitionLocalService;
	private final ObjectDefinitionTreeFactory _objectDefinitionTreeFactory;
	private final ObjectEntryLocalService _objectEntryLocalService;
	private final ObjectEntryService _objectEntryService;
	private final ObjectFieldLocalService _objectFieldLocalService;
	private final ObjectFolderLocalService _objectFolderLocalService;
	private final ObjectLayoutLocalService _objectLayoutLocalService;
	private final ObjectLayoutTabLocalService _objectLayoutTabLocalService;
	private final ObjectRelationshipLocalService
		_objectRelationshipLocalService;
	private final ObjectScopeProviderRegistry _objectScopeProviderRegistry;
	private final ObjectViewLocalService _objectViewLocalService;
	private final OrganizationLocalService _organizationLocalService;
	private final PLOEntryLocalService _ploEntryLocalService;
	private final Portal _portal;
	private final PortletLocalService _portletLocalService;
	private final ResourceActions _resourceActions;
	private final ResourcePermissionLocalService
		_resourcePermissionLocalService;
	private final SearchLocalizationHelper _searchLocalizationHelper;
	private final Map> _serviceRegistrations =
		new ConcurrentHashMap<>();
	private final SharingModelResourcePermissionConfigurator
		_sharingModelResourcePermissionConfigurator;
	private final UserGroupRoleLocalService _userGroupRoleLocalService;
	private final UserLocalService _userLocalService;
	private final WorkflowDefinitionLinkLocalService
		_workflowDefinitionLinkLocalService;
	private final ModelPreFilterContributor
		_workflowStatusModelPreFilterContributor;

	private static class ConsumerSupplier
		implements Consumer, Supplier {

		@Override
		public void accept(T t) {
			_t = t;
		}

		@Override
		public T get() {
			return _t;
		}

		private T _t;

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy