wicket: HTML Kommentare generieren

Gerade habe ich mich mit den Möglichkeiten auseinander gesetzt, mittels Apache Wicket den generierten HTML Code mit Kommentaren und Informationen anzureichern. Wegen der Eleganz von wicket keine große Kunst, hier nur eine kleine Materialsammlung dazu.

Um eine Komponente in Kommentar-Klammern einzupacken ist das folgende Behavior eine elegante Lösung:

public class HtmlCommentBehavior extends Behavior {
    private static final long serialVersionUID = 1L;

    @Override
    public void beforeRender(Component component) {
        component.getResponse().write("<!-- ");
    }

    @Override
    public void afterRender(Component component) {
      component.getResponse().write(" -->");
    }
}

Der Bequemlichkeit halber lässt sich auch ein Spezial-Label für Kommentare erzeugen:

public class CommentLabel extends Label {

    public CommentLabel(String id) {
        super(id);
        prepareAsHtmlComment();
    }

    public CommentLabel(String id, String label) {
        super(id, label);
        prepareAsHtmlComment();
    }

    public CommentLabel(String id, IModel<?> model) {
        super(id, model);
        prepareAsHtmlComment();
    }
    
    private void prepareAsHtmlComment() {
        setRenderBodyOnly(true);
        add(new HtmlCommentBehavior());
    }
}

Um so ein Label mit Informationen über die Laufzeitumgebung zu füttern, kann man beispielsweise das folgende DebugInfoModel verwenden. Da es ein LoadableDetachableModel ist, hat es den wohltuenden Nebeneffekt, die Informationen nicht jedesmal abzufragen, sondern sozusagen zu cachen.

/**
 * Model to generate an environment debug information String.
 * @author Dieter Tremel <tremel@tremel-computer.de>
 */
public class DebugInfoModel extends LoadableDetachableModel<String> {

    @Override
    protected String load() {
        return MessageFormat.format(
                "Java Version: {1}"
                + ", Wicket Version: {0}"
                + ", Application Server: {2}"
                + ", Operating System: {3}",
                WebApplication.get().getFrameworkSettings().getVersion(),
                System.getProperty("java.vendor") + " " + System.getProperty("java.version"),
                WebApplication.get().getServletContext().getServerInfo(),
                System.getProperty("os.version"));
    }
}

Um in den Header eine meta-Information einzufügen, kann man das content Attribute eine WebMarkupContainers verändern:

    <head> 
        <meta name="generator" wicket:id="metaGenerator" content="Supergenerator by Tremel Computer, Dieter Tremel"/>
    </head>

Im zugehörigen Code wird das Attribut content gesetzt:

    private void addHeaderDetails() {
        WebMarkupContainer metaGenerator = new WebMarkupContainer("metaGenerator");
        metaGenerator.add(new AttributeModifier("content", new LoadableDetachableModel() {
            @Override
            protected Object load() {
                return MessageFormat.format("Supergenerator Version {0} by Tremel Computer, Dieter Tremel", Globals.VERSION);
            }
        }));
        add(metaGenerator);
    }

Alles keine Zauberei, aber ganz praktisch, wenn man es braucht.