// ============================================================================
//
// Copyright (C) 2006-2012 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.repository.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.talend.commons.exception.BusinessException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler;
import org.talend.commons.ui.runtime.image.ECoreImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.ITDQRepositoryService;
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.model.repository.RepositoryManager;
import org.talend.core.repository.i18n.Messages;
import org.talend.core.repository.model.ISubRepositoryObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.repository.utils.RepositoryNodeDeleteManager;
import org.talend.designer.business.diagram.custom.IDiagramModelService;
import org.talend.repository.ProjectManager;
import org.talend.repository.model.ERepositoryStatus;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.ItemReferenceBean;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.model.RepositoryNodeUtilities;
import org.talend.repository.ui.dialog.ItemReferenceDialog;
/**
* Action used to empty the recycle bin.<br/>
*
* $Id: EmptyRecycleBinAction.java 85660 2012-06-15 08:09:39Z ycbai $
*
*/
public class EmptyRecycleBinAction extends AContextualAction {
public EmptyRecycleBinAction() {
super();
this.setText(Messages.getString("EmptyRecycleBinAction.action.title")); //$NON-NLS-1$
this.setToolTipText(Messages.getString("EmptyRecycleBinAction.action.toolTipText")); //$NON-NLS-1$
this.setImageDescriptor(ImageProvider.getImageDesc(ECoreImage.RECYCLE_BIN_EMPTY_ICON));
}
@Override
protected void doRun() {
ISelection selection = getSelection();
Object obj = ((IStructuredSelection) selection).getFirstElement();
final RepositoryNode node = (RepositoryNode) obj;
final String title = Messages.getString("EmptyRecycleBinAction.dialog.title"); //$NON-NLS-1$
String message = null;
// TDI-20542
List<IRepositoryNode> originalChildren = node.getChildren();
final List<IRepositoryNode> children = new ArrayList<IRepositoryNode>(originalChildren);
if (children.size() == 0) {
return;
} else if (children.size() > 1) {
message = Messages.getString("DeleteAction.dialog.messageAllElements") + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
Messages.getString("DeleteAction.dialog.message2"); //$NON-NLS-1$;
} else {
message = Messages.getString("DeleteAction.dialog.message1") + "\n" //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.getString("DeleteAction.dialog.message2"); //$NON-NLS-1$
}
final List<ItemReferenceBean> unDeleteItems = RepositoryNodeDeleteManager.getInstance().getUnDeleteItems(children, null);
final Shell shell = getShell();
if (!(MessageDialog.openQuestion(shell, title, message))) {
return;
}
// TDQ-5359
for (IRepositoryNode child : children) {
// MOD klliu 2011-04-28 bug 20204 removing connection is synced to the connection view of SQL
// explore
if (GlobalServiceRegister.getDefault().isServiceRegistered(ITDQRepositoryService.class)) {
ITDQRepositoryService tdqRepService = (ITDQRepositoryService) GlobalServiceRegister.getDefault().getService(
ITDQRepositoryService.class);
if (!tdqRepService.removeAliasInSQLExplorer(child)) {
MessageDialog.openWarning(shell, title, Messages.getString("EmptyRecycleBinAction.dialog.allDependencies"));
try {
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
factory.saveProject(ProjectManager.getInstance().getCurrentProject());
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
return;
}
}
}
final IWorkspaceRunnable op = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) {
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
for (IRepositoryNode child : children) {
try {
deleteElements(factory, (RepositoryNode) child);
} catch (Exception e) {
MessageBoxExceptionHandler.process(e);
}
}
try {
factory.saveProject(ProjectManager.getInstance().getCurrentProject());
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
};
IRunnableWithProgress iRunnableWithProgress = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
try {
ISchedulingRule schedulingRule = workspace.getRoot();
// the update the project files need to be done in the workspace runnable to avoid all
// notification
// of changes before the end of the modifications.
workspace.run(op, schedulingRule, IWorkspace.AVOID_UPDATE, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
};
try {
PlatformUI.getWorkbench().getProgressService().run(true, true, iRunnableWithProgress);
} catch (Exception e) {
ExceptionHandler.process(e);
}
if (unDeleteItems.size() > 0) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
ItemReferenceDialog dialog = new ItemReferenceDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell(), unDeleteItems);
dialog.open();
}
});
}
// TDI-21238, have done listener to refresh in new CNF repository view
// MOD qiongli 2011-1-24,avoid to refresh repositoryView for top
// if (!PluginChecker.isOnlyTopLoaded()) {
// RepositoryManager.refresh(ERepositoryObjectType.JOB_SCRIPT);
// IRepositoryView view = getViewPart();
// if (view != null) {
// view.refresh();
// }
// }
}
protected Shell getShell() {
Shell shell = null;
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null) {
shell = activeWorkbenchWindow.getShell();
}
if (shell == null) {
Display dis = Display.getCurrent();
if (dis == null) {
dis = Display.getDefault();
}
if (dis != null) {
shell = dis.getActiveShell();
}
}
if (shell == null) {
shell = new Shell();
}
return shell;
}
/**
*
* ggu Comment method "refreshRelations".
*
* bug 12883
*/
private void refreshRelations() {
// refresh
RepositoryManager.refreshDeletedNode(null);
IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow != null && GlobalServiceRegister.getDefault().isServiceRegistered(IDiagramModelService.class)) {
IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
IDiagramModelService sevice = (IDiagramModelService) GlobalServiceRegister.getDefault().getService(
IDiagramModelService.class);
if (page != null && sevice != null) {
for (IEditorReference editors : page.getEditorReferences()) {
sevice.refreshBusinessModel(editors);
}
}
}
}
protected void deleteElements(final IProxyRepositoryFactory factory, final RepositoryNode currentNode)
throws PersistenceException, BusinessException {
final IRepositoryViewObject objToDelete = currentNode.getObject();
if (objToDelete == null) {
return;
}
if (objToDelete instanceof ISubRepositoryObject) {
ISubRepositoryObject subRepositoryObject = (ISubRepositoryObject) objToDelete;
if (!isRootNodeDeleted(currentNode)) {
Item item = subRepositoryObject.getProperty().getItem();
subRepositoryObject.removeFromParent();
factory.save(item);
}
} else {
Display.getDefault().syncExec(new Runnable() {
public void run() {
try {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
for (IEditorReference editors : page.getEditorReferences()) {
String nameInEditor = editors.getName();
if (objToDelete.getLabel().equals(nameInEditor.substring(nameInEditor.indexOf(" ") + 1))) { //$NON-NLS-1$
page.closeEditor(editors.getEditor(false), false);
}
}
if (objToDelete.getRepositoryObjectType() != ERepositoryObjectType.JOB_DOC
&& objToDelete.getRepositoryObjectType() != ERepositoryObjectType.JOBLET_DOC) {
if (currentNode.getType() == ENodeType.SIMPLE_FOLDER) {
for (IRepositoryNode curNode : currentNode.getChildren()) {
deleteElements(factory, (RepositoryNode) curNode);
}
factory.deleteFolder(ProjectManager.getInstance().getCurrentProject(),
currentNode.getContentType(),
RepositoryNodeUtilities.getFolderPath(currentNode.getObject().getProperty().getItem()),
true);
} else {
factory.deleteObjectPhysical(ProjectManager.getInstance().getCurrentProject(), objToDelete, null,
true);
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
});
}
}
/**
* DOC qzhang Comment method "getRootNode".
*
* @param child
* @return
*/
private boolean isRootNodeDeleted(RepositoryNode child) {
boolean isDeleted = false;
if (child != null) {
RepositoryNode parent = child.getParent();
if (parent != null) {
IRepositoryViewObject object = parent.getObject();
if (object != null) {
ProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
isDeleted = factory.getStatus(object) == ERepositoryStatus.DELETED;
}
if (!isDeleted) {
isDeleted = isRootNodeDeleted(parent);
}
}
}
return isDeleted;
}
/*
* (non-Javadoc)
*
* @see org.talend.repository.ui.actions.ITreeContextualAction#init(org.eclipse.jface.viewers.TreeViewer,
* org.eclipse.jface.viewers.IStructuredSelection)
*/
public void init(TreeViewer viewer, IStructuredSelection selection) {
boolean canWork = !selection.isEmpty() && selection.size() == 1;
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
if (factory.isUserReadOnlyOnCurrentProject()) {
canWork = false;
}
if (canWork) {
Object o = selection.getFirstElement();
RepositoryNode node = (RepositoryNode) o;
switch (node.getType()) {
case STABLE_SYSTEM_FOLDER:
if (!node.isBin() || !node.hasChildren()) {
canWork = false;
}
break;
default:
canWork = false;
break;
}
if (canWork && !ProjectManager.getInstance().isInCurrentMainProject(node)) {
canWork = false;
}
}
setEnabled(canWork);
}
}