de.hybris.platform.acceleratorcms.component.slot.impl.DefaultCMSPageSlotComponentService.java Source code

Java tutorial

Introduction

Here is the source code for de.hybris.platform.acceleratorcms.component.slot.impl.DefaultCMSPageSlotComponentService.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2014 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 de.hybris.platform.acceleratorcms.component.slot.impl;

import static de.hybris.platform.servicelayer.util.ServicesUtil.validateParameterNotNull;

import de.hybris.platform.acceleratorcms.component.container.CMSComponentContainerStrategy;
import de.hybris.platform.acceleratorcms.component.renderer.CMSComponentRenderer;
import de.hybris.platform.acceleratorcms.component.slot.CMSPageSlotComponentService;
import de.hybris.platform.acceleratorcms.data.CmsPageRequestContextData;
import de.hybris.platform.cms2.exceptions.CMSItemNotFoundException;
import de.hybris.platform.cms2.model.contents.components.AbstractCMSComponentModel;
import de.hybris.platform.cms2.model.contents.components.SimpleCMSComponentModel;
import de.hybris.platform.cms2.model.contents.containers.AbstractCMSComponentContainerModel;
import de.hybris.platform.cms2.model.contents.contentslot.ContentSlotModel;
import de.hybris.platform.cms2.model.restrictions.AbstractRestrictionModel;
import de.hybris.platform.cms2.servicelayer.data.ContentSlotData;
import de.hybris.platform.cms2.servicelayer.data.RestrictionData;
import de.hybris.platform.cms2.servicelayer.services.CMSComponentService;
import de.hybris.platform.cms2.servicelayer.services.CMSContentSlotService;
import de.hybris.platform.cms2.servicelayer.services.CMSRestrictionService;
import de.hybris.platform.servicelayer.exceptions.AmbiguousIdentifierException;
import de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.jsp.PageContext;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Required;

import com.google.common.base.Stopwatch;

/**
 */
public class DefaultCMSPageSlotComponentService implements CMSPageSlotComponentService {
    private static final Logger LOG = Logger.getLogger(DefaultCMSPageSlotComponentService.class);

    private CMSRestrictionService cmsRestrictionService;
    private CMSContentSlotService cmsContentSlotService;
    private CMSComponentService cmsComponentService;
    private CMSComponentRenderer cmsComponentRenderer;
    private CMSComponentContainerStrategy cmsComponentContainerStrategy;

    protected CMSRestrictionService getCmsRestrictionService() {
        return cmsRestrictionService;
    }

    @Required
    public void setCmsRestrictionService(final CMSRestrictionService cmsRestrictionService) {
        this.cmsRestrictionService = cmsRestrictionService;
    }

    protected CMSContentSlotService getCmsContentSlotService() {
        return cmsContentSlotService;
    }

    @Required
    public void setCmsContentSlotService(final CMSContentSlotService cmsContentSlotService) {
        this.cmsContentSlotService = cmsContentSlotService;
    }

    protected CMSComponentService getCmsComponentService() {
        return cmsComponentService;
    }

    @Required
    public void setCmsComponentService(final CMSComponentService cmsComponentService) {
        this.cmsComponentService = cmsComponentService;
    }

    protected CMSComponentRenderer getCmsComponentRenderer() {
        return cmsComponentRenderer;
    }

    @Required
    public void setCmsComponentRenderer(final CMSComponentRenderer cmsComponentRenderer) {
        this.cmsComponentRenderer = cmsComponentRenderer;
    }

    protected CMSComponentContainerStrategy getCmsComponentContainerStrategy() {
        return cmsComponentContainerStrategy;
    }

    @Required
    public void setCmsComponentContainerStrategy(
            final CMSComponentContainerStrategy cmsComponentContainerStrategy) {
        this.cmsComponentContainerStrategy = cmsComponentContainerStrategy;
    }

    @Override
    public ContentSlotModel getContentSlotForId(final String id) {
        validateParameterNotNull(id, "Parameter id must not be null");

        try {
            return getCmsContentSlotService().getContentSlotForId(id);
        } catch (final AmbiguousIdentifierException e) {
            LOG.warn("Failed to lookup ContentSlot for id [" + id + "]. " + e.getMessage());
        } catch (final UnknownIdentifierException e) {
            LOG.warn("Failed to lookup ContentSlot for id [" + id + "]. " + e.getMessage());
        }
        return null;
    }

    @Override
    public ContentSlotData getContentSlotForPosition(final CmsPageRequestContextData cmsPageRequestContextData,
            final String position) {
        validateParameterNotNull(cmsPageRequestContextData, "Parameter cmsPageRequestContextData must not be null");
        validateParameterNotNull(position, "Parameter position must not be null");

        final ContentSlotData contentSlot = (ContentSlotData) cmsPageRequestContextData.getPositionToSlot()
                .get(position);
        if (contentSlot == null) {
            if (LOG.isDebugEnabled()) {
                LOG.debug("Failed to lookup ContentSlot for position [" + position + "] in page ["
                        + cmsPageRequestContextData.getPage().getUid() + "].");
            }
        }
        return contentSlot;
    }

    @Override
    public List<AbstractCMSComponentModel> getCMSComponentsForContentSlot(
            final CmsPageRequestContextData cmsPageRequestContextData, final ContentSlotModel contentSlot,
            final boolean evaluateRestrictions, final int limit) {
        validateParameterNotNull(cmsPageRequestContextData, "Parameter cmsPageRequestContextData must not be null");
        validateParameterNotNull(contentSlot, "Parameter contentSlot must not be null");

        final List<AbstractCMSComponentModel> ret = new ArrayList<AbstractCMSComponentModel>();
        for (final AbstractCMSComponentModel component : contentSlot.getCmsComponents()) {
            if (isComponentVisible(cmsPageRequestContextData, component, evaluateRestrictions)) {
                final int remainingLimit = limit == -1 ? -1 : limit - ret.size();
                ret.addAll(flattenComponentHierarchy(cmsPageRequestContextData, component, evaluateRestrictions,
                        remainingLimit));
            }
        }
        return ret;
    }

    protected List<AbstractCMSComponentModel> flattenComponentHierarchy(
            final CmsPageRequestContextData cmsPageRequestContextData, final AbstractCMSComponentModel component,
            final boolean evaluateRestrictions, final int limit) {
        if (limit == 0) {
            return Collections.emptyList();
        } else if (component instanceof SimpleCMSComponentModel) {
            // We assume that Simple CMS Component should not be decomposed further
            return Arrays.asList(component);
        } else if (component instanceof AbstractCMSComponentContainerModel) {
            final AbstractCMSComponentContainerModel container = (AbstractCMSComponentContainerModel) component;
            return flattenComponentContainerHierarchy(cmsPageRequestContextData, container, evaluateRestrictions,
                    limit);
        } else {
            // Don't know what this component is - just return it
            return Arrays.asList(component);
        }
    }

    protected List<AbstractCMSComponentModel> flattenComponentContainerHierarchy(
            final CmsPageRequestContextData cmsPageRequestContextData,
            final AbstractCMSComponentContainerModel container, final boolean evaluateRestrictions,
            final int limit) {
        final List<AbstractCMSComponentModel> ret = new ArrayList<AbstractCMSComponentModel>();

        // Add the child components from the container
        final List<AbstractCMSComponentModel> replacementComponents = getComponentsForContainer(container);
        if (replacementComponents != null && !replacementComponents.isEmpty()) {
            for (final AbstractCMSComponentModel component : replacementComponents) {
                if (isComponentVisible(cmsPageRequestContextData, component, evaluateRestrictions)) {
                    ret.add(component);
                    if (limit > 0 && ret.size() >= limit) {
                        return ret;
                    }
                }
            }
        }

        return ret;
    }

    protected List<AbstractCMSComponentModel> getComponentsForContainer(
            final AbstractCMSComponentContainerModel container) {
        return getCmsComponentContainerStrategy().getDisplayComponentsForContainer(container);
    }

    @Override
    public List<AbstractCMSComponentModel> getCMSComponentsForComponent(
            final CmsPageRequestContextData cmsPageRequestContextData, final AbstractCMSComponentModel component,
            final boolean evaluateRestrictions, final int limit) {
        validateParameterNotNull(cmsPageRequestContextData, "Parameter cmsPageRequestContextData must not be null");
        validateParameterNotNull(component, "Parameter component must not be null");

        final List<AbstractCMSComponentModel> ret = new ArrayList<AbstractCMSComponentModel>();

        if (isComponentVisible(cmsPageRequestContextData, component, evaluateRestrictions)) {
            final int remainingLimit = limit == -1 ? -1 : limit - ret.size();
            ret.addAll(flattenComponentHierarchy(cmsPageRequestContextData, component, evaluateRestrictions,
                    remainingLimit));
        }

        return ret;
    }

    @Override
    public AbstractCMSComponentModel getComponentForId(final String id) {
        validateParameterNotNull(id, "Parameter id must not be null");

        try {
            return getCmsComponentService().getAbstractCMSComponent(id);
        } catch (final CMSItemNotFoundException e) {
            LOG.warn("Failed to lookup ContentSlot for id [" + id + "]. " + e.getMessage());
        }
        return null;
    }

    /**
     * Checks whether component should be displayed.<br/>
     * <p/>
     * Note: Computation takes into account:
     * <ul>
     * <li>Checks whether component is visible</li>
     * <li>If component is restricted checks whether we should display it</li>
     * </ul>
     */
    @Override
    public boolean isComponentVisible(final CmsPageRequestContextData cmsPageRequestContextData,
            final AbstractCMSComponentModel component, final boolean evaluateRestrictions) {
        validateParameterNotNull(cmsPageRequestContextData, "Parameter cmsPageRequestContextData must not be null");
        validateParameterNotNull(component, "Parameter component must not be null");

        boolean allowed = true;
        if (Boolean.FALSE.equals(component.getVisible())) {
            allowed = false;
        } else if (doesComponentHaveRestrictions(component)) {
            if (evaluateRestrictions) {
                final RestrictionData restrictionData = (RestrictionData) cmsPageRequestContextData
                        .getRestrictionData();
                restrictionData.setValue("parentComponent", cmsPageRequestContextData.getParentComponent());
                restrictionData.setValue("component", component);
                allowed = getCmsRestrictionService().evaluateCMSComponent(component, restrictionData);
            }
        }
        return allowed;
    }

    protected boolean doesComponentHaveRestrictions(final AbstractCMSComponentModel component) {
        final List<AbstractRestrictionModel> restrictions = component.getRestrictions();
        return restrictions != null && !restrictions.isEmpty();
    }

    @Override
    public void renderComponent(final PageContext pageContext, final AbstractCMSComponentModel component)
            throws ServletException, IOException {
        validateParameterNotNull(pageContext, "Parameter pageContext must not be null");
        validateParameterNotNull(component, "Parameter component must not be null");

        if (LOG.isDebugEnabled()) {
            final Stopwatch stopwatch = new Stopwatch();

            stopwatch.start();
            getCmsComponentRenderer().renderComponent(pageContext, component);
            stopwatch.stop();

            if (stopwatch.elapsedMillis() > 1) {
                LOG.debug("Rendered component [" + component.getUid() + "] of type [" + component.getItemtype()
                        + "].. (" + stopwatch.toString() + ")");
            }
        } else {
            getCmsComponentRenderer().renderComponent(pageContext, component);
        }
    }
}