com.liferay.faces.demos.bean.DocLibModelBean.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.faces.demos.bean.DocLibModelBean.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library 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 library 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.
 */
package com.liferay.faces.demos.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.MenuModel;
import org.primefaces.model.TreeNode;

import com.liferay.faces.util.logging.Logger;
import com.liferay.faces.util.logging.LoggerFactory;
import com.liferay.faces.demos.list.DocumentDataModel;
import com.liferay.faces.demos.tree.FolderTreeModel;
import com.liferay.faces.portal.context.LiferayFacesContext;
import com.liferay.faces.util.helper.LongHelper;

import com.liferay.portal.NoSuchGroupException;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.model.Group;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.service.GroupServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;

import com.liferay.portlet.documentlibrary.model.DLFolder;
import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
import com.liferay.portlet.documentlibrary.model.DLFileEntry;
import com.liferay.portlet.documentlibrary.service.DLFileEntryServiceUtil;
import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;

import com.liferay.faces.demos.tree.PrimefacesDocument;
import com.liferay.faces.demos.tree.PrimefacesFolder;

import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;

import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import java.util.LinkedList;
import java.util.ListIterator;

/**
 * @author  Neil Griffin, ported to Primefaces by Jacques Champliaud
 */
@ManagedBean(name = "docLibModelBean")
@SessionScoped
public class DocLibModelBean implements Serializable {

    // serialVersionUID Note: This class implements Serializable only to avoid extraneous stacktraces from being thrown
    // by Mojarra. All of the private data members are marked as transient, because it's not possible to de-serialize
    // instances of Liferay's DLFolderImpl class due to classloader prolems.
    private static final long serialVersionUID = 6145332622204857486L;

    // Logger
    private static final Logger logger = LoggerFactory.getLogger(DocLibModelBean.class);

    // Self-Injections
    private LiferayFacesContext liferayFacesContext = LiferayFacesContext.getInstance();

    // Private Data Members
    private transient DocumentDataModel documentDataModel;
    private transient FolderTreeModel folderTreeModel;

    // Ajout de jch
    private int INITIAL_OPENED_TREENODE_LEVEL = 2;
    private int expandLevel = INITIAL_OPENED_TREENODE_LEVEL;
    private TreeNode root;
    private TreeNode selectedNode = null;
    private long selectedNodeId = 0;
    private long rootNodeId;
    private PrimefacesDocument selectedPrimefacesDocument = null;
    private List<PrimefacesDocument> folderPrimefacesDocumentList = new ArrayList<PrimefacesDocument>();
    private List<Long> expandedTreeNodeList = new ArrayList<Long>();
    private HashMap<Long, TreeNode> treeNodeListHm = new HashMap<Long, TreeNode>();
    private boolean initialTreeNodeRendering = true;
    private String renderedPanel = "documentList";
    List<Long> list = new LinkedList<Long>();
    private int documentNumber;
    // Fin de Ajout de jch

    @PostConstruct
    public void postConstruct() {

        // NOTE: Since we don't have those nice ICEfaces 2.0 ACE components, we have to do file upload the Web 1.0 way
        // with the bridge:inputFile component. That forces us to keep the ModelBean in session scope, so that we can
        // retain knowledge of the selected tree folder. Having the following calls to docLibModelBean.force*() will
        // essentially cause the tree and list to be RequestScoped, even though the selected folder remains
        // SessionScoped. This prevents having two model beans, one RequestScoped, and the other SessionScoped, which
        // will enable easier refactoring of the model bean to ViewScoped when the ACE file upload component is
        // available. Note that the whole point of having the list data ViewScoped is to force the list to reload more
        // frequently, so that it contains updates by other users.
        forceTreeRequery();
    }

    public void forceDocumentRequery() {
        buildFolderPrimefacesDocumentList(selectedNodeId);
    }

    public DLFolder getSelectedNodeDlFolder() {
        DLFolder dlFolder = ((PrimefacesFolder) treeNodeListHm.get(selectedNodeId).getData()).getDlFolder();
        return dlFolder;
    }

    public long getSelectedNodeId() {
        return selectedNodeId;
    }

    public void setSelectedNodeId(Long nodeId) {
        selectedNodeId = nodeId;
    }

    public void selectParentNodeOf(Long nodeId) {
        selectedNodeId = ((PrimefacesFolder) treeNodeListHm.get(nodeId).getParent().getData()).getId();
    }

    public void buildBreadCrumb(long nodeId) {
        list.add(nodeId);
        long parentId = ((PrimefacesFolder) treeNodeListHm.get(nodeId).getParent().getData()).getId();
        if (parentId != -1) {
            buildBreadCrumb(parentId);
        }
    }

    public MenuModel getBreadCrumb() {
        MenuModel simpleMenuModel = new DefaultMenuModel();
        MenuItem menuItem = new MenuItem();
        simpleMenuModel.addMenuItem(menuItem);
        list.clear();
        buildBreadCrumb(selectedNodeId);
        ListIterator<Long> iter = list.listIterator(list.size());
        while (iter.hasPrevious()) {
            menuItem = new MenuItem();
            menuItem.setValue(
                    ((PrimefacesFolder) treeNodeListHm.get(iter.previous()).getData()).getDlFolder().getName());
            menuItem.setUrl("#");
            simpleMenuModel.addMenuItem(menuItem);
        }
        return simpleMenuModel;
    }

    public void addExpandeNode(long nodeId) {
        expandedTreeNodeList.add(nodeId);
    }

    private void logNodesState() {
        // Debbugging mode only, to check nodes state
        for (long i : treeNodeListHm.keySet()) {
            logger.info("\n----------- \033[44m\033[36mMESSAGE Nodes [{0}] : [{1}]", i,
                    treeNodeListHm.get(i) + "\033[0m\n");
        }
        for (long i : expandedTreeNodeList) {
            logger.info("\n----------- \033[44m\033[36mMESSAGE logExpandeNodes [{0}][{1}]", i,
                    treeNodeListHm.get(i) + "\033[0m\n");
        }
        logger.info("\n----------- \033[44m\033[36mMESSAGE logselectednode [{0}][{1}]",
                selectedNodeId + "\033[0m\n");
    }

    public HashMap<Long, TreeNode> getTreeNodeList(TreeNode node) {
        treeNodeListHm.clear();
        treeNodeEnum((DefaultTreeNode) root, 0);
        if (initialTreeNodeRendering) {
            selectedNode = treeNodeListHm.get(selectedNodeId);
            initialTreeNodeRendering = false;
        }
        return treeNodeListHm;
    }

    public void treeNodeEnum(DefaultTreeNode node, int level) {
        long nodeId = ((PrimefacesFolder) node.getData()).getId();
        // TODO decide node's type ( see docLib.xhtml for available types )       
        //       String type = ( condition ) ? "admin" : "guest"; 
        String type = "admin";
        ((PrimefacesFolder) node.getData()).setType(type);
        node.setType(type);
        node.setExpanded(false);
        node.setSelected(false);
        treeNodeListHm.put(nodeId, node);
        if (level <= expandLevel && initialTreeNodeRendering) {
            expandedTreeNodeList.add(nodeId);
        }
        for (TreeNode childNode : node.getChildren()) {
            treeNodeEnum((DefaultTreeNode) childNode, level + 1);
        }
    }

    public void forceTreeRequery() {

        // Clear the document list model, but clear-and-requery the folder tree model.
        //      setDocumentDataModel(null);
        setFolderTreeModel(null);
        getFolderTreeModel();
        getTreeNodeList(root);
        logger.info("\n----------- \033[44m\033[36mJCH_MESSAGE_PRIMEFACES forceTreeRequery  selectedNodeId "
                + getSelectedNodeId() + "\033[0m\n");
        if (folderTreeModel != null) {
            // Attempt to re-expand the previously expanded folders.
            for (long i : expandedTreeNodeList) {
                treeNodeListHm.get(i).setExpanded(true);
            }
            // Attempt to re-select the previously selected folder.
            treeNodeListHm.get(selectedNodeId).setSelected(true);
            forceDocumentRequery();
        }
    }

    public List<PrimefacesDocument> getFolderPrimefacesDocumentList() {
        return this.folderPrimefacesDocumentList;
    }

    public int getDocumentNumber() {
        return documentNumber;
    }

    public void buildFolderPrimefacesDocumentList(long nodeId) {
        documentNumber = 0;
        setDocumentDataModel(null);
        folderPrimefacesDocumentList.clear();
        DocumentDataModel documentDataModel = getDocumentDataModel(nodeId);
        for (DLFileEntry fileEntry : documentDataModel) {
            documentNumber++;
            long id = fileEntry.getFileEntryId();
            String documentName = fileEntry.getName();
            String type = fileEntry.getExtension();
            String description = fileEntry.getDescription();
            try {
                PermissionChecker permissionChecker = liferayFacesContext.getPermissionChecker();
                boolean permittedToDelete = DLFileEntryPermission.contains(permissionChecker, fileEntry, "DELETE");
                permittedToDelete = (fileEntry.getTitle().contains("a")) ? true : false;
                permittedToDelete = true;
                PrimefacesDocument primefacesDocument = new PrimefacesDocument(id, documentName, type, description,
                        fileEntry, permittedToDelete);
                folderPrimefacesDocumentList.add(primefacesDocument);
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
        }
    }

    public DocumentDataModel getDocumentDataModel(long nodeId) {
        DLFolder dlFolder = ((PrimefacesFolder) treeNodeListHm.get(nodeId).getData()).getDlFolder();
        int rowsPerPage = liferayFacesContext.getPortletPreferenceAsInt("rowsPerPage",
                SearchContainer.DEFAULT_DELTA);
        ThemeDisplay themeDisplay = liferayFacesContext.getThemeDisplay();
        String portalURL = themeDisplay.getPortalURL();
        String pathContext = themeDisplay.getPathContext();
        PermissionChecker permissionChecker = themeDisplay.getPermissionChecker();
        documentDataModel = new DocumentDataModel(dlFolder, rowsPerPage, portalURL, pathContext, permissionChecker);
        return documentDataModel;
    }

    public void setDocumentDataModel(DocumentDataModel documentDataModel) {
        this.documentDataModel = documentDataModel;
    }

    public TreeNode getRoot() {
        return root;
    }

    public long getNodeId(TreeNode node) {
        return (node != null) ? ((PrimefacesFolder) node.getData()).getId() : 0L;
    }

    public void setSelectedPrimefacesDocument(PrimefacesDocument selectedPrimefacesDocument) {
        if (selectedPrimefacesDocument != null) {
        }
        this.selectedPrimefacesDocument = selectedPrimefacesDocument;
    }

    public PrimefacesDocument getSelectedPrimefacesDocument() {
        return this.selectedPrimefacesDocument;
    }

    public boolean isPrimefacesDocumentPermittedTo(String action) {
        boolean permitted = false;
        try {
            PermissionChecker permissionChecker = liferayFacesContext.getPermissionChecker();
            DLFileEntry selectedDLFileEntry = getSelectedPrimefacesDocument().getFileEntry();
            if (selectedDLFileEntry != null) {
                permitted = DLFileEntryPermission.contains(permissionChecker, selectedDLFileEntry, action);
            } else {
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return permitted;
    }

    public void deletePrimefacesDocument() {
        try {
            selectedPrimefacesDocument = getSelectedPrimefacesDocument();
            long selectedDLFileEntryId = selectedPrimefacesDocument.getFileEntry().getFileEntryId();
            if (isPrimefacesDocumentPermittedTo("DELETE")) {
                try {
                    folderPrimefacesDocumentList.remove(selectedPrimefacesDocument);
                    selectedPrimefacesDocument = null;
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    DLFileEntryServiceUtil.deleteFileEntry(selectedDLFileEntryId);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else {
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        buildFolderPrimefacesDocumentList(selectedNodeId);
    }

    /////////////////////////////////////////////////////////////////////
    public void onNodeExpand(NodeExpandEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Expanded",
                "" + ((PrimefacesFolder) event.getTreeNode().getData()).getId());
        FacesContext.getCurrentInstance().addMessage(null, message);
        long nodeId = ((PrimefacesFolder) event.getTreeNode().getData()).getId();
        expandedTreeNodeList.add(nodeId);
        //      logNodesState();
    }

    public void onNodeCollapse(NodeCollapseEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Collapsed",
                "" + ((PrimefacesFolder) event.getTreeNode().getData()).getId());
        FacesContext.getCurrentInstance().addMessage(null, message);
        long nodeId = ((PrimefacesFolder) event.getTreeNode().getData()).getId();
        expandedTreeNodeList.remove(nodeId);
        //      logNodesState();
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        selectedNodeId = ((PrimefacesFolder) selectedNode.getData()).getId();
        buildFolderPrimefacesDocumentList(selectedNodeId);
        this.selectedNode = selectedNode;
        //      don't do that as setSelectedNode is triggered when page is rendered
        //      setRenderedPanel("documentList");
        //      end of don't do that
        logger.info("\n----------- \033[44m\033[36mMESSAGE setSelectedNode selectedNodeId = " + selectedNodeId
                + "\033[0m\n");
    }

    public void onNodeSelect(NodeSelectEvent event) {
        setRenderedPanel("documentList");
        logger.info("\n----------- \033[44m\033[36mMESSAGE onNodeSelect selectedNodeId = " + selectedNodeId
                + "\033[0m\n");
    }

    public void onNodeUnselect(NodeUnselectEvent event) {
    }

    public FolderTreeModel getFolderTreeModel() {

        if (folderTreeModel == null) {
            try {
                Group scopeGroup = liferayFacesContext.getThemeDisplay().getScopeGroup();
                logger.debug("Querying folders for scopeGroupId=[" + scopeGroup.getGroupId() + "] scopeGroupName=["
                        + scopeGroup.getName() + "]");
                String scopeGroupIdPreference = (String) liferayFacesContext.getPortletPreference("scopeGroupId",
                        null);
                long scopeGroupId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;
                if (scopeGroupIdPreference != null) {
                    scopeGroupId = LongHelper.toLong(scopeGroupIdPreference, 0L);
                    if (scopeGroupId != 0L) {
                        try {
                            scopeGroup = GroupServiceUtil.getGroup(scopeGroupId);
                            logger.debug("Overriding with preference scopeGroupId=[" + scopeGroup.getGroupId()
                                    + "] scopeGroupName=[" + scopeGroup.getName() + "]");
                        } catch (NoSuchGroupException e) {
                            logger.error(e.getMessage() + " using current group scopeId=[{0}]",
                                    scopeGroup.getGroupId());
                        }
                    }
                }
                root = new DefaultTreeNode(new PrimefacesFolder(-1, "level00", null), null);
                folderTreeModel = new FolderTreeModel(scopeGroup, root);
                rootNodeId = ((PrimefacesFolder) root.getChildren().get(0).getData()).getId();
                //            logNodesState();
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
        }
        return folderTreeModel;
    }

    public void setFolderTreeModel(FolderTreeModel folderTreeModel) {
        this.folderTreeModel = folderTreeModel;
    }

    public String documentAddCancel() {
        setRenderedPanel("documentList");
        return "/views/portletViewMode.xhtml";
    }

    public String getRenderedPanel() {
        return renderedPanel;
    }

    public void setRenderedPanel(String renderedPanel) {
        this.renderedPanel = renderedPanel;
    }

    public void expandLevel(String level) {
        expandLevel = (int) Integer.parseInt(level);
        initialTreeNodeRendering = true;
        expandedTreeNodeList.clear();
        forceTreeRequery();
    }

}