/*************************************************************************** * Copyright (C) 2003-2009 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 javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.nodetype.NodeDefinition; import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.ecm.webui.utils.JCRExceptionManager; import org.exoplatform.services.jcr.util.Text; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.wcm.webui.Utils; import org.exoplatform.web.application.ApplicationMessage; 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.UIPopupComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.exception.MessageException; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.validator.MandatoryValidator; @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UICategoryForm.SaveActionListener.class), @EventConfig(listeners = UICategoryForm.CancelActionListener.class, phase=Phase.DECODE) } ) public class UICategoryForm extends UIForm implements UIPopupComponent { final static public String FIELD_NAME = "name"; final static public String FIELD_TYPE = "type"; final static private Log LOG = ExoLogger.getLogger(UICategoryForm.class.getName()); public void activate() { try { addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null).addValidator(MandatoryValidator.class).addValidator(ECMNameValidator.class)); setActions(new String[] { "Save", "Cancel" }); getUIStringInput(FIELD_NAME).setValue(null); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error!", e.getMessage()); } } } public void deActivate() {} static public class SaveActionListener extends EventListener<UICategoryForm> { public void execute(Event<UICategoryForm> event) throws Exception { UICategoryForm uiFolderForm = event.getSource(); UIJCRExplorer uiExplorer = uiFolderForm.getAncestorOfType(UIJCRExplorer.class); UIApplication uiApp = uiFolderForm.getAncestorOfType(UIApplication.class); String title = uiFolderForm.getUIStringInput(FIELD_NAME).getValue(); String name = Utils.cleanString(title); Node node = uiExplorer.getCurrentNode(); if (uiExplorer.nodeIsLocked(node)) { uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.node-locked", null)); return; } if (name == null || name.length() == 0) { uiApp.addMessage(new ApplicationMessage("UIFolderForm.msg.name-invalid", null)); return; } String type = "exo:taxonomy"; try { Node newNode = node.addNode(Text.escapeIllegalJcrChars(name), type); if (newNode.canAddMixin("exo:rss-enable")) { newNode.addMixin("exo:rss-enable"); newNode.setProperty("exo:title", title); } node.save(); node.getSession().save(); uiExplorer.updateAjax(event); } catch(ConstraintViolationException cve) { Object[] arg = { type }; throw new MessageException(new ApplicationMessage("UIFolderForm.msg.constraint-violation", arg, ApplicationMessage.WARNING)); } catch(AccessDeniedException accessDeniedException) { uiApp.addMessage(new ApplicationMessage("UIFolderForm.msg.repository-exception-permission", null, ApplicationMessage.WARNING)); return; } catch(RepositoryException re) { String key = ""; NodeDefinition[] definitions = node.getPrimaryNodeType().getChildNodeDefinitions(); for (NodeDefinition def : definitions) { if (node.hasNode(name) || !def.allowsSameNameSiblings()) { key = "UIFolderForm.msg.not-allow-sameNameSibling"; } else { key = "UIFolderForm.msg.repository-exception"; } } uiApp.addMessage(new ApplicationMessage(key, null, ApplicationMessage.WARNING)); return ; } catch(NumberFormatException nume) { String key = "UIFolderForm.msg.numberformat-exception"; uiApp.addMessage(new ApplicationMessage(key, null, ApplicationMessage.WARNING)); return ; } catch (Exception e) { JCRExceptionManager.process(uiApp, e); if (LOG.isErrorEnabled()) { LOG.error("Error when create category node", e); } return; } } } static public class CancelActionListener extends EventListener<UICategoryForm> { public void execute(Event<UICategoryForm> event) throws Exception { UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class); uiExplorer.cancelAction(); } } }