org.apache.openmeetings.web.admin.rooms.RoomForm.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openmeetings.web.admin.rooms.RoomForm.java

Source

/*
 * 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.openmeetings.web.admin.rooms;

import static org.apache.openmeetings.web.app.Application.getBean;
import static org.apache.openmeetings.web.app.WebSession.getSid;
import static org.apache.openmeetings.web.app.WebSession.getUserId;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.apache.openmeetings.db.dao.room.RoomDao;
import org.apache.openmeetings.db.dao.server.ISessionManager;
import org.apache.openmeetings.db.dao.user.GroupDao;
import org.apache.openmeetings.db.dao.user.IUserService;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.room.Client;
import org.apache.openmeetings.db.entity.room.Room;
import org.apache.openmeetings.db.entity.room.RoomGroup;
import org.apache.openmeetings.db.entity.room.RoomModerator;
import org.apache.openmeetings.db.entity.user.Address;
import org.apache.openmeetings.db.entity.user.Group;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.web.admin.AdminBaseForm;
import org.apache.openmeetings.web.admin.AdminUserChoiceProvider;
import org.apache.openmeetings.web.app.Application;
import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
import org.apache.openmeetings.web.util.RoomTypeDropDown;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.time.Duration;
import org.wicketstuff.select2.ChoiceProvider;
import org.wicketstuff.select2.Response;
import org.wicketstuff.select2.Select2Choice;
import org.wicketstuff.select2.Select2MultiChoice;

public class RoomForm extends AdminBaseForm<Room> {
    private static final long serialVersionUID = 1L;
    private final static List<Long> DROPDOWN_NUMBER_OF_PARTICIPANTS = Arrays.asList(2L, 4L, 6L, 8L, 10L, 12L, 14L,
            16L, 20L, 25L, 32L, 50L, 100L, 150L, 200L, 500L, 1000L);
    private final WebMarkupContainer roomList;
    private final TextField<String> pin;
    private final WebMarkupContainer moderatorContainer = new WebMarkupContainer("moderatorContainer");
    private final WebMarkupContainer clientsContainer = new WebMarkupContainer("clientsContainer");
    private final ListView<Client> clients;
    private List<Client> clientsInRoom = null;
    private IModel<User> moderator2add = Model.of((User) null);

    public RoomForm(String id, WebMarkupContainer roomList, final Room room) {
        super(id, new CompoundPropertyModel<Room>(room));
        this.roomList = roomList;
        setOutputMarkupId(true);
        RequiredTextField<String> name = new RequiredTextField<String>("name");
        name.setLabel(new Model<String>(Application.getString(193)));
        add(name);

        add(new DropDownChoice<Long>("numberOfPartizipants", //
                DROPDOWN_NUMBER_OF_PARTICIPANTS, //
                new ChoiceRenderer<Long>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public Object getDisplayValue(Long id) {
                        return id;
                    }

                    @Override
                    public String getIdValue(Long id, int index) {
                        return "" + id;
                    }
                }));

        add(new RoomTypeDropDown("type").setRequired(true).setLabel(Model.of(Application.getString(194))));

        add(new TextArea<String>("comment"));

        add(new CheckBox("appointment").setEnabled(false));
        add(new CheckBox("ispublic"));

        List<Group> orgList = Application.getBean(GroupDao.class).get(0, Integer.MAX_VALUE);
        final List<RoomGroup> orgRooms = new ArrayList<RoomGroup>(orgList.size());
        for (Group org : orgList) {
            orgRooms.add(new RoomGroup(org, getModelObject()));
        }
        add(new Select2MultiChoice<RoomGroup>("roomGroups", null, new ChoiceProvider<RoomGroup>() {
            private static final long serialVersionUID = 1L;

            @Override
            public String getDisplayValue(RoomGroup choice) {
                String name = choice.getGroup().getName();
                return name == null ? "" : name;
            }

            @Override
            public String getIdValue(RoomGroup choice) {
                Long id = choice.getGroup().getId();
                return id == null ? null : "" + id;
            }

            @Override
            public void query(String term, int page, Response<RoomGroup> response) {
                for (RoomGroup or : orgRooms) {
                    if (Strings.isEmpty(term) || or.getGroup().getName().contains(term)) {
                        response.add(or);
                    }
                }
            }

            @Override
            public Collection<RoomGroup> toChoices(Collection<String> _ids) {
                List<Long> ids = new ArrayList<Long>();
                for (String id : _ids) {
                    ids.add(Long.valueOf(id));
                }
                List<RoomGroup> list = new ArrayList<RoomGroup>();
                for (Group o : getBean(GroupDao.class).get(ids)) {
                    list.add(new RoomGroup(o, RoomForm.this.getModelObject()));
                }
                return list;
            }
        }));

        add(new CheckBox("isDemoRoom"));
        TextField<Integer> demoTime = new TextField<Integer>("demoTime");
        demoTime.setLabel(new Model<String>(Application.getString(637)));
        add(demoTime);
        add(new CheckBox("allowUserQuestions"));
        add(new CheckBox("audioOnly"));
        add(new CheckBox("allowFontStyles"));
        add(new CheckBox("closed"));
        add(new TextField<String>("redirectURL"));
        add(new CheckBox("waitForRecording"));
        add(new CheckBox("allowRecording"));

        add(new CheckBox("hideTopBar"));
        add(new CheckBox("chatHidden"));
        add(new CheckBox("activitiesHidden"));
        add(new CheckBox("hideFilesExplorer"));
        add(new CheckBox("hideActionsMenu"));
        add(new CheckBox("hideScreenSharing"));
        add(new CheckBox("hideWhiteboard"));
        add(new CheckBox("showMicrophoneStatus"));
        add(new CheckBox("chatModerated"));
        add(new CheckBox("chatOpened"));
        add(new CheckBox("filesOpened"));
        add(new CheckBox("autoVideoSelect"));

        // Users in this Room 
        clients = new ListView<Client>("clients", clientsInRoom) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<Client> item) {
                Client client = item.getModelObject();
                item.add(new Label("clientId", "" + client.getId()))
                        .add(new Label("clientLogin", "" + client.getUsername()))
                        .add(new ConfirmableAjaxBorder("clientDelete", getString("80"), getString("833")) {
                            private static final long serialVersionUID = 1L;

                            @Override
                            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                                Client c = item.getModelObject();
                                getBean(IUserService.class).kickUserByStreamId(getSid(), c.getStreamid(),
                                        c.getServer() == null ? 0 : c.getServer().getId());

                                updateClients(target);
                            }
                        });
            }
        };
        add(clientsContainer.add(clients.setOutputMarkupId(true)).setOutputMarkupId(true));

        // Moderators
        final Select2Choice<User> moderatorChoice = new Select2Choice<User>("moderator2add", moderator2add,
                new AdminUserChoiceProvider() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void query(String term, int page, Response<User> response) {
                        response.addAll(getBean(UserDao.class).get(term, false, page * PAGE_SIZE, PAGE_SIZE));
                        response.setHasMore(PAGE_SIZE == response.getResults().size());
                    }

                    @Override
                    public String getDisplayValue(User choice) {
                        Address a = choice.getAddress();
                        return String.format("\"%s %s\" <%s>", choice.getFirstname(), choice.getLastname(),
                                a == null ? "" : a.getEmail());
                    }
                });
        add(moderatorChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                Room r = RoomForm.this.getModelObject();
                User u = moderator2add.getObject();
                boolean found = false;
                if (u != null) {
                    if (r.getModerators() == null) {
                        r.setModerators(new ArrayList<RoomModerator>());
                    }
                    for (RoomModerator rm : r.getModerators()) {
                        if (rm.getUser().getId().equals(u.getId())) {
                            found = true;
                            break;
                        }
                    }
                    if (!found) {
                        RoomModerator rm = new RoomModerator();
                        rm.setRoomId(r.getId());
                        rm.setUser(u);
                        r.getModerators().add(0, rm);
                        moderator2add.setObject(null);
                        target.add(moderatorContainer, moderatorChoice);
                    }
                }
            }
        }).setOutputMarkupId(true));
        add(moderatorContainer.add(new ListView<RoomModerator>("moderators") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<RoomModerator> item) {
                RoomModerator moderator = item.getModelObject();
                Label name = new Label("uName",
                        moderator.getUser().getFirstname() + " " + moderator.getUser().getLastname());
                if (moderator.getId() == null) {
                    name.add(AttributeAppender.append("class", "newItem"));
                }
                item.add(new CheckBox("superModerator", new PropertyModel<Boolean>(moderator, "superModerator")))
                        .add(new Label("userId", "" + moderator.getUser().getId())).add(name)
                        .add(new Label("email", moderator.getUser().getAddress().getEmail()))
                        .add(new ConfirmableAjaxBorder("delete", getString("80"), getString("833")) {
                            private static final long serialVersionUID = 1L;

                            @Override
                            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                                RoomForm.this.getModelObject().getModerators().remove(item.getIndex());
                                target.add(moderatorContainer);
                            }
                        });
            }
        }).setOutputMarkupId(true));

        add(new CheckBox("moderated"));

        add(new TextField<String>("confno").setEnabled(false));
        add(pin = new TextField<String>("pin"));
        pin.setEnabled(room.isSipEnabled());
        add(new TextField<String>("ownerId").setEnabled(false));
        add(new AjaxCheckBox("sipEnabled") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                updateView(target);
            }
        }.setOutputMarkupId(true));

        // attach an ajax validation behavior to all form component's keydown
        // event and throttle it down to once per second
        add(new AjaxFormValidatingBehavior("keydown", Duration.ONE_SECOND));
    }

    void updateClients(AjaxRequestTarget target) {
        long roomId = (getModelObject().getId() != null ? getModelObject().getId() : 0);
        final List<Client> clientsInRoom = Application.getBean(ISessionManager.class).getClientListByRoom(roomId);
        clients.setDefaultModelObject(clientsInRoom);
        target.add(clientsContainer);
    }

    @Override
    protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
        Room r = getModelObject();
        boolean newRoom = r.getId() == null;
        r = getBean(RoomDao.class).update(r, getUserId());
        if (newRoom) {
            for (RoomModerator rm : r.getModerators()) {
                rm.setRoomId(r.getId());
            }
            // FIXME double update
            getBean(RoomDao.class).update(getModelObject(), getUserId());
        }
        hideNewRecord();
        updateView(target);
    }

    @Override
    protected void onSaveError(AjaxRequestTarget target, Form<?> form) {
        // TODO Auto-generated method stub
    }

    @Override
    protected void onNewSubmit(AjaxRequestTarget target, Form<?> form) {
        setModelObject(new Room());
        updateView(target);
    }

    @Override
    protected void onNewError(AjaxRequestTarget target, Form<?> form) {
        // TODO Auto-generated method stub
    }

    @Override
    protected void onRefreshSubmit(AjaxRequestTarget target, Form<?> form) {
        Room r = getModelObject();
        if (r.getId() != null) {
            r = getBean(RoomDao.class).get(r.getId());
        } else {
            r = new Room();
        }
        setModelObject(r);
        updateView(target);
    }

    @Override
    protected void onRefreshError(AjaxRequestTarget target, Form<?> form) {
        // TODO Auto-generated method stub
    }

    @Override
    protected void onDeleteSubmit(AjaxRequestTarget target, Form<?> form) {
        getBean(RoomDao.class).delete(getModelObject(), getUserId());
        target.add(roomList);
        setModelObject(new Room());
        updateView(target);
    }

    @Override
    protected void onDeleteError(AjaxRequestTarget target, Form<?> form) {
        // TODO Auto-generated method stub
    }

    public void updateView(AjaxRequestTarget target) {
        target.add(this);
        target.add(roomList);
        target.add(pin.setEnabled(getModelObject().isSipEnabled()));
        updateClients(target);
        target.appendJavaScript("omRoomPanelInit();");
    }

    @Override
    protected void onDetach() {
        moderator2add.detach();
        super.onDetach();
    }
}