/*
* 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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.SpaceReference;
import com.celements.common.classes.IClassCollectionRole;
import com.celements.navigation.TreeNode;
import com.celements.rendering.RenderCommand;
import com.celements.web.plugin.cmd.PageLayoutCommand;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.web.Utils;
public class CellRenderStrategy implements IRenderStrategy {
private static Log LOGGER = LogFactory.getFactory().getInstance(CellRenderStrategy.class);
private ICellWriter cellWriter;
private XWikiContext context;
private SpaceReference spaceReference;
RenderCommand rendererCmd;
PageLayoutCommand pageLayoutCmd = new PageLayoutCommand();
IWebUtilsService webUtilsService = Utils.getComponent(IWebUtilsService.class);
CellsClasses cellClasses = (CellsClasses) Utils.getComponent(IClassCollectionRole.class,
"celements.celCellsClasses");
public CellRenderStrategy(XWikiContext context) {
this.context = context;
}
public void endRenderCell(TreeNode node, boolean isFirstItem, boolean isLastItem) {
cellWriter.closeLevel();
}
public void endRenderChildren(EntityReference parentRef) {
}
public void endRendering() {
}
public String getMenuPart(TreeNode node) {
return "";
}
public SpaceReference getSpaceReference() {
if (spaceReference == null) {
return pageLayoutCmd.getDefaultLayoutSpaceReference();
} else {
return spaceReference;
}
}
public boolean isRenderCell(TreeNode node) {
return node != null;
}
public boolean isRenderSubCells(EntityReference parentRef) {
return parentRef != null;
}
public void startRenderCell(TreeNode node, boolean isFirstItem, boolean isLastItem) {
String cssClasses = "cel_cell";
String cssStyles = "";
String idname = "";
try {
DocumentReference cellDocRef = node.getDocumentReference();
LOGGER.debug("startRenderCell: cellDocRef [" + cellDocRef + "] context db ["
+ context.getDatabase() + "].");
XWikiDocument cellDoc = context.getWiki().getDocument(cellDocRef, context);
BaseObject cellObj = cellDoc.getXObject(cellClasses.getCellClassRef(
cellDocRef.getWikiReference().getName()));
if (cellObj != null) {
String cellObjCssClasses = cellObj.getStringValue("css_classes");
if ((cellObjCssClasses != null) && !"".equals(cellObjCssClasses)) {
cssClasses += " " + cellObjCssClasses;
}
cssStyles = cellObj.getStringValue("css_styles");
idname = cellObj.getStringValue("idname");
}
if ((idname == null) || "".equals(idname)) {
String nodeFN = webUtilsService.getRefDefaultSerializer().serialize(
node.getDocumentReference());
nodeFN = nodeFN.replaceAll(context.getDatabase() + ":", "");
idname = "cell:" + nodeFN.replaceAll(":", "..");
}
} catch (XWikiException e) {
LOGGER.error("failed to get cell [" + node.getDocumentReference() + "] document.", e);
}
cellWriter.openLevel(idname, cssClasses, cssStyles);
}
public void startRenderChildren(EntityReference parentRef) {
}
public void startRendering() {
cellWriter.clear();
}
public CellRenderStrategy setOutputWriter(ICellWriter newWriter) {
this.cellWriter = newWriter;
return this;
}
public String getAsString() {
return cellWriter.getAsString();
}
public void renderEmptyChildren(TreeNode node) {
String cellContent = "";
try {
LOGGER.debug("renderEmptyChildren: parent [" + node + "].");
long millisec = System.currentTimeMillis();
cellContent = getRendererCmd().renderCelementsCell(node.getDocumentReference());
LOGGER.info("renderEmptyChildren: rendered parent [" + node + "]. Time used in millisec: "
+ (System.currentTimeMillis() - millisec));
} catch (XWikiException exp) {
LOGGER.error("failed to get cell [" + node + "] document to render cell" + " content.", exp);
}
cellWriter.appendContent(cellContent);
}
RenderCommand getRendererCmd() {
if (rendererCmd == null) {
rendererCmd = new RenderCommand();
}
return rendererCmd;
}
public void setSpaceReference(SpaceReference spaceReference) {
this.spaceReference = spaceReference;
}
}