Wiki Markup |
---|
{scrollbar} |
Excerpt | ||
---|---|---|
| ||
Adding an Annotation and a Filter to customize Tapestry's page rendering |
...
Code Block | ||||
---|---|---|---|---|
| ||||
package com.fnord;
import org.apache.tapestry5.http.services.BaseURLSource;
import com.fnord.annotations.ForbidFraming;
public class FnordSymbols {
/**
* Meta-data key; when true, MarkupRendererFilter will inject some extra
* content into the response to enforce that the content may not be framed
* (i.e., "stolen").
*
* @see ForbidFraming
*/
public static final String FORBID_FRAMING = "forbid-framing";
}
|
...
Code Block | ||||
---|---|---|---|---|
| ||||
package com.fnord.services.forbidframing; import org.apache.tapestry5.ioccommons.MappedConfiguration; import org.apache.tapestry5.ioc.annotations.Contribute; import org.apache.tapestry5.ioc.services.FactoryDefaults; import org.apache.tapestry5.ioc.services.SymbolProvider; import com.fnord.FnordSymbols; public class ForbidFramingModule { @Contribute(SymbolProvider.class) @FactoryDefaults public static void setupForbidFramingDefault( MappedConfiguration<String, String> configuration) { configuration.add(FnordSymbols.FORBID_FRAMING, "false"); } } |
...
The work we ultimately want to do occurs when rendering a page. Tapestry defines a pipeline for that overall process. The point of a pipeline is that we can add filters to it. We'll add a filter that checks for the meta-data key and adds the response header and JavaScript.
...
How do you know what filters are built-in and where to add your own? The right starting point is the JavaDoc for the method of TapestryModule that contributes the base set: contributeMarkupRenderer()
Implementing the Filter
Everything comes together in the filter:
...
There's a bit going on in this short piece of code. The heart of the code is the MetaDataLocator service; given a meta-data key and a page name, it can not only extract the value, but then coerce it to a desired type, all in one go.
...