use of org.xwiki.rendering.transformation.RenderingContext in project xwiki-platform by xwiki.
the class DefaultHTMLConverterTest method parseAndRender.
/**
* Unit test for {@link DefaultHTMLConverter#parseAndRender(String, String)}.
*/
@Test
public void parseAndRender() throws Exception {
String html = "some HTML";
String syntaxId = "syntax/x.y";
// Verify the HTML is cleaned.
HTMLCleaner cleaner = mocker.getInstance(HTMLCleaner.class);
when(cleaner.clean(html)).thenReturn(html);
// Verify the HTML is parsed into XDOM.
XDOM xdom = new XDOM(Collections.<Block>emptyList());
Parser xhtmlParser = mocker.getInstance(Parser.class, "xhtml/1.0");
when(xhtmlParser.parse(any(StringReader.class))).thenReturn(xdom);
Assert.assertEquals("", mocker.getComponentUnderTest().parseAndRender(html, syntaxId));
// Verify that the macro transformations have been executed.
Transformation macroTransformation = mocker.getInstance(Transformation.class, "macro");
RenderingContext renderingContext = mocker.getInstance(RenderingContext.class);
// It's very important to verify that a transformation context id is set as otherwise if the content being
// edited has different velocity macros executing, they'll be executed in isolation and thus what's defined in
// one won't be visible from the other ones (For example see https://jira.xwiki.org/browse/XWIKI-11695).
ArgumentCaptor<TransformationContext> txContextArgument = ArgumentCaptor.forClass(TransformationContext.class);
verify((MutableRenderingContext) renderingContext).transformInContext(same(macroTransformation), txContextArgument.capture(), same(xdom));
assertEquals("wysiwygtxid", txContextArgument.getValue().getId());
// Verify the XDOM is rendered to Annotated XHTML.
BlockRenderer xhtmlRenderer = mocker.getInstance(BlockRenderer.class, "annotatedxhtml/1.0");
verify(xhtmlRenderer).render(same(xdom), any(WikiPrinter.class));
// Verify that the syntax meta data has been set.
Assert.assertEquals(Syntax.valueOf("syntax/x.y"), xdom.getMetaData().getMetaData(MetaData.SYNTAX));
}
use of org.xwiki.rendering.transformation.RenderingContext in project xwiki-platform by xwiki.
the class XWikiAction method renderInit.
private void renderInit(XWikiContext xcontext) throws Exception {
RenderingContext renderingContext = Utils.getComponent(RenderingContext.class);
MutableRenderingContext mutableRenderingContext = renderingContext instanceof MutableRenderingContext ? (MutableRenderingContext) renderingContext : null;
if (mutableRenderingContext != null) {
mutableRenderingContext.push(renderingContext.getTransformation(), renderingContext.getXDOM(), renderingContext.getDefaultSyntax(), "init.vm", renderingContext.isRestricted(), Syntax.XHTML_1_0);
}
xcontext.getResponse().setStatus(503);
xcontext.getResponse().setContentType("text/html; charset=UTF-8");
try {
Utils.getComponent(TemplateManager.class).render("init.vm", xcontext.getResponse().getWriter());
} finally {
if (mutableRenderingContext != null) {
mutableRenderingContext.pop();
}
}
xcontext.getResponse().flushBuffer();
xcontext.setFinished(true);
}
use of org.xwiki.rendering.transformation.RenderingContext in project xwiki-platform by xwiki.
the class DefaultHTMLConverterTest method toHTML.
/**
* Unit test for {@link DefaultHTMLConverter#toHTML(String, String)}.
*/
@Test
public void toHTML() throws Exception {
String source = "wiki syntax";
String syntaxId = "syntax/x.y";
// The source should be parsed.
Parser parser = this.mocker.registerMockComponent(Parser.class, syntaxId);
XDOM xdom = new XDOM(Collections.<Block>emptyList());
when(parser.parse(any(StringReader.class))).thenReturn(xdom);
Assert.assertEquals("", mocker.getComponentUnderTest().toHTML(source, syntaxId));
// Verify that the macro transformations have been executed.
Transformation macroTransformation = mocker.getInstance(Transformation.class, "macro");
RenderingContext renderingContext = mocker.getInstance(RenderingContext.class);
// It's very important to verify that a transformation context id is set as otherwise if the content being
// edited has different velocity macros executing, they'll be executed in isolation and thus what's defined in
// one won't be visible from the other ones (For example see https://jira.xwiki.org/browse/XWIKI-11695).
ArgumentCaptor<TransformationContext> txContextArgument = ArgumentCaptor.forClass(TransformationContext.class);
verify((MutableRenderingContext) renderingContext).transformInContext(same(macroTransformation), txContextArgument.capture(), same(xdom));
assertEquals("wysiwygtxid", txContextArgument.getValue().getId());
// Verify the XDOM is rendered to Annotated XHTML.
BlockRenderer xhtmlRenderer = mocker.getInstance(BlockRenderer.class, "annotatedxhtml/1.0");
verify(xhtmlRenderer).render(same(xdom), any(WikiPrinter.class));
}
use of org.xwiki.rendering.transformation.RenderingContext in project xwiki-platform by xwiki.
the class DefaultWikiMacro method execute.
@Override
public List<Block> execute(WikiMacroParameters parameters, String macroContent, MacroTransformationContext context) throws MacroExecutionException {
validate(parameters, macroContent);
// Parse the wiki macro content.
XDOM xdom = prepareWikiMacroContent(context);
// Prepare macro context.
Map<String, Object> macroBinding = new HashMap<>();
macroBinding.put(MACRO_PARAMS_KEY, parameters);
macroBinding.put(MACRO_CONTENT_KEY, macroContent);
macroBinding.put(MACRO_DESCRIPTOR_KEY, getDescriptor());
macroBinding.put(MACRO_CONTEXT_KEY, context);
macroBinding.put(MACRO_RESULT_KEY, null);
// Extension point to add more wiki macro bindings
try {
List<WikiMacroBindingInitializer> bindingInitializers = this.componentManager.getInstanceList(WikiMacroBindingInitializer.class);
for (WikiMacroBindingInitializer bindingInitializer : bindingInitializers) {
bindingInitializer.initialize(this.macroDocumentReference, parameters, macroContent, context, macroBinding);
}
} catch (ComponentLookupException e) {
// TODO: we should probably log something but that should never happen
}
// Execute the macro
ObservationManager observation = null;
try {
observation = this.componentManager.getInstance(ObservationManager.class);
} catch (ComponentLookupException e) {
// TODO: maybe log something
}
// Get XWiki context
Map<String, Object> xwikiContext = null;
try {
Execution execution = this.componentManager.getInstance(Execution.class);
ExecutionContext econtext = execution.getContext();
if (econtext != null) {
xwikiContext = (Map<String, Object>) execution.getContext().getProperty("xwikicontext");
}
} catch (ComponentLookupException e) {
// TODO: maybe log something
}
try {
Transformation macroTransformation = this.componentManager.getInstance(Transformation.class, MACRO_HINT);
if (xwikiContext != null) {
// Place macro context inside xwiki context ($xcontext.macro).
xwikiContext.put(MACRO_KEY, macroBinding);
}
MacroBlock wikiMacroBlock = context.getCurrentMacroBlock();
MacroMarkerBlock wikiMacroMarker = new MacroMarkerBlock(wikiMacroBlock.getId(), wikiMacroBlock.getParameters(), wikiMacroBlock.getContent(), xdom.getChildren(), wikiMacroBlock.isInline());
// Make sure to use provided metadatas
MetaDataBlock metaDataBlock = new MetaDataBlock(Collections.<Block>singletonList(wikiMacroMarker), xdom.getMetaData());
// Make sure the context XDOM contains the wiki macro content
wikiMacroBlock.getParent().replaceChild(metaDataBlock, wikiMacroBlock);
// "Emulate" the fact that wiki macro block is still part of the XDOM (what is in the XDOM is a
// MacroMarkerBlock and MacroTransformationContext current macro block only support MacroBlock so we can't
// switch it without breaking some APIs)
wikiMacroBlock.setParent(metaDataBlock.getParent());
wikiMacroBlock.setNextSiblingBlock(metaDataBlock.getNextSibling());
wikiMacroBlock.setPreviousSiblingBlock(metaDataBlock.getPreviousSibling());
try {
if (observation != null) {
observation.notify(STARTEXECUTION_EVENT, this, macroBinding);
}
// Perform internal macro transformations.
TransformationContext txContext = new TransformationContext(context.getXDOM(), this.syntax);
txContext.setId(context.getId());
RenderingContext renderingContext = componentManager.getInstance(RenderingContext.class);
((MutableRenderingContext) renderingContext).transformInContext(macroTransformation, txContext, wikiMacroMarker);
} finally {
// Restore context XDOM to its previous state
metaDataBlock.getParent().replaceChild(wikiMacroBlock, metaDataBlock);
}
return extractResult(wikiMacroMarker.getChildren(), macroBinding, context);
} catch (Exception ex) {
throw new MacroExecutionException("Error while performing internal macro transformations", ex);
} finally {
if (xwikiContext != null) {
xwikiContext.remove(MACRO_KEY);
}
if (observation != null) {
observation.notify(ENDEXECUTION_EVENT, this);
}
}
}
Aggregations