sf.wicklet.gwt.site.server.pages.Home.java Source code

Java tutorial

Introduction

Here is the source code for sf.wicklet.gwt.site.server.pages.Home.java

Source

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You should have received a copy of  the license along with this library.
 * You may also obtain a copy of the License at
 *         http://www.apache.org/licenses/LICENSE-2.0.
 */
package sf.wicklet.gwt.site.server.pages;

import java.io.File;
import java.util.TreeSet;
import org.apache.wicket.markup.IRootMarkup;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.request.IRequestParameters;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import sf.blacksun.util.FileUtil;
import sf.blacksun.util.FileUtil.FileTimestampComparator;
import sf.blacksun.util.net.IHttpConstants.HttpStatus;
import sf.blacksun.util.struct.ReversedComparator;
import sf.blacksun.util.text.XMLStringWriter;
import sf.wicklet.dsl.html.api.INode;
import sf.wicklet.ext.application.IWickletSupport;
import sf.wicklet.ext.components.link.SimpleLink;
import sf.wicklet.gwt.client.util.GwtXmlUtil;
import sf.wicklet.gwt.server.UserInfo;
import sf.wicklet.gwt.server.ajax.GwtAuthenticatedWebApplication;
import sf.wicklet.gwt.server.ajax.IGwtAjaxRequestHandler;
import sf.wicklet.gwt.server.ajax.IGwtAjaxTarget;
import sf.wicklet.gwt.server.ajax.impl.GwtAjaxWickletTarget;
import sf.wicklet.gwt.server.ajax.impl.GwtAjaxXmlTarget;
import sf.wicklet.gwt.server.behavior.WickletGwtAjaxBehavior;
import sf.wicklet.gwt.site.server.MyAuthenticatedWebSession;
import sf.wicklet.gwt.site.server.behavior.UserInfoBehavior;
import sf.wicklet.gwt.site.server.pages.p.Admin;
import sf.wicklet.gwt.site.server.pages.p.Login;
import sf.wicklet.gwt.site.server.pages.p.Logout;
import sf.wicklet.gwt.site.server.pages.p.User;
import sf.wicklet.gwt.site.server.pages.s.Service;
import sf.wicklet.gwt.site.server.support.WickletGwtSiteTemplate;
import sf.wicklet.gwt.site.shared.ICS;
import sf.wicklet.gwt.site.shared.Shared.Services;
import sf.wicklet.gwt.site.shared.WID;

/** Standard GWT application home page. */
public class Home extends WebPage {

    private static final long serialVersionUID = 1L;
    public static final String MODULE = "WickletGwtSiteHome";
    public static final String PATH = "/";
    public static final String TITLE = "Wicklet";
    public static final String PARAM_ACTION = "action";

    private static class Lazy {
        static IRootMarkup MARKUP = new WickletGwtSiteTemplate(MODULE, PATH) {
            @Override
            protected INode content() {
                final IWickletSupport support = GwtAuthenticatedWebApplication.get().getWickletSupport();
                return div(id(WID.bodyContent), div(id(WID.threePane), css(ICS.threePane),
                        div(id(WID.topPanel), a(id(WID.topHome), href(support.getContextPath(PATH)), txt("Home")),
                                component(id(WID.topUser)).span(),
                                a(id(WID.topLogin), href(support.getHttpsUrl(Login.PATH)), txt("Login")),
                                a(id(WID.topLogout), href(support.getHttpsUrl(Logout.PATH)), txt("Logout"))),
                        div(id(WID.leftPanel), div(id(WID.leftTopPanel)),
                                component(id(WID.wikiPanel)).div(css(ICS.wikiPanel),
                                        component(WID.wikiRepeater).a()),
                                component(id(WID.newsPanel)).div(css(ICS.newsPanel),
                                        component(WID.newsRepeater).a()),
                                component(id(WID.forumPanel)).div(css(ICS.forumPanel),
                                        component(WID.forumRepeater).a()),
                                component(id(WID.bugsPanel)).div(css(ICS.bugsPanel),
                                        component(WID.bugsRepeater).a())),
                        div(id(WID.rightPanel)), component(id(WID.commentPanel)).div()));
            }

            @Override
            protected INode headstart() {
                return top(super.headstart(), title(TITLE));
            }
        }.build();
    }

    public Home(final PageParameters params) {
        super(params);
        setStatelessHint(false);
        final IWickletSupport support = GwtAuthenticatedWebApplication.get().getWickletSupport();
        final MyAuthenticatedWebSession session = MyAuthenticatedWebSession.get();
        final String href = support.getHttpsUrl(session.isAdmin() ? Admin.PATH : User.PATH);
        final UserInfo userinfo = session.getUserInfo();
        add(new UserInfoBehavior(userinfo));
        add(new WebMarkupContainer(WID.topUser.toString()) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onRender() {
                if (userinfo != null) {
                    getResponse()
                            .write(new XMLStringWriter().element("a", GwtXmlUtil.escXml(userinfo.getUsername()),
                                    "id", WID.topUser.toString(), "href", href).toString());
                } else {
                    getResponse().write("<span id=\"" + WID.topUser + "\"></span>");
                }
            }
        });
        add(wikiPanel(), newsPanel(), forumPanel(), bugsPanel());
        add(new Label(WID.commentPanel.toString(), ""));
        add(new WickletGwtAjaxBehavior() {
            private static final long serialVersionUID = 1L;

            @Override
            public void onRequest() {
                final IRequestParameters p = getRequest().getRequestParameters();
                final String action = p.getParameterValue(PARAM_ACTION).toString();
                if (action != null) {
                    handleActions(p, action);
                }
            }
        });
    }

    void handleActions(final IRequestParameters p, final String action) {
        IGwtAjaxTarget target;
        if (Services.WikiComment.equalsIgnoreCase(action)) {
            target = Service.wikiComment(new GwtAjaxWickletTarget(this), p);
        } else {
            target = new GwtAjaxXmlTarget(this);
            target.error(HttpStatus.ServiceUnavailable, "ERROR: Invalid action: " + action, null);
        }
        final IGwtAjaxRequestHandler handler = GwtAuthenticatedWebApplication.get().getGwtAjaxSupport()
                .createGwtAjaxRequestHandler(this, target);
        RequestCycle.get().scheduleRequestHandlerAfterCurrent(handler);
    }

    @Override
    public IRootMarkup getAssociatedMarkup() {
        return Lazy.MARKUP;
    }

    private WebMarkupContainer wikiPanel() {
        final WebMarkupContainer ret = new WebMarkupContainer(WID.wikiPanel.toString());
        final RepeatingView r = new RepeatingView(WID.wikiRepeater.toString());
        for (final String name : new String[] { "home", "projects", "sources", "license", "about" }) {
            r.add(new SimpleLink(r.newChildId()).href("#" + name)
                    .body("" + Character.toUpperCase(name.charAt(0)) + name.substring(1)));
        }
        ret.add(r);
        return ret;
    }

    private WebMarkupContainer newsPanel() {
        final WebMarkupContainer ret = new WebMarkupContainer(WID.newsPanel.toString());
        final RepeatingView r = new RepeatingView(WID.newsRepeater.toString());
        ret.add(r);
        final IWickletSupport support = GwtAuthenticatedWebApplication.get().getWickletSupport();
        final File newsdir = support.getContextFile("/news");
        final TreeSet<File> set = new TreeSet<File>(
                new ReversedComparator<File>(FileTimestampComparator.getSingleton()));
        set.addAll(FileUtil.files(newsdir, ".*\\.html$"));
        for (final File filename : set) {
            final String base = FileUtil.basename(filename.getName());
            r.add(new SimpleLink(r.newChildId()).href("#" + base)
                    .body("" + Character.toUpperCase(base.charAt(0)) + base.substring(1)));
        }
        return ret;
    }

    private WebMarkupContainer forumPanel() {
        final WebMarkupContainer ret = new WebMarkupContainer(WID.forumPanel.toString());
        final RepeatingView r = new RepeatingView(WID.forumRepeater.toString());
        ret.add(r);
        r.add(new SimpleLink(r.newChildId()).href("#wiki-forum1").body("What the hell"));
        r.add(new SimpleLink(r.newChildId()).href("#wiki-forum2").body("What the ..."));
        return ret;
    }

    private WebMarkupContainer bugsPanel() {
        final WebMarkupContainer ret = new WebMarkupContainer(WID.bugsPanel.toString());
        final RepeatingView r = new RepeatingView(WID.bugsRepeater.toString());
        ret.add(r);
        r.add(new SimpleLink(r.newChildId()).href("#wiki-bugs134237").body("No bug today ..."));
        return ret;
    }
}