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

com.liferay.commerce.product.internal.util.CPInstanceHelperImpl Maven / Gradle / Ivy

/**
 * 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.commerce.product.internal.util;

import com.liferay.commerce.account.util.CommerceAccountHelper;
import com.liferay.commerce.media.CommerceMediaResolver;
import com.liferay.commerce.product.catalog.CPCatalogEntry;
import com.liferay.commerce.product.catalog.CPSku;
import com.liferay.commerce.product.exception.CPDefinitionIgnoreSKUCombinationsException;
import com.liferay.commerce.product.exception.NoSuchCPInstanceException;
import com.liferay.commerce.product.internal.catalog.CPSkuImpl;
import com.liferay.commerce.product.model.CPAttachmentFileEntry;
import com.liferay.commerce.product.model.CPAttachmentFileEntryConstants;
import com.liferay.commerce.product.model.CPDefinition;
import com.liferay.commerce.product.model.CPDefinitionOptionRel;
import com.liferay.commerce.product.model.CPDefinitionOptionValueRel;
import com.liferay.commerce.product.model.CPInstance;
import com.liferay.commerce.product.model.CPInstanceOptionValueRel;
import com.liferay.commerce.product.permission.CommerceProductViewPermission;
import com.liferay.commerce.product.service.CPAttachmentFileEntryLocalService;
import com.liferay.commerce.product.service.CPDefinitionLocalService;
import com.liferay.commerce.product.service.CPDefinitionOptionRelLocalService;
import com.liferay.commerce.product.service.CPDefinitionOptionValueRelLocalService;
import com.liferay.commerce.product.service.CPInstanceLocalService;
import com.liferay.commerce.product.service.CPInstanceOptionValueRelLocalService;
import com.liferay.commerce.product.service.CommerceChannelLocalService;
import com.liferay.commerce.product.util.CPInstanceHelper;
import com.liferay.commerce.product.util.DDMFormValuesHelper;
import com.liferay.commerce.product.util.JsonHelper;
import com.liferay.commerce.product.util.comparator.CPDefinitionOptionValueRelPriorityComparator;
import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker;
import com.liferay.dynamic.data.mapping.form.renderer.DDMFormRenderer;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactory;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.util.KeyValuePair;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.Validator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

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

/**
 * @author Marco Leo
 * @author Alessio Antonio Rendina
 * @author Igor Beslic
 */
@Component(immediate = true, service = CPInstanceHelper.class)
public class CPInstanceHelperImpl implements CPInstanceHelper {

	@Override
	public CPInstance fetchCPInstance(
			long cpDefinitionId, String serializedDDMFormValues)
		throws PortalException {

		CPDefinition cpDefinition = _cpDefinitionLocalService.getCPDefinition(
			cpDefinitionId);

		if (cpDefinition.isIgnoreSKUCombinations()) {
			return getDefaultCPInstance(cpDefinitionId);
		}

		if (_jsonHelper.isEmpty(serializedDDMFormValues)) {
			return null;
		}

		return _fetchCPInstanceBySKUContributors(
			cpDefinitionId, serializedDDMFormValues);
	}

	@Override
	public List filterCPDefinitionOptionValueRels(
			long cpDefinitionOptionRelId,
			List skuCombinationCPDefinitionOptionValueRelIds)
		throws PortalException {

		List cpInstanceOptionValueRels =
			_cpInstanceOptionValueRelLocalService.
				getCPDefinitionOptionRelCPInstanceOptionValueRels(
					cpDefinitionOptionRelId);

		List filtered = new ArrayList<>();

		for (CPInstanceOptionValueRel cpInstanceOptionValueRel :
				cpInstanceOptionValueRels) {

			if (!_hasCPInstanceCPDefinitionOptionValueRelIds(
					cpInstanceOptionValueRel.getCPInstanceId(),
					skuCombinationCPDefinitionOptionValueRelIds)) {

				continue;
			}

			CPDefinitionOptionValueRel cpDefinitionOptionValueRel =
				_cpDefinitionOptionValueRelLocalService.
					getCPInstanceCPDefinitionOptionValueRel(
						cpDefinitionOptionRelId,
						cpInstanceOptionValueRel.getCPInstanceId());

			if (filtered.contains(cpDefinitionOptionValueRel)) {
				continue;
			}

			filtered.add(cpDefinitionOptionValueRel);
		}

		Collections.sort(filtered);

		return filtered;
	}

	@Override
	public List getCPAttachmentFileEntries(
			long commerceAccountId, long commerceChannelGroupId,
			long cpDefinitionId, String serializedDDMFormValues, int type)
		throws Exception {

		return getCPAttachmentFileEntries(
			commerceAccountId, commerceChannelGroupId, cpDefinitionId,
			serializedDDMFormValues, type, QueryUtil.ALL_POS,
			QueryUtil.ALL_POS);
	}

	@Override
	public List getCPAttachmentFileEntries(
			long commerceAccountId, long commerceChannelGroupId,
			long cpDefinitionId, String serializedDDMFormValues, int type,
			int start, int end)
		throws Exception {

		PermissionChecker permissionChecker =
			PermissionThreadLocal.getPermissionChecker();

		_commerceProductViewPermission.check(
			permissionChecker, commerceAccountId, commerceChannelGroupId,
			cpDefinitionId);

		return _cpAttachmentFileEntryLocalService.getCPAttachmentFileEntries(
			cpDefinitionId, serializedDDMFormValues, type, start, end);
	}

	@Override
	public Map>
		getCPDefinitionOptionRelsMap(
			long cpDefinitionId, boolean skuContributor, boolean publicStore) {

		Map>
			cpDefinitionOptionRelsMap = new HashMap<>();

		List cpDefinitionOptionRels;

		if (skuContributor) {
			cpDefinitionOptionRels =
				_cpDefinitionOptionRelLocalService.getCPDefinitionOptionRels(
					cpDefinitionId, true);
		}
		else {
			cpDefinitionOptionRels =
				_cpDefinitionOptionRelLocalService.getCPDefinitionOptionRels(
					cpDefinitionId);
		}

		if (cpDefinitionOptionRels.isEmpty()) {
			return Collections.emptyMap();
		}

		for (CPDefinitionOptionRel cpDefinitionOptionRel :
				cpDefinitionOptionRels) {

			if (cpDefinitionOptionRel.isSkuContributor() && publicStore) {
				cpDefinitionOptionRelsMap.put(
					cpDefinitionOptionRel,
					getCPInstanceCPDefinitionOptionValueRels(
						cpDefinitionId,
						cpDefinitionOptionRel.getCPDefinitionOptionRelId()));

				continue;
			}

			cpDefinitionOptionRelsMap.put(
				cpDefinitionOptionRel,
				cpDefinitionOptionRel.getCPDefinitionOptionValueRels());
		}

		return cpDefinitionOptionRelsMap;
	}

	@Override
	public Map>
			getCPDefinitionOptionRelsMap(long cpDefinitionId, String json)
		throws PortalException {

		Map>
			cpDefinitionOptionRelListMap = new HashMap<>();

		if (Validator.isNull(json)) {
			return cpDefinitionOptionRelListMap;
		}

		JSONArray jsonArray = _jsonFactory.createJSONArray(json);

		for (int i = 0; i < jsonArray.length(); i++) {
			JSONObject jsonObject = jsonArray.getJSONObject(i);

			CPDefinitionOptionRel cpDefinitionOptionRel =
				_cpDefinitionOptionRelLocalService.
					fetchCPDefinitionOptionRelByKey(
						cpDefinitionId, jsonObject.getString("key"));

			if (cpDefinitionOptionRel == null) {
				continue;
			}

			JSONArray valueJSONArray = jsonObject.getJSONArray("value");

			for (int j = 0; j < valueJSONArray.length(); j++) {
				CPDefinitionOptionValueRel cpDefinitionOptionValueRel =
					_cpDefinitionOptionValueRelLocalService.
						fetchCPDefinitionOptionValueRel(
							cpDefinitionOptionRel.getCPDefinitionOptionRelId(),
							valueJSONArray.getString(j));

				if (cpDefinitionOptionValueRel == null) {
					continue;
				}

				List cpDefinitionOptionValueRels =
					cpDefinitionOptionRelListMap.get(cpDefinitionOptionRel);

				if (cpDefinitionOptionValueRels == null) {
					cpDefinitionOptionValueRels = new ArrayList<>();

					cpDefinitionOptionRelListMap.put(
						cpDefinitionOptionRel, cpDefinitionOptionValueRels);
				}

				cpDefinitionOptionValueRels.add(cpDefinitionOptionValueRel);
			}
		}

		return cpDefinitionOptionRelListMap;
	}

	@Override
	public Map>
			getCPInstanceCPDefinitionOptionRelsMap(long cpInstanceId)
		throws PortalException {

		List cpInstanceCPInstanceOptionValueRels =
			_cpInstanceOptionValueRelLocalService.
				getCPInstanceCPInstanceOptionValueRels(cpInstanceId);

		if (cpInstanceCPInstanceOptionValueRels.isEmpty()) {
			return Collections.emptyMap();
		}

		Map>
			cpDefinitionOptionRelsMap = new HashMap<>();

		for (CPInstanceOptionValueRel cpInstanceCPInstanceOptionValueRel :
				cpInstanceCPInstanceOptionValueRels) {

			CPDefinitionOptionRel cpDefinitionOptionRel =
				_cpDefinitionOptionRelLocalService.getCPDefinitionOptionRel(
					cpInstanceCPInstanceOptionValueRel.
						getCPDefinitionOptionRelId());

			List cpDefinitionOptionValueRels =
				cpDefinitionOptionRelsMap.get(cpDefinitionOptionRel);

			if (cpDefinitionOptionValueRels == null) {
				cpDefinitionOptionValueRels = new ArrayList<>();

				cpDefinitionOptionRelsMap.put(
					cpDefinitionOptionRel, cpDefinitionOptionValueRels);
			}

			cpDefinitionOptionValueRels.add(
				_cpDefinitionOptionValueRelLocalService.
					getCPDefinitionOptionValueRel(
						cpInstanceCPInstanceOptionValueRel.
							getCPDefinitionOptionValueRelId()));
		}

		return cpDefinitionOptionRelsMap;
	}

	@Override
	public List
		getCPInstanceCPDefinitionOptionValueRels(
			long cpDefinitionId, long cpDefinitionOptionRelId) {

		List cpDefinitionCPInstanceOptionValueRels =
			_cpInstanceOptionValueRelLocalService.
				getCPDefinitionCPInstanceOptionValueRels(cpDefinitionId);

		List cpDefinitionOptionValueRels =
			new ArrayList<>();

		for (CPInstanceOptionValueRel cpInstanceOptionValueRel :
				cpDefinitionCPInstanceOptionValueRels) {

			if (cpDefinitionOptionRelId !=
					cpInstanceOptionValueRel.getCPDefinitionOptionRelId()) {

				continue;
			}

			CPDefinitionOptionValueRel cpDefinitionOptionValueRel =
				_cpDefinitionOptionValueRelLocalService.
					fetchCPDefinitionOptionValueRel(
						cpInstanceOptionValueRel.
							getCPDefinitionOptionValueRelId());

			if ((cpDefinitionOptionValueRel != null) &&
				!cpDefinitionOptionValueRels.contains(
					cpDefinitionOptionValueRel)) {

				cpDefinitionOptionValueRels.add(cpDefinitionOptionValueRel);
			}
		}

		Collections.sort(
			cpDefinitionOptionValueRels,
			new CPDefinitionOptionValueRelPriorityComparator(true));

		return cpDefinitionOptionValueRels;
	}

	@Override
	public List
		getCPInstanceCPInstanceOptionValueRels(long cpInstanceId) {

		return _cpInstanceOptionValueRelLocalService.
			getCPInstanceCPInstanceOptionValueRels(cpInstanceId);
	}

	@Override
	public String getCPInstanceThumbnailSrc(long cpInstanceId)
		throws Exception {

		CPInstance cpInstance = _cpInstanceLocalService.fetchCPInstance(
			cpInstanceId);

		if (cpInstance == null) {
			return StringPool.BLANK;
		}

		Map>
			cpDefinitionOptionRelKeysCPDefinitionOptionValueRelKeys =
				_cpDefinitionOptionRelLocalService.
					getCPDefinitionOptionRelKeysCPDefinitionOptionValueRelKeys(
						cpInstanceId);

		JSONArray keyValuesJSONArray = _jsonHelper.toJSONArray(
			cpDefinitionOptionRelKeysCPDefinitionOptionValueRelKeys);

		List cpAttachmentFileEntries =
			_cpAttachmentFileEntryLocalService.getCPAttachmentFileEntries(
				cpInstance.getCPDefinitionId(), keyValuesJSONArray.toString(),
				CPAttachmentFileEntryConstants.TYPE_IMAGE, 0, 1);

		if (cpAttachmentFileEntries.isEmpty()) {
			CPDefinition cpDefinition = cpInstance.getCPDefinition();

			return cpDefinition.getDefaultImageThumbnailSrc();
		}

		CPAttachmentFileEntry cpAttachmentFileEntry =
			cpAttachmentFileEntries.get(0);

		return _commerceMediaResolver.getThumbnailUrl(
			cpAttachmentFileEntry.getCPAttachmentFileEntryId());
	}

	@Override
	public CPInstance getDefaultCPInstance(long cpDefinitionId)
		throws PortalException {

		CPDefinition cpDefinition = _cpDefinitionLocalService.getCPDefinition(
			cpDefinitionId);

		if (!cpDefinition.isIgnoreSKUCombinations()) {
			throw new CPDefinitionIgnoreSKUCombinationsException(
				"Unable to get default CP instance if SKU combination present");
		}

		List approvedCPInstances =
			_cpInstanceLocalService.getCPDefinitionApprovedCPInstances(
				cpDefinitionId);

		if (approvedCPInstances.isEmpty()) {
			return null;
		}

		if (approvedCPInstances.size() > 1) {
			throw new NoSuchCPInstanceException(
				"Unable to find default CP instance for CP definition ID " +
					cpDefinitionId);
		}

		return approvedCPInstances.get(0);
	}

	@Override
	public CPSku getDefaultCPSku(CPCatalogEntry cpCatalogEntry)
		throws Exception {

		if (!cpCatalogEntry.isIgnoreSKUCombinations()) {
			return null;
		}

		CPInstance cpInstance = getDefaultCPInstance(
			cpCatalogEntry.getCPDefinitionId());

		if (cpInstance == null) {
			return null;
		}

		return new CPSkuImpl(cpInstance);
	}

	@Override
	public List getKeyValuePairs(
			long cpDefinitionId, String json, Locale locale)
		throws PortalException {

		List values = new ArrayList<>();

		if (Validator.isNull(json)) {
			return values;
		}

		JSONArray jsonArray = _jsonHelper.getJSONArray(json);

		for (int i = 0; i < jsonArray.length(); i++) {
			JSONObject jsonObject = jsonArray.getJSONObject(i);

			String key = jsonObject.getString("key");

			CPDefinitionOptionRel cpDefinitionOptionRel =
				_cpDefinitionOptionRelLocalService.
					fetchCPDefinitionOptionRelByKey(cpDefinitionId, key);

			if (cpDefinitionOptionRel == null) {
				continue;
			}

			JSONArray valueJSONArray = _jsonHelper.getValueAsJSONArray(
				"value", jsonObject);

			for (int j = 0; j < valueJSONArray.length(); j++) {
				String value = valueJSONArray.getString(j);

				CPDefinitionOptionValueRel cpDefinitionOptionValueRel =
					_cpDefinitionOptionValueRelLocalService.
						fetchCPDefinitionOptionValueRel(
							cpDefinitionOptionRel.getCPDefinitionOptionRelId(),
							value);

				if (cpDefinitionOptionValueRel != null) {
					value = cpDefinitionOptionValueRel.getName(locale);
				}
				else {
					value = valueJSONArray.getString(j);
				}

				KeyValuePair keyValuePair = new KeyValuePair();

				keyValuePair.setKey(cpDefinitionOptionRel.getName(locale));
				keyValuePair.setValue(value);

				values.add(keyValuePair);
			}
		}

		return values;
	}

	private CPInstance _fetchCPInstanceBySKUContributors(
			long cpDefinitionId, String json)
		throws PortalException {

		int skuContributorCPDefinitionOptionRelsCount =
			_cpDefinitionOptionRelLocalService.getCPDefinitionOptionRelsCount(
				cpDefinitionId, true);

		if (skuContributorCPDefinitionOptionRelsCount == 0) {
			return null;
		}

		Map>
			cpDefinitionOptionRelCPDefinitionOptionValueRelIds =
				_cpDefinitionOptionRelLocalService.
					getCPDefinitionOptionRelCPDefinitionOptionValueRelIds(
						cpDefinitionId, true, json);

		if (cpDefinitionOptionRelCPDefinitionOptionValueRelIds.isEmpty() ||
			(skuContributorCPDefinitionOptionRelsCount !=
				cpDefinitionOptionRelCPDefinitionOptionValueRelIds.size())) {

			return null;
		}

		List cpDefinitionCPInstanceOptionValueRels =
			_cpInstanceOptionValueRelLocalService.
				getCPDefinitionCPInstanceOptionValueRels(cpDefinitionId);

		Map cpInstanceCPInstanceOptionValueHits =
			new HashMap<>();

		for (CPInstanceOptionValueRel cpInstanceOptionValueRel :
				cpDefinitionCPInstanceOptionValueRels) {

			if (!cpDefinitionOptionRelCPDefinitionOptionValueRelIds.containsKey(
					cpInstanceOptionValueRel.getCPDefinitionOptionRelId())) {

				continue;
			}

			List cpDefinitionOptionValueIds =
				cpDefinitionOptionRelCPDefinitionOptionValueRelIds.get(
					cpInstanceOptionValueRel.getCPDefinitionOptionRelId());

			if (!cpDefinitionOptionValueIds.contains(
					cpInstanceOptionValueRel.
						getCPDefinitionOptionValueRelId())) {

				continue;
			}

			if (cpInstanceCPInstanceOptionValueHits.containsKey(
					cpInstanceOptionValueRel.getCPInstanceId())) {

				cpInstanceCPInstanceOptionValueHits.put(
					cpInstanceOptionValueRel.getCPInstanceId(),
					cpInstanceCPInstanceOptionValueHits.get(
						cpInstanceOptionValueRel.getCPInstanceId()) + 1);

				continue;
			}

			cpInstanceCPInstanceOptionValueHits.put(
				cpInstanceOptionValueRel.getCPInstanceId(), 1);
		}

		if (cpInstanceCPInstanceOptionValueHits.isEmpty()) {
			return null;
		}

		long cpInstanceId = _getTopId(cpInstanceCPInstanceOptionValueHits);

		if (skuContributorCPDefinitionOptionRelsCount !=
				cpInstanceCPInstanceOptionValueHits.get(cpInstanceId)) {

			return null;
		}

		return _cpInstanceLocalService.getCPInstance(cpInstanceId);
	}

	private long _getTopId(Map idIdHits) {
		long topId = 0;
		int topIdHits = 0;

		for (Map.Entry idIdHitsEntry : idIdHits.entrySet()) {
			if (topIdHits > idIdHitsEntry.getValue()) {
				continue;
			}

			topId = idIdHitsEntry.getKey();
			topIdHits = idIdHitsEntry.getValue();
		}

		return topId;
	}

	private boolean _hasCPInstanceCPDefinitionOptionValueRelIds(
		long cpInstanceId,
		List skuCombinationCPDefinitionOptionValueRelIds) {

		for (Long skuCombinationCPDefinitionOptionValueRelId :
				skuCombinationCPDefinitionOptionValueRelIds) {

			if (!_cpInstanceOptionValueRelLocalService.
					hasCPInstanceCPDefinitionOptionValueRel(
						skuCombinationCPDefinitionOptionValueRelId,
						cpInstanceId)) {

				return false;
			}
		}

		return true;
	}

	@Reference
	private CommerceAccountHelper _commerceAccountHelper;

	@Reference
	private CommerceChannelLocalService _commerceChannelLocalService;

	@Reference
	private CommerceMediaResolver _commerceMediaResolver;

	@Reference
	private CommerceProductViewPermission _commerceProductViewPermission;

	@Reference
	private CPAttachmentFileEntryLocalService
		_cpAttachmentFileEntryLocalService;

	@Reference
	private CPDefinitionLocalService _cpDefinitionLocalService;

	@Reference
	private CPDefinitionOptionRelLocalService
		_cpDefinitionOptionRelLocalService;

	@Reference
	private CPDefinitionOptionValueRelLocalService
		_cpDefinitionOptionValueRelLocalService;

	@Reference
	private CPInstanceLocalService _cpInstanceLocalService;

	@Reference
	private CPInstanceOptionValueRelLocalService
		_cpInstanceOptionValueRelLocalService;

	@Reference
	private DDMFormFieldTypeServicesTracker _ddmFormFieldTypeServicesTracker;

	@Reference
	private DDMFormRenderer _ddmFormRenderer;

	@Reference
	private DDMFormValuesHelper _ddmFormValuesHelper;

	@Reference
	private JSONFactory _jsonFactory;

	@Reference
	private JsonHelper _jsonHelper;

	@Reference
	private Portal _portal;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy