org.benjp.portlet.chat.ChatApplication.java Source code

Java tutorial

Introduction

Here is the source code for org.benjp.portlet.chat.ChatApplication.java

Source

/*
 * Copyright (C) 2012 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.benjp.portlet.chat;

import juzu.*;
import juzu.plugin.ajax.Ajax;
import juzu.request.RenderContext;
import juzu.request.ResourceContext;
import juzu.template.Template;
import org.apache.commons.fileupload.FileItem;
import org.benjp.bean.File;
import org.benjp.listener.ServerBootstrap;
import org.benjp.model.SpaceBean;
import org.benjp.model.SpaceBeans;
import org.benjp.services.ChatService;
import org.benjp.services.UserService;
import org.benjp.utils.PropertyManager;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.social.core.space.model.Space;
import org.exoplatform.social.core.space.spi.SpaceService;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.portlet.PortletPreferences;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Logger;

@SessionScoped
public class ChatApplication {

    @Inject
    @Path("index.gtmpl")
    Template index;

    String token_ = "---";
    String remoteUser_ = null;
    String fullname_ = null;
    boolean isAdmin_ = false;
    Boolean isTeamAdmin_ = null;

    boolean profileInitialized_ = false;

    Logger log = Logger.getLogger("ChatApplication");

    OrganizationService organizationService_;

    SpaceService spaceService_;

    @Inject
    Provider<PortletPreferences> providerPreferences;

    @Inject
    DocumentsData documentsData_;

    @Inject
    CalendarService calendarService_;

    @Inject
    WikiService wikiService_;

    @Inject
    public ChatApplication(OrganizationService organizationService, SpaceService spaceService) {
        organizationService_ = organizationService;
        spaceService_ = spaceService;
    }

    @View
    public Response.Content index(RenderContext renderContext) {
        remoteUser_ = renderContext.getSecurityContext().getRemoteUser();
        boolean isPublic = (remoteUser_ == null);
        if (isPublic)
            remoteUser_ = UserService.ANONIM_USER;
        String chatServerURL = PropertyManager.getProperty(PropertyManager.PROPERTY_CHAT_SERVER_URL);
        String chatIntervalChat = PropertyManager.getProperty(PropertyManager.PROPERTY_INTERVAL_CHAT);
        String chatIntervalSession = PropertyManager.getProperty(PropertyManager.PROPERTY_INTERVAL_SESSION);
        String chatIntervalStatus = PropertyManager.getProperty(PropertyManager.PROPERTY_INTERVAL_STATUS);
        String chatIntervalUsers = PropertyManager.getProperty(PropertyManager.PROPERTY_INTERVAL_USERS);
        String chatWeemoKey = PropertyManager.getProperty(PropertyManager.PROPERTY_WEEMO_KEY);
        String publicModeEnabled = PropertyManager.getProperty(PropertyManager.PROPERTY_PUBLIC_MODE);
        String servicesImplementation = PropertyManager
                .getProperty(PropertyManager.PROPERTY_SERVICES_IMPLEMENTATION);
        String dbServerMode = PropertyManager.getProperty(PropertyManager.PROPERTY_SERVER_TYPE);
        String demoMode = (PropertyManager.PROPERTY_SERVER_TYPE_EMBED.equals(dbServerMode)
                || PropertyManager.PROPERTY_SERVICE_IMPL_JCR.equals(servicesImplementation)) ? "DEV" : "PROD";

        String fullname = (fullname_ == null) ? remoteUser_ : fullname_;

        PortletPreferences portletPreferences = providerPreferences.get();
        String view = portletPreferences.getValue("view", "responsive");
        if (!"normal".equals(view) && !"responsive".equals(view) && !"public".equals(view))
            view = "responsive";

        String fullscreen = portletPreferences.getValue("fullscreen", "false");

        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
        Date today = Calendar.getInstance().getTime();
        String todayDate = df.format(today);

        return index.with().set("user", remoteUser_).set("room", "noroom").set("token", token_)
                .set("chatServerURL", chatServerURL).set("fullname", fullname)
                .set("chatIntervalChat", chatIntervalChat).set("chatIntervalSession", chatIntervalSession)
                .set("chatIntervalStatus", chatIntervalStatus).set("chatIntervalUsers", chatIntervalUsers)
                .set("publicMode", isPublic).set("publicModeEnabled", publicModeEnabled).set("view", view)
                .set("fullscreen", fullscreen).set("weemoKey", chatWeemoKey).set("demoMode", demoMode)
                .set("today", todayDate).ok().withMetaTag("viewport", "width=device-width, initial-scale=1.0")
                .withStylesheets("chat-" + view);

    }

    @Ajax
    @Resource
    public Response.Content maintainSession() {
        return Response.ok("OK").withMimeType("text/html; charset=UTF-8").withHeader("Cache-Control", "no-cache");
    }

    @Ajax
    @Resource
    public Response.Content initChatProfile() {
        String out = "{\"token\": \"" + token_ + "\", \"fullname\": \"" + fullname_
                + "\", \"msg\": \"nothing to update\", \"isAdmin\": \"" + isAdmin_ + "\", \"isTeamAdmin\": \""
                + isTeamAdmin_ + "\"}";
        if (!profileInitialized_ && !UserService.ANONIM_USER.equals(remoteUser_)) {
            try {
                // Generate and store token if doesn't exist yet.
                token_ = ServerBootstrap.getToken(remoteUser_);

                // Add User in the DB
                addUser(remoteUser_, token_);

                // Set user's Full Name in the DB
                saveFullNameAndEmail(remoteUser_);

                if ("true".equals(PropertyManager.getProperty(PropertyManager.PROPERTY_PUBLIC_MODE))) {
                    Collection ms = organizationService_.getMembershipHandler().findMembershipsByUserAndGroup(
                            remoteUser_, PropertyManager.getProperty(PropertyManager.PROPERTY_PUBLIC_ADMIN_GROUP));
                    isAdmin_ = (ms != null && ms.size() > 0);
                }

                if (isTeamAdmin_ == null) {
                    Collection ms = organizationService_.getMembershipHandler().findMembershipsByUserAndGroup(
                            remoteUser_, PropertyManager.getProperty(PropertyManager.PROPERTY_TEAM_ADMIN_GROUP));
                    isTeamAdmin_ = (ms != null && ms.size() > 0);
                }

                if (!UserService.ANONIM_USER.equals(remoteUser_)) {
                    fullname_ = ServerBootstrap.getUserFullName(remoteUser_);
                    ServerBootstrap.setAsAdmin(remoteUser_, isAdmin_);
                }

                out = "{\"token\": \"" + token_ + "\", \"fullname\": \"" + fullname_
                        + "\", \"msg\": \"updated\", \"isAdmin\": \"" + isAdmin_ + "\", \"isTeamAdmin\": \""
                        + isTeamAdmin_ + "\"}";
                profileInitialized_ = true;
            } catch (Exception e) {
                e.printStackTrace();
                profileInitialized_ = false;
                return Response.notFound("Error during init, try later");
            }
        }
        if (!UserService.ANONIM_USER.equals(remoteUser_)) {
            // Set user's Spaces in the DB
            saveSpaces(remoteUser_);
        }

        return Response.ok(out).withMimeType("text/event-stream; charset=UTF-8").withHeader("Cache-Control",
                "no-cache");

    }

    @Resource
    @Ajax
    public Response.Content upload(String room, String targetUser, String targetFullname, FileItem userfile,
            ResourceContext resourceContext) {
        log.info("file upload in " + room);
        if (userfile.isFormField()) {
            String fieldName = userfile.getFieldName();
            if ("room".equals(fieldName)) {
                room = userfile.getString();
                log.info("room : " + room);
            }
        }
        if (userfile.getFieldName().equals("userfile")) {

            String uuid = null;
            if (targetUser.startsWith(ChatService.SPACE_PREFIX)) {
                uuid = documentsData_.storeFile(userfile, targetFullname, false);
            } else {
                remoteUser_ = resourceContext.getSecurityContext().getRemoteUser();
                uuid = documentsData_.storeFile(userfile, remoteUser_, true);
                documentsData_.setPermission(uuid, targetUser);
            }
            File file = documentsData_.getNode(uuid);

            log.info(file.toJSON());

            return Response.ok(file.toJSON()).withMimeType("application/json; charset=UTF-8")
                    .withHeader("Cache-Control", "no-cache");
        }

        return Response.ok("{\"status\":\"File has not been uploaded !\"}")
                .withMimeType("application/json; charset=UTF-8").withHeader("Cache-Control", "no-cache");
    }

    @Ajax
    @Resource
    public Response.Content createTask(String username, String dueDate, String task) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
        Date today = new Date();
        today.setHours(0);
        today.setMinutes(0);
        try {
            calendarService_.saveTask(remoteUser_, username, task, today, sdf.parse(dueDate + " 23:59"));
        } catch (ParseException e) {
            log.info("parse exception during task creation");
            return Response.notFound("Error during task creation");
        } catch (Exception e) {
            log.info("exception during task creation");
            return Response.notFound("Error during task creation");
        }

        return Response.ok("{\"status\":\"ok\"}").withMimeType("application/json; charset=UTF-8")
                .withHeader("Cache-Control", "no-cache");

    }

    @Ajax
    @Resource
    public Response.Content createEvent(String space, String users, String summary, String startDate,
            String startTime, String endDate, String endTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
        try {
            calendarService_.saveEvent(remoteUser_, space, users, summary, sdf.parse(startDate + " " + startTime),
                    sdf.parse(endDate + " " + endTime));

        } catch (ParseException e) {
            log.info("parse exception during task creation");
            return Response.notFound("Error during task creation");
        } catch (Exception e) {
            log.info("exception during task creation");
            return Response.notFound("Error during task creation");
        }

        return Response.ok("{\"status\":\"ok\"}").withMimeType("application/json; charset=UTF-8")
                .withHeader("Cache-Control", "no-cache");

    }

    @Ajax
    @Resource
    public Response.Content saveWiki(String targetFullname, String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH-mm");
        String group = null, title = null, path = "";
        Space spaceBean = spaceService_.getSpaceByDisplayName(targetFullname);
        if (spaceBean != null) // Space use case
        {
            group = spaceBean.getGroupId();
            if (group.startsWith("/"))
                group = group.substring(1);
            title = "Meeting " + sdf.format(new Date());
            path = wikiService_.createSpacePage(title, content, group);
        } else // Team use case
        {
            title = targetFullname + " Meeting " + sdf.format(new Date());
            path = wikiService_.createIntranetPage(title, content);
        }
        path = ServerBootstrap.getServerBase() + path;

        return Response.ok("{\"status\":\"ok\", \"path\":\"" + path + "\"}")
                .withMimeType("application/json; charset=UTF-8").withHeader("Cache-Control", "no-cache");

    }

    public Response.Content createDemoUser(String fullname, String email, String isPublic) {
        String out = "created";
        boolean isPublicUser = "true".equals(isPublic);

        String username = UserService.ANONIM_USER
                + fullname.trim().toLowerCase().replace(" ", "-").replace(".", "-");
        remoteUser_ = username;
        token_ = ServerBootstrap.getToken(remoteUser_);
        addUser(remoteUser_, token_);
        ServerBootstrap.addUserFullNameAndEmail(username, fullname, email);
        ServerBootstrap.setAsAdmin(username, false);
        if (!isPublicUser)
            saveDemoSpace(username);

        StringBuffer json = new StringBuffer();
        json.append("{ \"username\": \"").append(remoteUser_).append("\"");
        json.append(", \"token\": \"").append(token_).append("\" }");

        return Response.ok(json).withMimeType("text/html; charset=UTF-8").withHeader("Cache-Control", "no-cache");
    }

    protected void addUser(String remoteUser, String token) {
        ServerBootstrap.addUser(remoteUser, token);
    }

    protected String saveFullNameAndEmail(String username) {
        String fullname = username;
        try {

            fullname = ServerBootstrap.getUserFullName(username);
            if (fullname == null) {
                User user = organizationService_.getUserHandler().findUserByName(username);
                if (user != null) {
                    fullname = user.getFirstName() + " " + user.getLastName();
                    ServerBootstrap.addUserFullNameAndEmail(username, fullname, user.getEmail());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return fullname;
    }

    protected void setAsAdmin(String username, boolean isAdmin) {
        try {

            ServerBootstrap.setAsAdmin(username, isAdmin);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void saveSpaces(String username) {
        try {
            ListAccess<Space> spacesListAccess = spaceService_.getAccessibleSpacesWithListAccess(username);
            List<Space> spaces = Arrays.asList(spacesListAccess.load(0, spacesListAccess.getSize()));
            ArrayList<SpaceBean> beans = new ArrayList<SpaceBean>();
            for (Space space : spaces) {
                SpaceBean spaceBean = new SpaceBean();
                spaceBean.setDisplayName(space.getDisplayName());
                spaceBean.setGroupId(space.getGroupId());
                spaceBean.setId(space.getId());
                spaceBean.setShortName(space.getShortName());
                beans.add(spaceBean);
            }
            ServerBootstrap.setSpaces(username, new SpaceBeans(beans));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    protected void saveDemoSpace(String username) {
        try {
            ArrayList<SpaceBean> beans = new ArrayList<SpaceBean>();
            SpaceBean spaceBean = new SpaceBean();
            spaceBean.setDisplayName("Welcome Space");
            spaceBean.setGroupId("/public");
            spaceBean.setId("welcome_space");
            spaceBean.setShortName("welcome_space");
            beans.add(spaceBean);

            ServerBootstrap.setSpaces(username, new SpaceBeans(beans));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}