/* * 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.ecm.webui.component.explorer.popup.actions; import org.exoplatform.ecm.jcr.model.Preference; import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer; import org.exoplatform.ecm.webui.component.explorer.sidebar.UISideBar; import org.exoplatform.ecm.webui.component.explorer.sidebar.UITagExplorer; import org.exoplatform.services.cms.folksonomy.NewFolksonomyService; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.webui.application.WebuiRequestContext; 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.UIPopupComponent; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.lifecycle.UIContainerLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import javax.jcr.Node; import java.util.List; /** * Created by The eXo Platform SARL * Author : Nguyen Anh Vu * anhvurz90@gmail.com * Nov 27, 2009 * 11:13:55 AM */ @ComponentConfig( lifecycle = UIContainerLifecycle.class, template = "system:/groovy/portal/webui/container/UIContainer.gtmpl", events = { @EventConfig(listeners = UIEditingTagsForm.EditTagActionListener.class), @EventConfig(listeners = UIEditingTagsForm.RemoveTagActionListener.class, confirm = "UIEditingTagsForm.msg.confirm-remove") } ) public class UIEditingTagsForm extends UIContainer implements UIPopupComponent { private static final Log LOG = ExoLogger.getLogger(UIEditingTagsForm.class.getName()); private static final String PUBLIC_TAG_NODE_PATH = "exoPublicTagNode"; private static final String USER_FOLKSONOMY_ALIAS = "userPrivateFolksonomy"; public void activate() { try { addChild(UIEditingTagList.class, null, null); getChild(UIEditingTagList.class).updateGrid(); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error!", e.getMessage()); } } } public void deActivate() { } @Override public void processRender(WebuiRequestContext context) throws Exception { getChild(UIEditingTagList.class).updateGrid(); super.processRender(context); } public void initTaggingFormPopup(Node selectedTag) throws Exception { removeChildById("TagPopup") ; UIPopupWindow uiPopup = addChild(UIPopupWindow.class, null, "TagPopup") ; uiPopup.setShowMask(true); uiPopup.setWindowSize(600, 200) ; UITagForm uiForm = createUIComponent(UITagForm.class, null, null) ; uiForm.setTag(selectedTag) ; uiPopup.setUIComponent(uiForm) ; uiPopup.setRendered(true) ; uiPopup.setShow(true) ; uiPopup.setResizable(true) ; } public Node getSelectedTag(String tagName) throws Exception { NewFolksonomyService newFolksonomyService = getApplicationComponent(NewFolksonomyService.class) ; NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class); UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class); String workspace = uiExplorer.getRepository().getConfiguration().getDefaultWorkspaceName(); String userName = WCMCoreUtils.getRemoteUser(); int scope = uiExplorer.getTagScope(); String publicTagNodePath = nodeHierarchyCreator.getJcrPath(PUBLIC_TAG_NODE_PATH); List<Node> tagList = (scope == NewFolksonomyService.PUBLIC) ? newFolksonomyService.getAllPublicTags(publicTagNodePath, workspace) : newFolksonomyService.getAllPrivateTags(userName); for (Node tag : tagList) if (tag.getName().equals(tagName)) return tag; return null; } static public class EditTagActionListener extends EventListener<UIEditingTagsForm> { public void execute(Event<UIEditingTagsForm> event) throws Exception { UIEditingTagsForm uiEditingTagsForm = event.getSource() ; String selectedName = event.getRequestContext().getRequestParameter(OBJECTID) ; Node selectedTag = uiEditingTagsForm.getSelectedTag(selectedName) ; uiEditingTagsForm.initTaggingFormPopup(selectedTag) ; UIJCRExplorer uiExplorer = uiEditingTagsForm.getAncestorOfType(UIJCRExplorer.class); Preference preferences = uiExplorer.getPreference(); if (preferences.isShowSideBar()) { UISideBar uiSideBar = uiExplorer.findFirstComponentOfType(UISideBar.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiSideBar); } event.getRequestContext().addUIComponentToUpdateByAjax(uiEditingTagsForm); } } static public class RemoveTagActionListener extends EventListener<UIEditingTagsForm> { public void execute(Event<UIEditingTagsForm> event) throws Exception { UIEditingTagsForm uiEdit = event.getSource(); UIJCRExplorer uiExplorer = uiEdit.getAncestorOfType(UIJCRExplorer.class); String selectedName = event.getRequestContext().getRequestParameter(OBJECTID); removeTagFromNode(WCMCoreUtils.getRemoteUser(), uiExplorer.getTagScope(), selectedName, uiEdit); uiEdit.getChild(UIEditingTagList.class).updateGrid(); uiExplorer.setTagPath(uiExplorer.getCurrentPath()); Preference preferences = uiExplorer.getPreference(); if (preferences.isShowSideBar()) { UISideBar uiSideBar = uiExplorer.findFirstComponentOfType(UISideBar.class); event.getRequestContext().addUIComponentToUpdateByAjax(uiSideBar); } event.getRequestContext().addUIComponentToUpdateByAjax(uiEdit); } public void removeTagFromNode(String userID, int scope, String tagName, UIEditingTagsForm uiForm) throws Exception { NewFolksonomyService newFolksonomyService = uiForm.getApplicationComponent(NewFolksonomyService.class); NodeHierarchyCreator nodeHierarchyCreator = uiForm.getApplicationComponent(NodeHierarchyCreator.class); String workspace = WCMCoreUtils.getRepository().getConfiguration().getDefaultWorkspaceName(); String tagPath = ""; if (NewFolksonomyService.PUBLIC == scope) { tagPath = newFolksonomyService.getDataDistributionType().getDataNode( (Node)(WCMCoreUtils.getUserSessionProvider().getSession(workspace, WCMCoreUtils.getRepository()).getItem( nodeHierarchyCreator.getJcrPath(PUBLIC_TAG_NODE_PATH))), tagName).getPath(); newFolksonomyService.removeTag(tagPath, workspace); } else if (NewFolksonomyService.PRIVATE == scope) { Node userFolksonomyNode = getUserFolksonomyFolder(userID, uiForm); tagPath = newFolksonomyService.getDataDistributionType().getDataNode(userFolksonomyNode, tagName).getPath(); newFolksonomyService.removeTag(tagPath, workspace); } uiForm.getAncestorOfType(UIJCRExplorer.class).findFirstComponentOfType(UITagExplorer.class).updateTagList(); } private Node getUserFolksonomyFolder(String userName, UIEditingTagsForm uiForm) throws Exception { NodeHierarchyCreator nodeHierarchyCreator = uiForm.getApplicationComponent(NodeHierarchyCreator.class); Node userNode = nodeHierarchyCreator.getUserNode(WCMCoreUtils.getUserSessionProvider(), userName); String folksonomyPath = nodeHierarchyCreator.getJcrPath(USER_FOLKSONOMY_ALIAS); return userNode.getNode(folksonomyPath); } } }