org.exoplatform.wcm.notification.plugin.FileActivityChildPlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.wcm.notification.plugin.FileActivityChildPlugin.java

Source

/*
 * Copyright (C) 2003-2013 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero 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 org.exoplatform.wcm.notification.plugin;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.jcr.Node;
import javax.jcr.RepositoryException;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.commons.api.notification.NotificationContext;
import org.exoplatform.commons.api.notification.model.ArgumentLiteral;
import org.exoplatform.commons.api.notification.model.NotificationInfo;
import org.exoplatform.commons.api.notification.plugin.AbstractNotificationChildPlugin;
import org.exoplatform.commons.api.notification.service.template.TemplateContext;
import org.exoplatform.commons.notification.NotificationUtils;
import org.exoplatform.commons.notification.template.TemplateUtils;
import org.exoplatform.commons.utils.CommonsUtils;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.container.xml.PortalContainerInfo;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.core.NodetypeConstant;
import org.exoplatform.services.wcm.friendly.FriendlyService;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.social.core.activity.model.ExoSocialActivity;
import org.exoplatform.social.core.manager.ActivityManager;
import org.exoplatform.social.notification.LinkProviderUtils;
import org.exoplatform.wcm.ext.component.activity.listener.Utils;
import org.exoplatform.webui.cssfile.CssClassIconFile;
import org.exoplatform.webui.cssfile.CssClassManager;
import org.exoplatform.webui.cssfile.CssClassUtils;

public class FileActivityChildPlugin extends AbstractNotificationChildPlugin {
    private static final Log LOG = ExoLogger.getLogger(FileActivityChildPlugin.class);
    public final static ArgumentLiteral<String> ACTIVITY_ID = new ArgumentLiteral<String>(String.class,
            "activityId");
    public final static String PRIVATE_FOLDER_PATH = "/Private/";
    public final static String ACTIVITY_URL = "view_full_activity";
    public static final String ID = "files:spaces";
    public static final String MESSAGE = "MESSAGE";
    public static final String REPOSITORY = "REPOSITORY";
    public static final String WORKSPACE = "WORKSPACE";
    public static final String DOCLINK = "DOCLINK";
    public static final String NODE_UUID = "id";
    public static final String AUTHOR = "author";
    public static final String MIME_TYPE = "mimeType";
    public static final String DOCUMENT_TITLE = "docTitle";
    public static final String CONTENT_NAME = "contentName";
    public static final String DOCUMENT_SUMMARY = "docSummary";
    public static final String EXO_RESOURCES_URI = "/eXoSkin/skin/images/themes/default/Icons/TypeIcons/EmailNotificationIcons/";
    public static final String DOCNAME = "DOCNAME";
    public static final String ICON_FILE_EXTENSION = ".png";

    private String mimeType;
    private String nodeUUID;
    private Node contentNode;
    private NodeLocation nodeLocation;
    private String documentTitle;
    private ExoSocialActivity activity;
    private String repository;
    private String workspace;
    private String baseURI;
    private String docName;

    public FileActivityChildPlugin(InitParams initParams) {
        super(initParams);
    }

    @Override
    public String makeContent(NotificationContext ctx) {
        try {
            ActivityManager activityM = CommonsUtils.getService(ActivityManager.class);

            NotificationInfo notification = ctx.getNotificationInfo();

            String language = getLanguage(notification);
            TemplateContext templateContext = new TemplateContext(ID, language);

            String activityId = notification.getValueOwnerParameter(ACTIVITY_ID.getKey());
            activity = activityM.getActivity(activityId);

            if (activity.isComment()) {
                activity = activityM.getParentActivity(activity);
            }

            //

            Map<String, String> templateParams = activity.getTemplateParams();
            getAndSetFileInfo(templateParams);

            //
            Node currentNode = getContentNode();

            // File uploaded to Content Explorer hasn't MESSAGE field
            String message = templateParams.get(MESSAGE) != null
                    ? NotificationUtils.processLinkTitle(templateParams.get(MESSAGE))
                    : "";

            templateContext.put("ACTIVITY_URL", LinkProviderUtils.getRedirectUrl(ACTIVITY_URL, activity.getId()));
            templateContext.put("ACTIVITY_TITLE", message);
            templateContext.put("DOCUMENT_TITLE", this.documentTitle);
            templateContext.put("SUMMARY", Utils.getSummary(currentNode));
            templateContext.put("SIZE", getSize(currentNode));
            templateContext.put("VERSION", getVersion(currentNode));
            templateContext.put("IS_VIDEO", this.mimeType.startsWith("video"));

            String thumbnailUrl = null;
            String docLink = templateParams.get(DOCLINK);
            String author = templateParams.get(AUTHOR);
            String receiver = notification.getTo();
            if (docLink != null && docLink.contains(author + PRIVATE_FOLDER_PATH)
                    && !(StringUtils.equals(author, receiver))) {
                templateContext.put("DEFAULT_THUMBNAIL_URL", getDefaultThumbnail());
            } else {
                thumbnailUrl = getThumbnailUrl(currentNode);
                if (thumbnailUrl == null) {
                    templateContext.put("DEFAULT_THUMBNAIL_URL", getDefaultThumbnail());
                }
            }

            templateContext.put("THUMBNAIL_URL", thumbnailUrl);

            //

            //
            String content = TemplateUtils.processGroovy(templateContext);
            return content;
        } catch (Exception e) {
            LOG.error("Failed at makeContent().", e);
            return (activity != null) ? activity.getTitle() : "";
        }
    }

    public String getActivityParamValue(String key) {
        Map<String, String> params = activity.getTemplateParams();
        if (params != null) {
            return params.get(key) != null ? params.get(key) : "";
        }
        return "";
    }

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public boolean isValid(NotificationContext ctx) {
        return false;
    }

    private void getAndSetFileInfo(Map<String, String> templateParams) {
        this.repository = templateParams.get(REPOSITORY);
        this.workspace = templateParams.get(WORKSPACE);
        this.nodeUUID = templateParams.get(NODE_UUID);
        this.mimeType = templateParams.get(MIME_TYPE);
        this.docName = templateParams.get(DOCNAME);

        String documentTitle = templateParams.get(DOCUMENT_TITLE);
        if (documentTitle != null) {
            this.documentTitle = documentTitle;
        } else {
            this.documentTitle = templateParams.get(CONTENT_NAME);
            ;
        }

        //get node data
        RepositoryService repositoryService = WCMCoreUtils.getService(RepositoryService.class);
        ManageableRepository manageRepo = null;
        try {
            manageRepo = repositoryService.getCurrentRepository();
            SessionProvider sessionProvider = CommonsUtils.getSystemSessionProvider();
            for (String ws : manageRepo.getWorkspaceNames()) {
                try {
                    this.contentNode = sessionProvider.getSession(ws, manageRepo).getNodeByUUID(this.nodeUUID);
                    break;
                } catch (RepositoryException e) {
                    continue;
                }
            }
        } catch (RepositoryException re) {
            LOG.error("Can not get the repository. ", re);
        }

        this.nodeLocation = NodeLocation.getNodeLocationByNode(contentNode);

        //
        this.baseURI = CommonsUtils.getCurrentDomain();
    }

    private Object getDefaultThumbnail() {
        String cssClass = CssClassUtils.getCSSClassByFileNameAndFileType(this.docName, this.mimeType,
                CssClassManager.ICON_SIZE.ICON_64);

        if (cssClass.indexOf(CssClassIconFile.DEFAULT_CSS) > 0) {
            return baseURI + EXO_RESOURCES_URI + "uiIcon64x64Templatent_file.png";
        }
        return baseURI + EXO_RESOURCES_URI + cssClass.split(" ")[0] + ICON_FILE_EXTENSION;
    }

    private String getThumbnailUrl(Node currentNode) {
        try {
            ExoContainer container = ExoContainerContext.getCurrentContainer();
            PortalContainerInfo containerInfo = (PortalContainerInfo) container
                    .getComponentInstanceOfType(PortalContainerInfo.class);
            String portalName = containerInfo.getContainerName();

            String restContextName = org.exoplatform.ecm.webui.utils.Utils.getRestContextName(portalName);
            String preferenceWS = currentNode.getSession().getWorkspace().getName();
            String encodedPath = URLEncoder.encode(currentNode.getPath(), "utf-8");
            encodedPath = encodedPath.replaceAll("%2F", "/");

            if (this.mimeType.startsWith("image")) {
                int imageWidth = getImageWidth(currentNode);
                int imageHeight = getImageHeight(currentNode);
                if (imageHeight > imageWidth && imageHeight > 300) {
                    imageWidth = (300 * imageWidth) / imageHeight;
                    imageHeight = 300;
                } else if (imageWidth > imageHeight && imageWidth > 300) {
                    imageHeight = (300 * imageHeight) / imageWidth;
                    imageWidth = 300;
                } else if (imageWidth == imageHeight && imageHeight > 300) {
                    imageWidth = 300;
                    imageHeight = 300;
                }

                return this.baseURI + "/" + portalName + "/" + restContextName + "/thumbnailImage/custom/"
                        + imageWidth + "x" + imageHeight + "/" + this.repository + "/" + preferenceWS + encodedPath;
            } else if (this.mimeType.indexOf("icon") >= 0) {
                return getWebdavURL();
            } else if (org.exoplatform.services.cms.impl.Utils.isSupportThumbnailView(mimeType)) {
                return this.baseURI + "/" + portalName + "/" + restContextName + "/thumbnailImage/big/"
                        + this.repository + "/" + preferenceWS + encodedPath;
            } else {
                return null;
            }

        } catch (Exception e) {
            LOG.debug("Cannot get thumbnail url");
        }
        return StringUtils.EMPTY;
    }

    private Node getContentNode() {
        return NodeLocation.getNodeByLocation(nodeLocation);
    }

    private String getSize(Node node) {
        double size = getFileSize(node);
        try {
            if (node.hasNode(org.exoplatform.ecm.webui.utils.Utils.JCR_CONTENT)) {
                return FileUtils.byteCountToDisplaySize((long) size);
            }
        } catch (Exception e) {
            return StringUtils.EMPTY;
        }
        return StringUtils.EMPTY;
    }

    private double getFileSize(Node node) {
        double fileSize = 0;
        try {
            if (node.hasNode(org.exoplatform.ecm.webui.utils.Utils.JCR_CONTENT)) {
                Node contentNode = node.getNode(org.exoplatform.ecm.webui.utils.Utils.JCR_CONTENT);
                if (contentNode.hasProperty(org.exoplatform.ecm.webui.utils.Utils.JCR_DATA)) {
                    fileSize = contentNode.getProperty(org.exoplatform.ecm.webui.utils.Utils.JCR_DATA).getLength();
                }
            }
        } catch (Exception ex) {
            fileSize = 0;
        }
        return fileSize;
    }

    private String getWebdavURL() throws Exception {
        contentNode = getContentNode();
        FriendlyService friendlyService = WCMCoreUtils.getService(FriendlyService.class);
        String link = "#";

        String portalName = PortalContainer.getCurrentPortalContainerName();
        String restContextName = PortalContainer.getCurrentRestContextName();
        if (this.contentNode.isNodeType("nt:frozenNode")) {
            String uuid = this.contentNode.getProperty("jcr:frozenUuid").getString();
            Node originalNode = this.contentNode.getSession().getNodeByUUID(uuid);
            link = baseURI + "/" + portalName + "/" + restContextName + "/jcr/" + this.repository + "/"
                    + this.workspace + originalNode.getPath() + "?version="
                    + this.contentNode.getParent().getName();
        } else {
            link = baseURI + "/" + portalName + "/" + restContextName + "/jcr/" + this.repository + "/"
                    + this.workspace + this.contentNode.getPath();
        }

        return friendlyService.getFriendlyUri(link);
    }

    private int getImageWidth(Node node) {
        int imageWidth = 0;
        try {
            if (node.hasNode(NodetypeConstant.JCR_CONTENT))
                node = node.getNode(NodetypeConstant.JCR_CONTENT);
            ImageReader reader = ImageIO.getImageReadersByMIMEType(mimeType).next();
            ImageInputStream iis = ImageIO.createImageInputStream(node.getProperty("jcr:data").getStream());
            reader.setInput(iis, true);
            imageWidth = reader.getWidth(0);
            iis.close();
            reader.dispose();
        } catch (RepositoryException | IOException e) {
            if (LOG.isWarnEnabled()) {
                LOG.warn("Can not get image width in " + this.getClass().getName());
            }
        }
        return imageWidth;
    }

    private int getImageHeight(Node node) {
        int imageHeight = 0;
        try {
            if (node.hasNode(NodetypeConstant.JCR_CONTENT))
                node = node.getNode(NodetypeConstant.JCR_CONTENT);
            ImageReader reader = ImageIO.getImageReadersByMIMEType(mimeType).next();
            ImageInputStream iis = ImageIO.createImageInputStream(node.getProperty("jcr:data").getStream());
            reader.setInput(iis, true);
            imageHeight = reader.getHeight(0);
            iis.close();
            reader.dispose();
        } catch (RepositoryException | IOException e) {
            if (LOG.isWarnEnabled()) {
                LOG.warn("Can not get image height in " + this.getClass().getName());
            }
        }
        return imageHeight;
    }

    private int getVersion(Node node) {
        String currentVersion = null;
        try {
            currentVersion = contentNode.getBaseVersion().getName();
            if (currentVersion.contains("jcr:rootVersion"))
                currentVersion = "0";
        } catch (Exception e) {
            currentVersion = "0";
        }
        return Integer.parseInt(currentVersion);
    }
}