com.epam.cme.core.services.impl.DefaultCompatibilityService.java Source code

Java tutorial

Introduction

Here is the source code for com.epam.cme.core.services.impl.DefaultCompatibilityService.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2013 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the
 * license agreement you entered into with hybris.
 * 
 *  
 */
package com.epam.cme.core.services.impl;

import de.hybris.platform.catalog.jalo.classification.ClassAttributeAssignment;
import de.hybris.platform.catalog.jalo.classification.ClassificationAttributeValue;
import de.hybris.platform.catalog.jalo.classification.util.FeatureValueCondition;
import de.hybris.platform.catalog.model.classification.ClassAttributeAssignmentModel;
import de.hybris.platform.catalog.model.classification.ClassificationAttributeValueModel;
import de.hybris.platform.classification.ClassificationService;
import de.hybris.platform.classification.features.Feature;
import de.hybris.platform.classification.features.FeatureValue;
import de.hybris.platform.core.GenericQuery;
import de.hybris.platform.core.model.product.ProductModel;
import de.hybris.platform.core.model.type.ComposedTypeModel;
import de.hybris.platform.genericsearch.GenericSearchService;
import de.hybris.platform.product.ProductService;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.servicelayer.search.SearchResult;
import com.epam.cme.core.daos.ProductsFeaturesDao;
import com.epam.cme.core.services.CompatibilityService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Required;

/**
 * Default implementation of Compatibility Service {@link CompatibilityService}
 */
public class DefaultCompatibilityService implements CompatibilityService {
    private ClassificationService classificationService;

    private ProductService productService;

    private GenericSearchService genericSearchService;

    private String classificationAttributeCode;
    private String classificationClassCode;

    private ModelService modelService;

    private ProductsFeaturesDao productsFeaturesDao;

    @Override
    public List<ProductModel> getFeatureCompatibleProducts(final String code,
            final ClassAttributeAssignmentModel classificationAttributeAssignment,
            final ComposedTypeModel targetItemType) {
        final ProductModel product = getProductService().getProductForCode(code);
        final Set<ProductModel> relatedProducts = new HashSet<ProductModel>();

        final Feature modelFeature = getClassificationService().getFeature(product,
                classificationAttributeAssignment);

        final List<ProductModel> selectedProducts = new ArrayList<ProductModel>();
        if (modelFeature != null) {
            relatedProducts.addAll(getProductsWithFeature(modelFeature, targetItemType));
        }
        CollectionUtils.addAll(selectedProducts, relatedProducts.iterator());
        return selectedProducts;
    }

    @Override
    public List<ProductModel> getAccessoriesForVendorCompatibility(final String code,
            final String productTypeCode) {
        final ProductModel product = getProductService().getProductForCode(code);

        if (product.getManufacturerName() != null) {
            return getProductsFeaturesDao().findAccessoriesByVendorCompatibility(product.getManufacturerName(),
                    getClassificationClassCode(), getClassificationAttributeCode(), productTypeCode);
        }

        return Collections.emptyList();
    }

    /**
     * Search list of products of a particular item and a particular classification feature value
     * 
     * @return list of matching products
     */
    protected List<ProductModel> getProductsWithFeature(final Feature modelFeature,
            final ComposedTypeModel targetItemType) {
        final List<FeatureValue> featureValues = modelFeature.getValues();
        final List<ProductModel> featureCompatibleProducts = new ArrayList<ProductModel>();

        for (final FeatureValue featureValue : featureValues) {
            if (featureValue != null) {
                featureCompatibleProducts
                        .addAll(getCompatibleProductsForFeature(featureValue, modelFeature, targetItemType));
            }
        }
        return featureCompatibleProducts;
    }

    /**
     * Use generic search service to list of products based on feature compatibilty values
     * 
     * @param targetItemType
     *            device
     * @return collection of matching products
     */
    protected Collection<ProductModel> getCompatibleProductsForFeature(final FeatureValue featureValue,
            final Feature modelFeature, final ComposedTypeModel targetItemType) {
        ClassificationAttributeValue classAttributeValue;
        if (featureValue.getValue() instanceof ClassificationAttributeValueModel) {
            classAttributeValue = getModelService().getSource(featureValue.getValue());
        } else {
            classAttributeValue = (ClassificationAttributeValue) featureValue.getValue();
        }
        final ClassAttributeAssignment classAttributeAssignment = getModelService()
                .getSource(modelFeature.getClassAttributeAssignment());

        final SearchResult<ProductModel> prodsResult = getGenericSearchService()
                .search(generateQuery(classAttributeAssignment, classAttributeValue, targetItemType.getCode()));

        return prodsResult.getResult();
    }

    /**
     * Sample code given in hybris wiki
     * https://wiki.hybris.com/display/release4/Classification+Feature+Value+API uses GenericQuery
     * and jalo classes. This should be replaced by servicelayer code as soon as wiki page us
     * updated.
     */
    protected GenericQuery generateQuery(final ClassAttributeAssignment classAttributeAssignment,
            final ClassificationAttributeValue classAttributeValue, final String code) {
        final GenericQuery query = new GenericQuery(code,
                FeatureValueCondition.equals(classAttributeAssignment, classAttributeValue));
        return query;
    }

    protected ProductsFeaturesDao getProductsFeaturesDao() {
        return productsFeaturesDao;
    }

    @Required
    public void setProductsFeaturesDao(final ProductsFeaturesDao productsFeaturesDao) {
        this.productsFeaturesDao = productsFeaturesDao;
    }

    protected ModelService getModelService() {
        return modelService;
    }

    @Required
    public void setModelService(final ModelService modelService) {
        this.modelService = modelService;
    }

    protected GenericSearchService getGenericSearchService() {
        return genericSearchService;
    }

    @Required
    public void setGenericSearchService(final GenericSearchService genericSearchService) {
        this.genericSearchService = genericSearchService;
    }

    protected ClassificationService getClassificationService() {
        return classificationService;
    }

    @Required
    public void setClassificationService(final ClassificationService classificationService) {
        this.classificationService = classificationService;
    }

    protected ProductService getProductService() {
        return productService;
    }

    @Required
    public void setProductService(final ProductService productService) {
        this.productService = productService;
    }

    protected String getClassificationAttributeCode() {
        return classificationAttributeCode;
    }

    @Required
    public void setClassificationAttributeCode(final String classificationAttributeCode) {
        this.classificationAttributeCode = classificationAttributeCode;
    }

    protected String getClassificationClassCode() {
        return classificationClassCode;
    }

    @Required
    public void setClassificationClassCode(final String classificationClassCode) {
        this.classificationClassCode = classificationClassCode;
    }
}