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

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

The newest version!
/**
 * 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.web.internal.deployer;

import com.liferay.application.list.PanelApp;
import com.liferay.asset.display.page.portlet.AssetDisplayPageFriendlyURLProvider;
import com.liferay.asset.kernel.model.AssetRendererFactory;
import com.liferay.asset.kernel.service.AssetCategoryLocalService;
import com.liferay.asset.kernel.service.AssetTagLocalService;
import com.liferay.asset.kernel.service.AssetVocabularyLocalService;
import com.liferay.document.library.kernel.exception.FileExtensionException;
import com.liferay.document.library.kernel.exception.FileSizeException;
import com.liferay.document.library.kernel.exception.InvalidFileException;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.service.DLAppLocalService;
import com.liferay.document.library.kernel.service.DLFileEntryLocalService;
import com.liferay.document.library.util.DLURLHelper;
import com.liferay.dynamic.data.mapping.expression.DDMExpressionFactory;
import com.liferay.friendly.url.info.item.provider.InfoItemFriendlyURLProvider;
import com.liferay.friendly.url.info.item.updater.InfoItemFriendlyURLUpdater;
import com.liferay.friendly.url.service.FriendlyURLEntryLocalService;
import com.liferay.frontend.data.set.view.FDSView;
import com.liferay.frontend.data.set.view.table.FDSTableSchemaBuilderFactory;
import com.liferay.info.collection.provider.InfoCollectionProvider;
import com.liferay.info.item.action.executor.InfoItemActionExecutor;
import com.liferay.info.item.capability.InfoItemCapability;
import com.liferay.info.item.creator.InfoItemCreator;
import com.liferay.info.item.field.reader.InfoItemFieldReaderFieldSetProvider;
import com.liferay.info.item.provider.InfoItemActionDetailsProvider;
import com.liferay.info.item.provider.InfoItemCapabilitiesProvider;
import com.liferay.info.item.provider.InfoItemCategorizationProvider;
import com.liferay.info.item.provider.InfoItemDetailsProvider;
import com.liferay.info.item.provider.InfoItemFieldValuesProvider;
import com.liferay.info.item.provider.InfoItemFormProvider;
import com.liferay.info.item.provider.InfoItemObjectProvider;
import com.liferay.info.item.provider.InfoItemPermissionProvider;
import com.liferay.info.item.provider.InfoItemScopeProvider;
import com.liferay.info.item.provider.InfoItemStatusProvider;
import com.liferay.info.item.provider.RelatedInfoItemProvider;
import com.liferay.info.item.renderer.InfoItemRenderer;
import com.liferay.info.item.renderer.InfoItemRendererRegistry;
import com.liferay.info.item.updater.InfoItemFieldValuesUpdater;
import com.liferay.info.list.renderer.InfoListRenderer;
import com.liferay.info.permission.provider.InfoPermissionProvider;
import com.liferay.info.staging.InfoStagingClassMapper;
import com.liferay.item.selector.ItemSelectorView;
import com.liferay.item.selector.ItemSelectorViewDescriptorRenderer;
import com.liferay.item.selector.criteria.info.item.criterion.InfoItemItemSelectorCriterion;
import com.liferay.layout.display.page.LayoutDisplayPageProvider;
import com.liferay.layout.page.template.info.item.capability.DisplayPageInfoItemCapability;
import com.liferay.layout.page.template.info.item.capability.EditPageInfoItemCapability;
import com.liferay.layout.page.template.info.item.provider.DisplayPageInfoItemFieldSetProvider;
import com.liferay.list.type.service.ListTypeEntryLocalService;
import com.liferay.object.configuration.ObjectConfiguration;
import com.liferay.object.constants.ObjectActionKeys;
import com.liferay.object.constants.ObjectDefinitionConstants;
import com.liferay.object.definition.security.permission.resource.ObjectDefinitionPortletResourcePermissionRegistryUtil;
import com.liferay.object.definition.util.ObjectDefinitionUtil;
import com.liferay.object.deployer.ObjectDefinitionDeployer;
import com.liferay.object.display.context.ObjectEntryDisplayContextFactory;
import com.liferay.object.field.attachment.AttachmentManager;
import com.liferay.object.field.filter.parser.ObjectFieldFilterContributorRegistry;
import com.liferay.object.info.field.converter.ObjectFieldInfoFieldConverter;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.model.ObjectEntry;
import com.liferay.object.model.ObjectField;
import com.liferay.object.related.models.ObjectRelatedModelsProviderRegistry;
import com.liferay.object.rest.context.path.RESTContextPathResolverRegistry;
import com.liferay.object.rest.manager.v1_0.ObjectEntryManagerRegistry;
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.ObjectFieldSettingLocalService;
import com.liferay.object.service.ObjectLayoutLocalService;
import com.liferay.object.service.ObjectRelationshipLocalService;
import com.liferay.object.service.ObjectRelationshipService;
import com.liferay.object.service.ObjectStateFlowLocalService;
import com.liferay.object.service.ObjectStateLocalService;
import com.liferay.object.service.ObjectViewLocalService;
import com.liferay.object.web.internal.asset.display.page.portlet.ObjectEntryDisplayPageFriendlyURLResolver;
import com.liferay.object.web.internal.asset.model.ObjectEntryAssetRendererFactory;
import com.liferay.object.web.internal.info.collection.provider.ObjectEntrySingleFormVariationInfoCollectionProvider;
import com.liferay.object.web.internal.info.item.action.ObjectEntryInfoItemActionExecutor;
import com.liferay.object.web.internal.info.item.creator.ObjectEntryInfoItemCreator;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemActionDetailsProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemCapabilitiesProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemCategorizationProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemDetailsProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemFieldValuesProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemFormProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemFriendlyURLProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemLanguagesProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemObjectProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemPermissionProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemScopeProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryInfoItemStatusProvider;
import com.liferay.object.web.internal.info.item.provider.ObjectEntryRelatedInfoItemProvider;
import com.liferay.object.web.internal.info.item.renderer.ObjectEntryRowInfoItemRenderer;
import com.liferay.object.web.internal.info.item.updater.ObjectEntryInfoItemFieldValuesUpdater;
import com.liferay.object.web.internal.info.item.updater.ObjectEntryInfoItemFriendlyURLUpdater;
import com.liferay.object.web.internal.info.list.renderer.ObjectEntryTableInfoListRenderer;
import com.liferay.object.web.internal.info.permission.provider.ObjectEntryInfoPermissionProvider;
import com.liferay.object.web.internal.info.staging.ObjectEntryInfoStagingClassMapper;
import com.liferay.object.web.internal.item.selector.ObjectEntryItemSelectorView;
import com.liferay.object.web.internal.layout.display.page.ObjectEntryLayoutDisplayPageProvider;
import com.liferay.object.web.internal.notifications.ObjectUserNotificationsDefinition;
import com.liferay.object.web.internal.notifications.ObjectUserNotificationsHandler;
import com.liferay.object.web.internal.object.definitions.portlet.ObjectDefinitionsControlPanelEntry;
import com.liferay.object.web.internal.object.entries.application.list.ObjectEntriesPanelApp;
import com.liferay.object.web.internal.object.entries.frontend.data.set.filter.factory.ObjectFieldFDSFilterFactoryRegistry;
import com.liferay.object.web.internal.object.entries.frontend.data.set.view.table.ObjectEntriesTableFDSView;
import com.liferay.object.web.internal.object.entries.portlet.ObjectEntriesPortlet;
import com.liferay.object.web.internal.object.entries.portlet.action.DeleteAttachmentMVCActionCommand;
import com.liferay.object.web.internal.object.entries.portlet.action.EditObjectEntryMVCActionCommand;
import com.liferay.object.web.internal.object.entries.portlet.action.EditObjectEntryMVCRenderCommand;
import com.liferay.object.web.internal.object.entries.portlet.action.EditObjectEntryRelatedModelMVCActionCommand;
import com.liferay.object.web.internal.object.entries.portlet.action.ExpireObjectEntryMVCActionCommand;
import com.liferay.object.web.internal.object.entries.portlet.action.UploadAttachmentMVCActionCommand;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.json.JSONUtil;
import com.liferay.portal.kernel.language.Language;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.role.RoleConstants;
import com.liferay.portal.kernel.notifications.UserNotificationDefinition;
import com.liferay.portal.kernel.notifications.UserNotificationHandler;
import com.liferay.portal.kernel.portlet.ControlPanelEntry;
import com.liferay.portal.kernel.portlet.FriendlyURLResolver;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCActionCommand;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCRenderCommand;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.resource.PortletResourcePermission;
import com.liferay.portal.kernel.service.GroupLocalService;
import com.liferay.portal.kernel.service.PortletLocalService;
import com.liferay.portal.kernel.service.ResourcePermissionLocalService;
import com.liferay.portal.kernel.service.RoleLocalService;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.HashMapDictionaryBuilder;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.MimeTypes;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.TempFileEntryUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.template.info.item.capability.TemplateInfoItemCapability;
import com.liferay.template.info.item.provider.TemplateInfoItemFieldSetProvider;
import com.liferay.translation.info.item.provider.InfoItemLanguagesProvider;
import com.liferay.upload.UploadFileEntryHandler;
import com.liferay.upload.UploadHandler;
import com.liferay.upload.UploadResponseHandler;

import jakarta.portlet.Portlet;
import jakarta.portlet.PortletRequest;

import jakarta.servlet.ServletContext;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentServiceObjects;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceScope;

/**
 * @author Brian Wing Shun Chan
 */
@Component(
	configurationPid = "com.liferay.object.configuration.ObjectConfiguration",
	service = ObjectDefinitionDeployer.class
)
public class ObjectDefinitionDeployerImpl implements ObjectDefinitionDeployer {

	@Override
	public List> deploy(
		ObjectDefinition objectDefinition) {

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

		ObjectFieldInfoFieldConverter objectFieldInfoFieldConverter =
			new ObjectFieldInfoFieldConverter(
				_ddmExpressionFactory, _listTypeEntryLocalService,
				_objectConfiguration, _objectDefinitionLocalService,
				_objectFieldLocalService, _objectFieldSettingLocalService,
				_objectRelationshipLocalService, _objectScopeProviderRegistry,
				_objectStateFlowLocalService, _objectStateLocalService, _portal,
				_restContextPathResolverRegistry, _userLocalService);

		InfoItemFormProvider infoItemFormProvider =
			new ObjectEntryInfoItemFormProvider(
				_displayPageInfoItemFieldSetProvider, objectDefinition,
				_infoItemFieldReaderFieldSetProvider,
				_listTypeEntryLocalService, _objectActionLocalService,
				_objectDefinitionLocalService, objectFieldInfoFieldConverter,
				_objectFieldLocalService, _objectFieldSettingLocalService,
				_objectRelationshipLocalService, _objectScopeProviderRegistry,
				_restContextPathResolverRegistry,
				_templateInfoItemFieldSetProvider, _userLocalService);

		InfoItemFriendlyURLProvider infoItemFriendlyURLProvider =
			new ObjectEntryInfoItemFriendlyURLProvider(
				_friendlyURLEntryLocalService, objectDefinition, _portal);

		PortletResourcePermission portletResourcePermission =
			_getPortletResourcePermission(_getResourceName(objectDefinition));

		InfoPermissionProvider infoPermissionProvider =
			new ObjectEntryInfoPermissionProvider(
				objectDefinition, _portletLocalService,
				portletResourcePermission);

		List> serviceRegistrations = ListUtil.fromArray(
			_bundleContext.registerService(
				AssetRendererFactory.class,
				new ObjectEntryAssetRendererFactory(
					_assetDisplayPageFriendlyURLProvider, objectDefinition,
					_objectEntryDisplayContextFactory, _objectEntryLocalService,
					_objectEntryService, _servletContext),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).build()),
			_bundleContext.registerService(
				ControlPanelEntry.class,
				new ObjectDefinitionsControlPanelEntry(
					objectDefinition, _objectDefinitionLocalService),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).build()),
			_bundleContext.registerService(
				FDSView.class,
				new ObjectEntriesTableFDSView(
					_fdsTableSchemaBuilderFactory, objectDefinition,
					_objectDefinitionLocalService, _objectFieldLocalService,
					_objectRelationshipLocalService, _objectViewLocalService,
					_userLocalService),
				HashMapDictionaryBuilder.put(
					"frontend.data.set.name", objectDefinition.getPortletId()
				).build()),
			_bundleContext.registerService(
				InfoCollectionProvider.class,
				new ObjectEntrySingleFormVariationInfoCollectionProvider(
					_assetCategoryLocalService, _assetTagLocalService,
					_assetVocabularyLocalService, _groupLocalService,
					_listTypeEntryLocalService, objectDefinition,
					_objectEntryLocalService, _objectEntryManagerRegistry,
					_objectFieldLocalService, _objectLayoutLocalService,
					_objectScopeProviderRegistry),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemActionDetailsProvider.class,
				new ObjectEntryInfoItemActionDetailsProvider(
					infoItemFormProvider, _objectActionLocalService,
					objectDefinition),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemActionExecutor.class,
				new ObjectEntryInfoItemActionExecutor(
					infoItemFormProvider, _objectActionLocalService,
					objectDefinition, _objectEntryManagerRegistry),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemCapabilitiesProvider.class,
				new ObjectEntryInfoItemCapabilitiesProvider(
					_displayPageInfoItemCapability, _editPageInfoItemCapability,
					_templateInfoItemCapability),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemCategorizationProvider.class,
				new ObjectEntryInfoItemCategorizationProvider(objectDefinition),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemStatusProvider.class,
				new ObjectEntryInfoItemStatusProvider(objectDefinition),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemCreator.class,
				new ObjectEntryInfoItemCreator(
					infoItemFormProvider, objectDefinition,
					_objectEntryLocalService, _objectEntryManagerRegistry,
					_objectScopeProviderRegistry),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemDetailsProvider.class,
				new ObjectEntryInfoItemDetailsProvider(objectDefinition),
				HashMapDictionaryBuilder.put(
					Constants.SERVICE_RANKING, 10
				).put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemFieldValuesProvider.class,
				new ObjectEntryInfoItemFieldValuesProvider(
					_displayPageInfoItemFieldSetProvider, _dlAppLocalService,
					_dlURLHelper, _friendlyURLEntryLocalService,
					_infoItemFieldReaderFieldSetProvider,
					_listTypeEntryLocalService, _objectActionLocalService,
					objectDefinition, _objectDefinitionLocalService,
					objectFieldInfoFieldConverter, _objectEntryLocalService,
					_objectEntryManagerRegistry, _objectFieldLocalService,
					_objectRelationshipLocalService,
					_objectScopeProviderRegistry, _portal,
					_templateInfoItemFieldSetProvider, _userLocalService),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemFieldValuesUpdater.class,
				new ObjectEntryInfoItemFieldValuesUpdater(
					infoItemFormProvider, objectDefinition,
					_objectEntryManagerRegistry, _objectScopeProviderRegistry),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemFormProvider.class, infoItemFormProvider,
				HashMapDictionaryBuilder.put(
					Constants.SERVICE_RANKING, 10
				).put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemFriendlyURLProvider.class, infoItemFriendlyURLProvider,
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemObjectProvider.class,
				new ObjectEntryInfoItemObjectProvider(
					objectDefinition, _objectEntryLocalService,
					_objectEntryManagerRegistry),
				HashMapDictionaryBuilder.put(
					Constants.SERVICE_RANKING, 100
				).put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"info.item.identifier",
					new String[] {
						"com.liferay.info.item.ClassPKInfoItemIdentifier",
						"com.liferay.info.item.ERCInfoItemIdentifier"
					}
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemPermissionProvider.class,
				new ObjectEntryInfoItemPermissionProvider(
					objectDefinition,
					_objectEntryManagerRegistry.getObjectEntryManager(
						objectDefinition.getStorageType()),
					_objectEntryService),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoItemRenderer.class,
				new ObjectEntryRowInfoItemRenderer(
					_assetDisplayPageFriendlyURLProvider, objectDefinition,
					_objectEntryManagerRegistry.getObjectEntryManager(
						objectDefinition.getStorageType()),
					_objectFieldLocalService, _objectScopeProviderRegistry,
					_servletContext),
				HashMapDictionaryBuilder.put(
					Constants.SERVICE_RANKING, 100
				).put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).put(
					"osgi.web.symbolicname", "com.liferay.object.web"
				).build()),
			_bundleContext.registerService(
				InfoItemScopeProvider.class,
				new ObjectEntryInfoItemScopeProvider(
					objectDefinition, _objectScopeProviderRegistry),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoListRenderer.class,
				new ObjectEntryTableInfoListRenderer(
					_infoItemRendererRegistry, objectDefinition,
					_objectFieldLocalService),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoPermissionProvider.class, infoPermissionProvider,
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				InfoStagingClassMapper.class,
				new ObjectEntryInfoStagingClassMapper(objectDefinition),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				ItemSelectorView.class,
				new ObjectEntryItemSelectorView(
					infoPermissionProvider, _itemSelectorViewDescriptorRenderer,
					objectDefinition,
					_objectEntryManagerRegistry.getObjectEntryManager(
						objectDefinition.getStorageType()),
					_objectRelatedModelsProviderRegistry,
					_objectScopeProviderRegistry, _portal),
				HashMapDictionaryBuilder.put(
					"item.selector.view.order", 500
				).build()),
			_bundleContext.registerService(
				LayoutDisplayPageProvider.class,
				new ObjectEntryLayoutDisplayPageProvider(
					infoItemFriendlyURLProvider, objectDefinition,
					_objectDefinitionLocalService, _objectEntryLocalService,
					_objectEntryManagerRegistry.getObjectEntryManager(
						objectDefinition.getStorageType()),
					_userLocalService),
				HashMapDictionaryBuilder.put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				Portlet.class,
				new ObjectEntriesPortlet(
					_objectActionLocalService,
					objectDefinition.getObjectDefinitionId(),
					_objectDefinitionLocalService,
					_objectFieldFDSFilterFactoryRegistry,
					_objectFieldLocalService, _objectScopeProviderRegistry,
					_objectViewLocalService, _portal,
					portletResourcePermission),
				HashMapDictionaryBuilder.put(
					"com.liferay.portlet.company",
					objectDefinition.getCompanyId()
				).put(
					"com.liferay.portlet.display-category",
					() -> {
						if (objectDefinition.isPortlet() &&
							!objectDefinition.isRootDescendantNode()) {

							return "category.object";
						}

						return "category.hidden";
					}
				).put(
					"jakarta.portlet.display-name",
					objectDefinition.getPluralLabel(LocaleUtil.getSiteDefault())
				).put(
					"jakarta.portlet.init-param.view-template",
					"/object_entries/view_object_entries.jsp"
				).put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"jakarta.portlet.security-role-ref",
					() -> {
						if (objectDefinition.isRootDescendantNode()) {
							return StringPool.BLANK;
						}

						return null;
					}
				).put(
					"jakarta.portlet.version", "3.0"
				).build()),
			_bundleContext.registerService(
				MVCActionCommand.class,
				new DeleteAttachmentMVCActionCommand(
					_dlFileEntryLocalService, objectDefinition),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name", "/object_entries/delete_attachment"
				).build()),
			_bundleContext.registerService(
				MVCActionCommand.class,
				new EditObjectEntryMVCActionCommand(
					_objectDefinitionLocalService, _objectEntryService,
					_objectRelatedModelsProviderRegistry,
					_objectRelationshipLocalService,
					_objectScopeProviderRegistry, _portal),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name", "/object_entries/edit_object_entry"
				).build()),
			_bundleContext.registerService(
				MVCActionCommand.class,
				new EditObjectEntryRelatedModelMVCActionCommand(
					_objectDefinitionLocalService,
					_objectRelationshipLocalService,
					_objectRelationshipService),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name",
					"/object_entries/edit_object_entry_related_model"
				).build()),
			_bundleContext.registerService(
				MVCActionCommand.class,
				new ExpireObjectEntryMVCActionCommand(
					_objectEntryLocalService, _objectEntryService),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name", "/object_entries/expire_object_entry"
				).build()),
			_bundleContext.registerService(
				MVCActionCommand.class,
				new UploadAttachmentMVCActionCommand(
					_attachmentUploadFileEntryHandler,
					_attachmentUploadResponseHandler, _uploadHandler),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name", "/object_entries/upload_attachment"
				).build()),
			_bundleContext.registerService(
				MVCRenderCommand.class,
				new EditObjectEntryMVCRenderCommand(
					_objectEntryDisplayContextFactory, _portal),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).put(
					"mvc.command.name", "/object_entries/edit_object_entry"
				).build()),
			_bundleContext.registerService(
				RelatedInfoItemProvider.class,
				new ObjectEntryRelatedInfoItemProvider(
					objectDefinition, _objectDefinitionLocalService,
					_objectRelationshipLocalService),
				HashMapDictionaryBuilder.put(
					"company.id", objectDefinition.getCompanyId()
				).put(
					"item.class.name", objectDefinition.getClassName()
				).build()),
			_bundleContext.registerService(
				UserNotificationDefinition.class,
				new ObjectUserNotificationsDefinition(
					objectDefinition.getPortletId(),
					_portal.getClassNameId(objectDefinition.getClassName()),
					UserNotificationDefinition.NOTIFICATION_TYPE_UPDATE_ENTRY),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).build()),
			_bundleContext.registerService(
				UserNotificationHandler.class,
				new ObjectUserNotificationsHandler(
					_assetDisplayPageFriendlyURLProvider, objectDefinition),
				HashMapDictionaryBuilder.put(
					"jakarta.portlet.name", objectDefinition.getPortletId()
				).build()));

		if (FeatureFlagManagerUtil.isEnabled("LPD-21926")) {
			if (Validator.isNotNull(
					objectDefinition.getFriendlyURLSeparator()) &&
				!ObjectDefinitionUtil.isDefaultFriendlyURLSeparator(
					objectDefinition.getFriendlyURLSeparator())) {

				ObjectEntryDisplayPageFriendlyURLResolver
					objectEntryDisplayPageFriendlyURLResolver =
						(ObjectEntryDisplayPageFriendlyURLResolver)
							_friendlyURLResolverComponentServiceObjects.
								getService();

				objectEntryDisplayPageFriendlyURLResolver.setObjectDefinition(
					objectDefinition);

				serviceRegistrations.add(
					_bundleContext.registerService(
						FriendlyURLResolver.class,
						objectEntryDisplayPageFriendlyURLResolver,
						HashMapDictionaryBuilder.put(
							"company.id", objectDefinition.getCompanyId()
						).put(
							"item.class.name", objectDefinition.getClassName()
						).build()));
			}

			Collections.addAll(
				serviceRegistrations,
				_bundleContext.registerService(
					InfoItemFriendlyURLUpdater.class,
					new ObjectEntryInfoItemFriendlyURLUpdater(
						_friendlyURLEntryLocalService),
					HashMapDictionaryBuilder.put(
						"company.id", objectDefinition.getCompanyId()
					).put(
						"item.class.name", objectDefinition.getClassName()
					).build()),
				_bundleContext.registerService(
					InfoItemLanguagesProvider.class,
					new ObjectEntryInfoItemLanguagesProvider(),
					HashMapDictionaryBuilder.put(
						"company.id", objectDefinition.getCompanyId()
					).put(
						"item.class.name", objectDefinition.getClassName()
					).build()));
		}

		// Register ObjectEntriesPanelApp after ObjectEntriesPortlet. See
		// LPS-140379.

		serviceRegistrations.add(
			_bundleContext.registerService(
				PanelApp.class,
				new ObjectEntriesPanelApp(
					objectDefinition,
					() -> {
						com.liferay.portal.kernel.model.Portlet portlet =
							_portletLocalService.getPortletById(
								objectDefinition.getCompanyId(),
								objectDefinition.getPortletId());

						portlet.setControlPanelEntryCategory(
							objectDefinition.getPanelCategoryKey());

						return portlet;
					}),
				HashMapDictionaryBuilder.put(
					"panel.app.order:Integer",
					objectDefinition.getPanelAppOrder()
				).put(
					"panel.category.key", objectDefinition.getPanelCategoryKey()
				).build()));

		return serviceRegistrations;
	}

	@Activate
	protected void activate(
		BundleContext bundleContext, Map properties) {

		modified(properties);

		_bundleContext = bundleContext;

		_objectFieldFDSFilterFactoryRegistry =
			new ObjectFieldFDSFilterFactoryRegistry(
				_language, _objectFieldFilterContributorRegistry,
				_objectFieldLocalService);
	}

	@Modified
	protected void modified(Map properties) {
		_objectConfiguration = ConfigurableUtil.createConfigurable(
			ObjectConfiguration.class, properties);
	}

	private PortletResourcePermission _getPortletResourcePermission(
		String resourceName) {

		PortletResourcePermission portletResourcePermission =
			ObjectDefinitionPortletResourcePermissionRegistryUtil.getService(
				resourceName);

		if (portletResourcePermission == null) {
			throw new IllegalArgumentException(
				"No portlet resource permission found with resource name " +
					resourceName);
		}

		return portletResourcePermission;
	}

	private String _getResourceName(ObjectDefinition objectDefinition) {
		if (!objectDefinition.isRootDescendantNode()) {
			return objectDefinition.getResourceName();
		}

		objectDefinition = _objectDefinitionLocalService.fetchObjectDefinition(
			objectDefinition.getRootObjectDefinitionId());

		return objectDefinition.getResourceName();
	}

	@Reference
	private AssetCategoryLocalService _assetCategoryLocalService;

	@Reference
	private AssetDisplayPageFriendlyURLProvider
		_assetDisplayPageFriendlyURLProvider;

	@Reference
	private AssetTagLocalService _assetTagLocalService;

	@Reference
	private AssetVocabularyLocalService _assetVocabularyLocalService;

	@Reference
	private AttachmentManager _attachmentManager;

	private final AttachmentUploadFileEntryHandler
		_attachmentUploadFileEntryHandler =
			new AttachmentUploadFileEntryHandler();
	private final AttachmentUploadResponseHandler
		_attachmentUploadResponseHandler =
			new AttachmentUploadResponseHandler();
	private BundleContext _bundleContext;

	@Reference
	private DDMExpressionFactory _ddmExpressionFactory;

	@Reference(target = "(upload.response.handler.system.default=true)")
	private UploadResponseHandler _defaultUploadResponseHandler;

	@Reference(
		target = "(info.item.capability.key=" + DisplayPageInfoItemCapability.KEY + ")"
	)
	private InfoItemCapability _displayPageInfoItemCapability;

	@Reference
	private DisplayPageInfoItemFieldSetProvider
		_displayPageInfoItemFieldSetProvider;

	@Reference
	private DLAppLocalService _dlAppLocalService;

	@Reference
	private DLFileEntryLocalService _dlFileEntryLocalService;

	@Reference
	private DLURLHelper _dlURLHelper;

	@Reference(
		target = "(info.item.capability.key=" + EditPageInfoItemCapability.KEY + ")"
	)
	private InfoItemCapability _editPageInfoItemCapability;

	@Reference
	private FDSTableSchemaBuilderFactory _fdsTableSchemaBuilderFactory;

	@Reference
	private FriendlyURLEntryLocalService _friendlyURLEntryLocalService;

	@Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED)
	private ComponentServiceObjects
		_friendlyURLResolverComponentServiceObjects;

	@Reference
	private GroupLocalService _groupLocalService;

	@Reference
	private InfoItemFieldReaderFieldSetProvider
		_infoItemFieldReaderFieldSetProvider;

	@Reference
	private InfoItemRendererRegistry _infoItemRendererRegistry;

	@Reference
	private ItemSelectorViewDescriptorRenderer
		_itemSelectorViewDescriptorRenderer;

	@Reference
	private Language _language;

	@Reference
	private ListTypeEntryLocalService _listTypeEntryLocalService;

	@Reference
	private MimeTypes _mimeTypes;

	@Reference
	private ObjectActionLocalService _objectActionLocalService;

	private volatile ObjectConfiguration _objectConfiguration;

	@Reference
	private ObjectDefinitionLocalService _objectDefinitionLocalService;

	@Reference
	private ObjectEntryDisplayContextFactory _objectEntryDisplayContextFactory;

	@Reference
	private ObjectEntryLocalService _objectEntryLocalService;

	@Reference
	private ObjectEntryManagerRegistry _objectEntryManagerRegistry;

	@Reference
	private ObjectEntryService _objectEntryService;

	private ObjectFieldFDSFilterFactoryRegistry
		_objectFieldFDSFilterFactoryRegistry;

	@Reference
	private ObjectFieldFilterContributorRegistry
		_objectFieldFilterContributorRegistry;

	@Reference
	private ObjectFieldLocalService _objectFieldLocalService;

	@Reference
	private ObjectFieldSettingLocalService _objectFieldSettingLocalService;

	@Reference
	private ObjectLayoutLocalService _objectLayoutLocalService;

	@Reference
	private ObjectRelatedModelsProviderRegistry
		_objectRelatedModelsProviderRegistry;

	@Reference
	private ObjectRelationshipLocalService _objectRelationshipLocalService;

	@Reference
	private ObjectRelationshipService _objectRelationshipService;

	@Reference
	private ObjectScopeProviderRegistry _objectScopeProviderRegistry;

	@Reference
	private ObjectStateFlowLocalService _objectStateFlowLocalService;

	@Reference
	private ObjectStateLocalService _objectStateLocalService;

	@Reference
	private ObjectViewLocalService _objectViewLocalService;

	@Reference
	private Portal _portal;

	@Reference
	private PortletLocalService _portletLocalService;

	@Reference
	private ResourcePermissionLocalService _resourcePermissionLocalService;

	@Reference
	private RESTContextPathResolverRegistry _restContextPathResolverRegistry;

	@Reference
	private RoleLocalService _roleLocalService;

	@Reference(target = "(osgi.web.symbolicname=com.liferay.object.web)")
	private ServletContext _servletContext;

	@Reference(
		target = "(info.item.capability.key=" + TemplateInfoItemCapability.KEY + ")"
	)
	private InfoItemCapability _templateInfoItemCapability;

	@Reference
	private TemplateInfoItemFieldSetProvider _templateInfoItemFieldSetProvider;

	@Reference
	private UploadHandler _uploadHandler;

	@Reference
	private UserLocalService _userLocalService;

	private class AttachmentUploadFileEntryHandler
		implements UploadFileEntryHandler {

		@Override
		public FileEntry upload(UploadPortletRequest uploadPortletRequest)
			throws IOException, PortalException {

			long objectFieldId = ParamUtil.getLong(
				uploadPortletRequest, "objectFieldId");

			ObjectField objectField = _objectFieldLocalService.fetchObjectField(
				objectFieldId);

			ObjectDefinition objectDefinition =
				_objectDefinitionLocalService.getObjectDefinition(
					objectField.getObjectDefinitionId());

			PortletResourcePermission portletResourcePermission =
				ObjectDefinitionPortletResourcePermissionRegistryUtil.
					getService(_getResourceName(objectDefinition));

			ThemeDisplay themeDisplay =
				(ThemeDisplay)uploadPortletRequest.getAttribute(
					WebKeys.THEME_DISPLAY);

			long groupId = _getGroupId(objectDefinition, themeDisplay);

			portletResourcePermission.check(
				themeDisplay.getPermissionChecker(), groupId,
				ObjectActionKeys.ADD_OBJECT_ENTRY);

			String fileName = uploadPortletRequest.getFileName("file");

			_attachmentManager.validateFileExtension(fileName, objectFieldId);

			File file = null;

			try (InputStream inputStream = uploadPortletRequest.getFileAsStream(
					"file")) {

				file = FileUtil.createTempFile(inputStream);

				if (file == null) {
					throw new InvalidFileException(
						"File is null for " + fileName);
				}

				_attachmentManager.validateFileSize(
					fileName, file.length(), objectFieldId,
					themeDisplay.isSignedIn());

				FileEntry tempFileEntry = TempFileEntryUtil.addTempFileEntry(
					groupId, themeDisplay.getUserId(),
					objectDefinition.getPortletId(),
					TempFileEntryUtil.getTempFileName(fileName), file,
					_mimeTypes.getContentType(file, fileName));

				_resourcePermissionLocalService.removeResourcePermission(
					themeDisplay.getCompanyId(), DLFileEntry.class.getName(),
					ResourceConstants.SCOPE_INDIVIDUAL,
					String.valueOf(tempFileEntry.getFileEntryId()),
					_roleLocalService.getRole(
						themeDisplay.getCompanyId(), RoleConstants.GUEST
					).getRoleId(),
					ActionKeys.DOWNLOAD);

				return tempFileEntry;
			}
			finally {
				if (file != null) {
					FileUtil.delete(file);
				}
			}
		}

		private long _getGroupId(
				ObjectDefinition objectDefinition, ThemeDisplay themeDisplay)
			throws PortalException {

			long groupId = themeDisplay.getScopeGroupId();

			if (Objects.equals(
					ObjectDefinitionConstants.SCOPE_COMPANY,
					objectDefinition.getScope())) {

				Company company = themeDisplay.getCompany();

				groupId = company.getGroupId();
			}

			return groupId;
		}

	}

	private class AttachmentUploadResponseHandler
		implements UploadResponseHandler {

		@Override
		public JSONObject onFailure(
				PortletRequest portletRequest, PortalException portalException)
			throws PortalException {

			JSONObject jsonObject = _defaultUploadResponseHandler.onFailure(
				portletRequest, portalException);

			String errorMessage = StringPool.BLANK;

			ThemeDisplay themeDisplay =
				(ThemeDisplay)portletRequest.getAttribute(
					WebKeys.THEME_DISPLAY);

			if (portalException instanceof FileExtensionException) {
				errorMessage = themeDisplay.translate(
					"please-enter-a-file-with-a-valid-extension-x",
					StringUtil.merge(
						_attachmentManager.getAcceptedFileExtensions(
							ParamUtil.getLong(portletRequest, "objectFieldId")),
						StringPool.COMMA_AND_SPACE));
			}
			else if (portalException instanceof FileSizeException) {
				errorMessage = themeDisplay.translate(
					"please-enter-a-file-with-a-valid-file-size-no-larger-" +
						"than-x",
					_language.formatStorageSize(
						_attachmentManager.getMaximumFileSize(
							ParamUtil.getLong(portletRequest, "objectFieldId"),
							themeDisplay.isSignedIn()),
						themeDisplay.getLocale()));
			}
			else if (portalException instanceof InvalidFileException) {
				errorMessage = themeDisplay.translate(
					"please-enter-a-valid-file");
			}
			else {
				errorMessage = themeDisplay.translate(
					"an-unexpected-error-occurred-while-uploading-your-file");
			}

			return jsonObject.put(
				"error", JSONUtil.put("message", errorMessage));
		}

		@Override
		public JSONObject onSuccess(
				UploadPortletRequest uploadPortletRequest, FileEntry fileEntry)
			throws PortalException {

			return JSONUtil.put(
				"file",
				JSONUtil.put(
					"contentURL",
					_dlURLHelper.getPreviewURL(
						fileEntry, fileEntry.getFileVersion(), null, "")
				).put(
					"fileEntryId", fileEntry.getFileEntryId()
				).put(
					"title",
					TempFileEntryUtil.getOriginalTempFileName(
						fileEntry.getFileName())
				)
			).put(
				"success", Boolean.TRUE
			);
		}

	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy