org.betaconceptframework.astroboa.console.jsf.ContentObjectList.java Source code

Java tutorial

Introduction

Here is the source code for org.betaconceptframework.astroboa.console.jsf.ContentObjectList.java

Source

/**
 * Copyright (C) 2005-2012 BetaCONCEPT Limited
 *
 * This file is part of Astroboa.
 *
 * Astroboa 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 3 of the License, or
 * (at your option) any later version.
 *
 * Astroboa 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 Astroboa.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.betaconceptframework.astroboa.console.jsf;

import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.betaconceptframework.astroboa.api.model.BinaryChannel;
import org.betaconceptframework.astroboa.api.model.exception.CmsException;
import org.betaconceptframework.astroboa.api.service.ContentService;
import org.betaconceptframework.astroboa.console.commons.ContentObjectStatefulSearchService;
import org.betaconceptframework.astroboa.console.jsf.edit.ContentObjectEdit;
import org.betaconceptframework.astroboa.console.seam.SeamEventNames;
import org.betaconceptframework.ui.jsf.AbstractUIBean;
import org.betaconceptframework.ui.jsf.utility.JSFUtilities;
import org.jboss.seam.Component;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Events;

/**
 * Created on Nov 1, 2006
 * @author Gregory Chomatas (gchomatas@betaconcept.com)
 * @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
 * 
 */
public class ContentObjectList extends AbstractUIBean {

    private static final long serialVersionUID = 1L;

    // Injected Beans
    private PageController pageController;
    private ContentService contentService;

    // holds the index of the top row in last viewed dataTable page. We use it in order to present the last shown data page each time the table is redrawn
    private int rowIndexOfCurrentPageTopElement;

    //   holds the info message which appears above the content list and informs the user about the contents of the list
    private String contentObjectListHeaderMessage;

    // holds the row index of the last selected dataTable row i.e. the last selected content object to edit
    private int selectedRowIndex;

    // holds the page number of the content object list table that is currently active (i.e it is shown to the user)
    private int activeContentObjectListPage;

    //holds the Id (identifier) of the user selected content object for which will she wishes to do some action
    private String selectedContentObjectIdentifier;

    // holds the binary channel Id selected for download
    private String binaryChannelIdSelectedForDownload;

    // holds the page component that renders the user selected view type for the displayed list of content objects (i.e. List view, Icon View, Full View)
    private String contentObjectListCurrentViewPageComponent = "contentObjectList_ListViewRichFaces.xhtml";

    // holds the user selected width for content object thumbnails. Defaults to 64;
    private int thumbnailWidth = 64;

    //holds localized label for xml file in case list is exported to XML
    private String labelForFileGeneratedWhenExportingListToXml;

    public void changeContentObjectListView_UIAction(String selectedView) {

        if (StringUtils.isBlank(selectedView)
                || ContentObjectListDisplayOptions.ListView.toString().equals(selectedView)) {
            contentObjectListCurrentViewPageComponent = ContentObjectListDisplayOptions.ListView
                    .getPageComponentThatRendersDisplayOption();
        } else if (ContentObjectListDisplayOptions.FullView.toString().equals(selectedView)) {
            contentObjectListCurrentViewPageComponent = ContentObjectListDisplayOptions.FullView
                    .getPageComponentThatRendersDisplayOption();
        } else if (ContentObjectListDisplayOptions.IconView.toString().equals(selectedView))
            contentObjectListCurrentViewPageComponent = ContentObjectListDisplayOptions.IconView
                    .getPageComponentThatRendersDisplayOption();
    }

    // Download is supported only for image/audio/video/text content types. It dowloads the primaryBinaryChannel which holds the related file binary data 
    public String downloadFile() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (!facesContext.getResponseComplete()) {
            BinaryChannel binaryChannel;
            // Retrieve the binary data of the Primary Binary Channel selected Content Object. Remember that for efficiency the binary data of binary channels are not retreived when a content object is retreived
            try {
                binaryChannel = contentService.getBinaryChannelById(binaryChannelIdSelectedForDownload);
            } catch (CmsException e) {
                throw new RuntimeException(e);
            }

            HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

            response.setCharacterEncoding("UTF-8");
            response.setContentType(binaryChannel.getMimeType());
            response.setHeader("Content-Disposition", "attachment;filename=" + binaryChannel.getSourceFilename());

            response.setContentLength((int) binaryChannel.getSize());

            InputStream contentAsStream = binaryChannel.getContentAsStream();

            try {

                if (contentAsStream != null) {
                    ServletOutputStream servletOutputStream = response.getOutputStream();

                    IOUtils.copy(contentAsStream, servletOutputStream);

                    servletOutputStream.flush();

                    facesContext.responseComplete();

                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                binaryChannel = null;

                //Close Stream
                if (contentAsStream != null)
                    try {
                        contentAsStream.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
            }
        }
        return null;
    }

    public void resetViewAndStateBeforeNewContentSearchResultsPresentation() {
        setContentObjectListHeaderMessage(null); // The message informing the use from which query the current list of content objects has been produced

        // reset scroller to show first page of results
        activeContentObjectListPage = 1;

        setLabelForFileGeneratedWhenExportingListToXml(null);
    }

    public String getContentObjectListHeaderMessage() {
        return contentObjectListHeaderMessage;
    }

    public void setContentObjectListHeaderMessage(String contentObjectListHeaderMessage) {
        this.contentObjectListHeaderMessage = contentObjectListHeaderMessage;
    }

    // all properties related to user selections in order to perform something to a content object
    public String getSelectedContentObjectIdentifier() {
        return selectedContentObjectIdentifier;
    }

    public void setSelectedContentObjectIdentifier(String selectedContentObjectIdentifier) {
        this.selectedContentObjectIdentifier = selectedContentObjectIdentifier;
    }

    public int getSelectedRowIndex() {
        return selectedRowIndex;
    }

    public void setSelectedRowIndex(int selectedRowIndex) {
        this.selectedRowIndex = selectedRowIndex;

        // calculate and set rowIndexOfCurrentPageTopElement according to the selected row index
        int page = getSelectedRowIndex() / pageController.getRowsPerDataTablePage();

        rowIndexOfCurrentPageTopElement = page * pageController.getRowsPerDataTablePage();

    }

    public int getRowIndexOfCurrentPageTopElement() {
        return rowIndexOfCurrentPageTopElement;
    }

    public void permanentlyRemoveSelectedContentObject_UIAction(String selectedContentObjectIdentifier,
            String selectedContentObjectType, Calendar selectedContentObjectCreatedDate) {
        // check if the object is already edited
        ContentObjectEdit contentObjectEdit = (ContentObjectEdit) Component.getInstance(ContentObjectEdit.class,
                false);
        if (contentObjectEdit != null && contentObjectEdit.getSelectedContentObjectForEdit() != null
                && contentObjectEdit.getSelectedContentObjectForEdit().getContentObject().getId() != null
                && contentObjectEdit.getSelectedContentObjectForEdit().getContentObject().getId()
                        .equals(selectedContentObjectIdentifier)) {

            JSFUtilities.addMessage(null, "object.edit.objectIsEditedAndCannotBeRemoved", null,
                    FacesMessage.SEVERITY_WARN);
            return;
        }

        try {
            contentService.deleteContentObject(selectedContentObjectIdentifier);

            Events.instance().raiseEvent(SeamEventNames.CONTENT_OBJECT_DELETED, new Object[] {
                    selectedContentObjectType, selectedContentObjectIdentifier, selectedContentObjectCreatedDate });
        } catch (Exception e) {
            JSFUtilities.addMessage(null, "object.edit.contentObjectCouldNotBePermanentlyRemovedError", null,
                    FacesMessage.SEVERITY_ERROR);
            getLogger().error("The content object could not be permanently deleted.", e);
            return;
        }

        // generate a success message, reset the browsing trees to accomodate the change and finally change the view to show the conentObjectListPanel 
        JSFUtilities.addMessage(null, "object.edit.successful.delete.info.message", null,
                FacesMessage.SEVERITY_INFO);

        //contentObjectListHeaderMessage = JSFUtilities.getStringI18n("object.list.message.contentObjectListHeaderMessageAfterContentObjectRemoval");
        contentObjectListHeaderMessage = null;

        // remove object from table
        ContentObjectStatefulSearchService contentObjectStatefulSearchService = (ContentObjectStatefulSearchService) JSFUtilities
                .getBeanFromSpringContext("contentObjectStatefulSearchService");
        //List<ContentObjectUIWrapper> contentObjectUIWrapperList = (List<ContentObjectUIWrapper>) contentObjectStatefulSearchService.getReturnedContentObjects().getWrappedData();
        //contentObjectUIWrapperList.remove(contentObjectStatefulSearchService.getReturnedContentObjects().getRowIndex());

        // reset data page and decrease search results count
        contentObjectStatefulSearchService
                .setSearchResultSetSize(contentObjectStatefulSearchService.getSearchResultSetSize() - 1);
        UIComponentBinding uiComponentBinding = (UIComponentBinding) Contexts.getEventContext()
                .get("uiComponentBinding");
        if (contentObjectStatefulSearchService.getSearchResultSetSize() > 0)
            contentObjectStatefulSearchService.getReturnedContentObjects().reset();
        else {
            contentObjectStatefulSearchService.setReturnedContentObjects(null);
            uiComponentBinding.setListViewContentObjectTableComponent(null);
            uiComponentBinding.setListViewContentObjectTableScrollerComponent(null);
        }
    }

    public String getContentObjectListCurrentViewPageComponent() {
        return contentObjectListCurrentViewPageComponent;
    }

    public void setContentObjectListCurrentViewPageComponent(String contentObjectListCurrentViewPageComponent) {
        this.contentObjectListCurrentViewPageComponent = contentObjectListCurrentViewPageComponent;
    }

    public int getThumbnailWidth() {
        return thumbnailWidth;
    }

    public void setThumbnailWidth(int thumbnailWidth) {
        this.thumbnailWidth = thumbnailWidth;
    }

    public void setBinaryChannelIdSelectedForDownload(String binaryChannelIdSelectedForDownload) {
        this.binaryChannelIdSelectedForDownload = binaryChannelIdSelectedForDownload;
    }

    public void setPageController(PageController pageController) {
        this.pageController = pageController;
    }

    public void setContentService(ContentService contentService) {
        this.contentService = contentService;
    }

    public int getActiveContentObjectListPage() {
        return activeContentObjectListPage;
    }

    public void setActiveContentObjectListPage(int activeContentObjectListPage) {
        this.activeContentObjectListPage = activeContentObjectListPage;
    }

    /**
     * @return the labelForFileGeneratedWhenExportingListToXml
     */
    public String getLabelForFileGeneratedWhenExportingListToXml() {
        return labelForFileGeneratedWhenExportingListToXml;
    }

    /**
     * @param labelForFileGeneratedWhenExportingListToXml the labelForFileGeneratedWhenExportingListToXml to set
     */
    public void setLabelForFileGeneratedWhenExportingListToXml(String labelForFileGeneratedWhenExportingListToXml) {
        this.labelForFileGeneratedWhenExportingListToXml = labelForFileGeneratedWhenExportingListToXml;
    }

}