// ============================================================================ // // 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.List; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.talend.commons.exception.BusinessException; import org.talend.commons.exception.PersistenceException; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ItemState; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.mdm.repository.core.AbstractRepositoryAction; import org.talend.mdm.repository.core.command.CommandManager; import org.talend.mdm.repository.core.command.CommandStack; import org.talend.mdm.repository.core.command.ICommand; import org.talend.mdm.repository.core.service.ContainerCacheService; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.models.FolderRepositoryObject; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.repository.ProjectManager; import org.talend.repository.model.IProxyRepositoryFactory; import com.amalto.workbench.image.EImage; import com.amalto.workbench.image.ImageCache; /** * DOC hbhong class global comment. Detailled comment */ public class RestoreAction extends AbstractRepositoryAction { static Logger log = Logger.getLogger(RestoreAction.class); IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); /** * DOC hbhong RestoreAction constructor comment. * * @param text */ public RestoreAction() { super(Messages.RestoreAction_title); setImageDescriptor(ImageCache.getImage(EImage.ADD_OBJ.getPath())); } @Override public String getGroupName() { return GROUP_EDIT; } @Override protected void doRun() { for (Object obj : getSelectedObject()) { IRepositoryViewObject viewObj = (IRepositoryViewObject) obj; restore(viewObj); // restore parent restoreParent(viewObj); } // save try { factory.saveProject(ProjectManager.getInstance().getCurrentProject()); } catch (PersistenceException e) { log.error(e.getMessage(), e); } commonViewer.refresh(); } private void restore(IRepositoryViewObject viewObj) { if (viewObj instanceof FolderRepositoryObject) { restoreFolder((FolderRepositoryObject) viewObj); } else { restoreServerObject(viewObj); } } private void restoreFolder(FolderRepositoryObject viewObj) { Item item = viewObj.getProperty().getItem(); ERepositoryObjectType type = viewObj.getRepositoryObjectType(); if (RepositoryResourceUtil.isDeletedFolder(item, type)) { ItemState state = item.getState(); state.setDeleted(false); String path = ERepositoryObjectType.getFolderName(type); if (!path.isEmpty()) { path += state.getPath(); } List<String> deletedFolderPaths = ProjectManager.getInstance().getCurrentProject().getEmfProject() .getDeletedFolders(); deletedFolderPaths.remove(path); for (IRepositoryViewObject child : viewObj.getChildren()) { restore(child); } } } private void restoreServerObject(IRepositoryViewObject viewObj) { Item item = viewObj.getProperty().getItem(); try { factory.restoreObject(viewObj, new Path(item.getState().getPath())); if (RepositoryResourceUtil.isOpenedInEditor(viewObj) != null) { factory.lock(viewObj); } executeRestoreCommand(viewObj); } catch (PersistenceException e) { log.error(e.getMessage(), e); } catch (BusinessException e) { log.error(e.getMessage(), e); } } protected void executeRestoreCommand(IRepositoryViewObject viewObj) { CommandManager manager = CommandManager.getInstance(); String id = viewObj.getId(); CommandStack stack = manager.findCommandStack(id); if (stack != null) { List<ICommand> deployCommands = stack.getCommands(ICommand.PHASE_DEPLOY); if (deployCommands.size() > 0) { manager.pushCommand(ICommand.CMD_RESTORE, viewObj); } IProgressMonitor monitor = new NullProgressMonitor(); List<ICommand> commands = stack.getCommands(ICommand.PHASE_RESTORE); for (ICommand cmd : commands) { cmd.updateViewObject(viewObj); cmd.execute(null, monitor); } manager.removeCommandStack(id, ICommand.PHASE_RESTORE); } } private void restoreParent(IRepositoryViewObject viewObj) { IRepositoryViewObject parent = ContainerCacheService.getParent(viewObj); if (parent != null && parent instanceof FolderRepositoryObject) { Item item = parent.getProperty().getItem(); ERepositoryObjectType type = parent.getRepositoryObjectType(); if (RepositoryResourceUtil.isDeletedFolder(item, type)) { item.getState().setDeleted(false); String path = ERepositoryObjectType.getFolderName(type); if (!path.isEmpty()) { path += item.getState().getPath(); } List<String> deletedFolderPaths = ProjectManager.getInstance().getCurrentProject().getEmfProject() .getDeletedFolders(); deletedFolderPaths.remove(path); restoreParent(parent); } } } }