// ============================================================================
//
// 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.process;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.window.Window;
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.properties.Item;
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.transformerV2.ITransformerV2NodeConsDef;
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.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 RenameProcessAction extends AbstractRepositoryAction implements ITransformerV2NodeConsDef {
private static Logger log = Logger.getLogger(RenameProcessAction.class);
private String oldPrefix = null;
protected IInputValidator validator;
private boolean processTypeChanged = false;
private ERepositoryObjectType etype;
public RenameProcessAction() {
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();
//
renameProcessObject(viewObj);
if (processTypeChanged) {
moveToOtherTypeNode(parent, viewObj);
}
}
}
private void renameProcessObject(IRepositoryViewObject viewObj) {
MDMServerObjectItem item = (MDMServerObjectItem) viewObj.getProperty().getItem();
MDMServerObject serverObject = item.getMDMServerObject();
int type = getType(item);
if (serverObject != null) {
String oldName = serverObject.getName();
RenameProcessDialog dialog = getRenameDialog(getSite(), oldName, type, getInputValidator());
int returnCode = dialog.open();
if (returnCode == Window.OK) {
IProxyRepositoryFactory factory = getFactory();
String newName = dialog.getValue();
transformPath(viewObj, newName);
try {
if (factory.isEditableAndLockIfPossible(item)) {
serverObject.setName(newName);
viewObj.getProperty().setLabel(newName);
viewObj.getProperty().setDisplayName(newName);
factory.save(item, false);
MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(item);
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);
}
}
}
}
}
private void waitSomeTime(IRepositoryViewObject viewObj) {
boolean lockedViewObject = RepositoryResourceUtil.isLockedViewObject(viewObj);
System.out.println(lockedViewObject);
if (lockedViewObject) {
try {
Thread.sleep(300);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
public void moveToOtherTypeNode(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(parent);
commonViewer.refresh(iRepositoryViewObject);
}
} 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 IWorkbenchPartSite getSite() {
IWorkbenchPartSite site = commonViewer.getCommonNavigator().getSite();
return site;
}
private IProxyRepositoryFactory getFactory() {
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
return factory;
}
private RenameProcessDialog getRenameDialog(IWorkbenchPartSite site, String processName, int type,
IInputValidator inputValidator) {
RenameProcessDialog renameDialog = new RenameProcessDialog(site.getShell(), site, type, processName, inputValidator);
return renameDialog;
}
private int getType(Item item) {
int type = 0;
String path = item.getState().getPath();
if (path.startsWith("/")) { //$NON-NLS-1$
path = path.substring(1);
}
if (path.startsWith(PATH_BEFORESAVE)) {
type = TYPE_BEFORESAVE;
oldPrefix = PREFIX_BEFORESAVE_UPPER;
} else if (path.startsWith(PATH_BEFOREDEL)) {
type = TYPE_BEFOREDEL;
oldPrefix = PREFIX_BEFOREDEL_UPPER;
} else if (path.startsWith(PATH_ENTITYACTION)) {
type = TYPE_ENTITYACTION;
oldPrefix = PREFIX_RUNNABLE_UPPER;
} else if (path.startsWith(PATH_WELCOMEACTION)) {
type = TYPE_WELCOMEACTION;
oldPrefix = PREFIX_STANDLONE_UPPER;
} else if (path.startsWith(PATH_SMARTVIEW)) {
type = TYPE_SMARTVIEW;
oldPrefix = PREFIX_SMARTVIEW_UPPER;
} else if (path.startsWith(PATH_OTHER)) {
type = TYPE_OTHER;
oldPrefix = ""; //$NON-NLS-1$
}
return type;
}
private void transformPath(IRepositoryViewObject viewObj, String newName) {
String newPath = getNewPath(newName);
if (newPath != null) {
processTypeChanged = true;
viewObj.getProperty().getItem().getState().setPath(newPath);
}
}
private String getNewPath(String newName) {
String path = null;
if (oldPrefix.isEmpty()) {
return RepositoryTransformUtil.getInstance().getProcessPath(newName, true);
}
return path;
}
private IInputValidator getInputValidator() {
if (validator == null) {
validator = new IInputValidator() {
public String isValid(String newText) {
if (newText == null || newText.trim().length() == 0) {
return Messages.Common_nameCanNotBeEmpty;
}
if (newText.startsWith(ITransformerV2NodeConsDef.PREFIX_SMARTVIEW_UPPER)) {
if (!ValidateUtil.matchSmartViewRegex(newText)) {
return Messages.Common_nameInvalid;
}
}
if (!ValidateUtil.matchViewProcessRegex(newText)) {
return Messages.Common_nameInvalid;
}
//
if (RepositoryResourceUtil.isExistByName(etype, newText.trim())) {
return Messages.Common_nameIsUsed;
}
return null;
};
};
}
return validator;
}
@Override
public boolean isVisible(IRepositoryViewObject viewObj) {
if (getSelectedObject().size() == 1) {
String path = viewObj.getPath();
if (path != null && path.equalsIgnoreCase("system")) {//$NON-NLS-1$
return false;
}
return true;
}
return false;
}
}