/*
* Copyright (C) 2003-2007 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.symlink;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.AccessDeniedException;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.nodetype.ConstraintViolationException;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.selector.UISelectable;
import org.exoplatform.ecm.webui.tree.selectone.UIOneNodePathSelector;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.cms.drives.DriveData;
import org.exoplatform.services.cms.drives.ManageDriveService;
import org.exoplatform.services.cms.i18n.MultiLanguageService;
import org.exoplatform.services.cms.link.NodeFinder;
import org.exoplatform.services.exceptions.SameAsDefaultLangException;
import org.exoplatform.services.jcr.util.Text;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.selector.content.one.UIContentBrowsePanelOne;
import org.exoplatform.wcm.webui.selector.content.one.UIContentSelectorOne;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormStringInput;
/**
* Created by The eXo Platform SARL
* Author : Chien Nguyen Van
*
*/
@ComponentConfigs( {
@ComponentConfig(lifecycle = UIFormLifecycle.class,
template = "app:/groovy/webui/component/explorer/thumbnail/UIAddTranslationForm.gtmpl",
events = {
@EventConfig(listeners = UIAddTranslationForm.SaveActionListener.class),
@EventConfig(listeners = UIAddTranslationForm.CancelActionListener.class, phase = Phase.DECODE) }),
@ComponentConfig(type = UITranslationFormMultiValueInputSet.class, id = "SymLinkMultipleInputset", events = {
@EventConfig(listeners = UIAddTranslationForm.RemoveActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIAddTranslationForm.SelectDocumentActionListener.class, phase = Phase.DECODE) }) })
public class UIAddTranslationForm extends UIForm implements UIPopupComponent, UISelectable {
public static final String FIELD_PATH = "pathNode";
public static final String FIELD_SYMLINK = "fieldPathNode";
public static final String POPUP_SYMLINK = "UIPopupSymLink";
/**
* Logger.
*/
private static final Log LOG = ExoLogger.getLogger(UIAddTranslationForm.class.getName());
final static public byte DRIVE_SELECTOR_MODE = 0;
final static public byte WORSPACE_SELECTOR_MODE = 1;
private byte selectorMode=DRIVE_SELECTOR_MODE;
public UIAddTranslationForm() throws Exception {
}
public void activate() {}
public void deActivate() {}
public void initFieldInput() throws Exception {
UITranslationFormMultiValueInputSet uiTranslationFormMultiValue = createUIComponent(UITranslationFormMultiValueInputSet.class,
"SymLinkMultipleInputset",
null);
uiTranslationFormMultiValue.setId(FIELD_PATH);
uiTranslationFormMultiValue.setName(FIELD_PATH);
uiTranslationFormMultiValue.setEditable(false);
uiTranslationFormMultiValue.setType(UIFormStringInput.class);
addUIFormInput(uiTranslationFormMultiValue);
}
public void doSelect(String selectField, Object value) throws Exception {
String valueNodeName = String.valueOf(value).trim();
String workspaceName = valueNodeName.substring(0, valueNodeName.lastIndexOf(":/"));
valueNodeName = valueNodeName.substring(workspaceName.lastIndexOf(":")+1);
List<String> listNodeName = new ArrayList<String>();
listNodeName.add(valueNodeName);
UITranslationFormMultiValueInputSet uiTranslationFormMultiValueInputSet = getChild(UITranslationFormMultiValueInputSet.class);
uiTranslationFormMultiValueInputSet.setValue(listNodeName);
String symLinkName = valueNodeName.substring(valueNodeName.lastIndexOf("/") + 1);
int squareBracketIndex = symLinkName.indexOf('[');
if (squareBracketIndex > -1)
symLinkName = symLinkName.substring(0, squareBracketIndex);
if (symLinkName.indexOf(".lnk") < 0) {
StringBuffer sb = new StringBuffer();
sb.append(symLinkName).append(".lnk");
symLinkName = sb.toString();
}
symLinkName = Text.unescapeIllegalJcrChars(symLinkName);
UIAddTranslationManager uiAddTranslationManager = getParent();
uiAddTranslationManager.removeChildById(POPUP_SYMLINK);
}
static public class SaveActionListener extends EventListener<UIAddTranslationForm> {
public void execute(Event<UIAddTranslationForm> event) throws Exception {
UIAddTranslationForm uiTranslationForm = event.getSource();
UIJCRExplorer uiExplorer = uiTranslationForm.getAncestorOfType(UIJCRExplorer.class);
UIApplication uiApp = uiTranslationForm.getAncestorOfType(UIApplication.class);
String pathNode = "";
UITranslationFormMultiValueInputSet uiSet = uiTranslationForm.getChild(UITranslationFormMultiValueInputSet.class);
List<UIComponent> listChildren = uiSet.getChildren();
for (UIComponent component : listChildren) {
UIFormStringInput uiStringInput = (UIFormStringInput)component;
if(uiStringInput.getValue() != null) {
pathNode = uiStringInput.getValue().trim();
}
}
Node node = uiExplorer.getCurrentNode() ;
if(uiExplorer.nodeIsLocked(node)) {
uiApp.addMessage(new ApplicationMessage("UIPopupMenu.msg.node-locked", null)) ;
return ;
}
if(pathNode == null || pathNode.length() ==0) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.path-node-invalid", null));
return ;
}
String workspaceName = pathNode.substring(0, pathNode.lastIndexOf(":/"));
pathNode = pathNode.substring(pathNode.lastIndexOf(":/") + 1);
NodeFinder nodeFinder = uiTranslationForm.getApplicationComponent(NodeFinder.class);
try {
nodeFinder.getItem(workspaceName, pathNode);
} catch (ItemNotFoundException e) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.non-node",
null,
ApplicationMessage.WARNING));
return;
} catch (RepositoryException re) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.non-node",
null,
ApplicationMessage.WARNING));
return;
} catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("An unexpected error occurs", e);
}
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.non-node",
null,
ApplicationMessage.WARNING));
return;
}
try {
Node targetNode = (Node) nodeFinder.getItem(workspaceName, pathNode);
MultiLanguageService langService = uiTranslationForm.getApplicationComponent(MultiLanguageService.class);
langService.addSynchronizedLinkedLanguage(node, targetNode);
uiExplorer.updateAjax(event);
} catch (AccessControlException ace) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.repository-exception",
null,
ApplicationMessage.WARNING));
return;
} catch (AccessDeniedException ade) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.repository-exception",
null,
ApplicationMessage.WARNING));
return;
} catch(NumberFormatException nume) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.numberformat-exception",
null,
ApplicationMessage.WARNING));
return;
} catch(ConstraintViolationException cve) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.cannot-save",
null,
ApplicationMessage.WARNING));
return;
} catch(ItemExistsException iee) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.item-exists-exception",
null,
ApplicationMessage.WARNING));
return;
} catch(UnsupportedRepositoryOperationException unOperationException) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.UnsupportedRepositoryOperationException",
null,
ApplicationMessage.WARNING));
return;
} catch (SameAsDefaultLangException unOperationException) {
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.translation-node-same-language-default",
null,
ApplicationMessage.WARNING));
return;
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
uiApp.addMessage(new ApplicationMessage("UIAddTranslationForm.msg.cannot-save",
null,
ApplicationMessage.WARNING));
return;
}
}
}
static public class CancelActionListener extends EventListener<UIAddTranslationForm> {
public void execute(Event<UIAddTranslationForm> event) throws Exception {
UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class);
uiExplorer.cancelAction();
}
}
static public class RemoveActionListener extends EventListener<UITranslationFormMultiValueInputSet> {
public void execute(Event<UITranslationFormMultiValueInputSet> event) throws Exception {
UITranslationFormMultiValueInputSet uiSet = event.getSource();
UIComponent uiComponent = uiSet.getParent();
if (uiComponent instanceof UIAddTranslationForm) {
UIAddTranslationForm uiTranslationForm = (UIAddTranslationForm)uiComponent;
String id = event.getRequestContext().getRequestParameter(OBJECTID);
uiSet.removeChildById(id);
event.getRequestContext().addUIComponentToUpdateByAjax(uiTranslationForm);
}
}
}
static public class SelectDocumentActionListener extends EventListener<UITranslationFormMultiValueInputSet> {
private String fixPath(String path, String driveName, String repo, UIAddTranslationForm uiAddTranslationForm) throws Exception {
if (path == null || path.length() == 0 ||
driveName == null || driveName.length() == 0 ||
repo == null || repo.length() == 0)
return "";
ManageDriveService managerDriveService = uiAddTranslationForm.getApplicationComponent(ManageDriveService.class);
DriveData driveData = managerDriveService.getDriveByName(driveName);
if (!path.startsWith(driveData.getHomePath()))
return "";
if ("/".equals(driveData.getHomePath()))
return path;
return path.substring(driveData.getHomePath().length());
}
public void execute(Event<UITranslationFormMultiValueInputSet> event) throws Exception {
UITranslationFormMultiValueInputSet uiSet = event.getSource();
UIAddTranslationForm uiTranslationForm = (UIAddTranslationForm) uiSet.getParent();
UIAddTranslationManager uiAddTranslationManager = uiTranslationForm.getParent();
UIJCRExplorer uiExplorer = uiTranslationForm.getAncestorOfType(UIJCRExplorer.class);
String workspaceName = uiExplorer.getCurrentWorkspace();
String param = "returnField=" + FIELD_SYMLINK;
UIPopupWindow uiPopupWindow = uiAddTranslationManager.initPopupTaxonomy(POPUP_SYMLINK);
if (uiTranslationForm.isUseWorkspaceSelector()) {
UIOneNodePathSelector uiNodePathSelector = uiAddTranslationManager.createUIComponent(UIOneNodePathSelector.class, null, null);
uiPopupWindow.setUIComponent(uiNodePathSelector);
uiNodePathSelector.setIsDisable(workspaceName, false);
uiNodePathSelector.setExceptedNodeTypesInPathPanel(new String[] {Utils.EXO_SYMLINK});
uiNodePathSelector.setRootNodeLocation(uiExplorer.getRepositoryName(), workspaceName, "/");
uiNodePathSelector.setIsShowSystem(false);
uiNodePathSelector.init(WCMCoreUtils.getUserSessionProvider());
uiNodePathSelector.setSourceComponent(uiTranslationForm, new String[]{param});
}else {
Node node =uiExplorer.getCurrentNode();
UIContentSelectorOne uiNodePathSelector = uiTranslationForm.createUIComponent(UIContentSelectorOne.class, null, null);
uiPopupWindow.setUIComponent(uiNodePathSelector);
uiNodePathSelector.init(uiExplorer.getDriveData().getName(),
fixPath(node == null ? "" : node.getPath(),
uiExplorer.getDriveData().getName(),
uiExplorer.getRepositoryName(),
uiTranslationForm));
uiNodePathSelector.getChild(UIContentBrowsePanelOne.class).setSourceComponent(uiTranslationForm, new String[] { param });
}
uiPopupWindow.setRendered(true);
uiPopupWindow.setShow(true);
event.getRequestContext().addUIComponentToUpdateByAjax(uiAddTranslationManager);
}
}
public void useWorkspaceSelector() {
this.selectorMode = WORSPACE_SELECTOR_MODE;
}
public void useDriveSelector() {
this.selectorMode = DRIVE_SELECTOR_MODE;
}
public boolean isUseWorkspaceSelector() {
return this.selectorMode==WORSPACE_SELECTOR_MODE;
}
}