com.celements.cells.RenderingEngine.java Source code

Java tutorial

Introduction

Here is the source code for com.celements.cells.RenderingEngine.java

Source

/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This 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 software 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.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package com.celements.cells;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.SpaceReference;

import com.celements.navigation.TreeNode;
import com.celements.navigation.service.ITreeNodeService;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.web.Utils;

public class RenderingEngine implements IRenderingEngine {

    private static Log LOGGER = LogFactory.getFactory().getInstance(RenderingEngine.class);

    private IRenderStrategy renderStrategy;

    ITreeNodeService treeNodeService;
    IWebUtilsService webUtilsService;

    public RenderingEngine() {
    }

    /* (non-Javadoc)
     * @see com.celements.web.cells.IRenderingEngine#renderCell(
     *   com.xpn.xwiki.objects.BaseObject)
     */
    public void renderCell(TreeNode node) {
        renderStrategy.startRendering();
        //isFirst AND isLast because only this item and its children is
        //rendered (NO SIBLINGS!)
        internal_renderCell(node, true, true);
        renderStrategy.endRendering();
    }

    /* (non-Javadoc)
     * @see com.celements.web.cells.IRenderingEngine#renderSubCells(java.lang.String)
     */
    @Deprecated
    public void renderPageLayout(String spaceName) {
        SpaceReference spaceRef = getWebUtilsService().resolveSpaceReference(spaceName);
        renderPageLayout(spaceRef);
    }

    /* (non-Javadoc)
     * @see com.celements.web.cells.IRenderingEngine#renderSubCells(
     *      org.xwiki.model.reference.SpaceReference)
     */
    public void renderPageLayout(SpaceReference spaceRef) {
        LOGGER.debug("renderPageLayout: start rendering [" + spaceRef + "].");
        renderStrategy.startRendering();
        renderStrategy.setSpaceReference(spaceRef);
        internal_renderSubCells(null);
        renderStrategy.endRendering();
    }

    void internal_renderCell(TreeNode node, boolean isFirstItem, boolean isLastItem) {
        if (renderStrategy.isRenderCell(node)) {
            renderStrategy.startRenderCell(node, isFirstItem, isLastItem);
            internal_renderSubCells(node);
            renderStrategy.endRenderCell(node, isFirstItem, isLastItem);
        }
    }

    void internal_renderSubCells(TreeNode parentNode) {
        EntityReference parentRef = getParentReference(parentNode);
        if (renderStrategy.isRenderSubCells(parentRef)) {
            List<TreeNode> children = getTreeNodeService().getSubNodesForParent(parentRef,
                    renderStrategy.getMenuPart(parentNode));
            LOGGER.debug("internal_renderSubCells: for parent [" + parentRef + "] render [" + children.size()
                    + "] children [" + children + "].");
            if (children.size() > 0) {
                renderStrategy.startRenderChildren(parentRef);
                boolean isFirstItem = true;
                for (TreeNode node : children) {
                    boolean isLastItem = (children.lastIndexOf(node) == (children.size() - 1));
                    internal_renderCell(node, isFirstItem, isLastItem);
                    isFirstItem = false;
                }
                renderStrategy.endRenderChildren(parentRef);
            } else if (renderStrategy.isRenderCell(parentNode)) {
                renderStrategy.renderEmptyChildren(parentNode);
            }
        }
    }

    private EntityReference getParentReference(TreeNode parentNode) {
        EntityReference parentRef;
        if (parentNode != null) {
            parentRef = parentNode.getDocumentReference();
        } else {
            parentRef = renderStrategy.getSpaceReference();
        }
        return parentRef;
    }

    public RenderingEngine setRenderStrategy(IRenderStrategy newStrategy) {
        this.renderStrategy = newStrategy;
        return this;
    }

    ITreeNodeService getTreeNodeService() {
        if (treeNodeService != null) {
            return treeNodeService;
        }
        return Utils.getComponent(ITreeNodeService.class);
    }

    IWebUtilsService getWebUtilsService() {
        if (webUtilsService != null) {
            return webUtilsService;
        }
        return Utils.getComponent(IWebUtilsService.class);
    }

}