package com.celements.pagelayout; import java.util.Map; import org.apache.velocity.VelocityContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xwiki.component.annotation.Component; import org.xwiki.component.annotation.Requirement; import org.xwiki.context.Execution; import org.xwiki.model.internal.reference.DefaultStringEntityReferenceSerializer; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.EntityReferenceSerializer; import org.xwiki.model.reference.SpaceReference; import org.xwiki.script.service.ScriptService; import com.celements.web.plugin.api.PageLayoutApi; 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.web.Utils; @Component("layout") public class LayoutScriptService implements ScriptService { private static Logger _LOGGER = LoggerFactory.getLogger(LayoutScriptService.class); public static final String CELEMENTS_PAGE_LAYOUT_COMMAND = "com.celements.web.PageLayoutCommand"; @Requirement private Execution execution; private XWikiContext getContext() { return (XWikiContext) execution.getContext().getProperty("xwikicontext"); } public String renderPageLayout() { return getPageLayoutCmd().renderPageLayout(); } public String renderPageLayout(SpaceReference spaceRef) { return getPageLayoutCmd().renderPageLayout(spaceRef); } public Map<String, String> getActivePageLayouts() { return getPageLayoutCmd().getActivePageLyouts(); } public Map<String, String> getAllPageLayouts() { return getPageLayoutCmd().getAllPageLayouts(); } public String createNewLayout(String layoutSpaceName) { return getPageLayoutCmd().createNew(getWebUtilsService().resolveSpaceReference( layoutSpaceName)); } public boolean deleteLayout(String layoutSpaceName) { SpaceReference layoutSpaceRef = getWebUtilsService().resolveSpaceReference(layoutSpaceName); String layoutPropDocName = getEntitySerializer().serialize( getPageLayoutCmd().standardPropDocRef(layoutSpaceRef)); try { if (getContext().getWiki().getRightService().hasAccessLevel("delete", getContext().getUser(), layoutPropDocName, getContext())) { return getPageLayoutCmd().deleteLayout(layoutSpaceRef); } else { _LOGGER.warn("NO delete rights on [" + layoutPropDocName + "] for user [" + getContext().getUser() + "]."); } } catch (XWikiException exp) { _LOGGER.error("Failed to check delete rights on [" + layoutSpaceName + "] for user [" + getContext().getUser() + "]."); } return false; } public PageLayoutApi getPageLayoutApiForName(String layoutSpaceName) { return new PageLayoutApi(getWebUtilsService().resolveSpaceReference(layoutSpaceName), getContext()); } public String getPageLayoutForDoc(DocumentReference docRef) { SpaceReference pageLayoutForDoc = getPageLayoutCmd().getPageLayoutForDoc(docRef); if (pageLayoutForDoc != null) { return pageLayoutForDoc.getName(); } return ""; } public boolean layoutExists(SpaceReference layoutSpaceRef) { return getPageLayoutCmd().layoutExists(layoutSpaceRef); } public boolean useXWikiLoginLayout() { return "1".equals(getContext().getWiki().getSpacePreference("xwikiLoginLayout", "celements.xwikiLoginLayout", "1", getContext())); } public boolean layoutEditorAvailable() { return getPageLayoutCmd().layoutEditorAvailable(); } public String renderCelementsDocumentWithLayout(DocumentReference docRef, SpaceReference layoutSpaceRef) { XWikiDocument oldContextDoc = getContext().getDoc(); _LOGGER.debug("renderCelementsDocumentWithLayout for docRef [" + docRef + "] and layoutSpaceRef [" + layoutSpaceRef + "] overwrite oldContextDoc [" + oldContextDoc.getDocumentReference() + "]."); VelocityContext vcontext = (VelocityContext) getContext().get("vcontext"); try { XWikiDocument newContextDoc = getContext().getWiki().getDocument(docRef, getContext()); getContext().setDoc(newContextDoc); vcontext.put("doc", newContextDoc.newDocument(getContext())); return getPageLayoutCmd().renderPageLayout(layoutSpaceRef); } catch (XWikiException exp) { _LOGGER.error("Failed to get docRef document to renderCelementsDocumentWithLayout.", exp); } finally { getContext().setDoc(oldContextDoc); vcontext.put("doc", oldContextDoc.newDocument(getContext())); } return ""; } public SpaceReference getCurrentRenderingLayout() { return getPageLayoutCmd().getCurrentRenderingLayout(); } /** * TODO: Probably use TreeNodeService directly */ private PageLayoutCommand getPageLayoutCmd() { if (!getContext().containsKey(CELEMENTS_PAGE_LAYOUT_COMMAND)) { getContext().put(CELEMENTS_PAGE_LAYOUT_COMMAND, new PageLayoutCommand()); } return (PageLayoutCommand) getContext().get(CELEMENTS_PAGE_LAYOUT_COMMAND); } private IWebUtilsService getWebUtilsService() { return Utils.getComponent(IWebUtilsService.class); } private DefaultStringEntityReferenceSerializer getEntitySerializer() { return ((DefaultStringEntityReferenceSerializer) Utils.getComponent( EntityReferenceSerializer.class)); } }