Updated Branches: refs/heads/master 03df3bcd8 -> 6b8ab22ea
WICKET-5005 Add Utility to allow conversion from Panel (or Component) to html String Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/6b8ab22e Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/6b8ab22e Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/6b8ab22e Branch: refs/heads/master Commit: 6b8ab22eaefb37cd17c2a6dae12f46517bfb59a5 Parents: 03df3bc Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Wed Mar 13 15:22:13 2013 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Wed Mar 13 15:22:13 2013 +0100 ---------------------------------------------------------------------- .../wicket/core/util/string/ComponentRenderer.java | 130 +++++++++++++ .../wicket/examples/asemail/MailTemplate.java | 147 ++------------- 2 files changed, 147 insertions(+), 130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/6b8ab22e/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java new file mode 100644 index 0000000..308b548 --- /dev/null +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.core.util.string; + +import org.apache.wicket.Application; +import org.apache.wicket.Component; +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.core.request.handler.PageProvider; +import org.apache.wicket.core.request.handler.RenderPageRequestHandler; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.protocol.http.BufferedWebResponse; +import org.apache.wicket.request.Response; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.request.cycle.RequestCycleContext; +import org.apache.wicket.request.handler.render.PageRenderer; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; + +/** + * A helper class for rendering components and pages + */ +public class ComponentRenderer +{ + /** + * The id to use when rendering a component + */ + public static final String COMP_ID = "compId"; + + /** + * Collects the html generated by the rendering of a page. + * + * @param pageProvider + * the provider of the page class/instance and its parameters + * @return the html rendered by a page + */ + public static CharSequence renderPage(final PageProvider pageProvider) + { + final RenderPageRequestHandler handler = new RenderPageRequestHandler(pageProvider, + RenderPageRequestHandler.RedirectPolicy.NEVER_REDIRECT); + + Application application = Application.get(); + final PageRenderer pageRenderer = application.getPageRendererProvider().get(handler); + + RequestCycle originalRequestCycle = RequestCycle.get(); + + BufferedWebResponse tempResponse = new BufferedWebResponse(null); + + RequestCycleContext requestCycleContext = new RequestCycleContext(originalRequestCycle.getRequest(), + tempResponse, application.getRootRequestMapper(), application.getExceptionMapperProvider().get()); + RequestCycle tempRequestCycle = new RequestCycle(requestCycleContext); + + final Response oldResponse = originalRequestCycle.getResponse(); + + try + { + originalRequestCycle.setResponse(tempResponse); + pageRenderer.respond(tempRequestCycle); + } + finally + { + originalRequestCycle.setResponse(oldResponse); + } + + return tempResponse.getText(); + } + + + /** + * Collects the html generated by the rendering of a component. + * + * @param component + * the component to render. + * @return the html rendered by the component + */ + public static CharSequence renderComponent(final Component component) + { + RequestCycle requestCycle = RequestCycle.get(); + + final Response originalResponse = requestCycle.getResponse(); + BufferedWebResponse tempResponse = new BufferedWebResponse(null); + + try + { + requestCycle.setResponse(tempResponse); + + RenderPage page = new RenderPage(); + page.add(component); + + component.render(); + } + finally + { + requestCycle.setResponse(originalResponse); + } + + return tempResponse.getText(); + } + + /** + * A page used as a parent for the component based rendering. + */ + private static class RenderPage extends WebPage implements IMarkupResourceStreamProvider + { + private static final String MARKUP = "<wicket:container wicket:id='" + COMP_ID + + "'></wicket:container>"; + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream(MARKUP); + } + + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/6b8ab22e/wicket-examples/src/main/java/org/apache/wicket/examples/asemail/MailTemplate.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/asemail/MailTemplate.java b/wicket-examples/src/main/java/org/apache/wicket/examples/asemail/MailTemplate.java index 7a26fcd..f3f1512 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/asemail/MailTemplate.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/asemail/MailTemplate.java @@ -20,16 +20,12 @@ import java.util.HashMap; import java.util.Map; import org.apache.wicket.Component; -import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.core.request.handler.PageProvider; -import org.apache.wicket.core.request.handler.RenderPageRequestHandler; -import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy; +import org.apache.wicket.core.util.string.ComponentRenderer; import org.apache.wicket.examples.WicketExamplePage; -import org.apache.wicket.markup.IMarkupResourceStreamProvider; -import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; @@ -37,16 +33,9 @@ import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.protocol.http.BufferedWebResponse; -import org.apache.wicket.request.Response; import org.apache.wicket.request.Url; -import org.apache.wicket.request.cycle.RequestCycle; -import org.apache.wicket.request.cycle.RequestCycleContext; -import org.apache.wicket.request.handler.render.PageRenderer; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.PackageResourceReference; -import org.apache.wicket.util.resource.IResourceStream; -import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.template.PackageTextTemplate; import org.apache.wicket.util.template.TextTemplate; @@ -96,7 +85,10 @@ public class MailTemplate extends WicketExamplePage @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - CharSequence pageHtml = renderPage(TemplateBasedOnPage.class); + PageParameters parameters = new PageParameters(); + parameters.set("name", name); + PageProvider pageProvider = new PageProvider(TemplateBasedOnPage. class, parameters); + CharSequence pageHtml = ComponentRenderer.renderPage(pageProvider); updateResult(result, pageHtml, target); target.add(feedback); @@ -116,8 +108,8 @@ public class MailTemplate extends WicketExamplePage @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { - CharSequence panelHtml = renderPanel(new MailTemplatePanel(DummyPage.COMP_ID, - new PropertyModel<String>(MailTemplate.this, "name"))); + CharSequence panelHtml = ComponentRenderer.renderComponent(new MailTemplatePanel(ComponentRenderer.COMP_ID, + new PropertyModel<String>(MailTemplate.this, "name"))); updateResult(result, panelHtml, target); target.add(feedback); @@ -137,9 +129,17 @@ public class MailTemplate extends WicketExamplePage @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { + Map<String, Object> variables = new HashMap<String, Object>(); + variables.put("name", name); - CharSequence templateHtml = renderTemplate(new PackageTextTemplate( - MailTemplate.class, "mail-template.tmpl")); + CharSequence relativeUrl = urlFor(new PackageResourceReference(MailTemplate.class, + "resource.txt"), null); + String href = getRequestCycle().getUrlRenderer().renderFullUrl( + Url.parse(relativeUrl.toString())); + variables.put("downloadLink", href); + + PackageTextTemplate template = new PackageTextTemplate(MailTemplate.class, "mail-template.tmpl"); + CharSequence templateHtml = template.asString(variables); updateResult(result, templateHtml, target); target.add(feedback); } @@ -155,119 +155,6 @@ public class MailTemplate extends WicketExamplePage } /** - * Loads the mail template from a file with placeholders, populates them and returns the text - * that can be used as mail body. - * - * @param template - * the {@link TextTemplate} to use for the final result - * @return the fully populated template - */ - private CharSequence renderTemplate(final TextTemplate template) - { - Map<String, Object> variables = new HashMap<String, Object>(); - variables.put("name", name); - - CharSequence relativeUrl = urlFor(new PackageResourceReference(MailTemplate.class, - "resource.txt"), null); - String href = getRequestCycle().getUrlRenderer().renderFullUrl( - Url.parse(relativeUrl.toString())); - variables.put("downloadLink", href); - - String html = template.asString(variables); - return html; - } - - /** - * Collects the html generated by the rendering of a page. - * - * @param pageClass - * the class of the page which should be rendered. - * @return the html rendered by a page - */ - private CharSequence renderPage(final Class<? extends Page> pageClass) - { - PageParameters parameters = new PageParameters(); - parameters.set("name", name); - - final RenderPageRequestHandler handler = new RenderPageRequestHandler(new PageProvider( - pageClass, parameters), RedirectPolicy.NEVER_REDIRECT); - - final PageRenderer pageRenderer = getApplication().getPageRendererProvider().get(handler); - - RequestCycle originalRequestCycle = getRequestCycle(); - - BufferedWebResponse tempResponse = new BufferedWebResponse(null); - - RequestCycleContext requestCycleContext = new RequestCycleContext(originalRequestCycle.getRequest(), - tempResponse, getApplication().getRootRequestMapper(), getApplication().getExceptionMapperProvider().get()); - RequestCycle tempRequestCycle = new RequestCycle(requestCycleContext); - - final Response oldResponse = originalRequestCycle.getResponse(); - - try - { - originalRequestCycle.setResponse(tempResponse); - pageRenderer.respond(tempRequestCycle); - } - finally - { - originalRequestCycle.setResponse(oldResponse); - } - - return tempResponse.getText(); - } - - /** - * Collects the html generated by the rendering of a page. - * - * @param panel - * the panel that should be rendered. - * @return the html rendered by the panel - */ - private CharSequence renderPanel(final Panel panel) - { - RequestCycle requestCycle = getRequestCycle(); - - final Response oldResponse = requestCycle.getResponse(); - BufferedWebResponse tempResponse = new BufferedWebResponse(null); - - try - { - requestCycle.setResponse(tempResponse); - - DummyPage page = new DummyPage(); - page.add(panel); - - panel.render(); - } - finally - { - requestCycle.setResponse(oldResponse); - } - - return tempResponse.getText(); - } - - /** - * A page used as a parent for the panel based templating. - */ - private static class DummyPage extends WebPage implements IMarkupResourceStreamProvider - { - private static final long serialVersionUID = 1L; - - private static final String COMP_ID = "dummy"; - - @Override - public IResourceStream getMarkupResourceStream(MarkupContainer container, - Class<?> containerClass) - { - return new StringResourceStream("<wicket:container wicket:id='" + COMP_ID + - "'></wicket:container>"); - } - - } - - /** * Updates the component that is used to show the generated mail body for this example. * * @param result
