Java tutorial
/* * Copyright (C) 2003-2010 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.social.plugin.doc; import java.io.InputStream; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.ValueFormatException; import javax.portlet.PortletRequest; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.exoplatform.container.PortalContainer; import org.exoplatform.ecm.jcr.model.VersionNode; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.wcm.core.NodeLocation; import org.exoplatform.services.wcm.core.NodetypeConstant; import org.exoplatform.services.wcm.core.WebSchemaConfigService; import org.exoplatform.services.wcm.friendly.FriendlyService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.services.wcm.webcontent.WebContentSchemaHandler; import org.exoplatform.social.webui.activity.BaseUIActivity; import org.exoplatform.social.webui.activity.UIActivitiesContainer; import org.exoplatform.social.webui.composer.PopupContainer; import org.exoplatform.web.application.ApplicationMessage; 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.UIApplication; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.cssfile.CssClassIconFile; import org.exoplatform.webui.cssfile.CssClassManager; import org.exoplatform.webui.cssfile.CssClassUtils; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; /** * Created by The eXo Platform SAS * Author : Zun * exo@exoplatform.com * Jul 23, 2010 */ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "classpath:groovy/social/plugin/doc/UIDocActivity.gtmpl", events = { @EventConfig(listeners = UIDocActivity.DownloadDocumentActionListener.class), @EventConfig(listeners = UIDocActivity.ViewDocumentActionListener.class), @EventConfig(listeners = BaseUIActivity.LoadLikesActionListener.class), @EventConfig(listeners = BaseUIActivity.ToggleDisplayCommentFormActionListener.class), @EventConfig(listeners = BaseUIActivity.LikeActivityActionListener.class), @EventConfig(listeners = BaseUIActivity.SetCommentListStatusActionListener.class), @EventConfig(listeners = BaseUIActivity.PostCommentActionListener.class), @EventConfig(listeners = BaseUIActivity.DeleteActivityActionListener.class), @EventConfig(listeners = BaseUIActivity.DeleteCommentActionListener.class) }) public class UIDocActivity extends BaseUIActivity { private static final Log LOG = ExoLogger.getLogger(UIDocActivity.class); private static final String IMAGE_PREFIX = "image/"; private static final String DOCUMENT_POSTFIX = "/pdf"; public static final String ACTIVITY_TYPE = "DOC_ACTIVITY"; public static final String DOCLINK = "DOCLINK"; public static final String MESSAGE = "MESSAGE"; public static final String REPOSITORY = "REPOSITORY"; public static final String WORKSPACE = "WORKSPACE"; public static final String DOCNAME = "DOCNAME"; public static final String ID = "id"; public static final String DOCPATH = "DOCPATH"; public static final String CONTENT_NAME = "contentName"; public static final String CONTENT_LINK = "contenLink"; public static final String IMAGE_PATH = "imagePath"; public static final String MIME_TYPE = "mimeType"; public static final String STATE = "state"; public static final String AUTHOR = "author"; public static final String DATE_CREATED = "dateCreated"; public static final String LAST_MODIFIED = "lastModified"; public static final String DOCUMENT_TYPE_LABEL = "docTypeLabel"; public static final String DOCUMENT_TITLE = "docTitle"; public static final String DOCUMENT_VERSION = "docVersion"; public static final String DOCUMENT_SUMMARY = "docSummary"; public String docLink; public String message; public String docName; public String docPath; public String repository; public String workspace; public UIDocActivity() { } protected boolean isPreviewable() { return getMimeType().endsWith(DOCUMENT_POSTFIX); } protected boolean isImageFile() { return getMimeType().startsWith(IMAGE_PREFIX); } protected String getDocThumbnail() { String portalContainerName = PortalContainer.getCurrentPortalContainerName(); String restContextName = PortalContainer.getRestContextName(portalContainerName); return new StringBuffer().append("/").append(portalContainerName).append("/").append(restContextName) .append("/thumbnailImage/big").append("/").append(UIDocActivityComposer.REPOSITORY).append("/") .append(UIDocActivityComposer.WORKSPACE).append(docPath).toString(); } protected String getSize() { double size = 0; Node docNode = getDocNode(); try { if (docNode.hasNode(Utils.JCR_CONTENT)) { Node contentNode = docNode.getNode(Utils.JCR_CONTENT); if (contentNode.hasProperty(Utils.JCR_DATA)) { size = contentNode.getProperty(Utils.JCR_DATA).getLength(); } return FileUtils.byteCountToDisplaySize((long) size); } } catch (PathNotFoundException e) { return StringUtils.EMPTY; } catch (ValueFormatException e) { return StringUtils.EMPTY; } catch (RepositoryException e) { return StringUtils.EMPTY; } return StringUtils.EMPTY; } protected int getVersion() { try { VersionNode rootVersion_ = new VersionNode( NodeLocation.getNodeByLocation(new NodeLocation(repository, workspace, docPath)) .getVersionHistory().getRootVersion(), getDocNode().getSession()); if (rootVersion_ != null) { return rootVersion_.getChildren().size(); } } catch (Exception e) { LOG.info("cannot version node"); } return 0; } protected String getCssClassIconFile(String fileName, String fileType) { String cssClass = CssClassUtils.getCSSClassByFileNameAndFileType(fileName, fileType, CssClassManager.ICON_SIZE.ICON_64); if (cssClass.indexOf(CssClassIconFile.DEFAULT_CSS) > 0) { return "uiIcon64x64Templatent_file uiIcon64x64nt_file"; } return cssClass; } protected boolean isDisplayThumbnail(String mimeType) { if (mimeType.startsWith("application/pdf") || mimeType.startsWith("application/msword") || mimeType.startsWith("application/vnd.oasis.opendocument.text") || mimeType.startsWith("application/vnd.openxmlformats-officedocument.wordprocessingml.document") || mimeType.startsWith("application/rtf")) { return true; } return false; } private boolean hasPermissionViewFile() { return (getDocNode() != null); } public static class ViewDocumentActionListener extends EventListener<UIDocActivity> { @Override public void execute(Event<UIDocActivity> event) throws Exception { final UIDocActivity docActivity = event.getSource(); if (!docActivity.hasPermissionViewFile()) { WebuiRequestContext ctx = event.getRequestContext(); UIApplication uiApplication = ctx.getUIApplication(); uiApplication.addMessage( new ApplicationMessage("UIDocActivity.msg.noPermission", null, ApplicationMessage.WARNING)); return; } final UIActivitiesContainer activitiesContainer = docActivity.getParent(); final PopupContainer popupContainer = activitiesContainer.getPopupContainer(); if (docActivity.getChild(UIDocViewer.class) != null) { docActivity.removeChild(UIDocViewer.class); } UIDocViewer docViewer = popupContainer.createUIComponent(UIDocViewer.class, null, "DocViewer"); docViewer.docPath = docActivity.docPath; docViewer.repository = docActivity.repository; docViewer.workspace = docActivity.workspace; popupContainer.activate(docViewer, 800, 600, true); event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer); } } public static class DownloadDocumentActionListener extends EventListener<UIDocActivity> { @Override public void execute(Event<UIDocActivity> event) throws Exception { UIDocActivity uiComp = event.getSource(); if (!uiComp.hasPermissionViewFile()) { WebuiRequestContext ctx = event.getRequestContext(); UIApplication uiApplication = ctx.getUIApplication(); uiApplication.addMessage( new ApplicationMessage("UIDocActivity.msg.noPermission", null, ApplicationMessage.WARNING)); return; } String downloadLink = null; if (getRealNode(uiComp.getDocNode()).getPrimaryNodeType().getName().equals(Utils.NT_FILE)) { downloadLink = Utils.getDownloadRestServiceLink(uiComp.getDocNode()); } event.getRequestContext().getJavascriptManager().addJavascript("ajaxRedirect('" + downloadLink + "');"); } private Node getRealNode(Node node) throws Exception { // TODO: Need to add to check symlink node if (node.isNodeType("nt:frozenNode")) { String uuid = node.getProperty("jcr:frozenUuid").getString(); return node.getSession().getNodeByUUID(uuid); } return node; } } protected Node getDocNode() { NodeLocation nodeLocation = new NodeLocation(repository, workspace, docPath); return NodeLocation.getNodeByLocation(nodeLocation); } /** * Gets the webdav url. * * @param node the node * @return the webdav url * @throws Exception the exception */ public String getWebdavURL() throws Exception { Node contentNode = getDocNode(); NodeLocation nodeLocation = new NodeLocation(repository, workspace, docPath); PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance(); PortletRequest portletRequest = portletRequestContext.getRequest(); String repository = nodeLocation.getRepository(); String workspace = nodeLocation.getWorkspace(); String baseURI = portletRequest.getScheme() + "://" + portletRequest.getServerName() + ":" + String.format("%s", portletRequest.getServerPort()); FriendlyService friendlyService = WCMCoreUtils.getService(FriendlyService.class); String link = "#"; String portalName = PortalContainer.getCurrentPortalContainerName(); String restContextName = PortalContainer.getCurrentRestContextName(); if (contentNode.isNodeType("nt:frozenNode")) { String uuid = contentNode.getProperty("jcr:frozenUuid").getString(); Node originalNode = contentNode.getSession().getNodeByUUID(uuid); link = baseURI + "/" + portalName + "/" + restContextName + "/jcr/" + repository + "/" + workspace + originalNode.getPath() + "?version=" + contentNode.getParent().getName(); } else { link = baseURI + "/" + portalName + "/" + restContextName + "/jcr/" + repository + "/" + workspace + contentNode.getPath(); } return friendlyService.getFriendlyUri(link); } /** * Gets the summary. * * @param node the node * @return the summary of Node. Return empty string if catch an exception. */ public String getSummary() { String desc = ""; Node node = getDocNode(); try { if (node != null) { if (node.hasProperty("exo:summary")) { desc = node.getProperty("exo:summary").getValue().getString(); } else if (node.hasNode("jcr:content")) { Node content = node.getNode("jcr:content"); if (content.hasProperty("dc:description") && content.getProperty("dc:description").getValues().length > 0) { desc = content.getProperty("dc:description").getValues()[0].getString(); } } } } catch (RepositoryException re) { if (LOG.isWarnEnabled()) LOG.warn("RepositoryException: ", re); } return desc; } public String getTitle() throws Exception { return Utils.getTitle(getDocNode()); } /** * get activity owner * * @return activity owner */ public static String getActivityOwnerId(Node node) { String activityOwnerId = ""; ConversationState conversationState = ConversationState.getCurrent(); if (conversationState != null) { activityOwnerId = conversationState.getIdentity().getUserId(); } else { try { activityOwnerId = node.getProperty("publication:lastUser").getString(); } catch (Exception e) { LOG.info("No lastUser publication"); } } return activityOwnerId; } /** * Gets the illustrative image. * * @param node the node * @return the illustrative image */ public static String getIllustrativeImage(Node node) { WebSchemaConfigService schemaConfigService = WCMCoreUtils.getService(WebSchemaConfigService.class); WebContentSchemaHandler contentSchemaHandler = schemaConfigService .getWebSchemaHandlerByType(WebContentSchemaHandler.class); Node illustrativeImage = null; String uri = ""; try { illustrativeImage = contentSchemaHandler.getIllustrationImage(node); uri = generateThumbnailImageURI(illustrativeImage); } catch (PathNotFoundException ex) { return uri; } catch (Exception e) { // WebContentSchemaHandler LOG.warn(e.getMessage(), e); } return uri; } /** * Generate the Thumbnail Image URI. * * @param node the node * @return the Thumbnail uri with medium size * @throws Exception the exception */ public static String generateThumbnailImageURI(Node file) throws Exception { StringBuilder builder = new StringBuilder(); NodeLocation fielLocation = NodeLocation.getNodeLocationByNode(file); String repository = fielLocation.getRepository(); String workspaceName = fielLocation.getWorkspace(); String nodeIdentifiler = file.getPath().replaceFirst("/", ""); String portalName = PortalContainer.getCurrentPortalContainerName(); String restContextName = PortalContainer.getCurrentRestContextName(); InputStream stream = file.getNode(NodetypeConstant.JCR_CONTENT).getProperty(NodetypeConstant.JCR_DATA) .getStream(); if (stream.available() == 0) return null; stream.close(); builder.append("/").append(portalName).append("/").append(restContextName).append("/") .append("thumbnailImage/medium/").append(repository).append("/").append(workspaceName).append("/") .append(nodeIdentifiler); return builder.toString(); } /** * Generate the viewer link to site explorer by node * * @param Node the node * @return String the viewer link * @throws RepositoryException */ public static String getContentLink(Node node) throws RepositoryException { String repository = ((ManageableRepository) node.getSession().getRepository()).getConfiguration().getName(); String workspace = node.getSession().getWorkspace().getName(); return repository + '/' + workspace + node.getPath(); } /** * Get the MimeType * * @param node the node * @return the MimeType */ public static String getMimeType(Node node) { try { if (node.getPrimaryNodeType().getName().equals(NodetypeConstant.NT_FILE)) { if (node.hasNode(NodetypeConstant.JCR_CONTENT)) return node.getNode(NodetypeConstant.JCR_CONTENT).getProperty(NodetypeConstant.JCR_MIME_TYPE) .getString(); } } catch (RepositoryException e) { LOG.error(e.getMessage(), e); } return ""; } private String getMimeType() { String mimeType = ""; try { mimeType = getDocNode().getNode("jcr:content").getProperty("jcr:mimeType").getString(); } catch (ValueFormatException e) { if (LOG.isDebugEnabled()) LOG.debug(e); return StringUtils.EMPTY; } catch (PathNotFoundException e) { if (LOG.isDebugEnabled()) LOG.debug(e); return StringUtils.EMPTY; } catch (RepositoryException e) { if (LOG.isDebugEnabled()) LOG.debug(e); return StringUtils.EMPTY; } return mimeType; } }