// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.ui.actions.view;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.ui.IWorkbenchPartSite;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.mdm.repository.core.AbstractRepositoryAction;
import org.talend.mdm.repository.core.command.CommandManager;
import org.talend.mdm.repository.core.command.ICommand;
import org.talend.mdm.repository.core.impl.view.IViewNodeConstDef;
import org.talend.mdm.repository.core.service.ContainerCacheService;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject;
import org.talend.mdm.repository.ui.actions.RenameObjectAction;
import org.talend.mdm.repository.ui.dialogs.RenameViewDialog;
import org.talend.mdm.repository.ui.dialogs.RenameViewDialog2;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.repository.utils.RepositoryTransformUtil;
import org.talend.mdm.repository.utils.ValidateUtil;
import org.talend.repository.model.IProxyRepositoryFactory;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
public class RenameViewAction extends AbstractRepositoryAction implements IViewNodeConstDef {
private static Logger log = Logger.getLogger(RenameObjectAction.class);
private IInputValidator inputValidator;
private ERepositoryObjectType etype;
private boolean viewTypeChanged = false;
public RenameViewAction() {
super(Messages.RenameObjectAction_rename);
setImageDescriptor(ImageCache.getImage(EImage.RENAME.getPath()));
}
@Override
public String getGroupName() {
return GROUP_EDIT;
}
@Override
protected boolean needValidateLockedObject() {
return true;
}
@Override
protected void doRun() {
Object selectObj = getSelectedObject().get(0);
if (selectObj instanceof IRepositoryViewObject) {
IRepositoryViewObject viewObj = (IRepositoryViewObject) selectObj;
IRepositoryViewObject parent = ContainerCacheService.getParent(viewObj);
etype = viewObj.getRepositoryObjectType();
//
renameViewObject(viewObj);
if (viewTypeChanged) {
moveToAnotherNode(parent, viewObj);
}
}
}
private void renameViewObject(IRepositoryViewObject viewObj) {
MDMServerObjectItem item = (MDMServerObjectItem) viewObj.getProperty().getItem();
MDMServerObject serverObject = item.getMDMServerObject();
IProxyRepositoryFactory factory = getFactory();
try {
if (serverObject != null) {
String oldName = serverObject.getName();
RenameViewDialog dialog = getRenameDialog(oldName);
int returnCode = dialog.open();
if (returnCode == IDialogConstants.OK_ID) {
String newName = dialog.getValue();
if (RepositoryTransformUtil.getInstance().getViewType(oldName) == TYPE_WEBFILTER) {
newName = PREFIX_VIEW_UPPER + newName;
} else {
if (newName.startsWith(PREFIX_VIEW_UPPER)) {
viewTypeChanged = true;
item.getState().setPath(IPath.SEPARATOR + PATH_WEBFILTER);
}
}
if (newName != null && factory.isEditableAndLockIfPossible(item)) {
serverObject.setName(newName);
viewObj.getProperty().setLabel(newName);
viewObj.getProperty().setDisplayName(newName);
factory.save(viewObj.getProperty().getItem(), false);
MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(viewObj);
if (lastServerDef != null) {
CommandManager.getInstance().pushCommand(ICommand.CMD_RENAME, viewObj.getId(),
new String[] { oldName, newName });
}
}
commonViewer.refresh(viewObj);
}
}
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
} finally {
try {
factory.unlock(item);
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
} catch (LoginException e) {
log.error(e.getMessage(), e);
}
}
}
public void moveToAnotherNode(IRepositoryViewObject parent, IRepositoryViewObject viewObj) {
MDMServerObjectItem item = (MDMServerObjectItem) viewObj.getProperty().getItem();
waitSomeTime(viewObj);
IProxyRepositoryFactory factory = getFactory();
try {
if (factory.isEditableAndLockIfPossible(item)) {
String path = item.getState().getPath();
IPath ipath = new Path(path);
factory.moveObject(viewObj, ipath);
IRepositoryViewObject iRepositoryViewObject = ContainerCacheService.get(viewObj.getRepositoryObjectType(), path);
commonViewer.refresh(iRepositoryViewObject);
commonViewer.refresh(parent);
}
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
} catch (BusinessException e) {
log.error(e.getMessage(), e);
} finally {
try {
factory.unlock(item);
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
} catch (LoginException e) {
log.error(e.getMessage(), e);
}
}
}
private void waitSomeTime(IRepositoryViewObject viewObj) {
boolean lockedViewObject = RepositoryResourceUtil.isLockedViewObject(viewObj);
if (lockedViewObject) {
try {
Thread.sleep(300);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
private RenameViewDialog getRenameDialog(String oldName) {
RenameViewDialog dialog = null;
IWorkbenchPartSite site = commonViewer.getCommonNavigator().getSite();
if (RepositoryTransformUtil.getInstance().getViewType(oldName) == TYPE_WEBFILTER) {
dialog = new RenameViewDialog(getShell(), Messages.RenameObjectAction_rename, Messages.Common_rename,
oldName.substring(PREFIX_VIEW_UPPER.length()), getInputValidator(), site);
} else {
dialog = new RenameViewDialog2(getShell(), Messages.RenameObjectAction_rename, Messages.Common_rename, oldName,
getInputValidator(), site);
}
return dialog;
}
private IProxyRepositoryFactory getFactory() {
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
return factory;
}
private IInputValidator getInputValidator() {
if (inputValidator == null) {
inputValidator = new IInputValidator() {
public String isValid(String newText) {
if (newText == null || newText.trim().length() == 0) {
return Messages.Common_nameCanNotBeEmpty;
}
if (!ValidateUtil.matchViewProcessRegex(newText)) {
return Messages.Common_nameInvalid;
}
//
if (RepositoryResourceUtil.isExistByName(etype, newText.trim())) {
return Messages.Common_nameIsUsed;
}
return null;
};
};
}
return inputValidator;
}
@Override
public boolean isVisible(IRepositoryViewObject viewObj) {
if (getSelectedObject().size() > 1) {
return false;
}
return super.isVisible(viewObj);
}
}