// ============================================================================
//
// 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.io.File;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.views.properties.PropertySheet;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.swt.actions.ITreeContextualAction;
import org.talend.commons.utils.VersionUtils;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ItemState;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.RepositoryViewObject;
import org.talend.core.model.utils.RepositoryManagerHelper;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.repository.ProjectManager;
import org.talend.repository.RepositoryWorkUnit;
import org.talend.repository.model.IProxyRepositoryFactory;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.IRepositoryNode.ENodeType;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.RepositoryConstants;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.ui.views.IJobSettingsView;
import org.talend.repository.ui.views.IRepositoryView;
/**
* Used to manage contextual actions on repository objects.<br/>
*
* $Id: AContextualAction.java 219 2006-10-24 13:45:54 +0000 (星期二, 24 十月 2006) smallet $
*
*/
public abstract class AContextualAction extends Action implements ITreeContextualAction {
private int level; // Used to manage order of actions in contextual menu
private boolean readAction = false;;
private boolean editAction = false;
private boolean propertiesAction = false;
private boolean isToolbar = false;
private ISelectionProvider specialSelectionProvider = null;
private String groupId;
private String neededVersion;
private boolean avoidUnloadResources;
private boolean unloadResourcesAfter;
protected RepositoryNode repositoryNode;
private Item oldItem;
private IRepositoryNode node;
public boolean isEditAction() {
return editAction;
}
public void setEditAction(boolean editAction) {
this.editAction = editAction;
}
public boolean isReadAction() {
return readAction;
}
public void setReadAction(boolean readAction) {
this.readAction = readAction;
}
public boolean isPropertiesAction() {
return propertiesAction;
}
public void setPropertiesAction(boolean propertiesAction) {
this.propertiesAction = propertiesAction;
}
/**
* Getter for level.
*
* @return the level
*/
public int getLevel() {
return this.level;
}
/**
* Sets the level.
*
* @param level the level to set
*/
public void setLevel(int level) {
this.level = level;
}
/*
* (non-Javadoc)
*
* @see org.talend.commons.ui.swt.actions.ITreeContextualAction#isVisible()
*/
public boolean isVisible() {
return isEnabled();
}
/**
* Returns if this action is accessible by double-click.
*
* @return <code>true</code> if action is accessible by double-click, <code>true</code> otherwise
*/
public final boolean isDoubleClickAction() {
return getClassForDoubleClick() != null;
}
/**
* Returns the class on wich this action may be call by double-click.
*
* @return the class on wich this action may be call by double-click
*/
public Class getClassForDoubleClick() {
return null;
}
/**
* Getter for neededVersion.
*
* @return the neededVersion
*/
public String getNeededVersion() {
return this.neededVersion;
}
/**
* Sets the neededVersion.
*
* @param neededVersion the neededVersion to set
*/
public void setNeededVersion(String neededVersion) {
this.neededVersion = neededVersion;
}
/**
* Convenience method user to refresh view on wich action had been called.
*/
public void refresh() {
IRepositoryView viewPart = getViewPart();
if (viewPart != null) {
viewPart.refresh();
}
}
/**
* Convenience method user to refresh view (starting with the given element) on wich action had been called.
*
* @param obj - object to start the refresh on
*/
public void refresh(Object obj) {
IRepositoryView viewPart = getViewPart();
if (viewPart != null) {
viewPart.refresh(obj);
viewPart.expand(obj, true);
}
}
private IWorkbenchPart workbenchPart = null;
/**
* Getter for workbenchPart.
*
* @return the workbenchPart
*/
public IWorkbenchPart getWorkbenchPart() {
return this.workbenchPart;
}
/**
* Sets the workbenchPart.
*
* @param workbenchPart the workbenchPart to set
*/
public void setWorkbenchPart(IWorkbenchPart workbenchPart) {
this.workbenchPart = workbenchPart;
}
/**
* The repository view selection.
*
* @return the selection
*/
public ISelection getSelection() {
if (specialSelectionProvider != null) {
return specialSelectionProvider.getSelection();
}
// useful for version property tab
IWorkbenchPart activePart = getActivePage().getActivePart();
if (activePart instanceof PropertySheet) {
return getActivePage().getSelection();
}
if (activePart instanceof IJobSettingsView) {
// wzhang modified to fix 8097.
ISelection selection = ((IJobSettingsView) activePart).getSelection();
if (selection == null) {
selection = getRepositorySelection();
}
return selection;
}
if (activePart instanceof IRepositoryView) {
return ((IRepositoryView) activePart).getViewer().getSelection();
}
if (workbenchPart != null) {
if (workbenchPart instanceof IRepositoryView) {
IRepositoryView view = (IRepositoryView) workbenchPart;
return view.getViewer().getSelection();
}
}
if (getActivePage().getActiveEditor() == null) {
workbenchPart = activePart;
if (workbenchPart instanceof IRepositoryView) {
IRepositoryView view = (IRepositoryView) workbenchPart;
return view.getViewer().getSelection();
}
return null;
}
IWorkbenchPartSite site = getActivePage().getActiveEditor().getSite();
ISelectionProvider selectionProvider = site.getSelectionProvider();
// if selectionProvider is null then avoid a NPE is required,see TDI-18275
return selectionProvider == null ? null : selectionProvider.getSelection();
}
/**
*
* Returns the repository view..
*
* @return - the repository biew
*/
public IRepositoryView getViewPart() {
if (workbenchPart != null) {
if (workbenchPart instanceof IRepositoryView) {
return (IRepositoryView) workbenchPart;
}
}
return RepositoryManagerHelper.findRepositoryView();
}
protected IWorkbench getWorkbench() {
IWorkbenchWindow workbenchWindow = getWorkbenchWindow();
IWorkbench workbench = null;
if (workbenchWindow != null) {
workbench = workbenchWindow.getWorkbench();
}
return workbench;
}
protected IWorkbenchWindow getWorkbenchWindow() {
IWorkbenchWindow workbenchWindow = null;
IRepositoryView viewPart = this.getViewPart();
if (viewPart != null) {
workbenchWindow = viewPart.getViewSite().getWorkbenchWindow();
} else {
workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
}
return workbenchWindow;
}
/**
* Returns the currently active page for this workbench window.
*
* @return the active page, or <code>null</code> if none
*/
public IWorkbenchPage getActivePage() {
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
}
protected void notifySQLBuilder(List<IRepositoryViewObject> list) {
CoreRuntimePlugin.getInstance().getRepositoryService().notifySQLBuilder(list);
}
/**
* Getter for isToolbar.
*
* @return the isToolbar
*/
public boolean isToolbar() {
return this.isToolbar;
}
/**
* Sets the isToolbar.
*
* @param isToolbar the isToolbar to set
*/
public void setToolbar(boolean isToolbar) {
this.isToolbar = isToolbar;
}
/**
* DOC qzhang Comment method "getCurrentRepositoryNode".
*
* @return
*/
protected RepositoryNode getCurrentRepositoryNode() {
ISelection selection;
IWorkbenchPage activePage = getActivePage();
if (activePage == null) {
selection = getSelection();
} else {
selection = getRepositorySelection();
}
// RepositoryNode metadataNode = getViewPart().getRoot().getChildren().get(6);
// RepositoryNode fileDelimitedNode = metadataNode.getChildren().get(1); getSelection()
if (selection == null) {
return null;
}
Object obj = null;
if (selection instanceof IStructuredSelection) {
obj = ((IStructuredSelection) selection).getFirstElement();
}
if (obj == null) {
selection = getSelection();
if (selection != null && selection instanceof IStructuredSelection) {
obj = ((IStructuredSelection) selection).getFirstElement();
}
}
if (!(obj instanceof RepositoryNode)) {
return null;
}
RepositoryNode node = (RepositoryNode) obj;
if (node == null || node.getObject() == null || !(node.getObject() instanceof RepositoryNode)) {
return node;
}
Property property = node.getObject().getProperty();
Property updatedProperty = null;
try {
IProxyRepositoryFactory proxyRepositoryFactory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
proxyRepositoryFactory.initialize();
updatedProperty = proxyRepositoryFactory.getLastVersion(
new Project(ProjectManager.getInstance().getProject(property.getItem())), property.getId()).getProperty();
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
// update the property of the node repository object
// node.getObject().setProperty(updatedProperty);
return node;
}
/**
* DOC wzhang Comment method "getRepositorySelection".
*
* @return
*/
protected ISelection getRepositorySelection() {
IRepositoryView repositoryViewPart = null;
for (IViewReference viewRef : getActivePage().getViewReferences()) {
if (viewRef.getView(false) instanceof IRepositoryView) {
repositoryViewPart = (IRepositoryView) viewRef.getView(false);
break;
}
}
if (repositoryViewPart == null) {
// comment by bug 10542
// try {
// throw new SystemException("Repository view not found");
// } catch (SystemException e) {
// ExceptionHandler.process(e);
// }
return null;
}
ISelection selection = repositoryViewPart.getViewer().getSelection();
return selection;
}
/**
*
* DOC ggu Comment method "getRepositoryNodeByDefault".
*
* get the type of repository node for default.
*/
public RepositoryNode getRepositoryNodeForDefault(ERepositoryObjectType type) {
IRepositoryView repositoryView = getViewPart();
if (repositoryView == null) {
return null;
}
return searchRepositoryNode((IRepositoryNode) repositoryView.getRoot(), type);
}
private RepositoryNode searchRepositoryNode(IRepositoryNode root, ERepositoryObjectType type) {
if (root == null || type == null) {
return null;
}
IRepositoryNode foundNode = null;
List<IRepositoryNode> chindren = root.getChildren();
for (IRepositoryNode repositoryNode : chindren) {
if (repositoryNode.getContentType() == type) {
foundNode = repositoryNode;
} else {
foundNode = searchRepositoryNode((RepositoryNode) repositoryNode, type);
}
if (foundNode != null) {
return (RepositoryNode) foundNode;
}
}
return null;
}
/**
* yzhang Comment method "isUnderUserDefined".
*
* @param node
* @return
*/
protected boolean isUnderUserDefined(RepositoryNode node) {
if (node.getType() == ENodeType.SYSTEM_FOLDER || node.getType() == ENodeType.STABLE_SYSTEM_FOLDER) {
return false;
}
Object obj = node.getProperties(EProperties.LABEL);
if (obj instanceof String) {
if (((String) obj).equals(RepositoryConstants.USER_DEFINED)) {
return true;
}
}
return isUnderUserDefined(node.getParent());
}
protected boolean isUnderDBConnection(RepositoryNode node) {
if (node == null) {
return false;
}
if (node.getType() == ENodeType.SYSTEM_FOLDER
&& node.getProperties(EProperties.CONTENT_TYPE) == ERepositoryObjectType.METADATA_CONNECTIONS) {
return true;
}
return isUnderDBConnection(node.getParent());
}
/**
* Display a "Save job" prompt dialog if the job eidtor of the selectedNode is unsaved.
*/
protected void promptForSavingIfNecessary(RepositoryNode selectedNode) {
try {
IEditorReference[] references = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.getEditorReferences();
if (references == null || references.length == 0) {
return;
}
String label = selectedNode.getObject().getProperty().getLabel();
for (int i = 0; i < references.length; i++) {
IEditorPart part = references[i].getEditor(false);
// find unsaved dialog
if (part == null || part.isDirty() == false) {
continue;
}
IEditorInput input = part.getEditorInput();
if (label.equals(input.getName())) {
// we have found an unsaved editor that matches the selected repository node
if (promptForSavingDialog(part) == ISaveablePart2.YES) {
part.doSave(new NullProgressMonitor());
}
}
}
} catch (Exception e) {
ExceptionHandler.process(e);
}
}
/**
* Display a prompt dialog to ask the user if we should save the job before duplicating.
*
* @param part
* @return
*/
@SuppressWarnings("restriction")
protected int promptForSavingDialog(IEditorPart part) {
String[] buttons = new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL };
String message = NLS.bind(WorkbenchMessages.EditorManager_saveChangesQuestion, part.getTitle());
Dialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(), WorkbenchMessages.Save_Resource, null, message,
MessageDialog.QUESTION, buttons, 0) {
@Override
protected int getShellStyle() {
return SWT.NONE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | getDefaultOrientation();
}
};
return dialog.open();
}
public void setSpecialSelection(ISelectionProvider selectionProvider) {
this.specialSelectionProvider = selectionProvider;
}
protected void updateNodeToLastVersion() {
}
public void setAvoidUnloadResources(boolean avoidUnloadResources) {
this.avoidUnloadResources = avoidUnloadResources;
}
@Override
public void run() {
String name = "User action : " + getText(); //$NON-NLS-1$
oldItem = null;
// if (node == null) {
node = getCurrentRepositoryNode();
// }
if (node != null) {
IRepositoryViewObject object = node.getObject();
if (object != null) {
Property oldProperty = node.getObject().getProperty();
if (oldProperty != null) {
oldItem = oldProperty.getItem();
}
}
}
RepositoryWorkUnit<Object> repositoryWorkUnit = new RepositoryWorkUnit<Object>(name, this) {
@Override
protected void run() throws LoginException, PersistenceException {
boolean exist = false;
if (node != null && node.getObject() != null) {
Property property = node.getObject().getProperty();
// only avoid NPE if item has been deleted in svn
if (property != null) {
exist = true;
doRun();
}
if (!exist) {
refreshRelatedItem(getOldItem());
}
} else {
doRun();
}
}
};
repositoryWorkUnit.setAvoidUnloadResources(isAvoidUnloadResources());
repositoryWorkUnit.setUnloadResourcesAfterRun(isUnloadResourcesAfter());
CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().executeRepositoryWorkUnit(repositoryWorkUnit);
oldItem = null;
}
protected abstract void doRun();
protected boolean isLastVersion(RepositoryNode repositoryObject) {
if (repositoryObject.getObject() instanceof RepositoryViewObject) {
return true;
}
try {
if (repositoryObject.getObject() != null) {
Property property = repositoryObject.getObject().getProperty();
Item item = repositoryObject.getObject().getProperty().getItem();
if (item instanceof ConnectionItem) {
return true;
}
List<IRepositoryViewObject> allVersion = null;
ItemState state = property.getItem().getState();
boolean pathExist = false;
if (state != null) {
String path = state.getPath();
if (path != null) {
File f = new File(path);
if (f.exists()) {
pathExist = true;
}
}
}
if (pathExist) {
allVersion = CoreRuntimePlugin
.getInstance()
.getProxyRepositoryFactory()
.getAllVersion(property.getId(), state.getPath(),
repositoryObject.getObject().getRepositoryObjectType());
} else {
allVersion = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().getAllVersion(property.getId());
}
if (allVersion == null || allVersion.isEmpty()) {
return false;
}
String lastVersion = VersionUtils.DEFAULT_VERSION;
for (IRepositoryViewObject object : allVersion) {
if (VersionUtils.compareTo(object.getVersion(), lastVersion) > 0) {
lastVersion = object.getVersion();
}
}
if (VersionUtils.compareTo(property.getVersion(), lastVersion) == 0) {
return true;
}
}
} catch (PersistenceException e) {
//
}
return false;
}
public String getGroupId() {
return this.groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public boolean isAvoidUnloadResources() {
return avoidUnloadResources;
}
public Item getOldItem() {
return this.oldItem;
}
protected void refreshRelatedItem(Item item) {
if (item == null) {
return;
}
IRepositoryView viewPart = getViewPart();
if (viewPart != null) {
ERepositoryObjectType itemType = ERepositoryObjectType.getItemType(item);
viewPart.refresh(itemType);
}
}
/**
* Sets the node.
*
* @param node the node to set
*/
public void setNode(IRepositoryNode node) {
this.node = node;
}
/**
* Getter for node.
*
* @return the node
*/
public IRepositoryNode getNode() {
return this.node;
}
public boolean isUnloadResourcesAfter() {
return unloadResourcesAfter;
}
public void setUnloadResourcesAfter(boolean unloadResourcesAfter) {
this.unloadResourcesAfter = unloadResourcesAfter;
}
}