/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.rendering.macro.include;
import java.util.Collections;
import java.util.List;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.wiki.mow.core.api.wiki.PageImpl;
import org.exoplatform.wiki.rendering.RenderingService;
import org.exoplatform.wiki.rendering.impl.DefaultWikiModel;
import org.exoplatform.wiki.service.WikiContext;
import org.exoplatform.wiki.service.WikiPageParams;
import org.exoplatform.wiki.service.WikiService;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.Requirement;
import org.xwiki.component.manager.ComponentLookupException;
import org.xwiki.component.manager.ComponentManager;
import org.xwiki.context.Execution;
import org.xwiki.context.ExecutionContext;
import org.xwiki.rendering.block.Block;
import org.xwiki.rendering.block.RawBlock;
import org.xwiki.rendering.listener.reference.ResourceType;
import org.xwiki.rendering.macro.AbstractMacro;
import org.xwiki.rendering.macro.MacroExecutionException;
import org.xwiki.rendering.syntax.Syntax;
import org.xwiki.rendering.transformation.MacroTransformationContext;
import org.xwiki.rendering.wiki.WikiModel;
/**
* Created by The eXo Platform SAS
* Author : Lai Trung Hieu
* hieu.lai@exoplatform.com
* Jan 06, 2011
*/
@Component("includepage")
public class IncludePageMacro extends AbstractMacro<IncludePageMacroParameters> {
private Log log = ExoLogger.getLogger(this.getClass());
/**
* The description of the macro
*/
private static final String DESCRIPTION = "Includes the contents of a page within current";
/**
* Used to get the current syntax parser.
*/
@Requirement
private ComponentManager componentManager;
@Requirement
private Execution execution;
private DefaultWikiModel model;
private RenderingService renderingservice;
private WikiService wservice;
public IncludePageMacro() {
super("Include Page", DESCRIPTION, IncludePageMacroParameters.class);
setDefaultCategory(DEFAULT_CATEGORY_CONTENT);
}
@Override
public List<Block> execute(IncludePageMacroParameters parameters,
String content,
MacroTransformationContext context) throws MacroExecutionException {
String documentName = parameters.getPage();
model = (DefaultWikiModel) getWikiModel(context);
renderingservice = getRenderingService();
wservice = getWikiService();
WikiPageParams params = model.getWikiMarkupContext(documentName,ResourceType.DOCUMENT);
WikiContext currentContext = null;
WikiContext pageContext = null;
StringBuilder includeContent = new StringBuilder();
ExecutionContext ec = execution.getContext();
try {
if (ec != null) {
currentContext = (WikiContext) ec.getProperty(WikiContext.WIKICONTEXT);
pageContext = currentContext.clone();
pageContext.setOwner(params.getOwner());
pageContext.setType(params.getType());
pageContext.setPageId(params.getPageId());
// Set page context as current context
ec.setProperty(WikiContext.WIKICONTEXT, pageContext);
}
includeContent.append("<div class=\"IncludePage \" >");
PageImpl page = (PageImpl) wservice.getPageById(params.getType(),
params.getOwner(),
params.getPageId());
if (page != null) {
includeContent.append(renderingservice.render(page.getContent().getText(),
page.getSyntax(),
Syntax.XHTML_1_0.toIdString(),
false));
}
includeContent.append("</div>");
Block result = new RawBlock(includeContent.toString(), Syntax.XHTML_1_0);
return Collections.singletonList(result);
} catch (Exception e) {
log.debug("Failed to execute page macro", e);
return Collections.emptyList();
} finally {
// Restore current context
ec.setProperty(WikiContext.WIKICONTEXT, currentContext);
}
}
@Override
public boolean supportsInlineMode() {
return true;
}
/**
* @return the component manager.
*/
public ComponentManager getComponentManager() {
return this.componentManager;
}
protected WikiModel getWikiModel(MacroTransformationContext context) throws MacroExecutionException {
try {
return getComponentManager().lookup(WikiModel.class);
} catch (ComponentLookupException e) {
throw new MacroExecutionException("Failed to find wiki model", e);
}
}
protected RenderingService getRenderingService() {
return (RenderingService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(RenderingService.class);
}
protected WikiService getWikiService() {
return (WikiService) ExoContainerContext.getCurrentContainer()
.getComponentInstanceOfType(WikiService.class);
}
}