// ============================================================================
//
// 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.recyclebin;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ProcessItem;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.dataquality.properties.TDQMatchRuleItem;
import org.talend.mdm.repository.core.AbstractRepositoryAction;
import org.talend.mdm.repository.core.IRepositoryNodeConfiguration;
import org.talend.mdm.repository.core.IRepositoryNodeResourceProvider;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.command.CommandManager;
import org.talend.mdm.repository.core.service.ContainerCacheService;
import org.talend.mdm.repository.extension.RepositoryNodeConfigurationManager;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.models.FolderRepositoryObject;
import org.talend.mdm.repository.ui.dialogs.recycle.WaitToDeployDialog;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.IProxyRepositoryFactory;
/**
* DOC hbhong class global comment. Detailled comment
*/
public abstract class AbstractRemoveCommandStackAction extends AbstractRepositoryAction {
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
static Logger log = Logger.getLogger(AbstractRemoveCommandStackAction.class);
/**
* DOC hbhong AbstractRemoveCommandStackAction constructor comment.
*
* @param text
*/
protected AbstractRemoveCommandStackAction(String text) {
super(text);
}
protected boolean canRemove(List<IRepositoryViewObject> viewObjs) {
WaitToDeployDialog dialog = new WaitToDeployDialog(getShell(), viewObjs);
if (dialog.needShowDialog()) {
return dialog.open() == IDialogConstants.OK_ID;
}
return true;
}
protected void removeViewObjects(List<IRepositoryViewObject> viewObjs) {
if (canRemove(viewObjs)) {
for (IRepositoryViewObject viewObj : viewObjs) {
RepositoryResourceUtil.closeEditor(viewObj, false);
if (isServerObject(viewObj)) {
removeServerObject(viewObj);
} else if (viewObj instanceof FolderRepositoryObject) {
removeFolderObject((FolderRepositoryObject) viewObj);
}
}
}
try {
factory.saveProject(ProjectManager.getInstance().getCurrentProject());
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
}
refreshRepositoryRoot(IServerObjectRepositoryType.TYPE_RECYCLE_BIN);
}
private boolean isServerObject(IRepositoryViewObject viewObj) {
Item item = viewObj.getProperty().getItem();
return item instanceof MDMServerObjectItem || item instanceof ProcessItem || item instanceof TDQMatchRuleItem;
}
private void removeServerObject(IRepositoryViewObject viewObj) {
try {
ERepositoryObjectType type = viewObj.getRepositoryObjectType();
String label = viewObj.getLabel();
String version = viewObj.getVersion();
//
String id = viewObj.getId();
List<IRepositoryViewObject> viewObjs = new ArrayList<IRepositoryViewObject>();
viewObjs.add(viewObj);
ContainerCacheService.remove(id);
factory.deleteObjectPhysical(viewObj);
CommandManager.getInstance().removeCommandStack(id);
//
postRemove(type, label, version);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private void postRemove(ERepositoryObjectType type, String name, String version) {
IRepositoryNodeConfiguration configuration = RepositoryNodeConfigurationManager.getConfiguration(type);
if (configuration != null) {
IRepositoryNodeResourceProvider resourceProvider = configuration.getResourceProvider();
if (resourceProvider != null) {
resourceProvider.postDelete(name, version);
}
}
}
private void removeFolderObject(FolderRepositoryObject viewObj) {
Project project = ProjectManager.getInstance().getCurrentProject();
ContainerItem containerItem = (ContainerItem) viewObj.getProperty().getItem();
String path = containerItem.getState().getPath();
ERepositoryObjectType repObjType = containerItem.getRepObjType();
// ContainerCacheService.removeContainer(repObjType, path);
for (IRepositoryViewObject childObj : viewObj.getChildren()) {
if (childObj instanceof FolderRepositoryObject) {
removeFolderObject((FolderRepositoryObject) childObj);
} else {
removeServerObject(childObj);
}
}
try {
factory.deleteFolder(project, repObjType, new Path(path), false);
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
}
}
}