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

com.liferay.fragment.web.internal.portlet.action.CopyFragmentEntryMVCActionCommand 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.fragment.web.internal.portlet.action;

import com.liferay.fragment.constants.FragmentPortletKeys;
import com.liferay.fragment.contributor.FragmentCollectionContributorRegistry;
import com.liferay.fragment.model.FragmentCollection;
import com.liferay.fragment.model.FragmentComposition;
import com.liferay.fragment.model.FragmentEntry;
import com.liferay.fragment.service.FragmentCompositionService;
import com.liferay.fragment.service.FragmentEntryLocalService;
import com.liferay.fragment.service.FragmentEntryService;
import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.Language;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Repository;
import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCActionCommand;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCActionCommand;
import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder;
import com.liferay.portal.kernel.portletfilerepository.PortletFileRepositoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextFactory;
import com.liferay.portal.kernel.servlet.MultiSessionMessages;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
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.URLUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.kernel.workflow.WorkflowConstants;

import java.net.URL;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

/**
 * @author Pavel Savinov
 */
@Component(
	property = {
		"javax.portlet.name=" + FragmentPortletKeys.FRAGMENT,
		"mvc.command.name=/fragment/copy_fragment_entry"
	},
	service = MVCActionCommand.class
)
public class CopyFragmentEntryMVCActionCommand extends BaseMVCActionCommand {

	@Override
	protected void doProcessAction(
			ActionRequest actionRequest, ActionResponse actionResponse)
		throws Exception {

		hideDefaultSuccessMessage(actionRequest);

		long[] fragmentEntryIds = StringUtil.split(
			ParamUtil.getString(actionRequest, "fragmentEntryIds"), 0L);

		long fragmentCollectionId = ParamUtil.getLong(
			actionRequest, "fragmentCollectionId");

		if (_isShowSuccessMessage(fragmentEntryIds, fragmentCollectionId)) {
			MultiSessionMessages.add(actionRequest, "fragmentEntryCopied");
		}

		sendRedirect(
			actionRequest, actionResponse,
			PortletURLBuilder.createRenderURL(
				_portal.getLiferayPortletResponse(actionResponse)
			).setParameter(
				"fragmentCollectionId",
				() -> {
					ServiceContext serviceContext =
						ServiceContextFactory.getInstance(actionRequest);

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

					for (long fragmentEntryId : fragmentEntryIds) {
						_fragmentEntryService.copyFragmentEntry(
							themeDisplay.getScopeGroupId(), fragmentEntryId,
							fragmentCollectionId, serviceContext);
					}

					String[] contributedEntryKeys = StringUtil.split(
						ParamUtil.getString(
							actionRequest, "contributedEntryKeys"));

					for (String contributedEntryKey : contributedEntryKeys) {
						FragmentComposition fragmentComposition =
							_fragmentCollectionContributorRegistry.
								getFragmentComposition(contributedEntryKey);

						FragmentEntry fragmentEntry =
							_fragmentCollectionContributorRegistry.
								getFragmentEntry(contributedEntryKey);

						if (fragmentComposition != null) {
							_addFragmentComposition(
								fragmentCollectionId, fragmentComposition,
								serviceContext, themeDisplay);
						}
						else if (fragmentEntry != null) {
							_addFragmentEntry(
								fragmentCollectionId, fragmentEntry,
								serviceContext, themeDisplay);
						}
					}

					return fragmentCollectionId;
				}
			).buildString());
	}

	private void _addFragmentComposition(
			long fragmentCollectionId, FragmentComposition fragmentComposition,
			ServiceContext serviceContext, ThemeDisplay themeDisplay)
		throws PortalException {

		long previewFileEntryId = 0;

		String imagePreviewURL = fragmentComposition.getImagePreviewURL(
			themeDisplay);

		if (Validator.isNotNull(imagePreviewURL)) {
			previewFileEntryId = _getPreviewFileEntryId(
				themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
				fragmentCollectionId,
				themeDisplay.getPortalURL() + imagePreviewURL);
		}

		_fragmentCompositionService.addFragmentComposition(
			null, themeDisplay.getScopeGroupId(), fragmentCollectionId,
			StringPool.BLANK,
			StringBundler.concat(
				fragmentComposition.getName(), StringPool.SPACE,
				StringPool.OPEN_PARENTHESIS,
				_language.get(LocaleUtil.getSiteDefault(), "copy"),
				StringPool.CLOSE_PARENTHESIS),
			null, fragmentComposition.getData(), previewFileEntryId,
			WorkflowConstants.STATUS_APPROVED, serviceContext);
	}

	private void _addFragmentEntry(
			long fragmentCollectionId, FragmentEntry fragmentEntry,
			ServiceContext serviceContext, ThemeDisplay themeDisplay)
		throws PortalException {

		long previewFileEntryId = 0;

		String imagePreviewURL = fragmentEntry.getImagePreviewURL(themeDisplay);

		if (Validator.isNotNull(imagePreviewURL)) {
			previewFileEntryId = _getPreviewFileEntryId(
				themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
				fragmentCollectionId,
				themeDisplay.getPortalURL() + imagePreviewURL);
		}

		_fragmentEntryService.addFragmentEntry(
			null, themeDisplay.getScopeGroupId(), fragmentCollectionId,
			StringPool.BLANK,
			StringBundler.concat(
				fragmentEntry.getName(), StringPool.SPACE,
				StringPool.OPEN_PARENTHESIS,
				_language.get(LocaleUtil.getSiteDefault(), "copy"),
				StringPool.CLOSE_PARENTHESIS),
			fragmentEntry.getCss(), fragmentEntry.getHtml(),
			fragmentEntry.getJs(), fragmentEntry.isCacheable(),
			fragmentEntry.getConfiguration(), fragmentEntry.getIcon(),
			previewFileEntryId, fragmentEntry.isReadOnly(),
			fragmentEntry.getType(), fragmentEntry.getTypeOptions(),
			WorkflowConstants.STATUS_APPROVED, serviceContext);
	}

	private long _getPreviewFileEntryId(
		long userId, long groupId, long fragmentCollectionId,
		String imagePreviewURL) {

		try {
			byte[] bytes = URLUtil.toByteArray(new URL(imagePreviewURL));

			String shortFileName = FileUtil.getShortFileName(imagePreviewURL);

			Repository repository =
				PortletFileRepositoryUtil.fetchPortletRepository(
					groupId, FragmentPortletKeys.FRAGMENT);

			if (repository == null) {
				ServiceContext serviceContext = new ServiceContext();

				serviceContext.setAddGroupPermissions(true);
				serviceContext.setAddGuestPermissions(true);

				repository = PortletFileRepositoryUtil.addPortletRepository(
					groupId, FragmentPortletKeys.FRAGMENT, serviceContext);
			}

			FileEntry fileEntry = PortletFileRepositoryUtil.addPortletFileEntry(
				groupId, userId, FragmentCollection.class.getName(),
				fragmentCollectionId, FragmentPortletKeys.FRAGMENT,
				repository.getDlFolderId(), bytes, shortFileName,
				MimeTypesUtil.getContentType(shortFileName), false);

			return fileEntry.getFileEntryId();
		}
		catch (Exception exception) {
			if (_log.isDebugEnabled()) {
				_log.debug(exception);
			}
		}

		return 0;
	}

	private boolean _isShowSuccessMessage(
		long[] fragmentEntryIds, long fragmentCollectionId) {

		if (ArrayUtil.isEmpty(fragmentEntryIds)) {
			return false;
		}

		FragmentEntry fragmentEntry =
			_fragmentEntryLocalService.fetchFragmentEntry(fragmentEntryIds[0]);

		if ((fragmentEntry == null) ||
			(fragmentEntry.getFragmentCollectionId() != fragmentCollectionId)) {

			return false;
		}

		return true;
	}

	private static final Log _log = LogFactoryUtil.getLog(
		CopyFragmentEntryMVCActionCommand.class);

	@Reference
	private FragmentCollectionContributorRegistry
		_fragmentCollectionContributorRegistry;

	@Reference
	private FragmentCompositionService _fragmentCompositionService;

	@Reference
	private FragmentEntryLocalService _fragmentEntryLocalService;

	@Reference
	private FragmentEntryService _fragmentEntryService;

	@Reference
	private Language _language;

	@Reference
	private Portal _portal;

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy