com.tysanclan.site.projectewok.components.TysanMemberPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.tysanclan.site.projectewok.components.TysanMemberPanel.java

Source

/**
 * Tysan Clan Website
 * Copyright (C) 2008-2013 Jeroen Steenbeeke and Ties van de Ven
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.tysanclan.site.projectewok.components;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.odlabs.wiquery.ui.dialog.Dialog;

import com.jeroensteenbeeke.hyperion.data.ModelMaker;
import com.tysanclan.site.projectewok.TysanSession;
import com.tysanclan.site.projectewok.TysanTopPanel;
import com.tysanclan.site.projectewok.auth.TysanMemberSecured;
import com.tysanclan.site.projectewok.beans.ForumService;
import com.tysanclan.site.projectewok.beans.MembershipService;
import com.tysanclan.site.projectewok.beans.UserService;
import com.tysanclan.site.projectewok.entities.ConversationParticipation;
import com.tysanclan.site.projectewok.entities.Message;
import com.tysanclan.site.projectewok.entities.MumbleServer;
import com.tysanclan.site.projectewok.entities.User;
import com.tysanclan.site.projectewok.entities.dao.ConversationParticipationDAO;
import com.tysanclan.site.projectewok.entities.dao.MumbleServerDAO;
import com.tysanclan.site.projectewok.entities.dao.filters.ConversationParticipationFilter;
import com.tysanclan.site.projectewok.pages.ForumOverviewPage;
import com.tysanclan.site.projectewok.pages.member.MessageListPage;
import com.tysanclan.site.projectewok.pages.member.OverviewPage;

/**
 * @author Jeroen Steenbeeke
 */
@TysanMemberSecured
public class TysanMemberPanel extends TysanTopPanel {
    private static final long serialVersionUID = 1L;

    @SpringBean
    private MembershipService memberService;

    @SpringBean
    private ForumService forumService;

    @SpringBean
    private MumbleServerDAO serverDAO;

    @SpringBean
    private UserService userService;

    public TysanMemberPanel(String id, User user) {
        super(id, ModelMaker.wrap(user));

        forumService.addUnreadPosts(user);

        memberService.registerAction(user);

        addForumLink();
        addOverviewLink();

        addMembersOnlineLink();

        addMessageLink(user);

        add(new LogoutLink("logout"));
    }

    private void addMessageLink(User user) {
        Link<Void> messageLink = new Link<Void>("messages") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick() {
                setResponsePage(new MessageListPage());
            }
        };

        messageLink.add(new Label("count", new UnreadMessagesModel(user)));

        add(messageLink);
    }

    /**
     * 
     */
    private void addForumLink() {
        Link<Void> link = new Link<Void>("forums") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick() {
                setResponsePage(new ForumOverviewPage());

            }

        };

        TysanSession session = (TysanSession) Session.get();

        link.add(new Label("count", new Model<Integer>(
                (session != null && session.getUser() != null) ? forumService.countUnread(session.getUser()) : 0)));

        add(link);
    }

    /**
    */
    private Dialog addMembersOnlineLink() {
        Dialog window = new Dialog("onlinewindow");
        window.setTitle("Members online");
        window.setOutputMarkupId(true);
        window.setOutputMarkupPlaceholderTag(true);
        window.setWidth(400);

        window.add(new OtterSniperPanel("otterSniperPanel", 4));

        AjaxLink<Dialog> link = new AjaxLink<Dialog>("online", new Model<Dialog>(window)) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                if (target != null) {
                    target.appendJavaScript(getModelObject().open().render().toString());
                }

            }

        };

        link.add(new Label("count", new MembersOnlineCountModel()).setOutputMarkupId(true));

        window.add(new ListView<User>("members", ModelMaker.wrap(userService.getMembersOnline())) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<User> item) {
                MemberListItem memberLink = new MemberListItem("link", item.getModelObject());

                item.add(memberLink);

            }

        });

        window.add(new ListView<MumbleServer>("servers", ModelMaker.wrap(serverDAO.findAll())) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<MumbleServer> item) {
                MumbleServer server = item.getModelObject();

                item.add(new WebMarkupContainer("server")
                        .add(AttributeModifier.replace("data-token", server.getApiToken()))
                        .add(AttributeModifier.replace("data-id", server.getServerID())));

                item.add(new ExternalLink("url", server.getUrl()).setBody(Model.of(server.getUrl())));
                item.add(new Label("password", server.getPassword()));

            }

        });

        add(link);
        add(window);
        return window;
    }

    /**
     * 
     */
    private void addOverviewLink() {
        add(new Link<Void>("overview") {
            private static final long serialVersionUID = 1L;

            /**
             * @see org.apache.wicket.markup.html.link.Link#onClick()
             */
            @Override
            public void onClick() {
                setResponsePage(new OverviewPage());
            }
        });
    }

    private static class MembersOnlineCountModel implements IModel<Integer> {
        private static final long serialVersionUID = 1L;

        @SpringBean
        private UserService _service;

        @SpringBean
        private MumbleServerDAO mumbleDAO;

        /**
         * @see org.apache.wicket.model.IModel#getObject()
         */
        @Override
        public Integer getObject() {
            if (_service == null) {
                Injector.get().inject(this);
            }

            return _service.getMembersOnline().size();
        }

        /**
         * @see org.apache.wicket.model.IModel#setObject(java.lang.Object)
         */
        @Override
        public void setObject(Integer object) {
            throw new UnsupportedOperationException("setObject not allowed on a read-only model");
        }

        /**
         * @see org.apache.wicket.model.IDetachable#detach()
         */
        @Override
        public void detach() {
            _service = null;

        }
    }

    private static class UnreadMessagesModel implements IModel<Integer> {
        private static final long serialVersionUID = 1L;

        private IModel<User> userModel;

        @SpringBean
        private ConversationParticipationDAO _service;

        /**
         * 
         */
        public UnreadMessagesModel(User user) {
            userModel = ModelMaker.wrap(user);
        }

        /**
         * @see org.apache.wicket.model.IModel#getObject()
         */
        @Override
        public Integer getObject() {
            if (_service == null) {
                Injector.get().inject(this);
            }

            ConversationParticipationFilter filter = new ConversationParticipationFilter();
            filter.setUser(userModel.getObject());

            List<ConversationParticipation> participations = _service.findByFilter(filter);

            int count = 0;

            for (ConversationParticipation participation : participations) {
                Set<Message> unread = new HashSet<Message>();
                unread.addAll(participation.getConversation().getMessages());
                unread.removeAll(participation.getReadMessages());
                count += unread.size();
            }

            return count;
        }

        /**
         * @see org.apache.wicket.model.IModel#setObject(java.lang.Object)
         */
        @Override
        public void setObject(Integer object) {
            throw new UnsupportedOperationException("Can not set object on read-only model");

        }

        /**
         * @see org.apache.wicket.model.IDetachable#detach()
         */
        @Override
        public void detach() {
            userModel.detach();
            _service = null;
        }

    }
}