org.exoplatform.wcm.webui.scv.UIPresentationContainer.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.wcm.webui.scv.UIPresentationContainer.java

Source

/*
 * Copyright (C) 2003-2008 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.webui.scv;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.portlet.PortletPreferences;

import org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.webui.utils.LockUtil;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.webui.application.UIPortlet;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.ecm.publication.PublicationService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.util.Text;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.publication.WCMComposer;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.reader.ContentReader;
import org.exoplatform.web.url.navigation.NavigationResource;
import org.exoplatform.web.url.navigation.NodeURL;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.lifecycle.Lifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;

/**
 * Author : Do Ngoc Anh *
 * Email: anh.do@exoplatform.com *
 * May 14, 2008
 */
@ComponentConfig(lifecycle = Lifecycle.class, template = "app:/groovy/SingleContentViewer/UIPresentationContainer.gtmpl", events = {
        @EventConfig(listeners = UIPresentationContainer.PreferencesActionListener.class),
        @EventConfig(listeners = UIPresentationContainer.FastPublishActionListener.class) })
public class UIPresentationContainer extends UIContainer {
    public final static String PARAMETER_REGX = "(.*)/(.*)";
    private static final Log LOG = ExoLogger.getLogger(UIPresentationContainer.class.getName());

    private boolean isPrint = false;
    private PortletPreferences portletPreferences;
    private String contentParameter = null;

    /**
     * Instantiates a new uI presentation container.
     *
     * @throws Exception the exception
     */
    public UIPresentationContainer() throws Exception {
        PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
        addChild(UIPresentation.class, null,
                UIPresentation.class.getSimpleName() + portletRequestContext.getWindowId());

        portletPreferences = portletRequestContext.getRequest().getPreferences();
    }

    /**
     * Gets the bar info show.
     *
     * @return the value for info bar setting
     *
     * @throws Exception the exception
     */
    public boolean isShowInfoBar() throws Exception {
        if (UIPortlet.getCurrentUIPortlet().getShowInfoBar())
            return true;
        return false;
    }

    /**
     * Gets the title.
     *
     * @param node the node
     *
     * @return the title
     *
     * @throws Exception the exception
     */
    public String getTitle(Node node) throws Exception {
        String title = null;
        if (node.hasProperty("exo:title")) {
            title = node.getProperty("exo:title").getValue().getString().trim();
        }
        if (title == null || title.equals("")) {
            if (node.hasNode("jcr:content")) {
                Node content = node.getNode("jcr:content");
                if (content.hasProperty("dc:title")) {
                    try {
                        title = content.getProperty("dc:title").getValues()[0].getString().trim();
                    } catch (Exception e) {
                        title = null;
                    }
                }
            }
        }
        if (title == null || title.equals("")) {
            title = Utils.getRealNode(node).getName();
        }
        return ContentReader.getXSSCompatibilityContent(title);
    }

    public boolean isPrinting() {
        return this.isPrint;
    }

    public boolean isShowTitle() {
        return Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_TITLE, "false"));
    }

    public boolean isShowDate() {
        return Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_DATE, "false"));
    }

    public boolean isShowOptionBar() {
        return Boolean
                .parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_OPTIONBAR, "false"));
    }

    public boolean isContextual() {
        return Boolean
                .parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, "false"));
    }

    public String getCurrentState() throws Exception {
        UIPresentation presentation = getChild(UIPresentation.class);
        Node node = presentation.getOriginalNode();
        if (node != null) {
            if (node.hasProperty("publication:currentState")) {
                PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
                String state = node.getProperty("publication:currentState").getValue().getString();
                try {
                    state = portletRequestContext.getApplicationResourceBundle()
                            .getString("PublicationStates." + state);
                } catch (MissingResourceException e) {
                    if (LOG.isWarnEnabled()) {
                        LOG.warn(e.getMessage());
                    }
                }
                return state;
            }
        }
        return "";
    }

    /**
     * Gets the created date.
     *
     * @param node the node
     *
     * @return the created date
     *
     * @throws Exception the exception
     */
    public String getCreatedDate(Node node) throws Exception {
        if (node.hasProperty("exo:dateCreated")) {
            Calendar calendar = node.getProperty("exo:dateCreated").getValue().getDate();
            return new SimpleDateFormat("dd.MM.yyyy '|' hh'h'mm").format(calendar.getTime());
        }
        return null;
    }

    /**
     * Gets the node.
     *
     * @return the node
     *
     * @throws Exception the exception
     */
    public Node getNodeView() {
        UIPresentation presentation = getChild(UIPresentation.class);
        try {
            Node viewNode;
            //Check for the saved parameter
            viewNode = getParameterizedNode();
            if (viewNode != null) {
                if (viewNode.isNodeType("nt:frozenNode")) {
                    try {
                        String nodeUUID = viewNode.getProperty("jcr:frozenUuid").getString();
                        presentation.setOriginalNode(viewNode.getSession().getNodeByUUID(nodeUUID));
                        presentation.setNode(viewNode);
                    } catch (Exception ex) {
                        return viewNode;
                    }
                }
                return viewNode;
            }
            PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
            portletPreferences = portletRequestContext.getRequest().getPreferences();
            String repository = portletPreferences.getValue(UISingleContentViewerPortlet.REPOSITORY, null);
            String workspace = portletPreferences.getValue(UISingleContentViewerPortlet.WORKSPACE, null);
            String nodeIdentifier = portletPreferences.getValue(UISingleContentViewerPortlet.IDENTIFIER, null);
            String sharedCache = portletPreferences.getValue(UISingleContentViewerPortlet.ENABLE_CACHE, "true");
            sharedCache = "true".equals(sharedCache) ? WCMComposer.VISIBILITY_PUBLIC : WCMComposer.VISIBILITY_USER;
            viewNode = Utils.getRealNode(repository, workspace, nodeIdentifier, false, sharedCache);
            if (viewNode != null) {
                boolean isDocumentType = false;
                if (viewNode.isNodeType("nt:frozenNode"))
                    isDocumentType = true;
                // check node is a document node
                TemplateService templateService = getApplicationComponent(TemplateService.class);
                List<String> documentTypes = templateService.getDocumentTemplates();
                for (String documentType : documentTypes) {
                    if (viewNode.isNodeType(documentType)) {
                        isDocumentType = true;
                        break;
                    }
                }
                if (!isDocumentType)
                    return null;
                if (viewNode != null && viewNode.isNodeType("nt:frozenNode")) {
                    String nodeUUID = viewNode.getProperty("jcr:frozenUuid").getString();
                    presentation.setOriginalNode(viewNode.getSession().getNodeByUUID(nodeUUID));
                    presentation.setNode(viewNode);
                } else {
                    presentation.setOriginalNode(viewNode);
                    presentation.setNode(viewNode);
                }
            }
            return viewNode;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Gets the node.
     *
     * @return the node
     *
     * @throws Exception the exception
     */
    public Node getParameterizedNode() throws Exception {
        PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
        PortletPreferences preferences = portletRequestContext.getRequest().getPreferences();
        String sharedCache = preferences.getValue(UISingleContentViewerPortlet.ENABLE_CACHE, "false");
        sharedCache = "true".equals(sharedCache) ? WCMComposer.VISIBILITY_PUBLIC : WCMComposer.VISIBILITY_USER;

        PortalRequestContext preq = Util.getPortalRequestContext();
        if (!preq.useAjax()) {
            contentParameter = getRequestParameters();
        }

        if (contentParameter == null)
            return null;
        UIPresentation presentation = getChild(UIPresentation.class);
        Node nodeView = Utils.getViewableNodeByComposer(null, null, contentParameter, null, sharedCache);
        if (nodeView != null) {
            boolean isDocumentType = false;
            if (nodeView.isNodeType("nt:frozenNode"))
                isDocumentType = true;
            // check node is a document node
            if (!isDocumentType) {
                TemplateService templateService = getApplicationComponent(TemplateService.class);
                List<String> documentTypes = templateService.getDocumentTemplates();
                for (String documentType : documentTypes) {
                    if (nodeView.isNodeType(documentType)) {
                        isDocumentType = true;
                        break;
                    }
                }
            }
            if (!isDocumentType)
                return null;
            if (nodeView != null && nodeView.isNodeType("nt:frozenNode")) {
                String nodeUUID = nodeView.getProperty("jcr:frozenUuid").getString();
                presentation.setOriginalNode(nodeView.getSession().getNodeByUUID(nodeUUID));
                presentation.setNode(nodeView);
            } else {
                presentation.setOriginalNode(nodeView);
                presentation.setNode(nodeView);
            }
            isPrint = Boolean.parseBoolean(Util.getPortalRequestContext().getRequestParameter("isPrint"));
        }
        return nodeView;
    }

    /**
     * Gets the request parameters.
     *
     * @return the request parameters
     */
    private String getRequestParameters() throws Exception {
        String parameters = null;
        if (!Boolean
                .parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, "false"))) {
            return null;
        }
        try {
            parameters = URLDecoder.decode(StringUtils.substringAfter(Util.getPortalRequestContext().getNodePath(),
                    Util.getUIPortal().getSelectedUserNode().getURI() + "/"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return null;
        }
        String parameterName = portletPreferences.getValue(UISingleContentViewerPortlet.PARAMETER, "");
        if (!parameters.matches(PARAMETER_REGX)) {
            String path = Util.getPortalRequestContext().getRequestParameter(parameterName);
            if (path == null) {
                return null;
            }
            parameters = Text.unescape(Util.getPortalRequestContext().getRequestParameter(parameterName));
            return parameters.substring(1);
        }
        return Text.unescape(parameters);
    }

    /**
     * Get the print's page URL
     *
     * @return <code>true</code> if the Quick Print is shown. Otherwise, <code>false</code>
     */
    public String getPrintUrl(Node node) throws RepositoryException {
        String printParameterName;
        Node tempNode = node;
        if (tempNode == null) {
            tempNode = getNodeView();
        }
        String strPath = tempNode.getPath();
        String repository = ((ManageableRepository) tempNode.getSession().getRepository()).getConfiguration()
                .getName();
        String workspace = tempNode.getSession().getWorkspace().getName();
        String printPageUrl = portletPreferences.getValue(UISingleContentViewerPortlet.PRINT_PAGE, "");
        printParameterName = portletPreferences.getValue(UISingleContentViewerPortlet.PRINT_PARAMETER, "");

        String paramName = "/" + repository + "/" + workspace + strPath;
        NodeURL nodeURL = Util.getPortalRequestContext().createURL(NodeURL.TYPE);
        NavigationResource resource = new NavigationResource(SiteType.PORTAL,
                Util.getPortalRequestContext().getPortalOwner(), printPageUrl);
        nodeURL.setResource(resource);
        nodeURL.setQueryParameterValue(printParameterName, paramName);
        nodeURL.setQueryParameterValue("isPrint", "true");
        nodeURL.setQueryParameterValue("noadminbar", "true");
        return nodeURL.toString();
    }

    /**
     * Get the quick edit url
     *
     * @param node
     * @return
     */
    public String getQuickEditLink(Node node) {
        Node tempNode = node;
        if (tempNode == null) {
            tempNode = getNodeView();
        }
        return Utils.getEditLink(tempNode, true, false);
    }

    public Node getOriginalNode() {
        UIPresentation presentation = getChild(UIPresentation.class);
        if (presentation == null)
            return null;
        try {
            return presentation.getOriginalNode();
        } catch (Exception e) {
            return null;
        }
    }

    public boolean isViewMode() {
        return Utils.getCurrentMode().equals(WCMComposer.MODE_LIVE);
    }

    public String getInlineEditingMsg() {
        StringBuffer sb = new StringBuffer();
        sb.append("new Array(");
        sb.append("'")
                .append(Text.escapeIllegalJcrChars(
                        getResourceBundle("UIPresentationContainer.msg.internal-server-error")))
                .append("', '")
                .append(Text
                        .escapeIllegalJcrChars(getResourceBundle("UIPresentationContainer.msg.empty-title-error")))
                .append("')");
        return sb.toString();
    }

    private String getResourceBundle(String key) {
        try {
            ResourceBundle rs = WebuiRequestContext.getCurrentInstance().getApplicationResourceBundle();
            return rs.getString(key);
        } catch (MissingResourceException e) {
            return key;
        }
    }

    /**
     * The listener interface for receiving preferencesAction events.
     * The class that is interested in processing a preferencesAction
     * event implements this interface, and the object created
     * with that class is registered with a component using the
     * component's <code>addPreferencesActionListener<code> method. When
     * the preferencesAction event occurs, that object's appropriate
     * method is invoked.
     */
    public static class PreferencesActionListener extends EventListener<UIPresentationContainer> {
        /* (non-Javadoc)
         * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
         */
        public void execute(Event<UIPresentationContainer> event) throws Exception {
            UIPresentationContainer presentationContainer = event.getSource();
            UISCVPreferences pcvConfigForm = presentationContainer.createUIComponent(UISCVPreferences.class, null,
                    null);
            Utils.createPopupWindow(presentationContainer, pcvConfigForm,
                    UISingleContentViewerPortlet.UIPreferencesPopupID, 600);
        }
    }

    public static class FastPublishActionListener extends EventListener<UIPresentationContainer> {

        /*
         * (non-Javadoc)
         * @see
         * org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
         * .event.Event)
         */
        public void execute(Event<UIPresentationContainer> event) throws Exception {
            UIPresentationContainer uiContainer = event.getSource();
            PublicationService publicationService = WCMCoreUtils.getService(PublicationService.class);
            Node node = uiContainer.getNodeView();
            if (node.isLocked()) {
                node.getSession().addLockToken(LockUtil.getLockToken(node));
            }
            HashMap<String, String> context = new HashMap<String, String>();

            publicationService.changeState(node, "published", context);
        }

    }

    public String getInlineEditingField(Node orgNode, String propertyName, String defaultValue, String inputType,
            String idGenerator, String cssClass, boolean isGenericProperty, String... arguments) throws Exception {
        return org.exoplatform.ecm.webui.utils.Utils.getInlineEditingField(orgNode, propertyName, defaultValue,
                inputType, idGenerator, cssClass, isGenericProperty, arguments);
    }

    public String getInlineEditingField(Node orgNode, String propertyName) throws Exception {
        return org.exoplatform.ecm.webui.utils.Utils.getInlineEditingField(orgNode, propertyName);
    }
}