// ============================================================================
//
// 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.core.impl;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.navigator.CommonViewer;
import org.talend.commons.CommonsPlugin;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.FolderType;
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.repository.model.ProxyRepositoryFactory;
import org.talend.mdm.repository.core.AbstractRepositoryAction;
import org.talend.mdm.repository.core.IRepositoryNodeActionProvider;
import org.talend.mdm.repository.core.IRepositoryViewGlobalActionHandler;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.service.IModelValidationService;
import org.talend.mdm.repository.extension.ActionProviderManager;
import org.talend.mdm.repository.extension.RepositoryNodeConfigurationManager;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.model.mdmproperties.MDMItem;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.model.mdmproperties.WorkspaceRootItem;
import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject;
import org.talend.mdm.repository.ui.actions.CreateFolderAction;
import org.talend.mdm.repository.ui.actions.DebugDigestValueAction;
import org.talend.mdm.repository.ui.actions.DeployAllAction;
import org.talend.mdm.repository.ui.actions.DeployAnotherVersionAction;
import org.talend.mdm.repository.ui.actions.DeployToAction;
import org.talend.mdm.repository.ui.actions.DeployToLastServerAction;
import org.talend.mdm.repository.ui.actions.DuplicateAction;
import org.talend.mdm.repository.ui.actions.ExportObjectAction;
import org.talend.mdm.repository.ui.actions.ImportObjectAction;
import org.talend.mdm.repository.ui.actions.ImportServerObjectAction;
import org.talend.mdm.repository.ui.actions.MDMEditPropertyAction;
import org.talend.mdm.repository.ui.actions.MDMOpenExistVersionProcessAction;
import org.talend.mdm.repository.ui.actions.RemoveFromRepositoryAction;
import org.talend.mdm.repository.ui.actions.RenameObjectAction;
import org.talend.mdm.repository.ui.actions.UndeployAction;
import org.talend.mdm.repository.ui.actions.ValidateAction;
import org.talend.mdm.repository.ui.actions.process.MDMEventManagerAction;
import org.talend.mdm.repository.ui.editors.IRepositoryViewEditorInput;
import org.talend.mdm.repository.ui.editors.XObjectBrowserInput2;
import org.talend.mdm.repository.ui.editors.XObjectEditorInput2;
import org.talend.repository.ProjectManager;
import com.amalto.workbench.exadapter.ExAdapterManager;
import com.amalto.workbench.models.TreeObject;
/**
* DOC hbhong class global comment. Detailled comment <br/>
*
*/
public class RepositoryNodeActionProviderAdapter implements IRepositoryNodeActionProvider {
private static boolean enableDebug = CommonsPlugin.isDebugMode();
public static AbstractRepositoryAction createFolderAction;
protected static AbstractRepositoryAction removeFromRepositoryAction;
static AbstractRepositoryAction duplicateAction;
protected static AbstractRepositoryAction exportObjectAction;
protected static AbstractRepositoryAction importObjectAction;
protected static AbstractRepositoryAction deployToAction;
protected static AbstractRepositoryAction deployAnotherToAction;
protected static AbstractRepositoryAction deployToLastServerAction;
protected static AbstractRepositoryAction undeployAction;
protected static AbstractRepositoryAction deployAllAction;
protected static AbstractRepositoryAction renameAction;
protected AbstractRepositoryAction refreshAction;
protected AbstractRepositoryAction copyAction;
protected AbstractRepositoryAction importServerObjectAction;
protected AbstractRepositoryAction mdmEditPropertyAction;
protected AbstractRepositoryAction pasteAction;
protected AbstractRepositoryAction emAction;
protected AbstractRepositoryAction openVersionAction;
protected IRepositoryViewGlobalActionHandler globalActionHandler;
private IStructuredSelection selection;
protected AbstractRepositoryAction validateAction;
protected AbstractRepositoryAction debugDigestValueAction;
IRepositoryNodeActionProviderAdapterExAdapter exAdapter = null;
public RepositoryNodeActionProviderAdapter() {
exAdapter = ExAdapterManager.getAdapter(this, IRepositoryNodeActionProviderAdapterExAdapter.class);
}
public void initCommonViewer(CommonViewer commonViewer) {
importObjectAction = initRepositoryAction(ImportObjectAction.createImportAction(), commonViewer);
exportObjectAction = initRepositoryAction(new ExportObjectAction(), commonViewer);
createFolderAction = initRepositoryAction(new CreateFolderAction(), commonViewer);
removeFromRepositoryAction = initRepositoryAction(new RemoveFromRepositoryAction(), commonViewer);
renameAction = initRepositoryAction(new RenameObjectAction(), commonViewer);
duplicateAction = initRepositoryAction(new DuplicateAction(), commonViewer);
deployToAction = initRepositoryAction(new DeployToAction(), commonViewer);
deployAnotherToAction = initRepositoryAction(new DeployAnotherVersionAction(), commonViewer);
deployToLastServerAction = initRepositoryAction(new DeployToLastServerAction(), commonViewer);
undeployAction = initRepositoryAction(new UndeployAction(), commonViewer);
deployAllAction = initRepositoryAction(new DeployAllAction(false), commonViewer);
emAction = initRepositoryAction(new MDMEventManagerAction(), commonViewer);
importServerObjectAction = initRepositoryAction(new ImportServerObjectAction(), commonViewer);
mdmEditPropertyAction = initRepositoryAction(new MDMEditPropertyAction(), commonViewer);
openVersionAction = initRepositoryAction(new MDMOpenExistVersionProcessAction(), commonViewer);
// for debug digestValue
debugDigestValueAction = initRepositoryAction(new DebugDigestValueAction(), commonViewer);
//
if (hasValidateService()) {
validateAction = initRepositoryAction(new ValidateAction(), commonViewer);
}
//
refreshAction = globalActionHandler.getGlobalAction(IRepositoryViewGlobalActionHandler.REFRESH);
copyAction = globalActionHandler.getGlobalAction(IRepositoryViewGlobalActionHandler.COPY);
if (exAdapter != null) {
exAdapter.initCommonViewer(commonViewer);
}
pasteAction = globalActionHandler.getGlobalAction(IRepositoryViewGlobalActionHandler.PASTE);
// action provider
for (IRepositoryNodeActionProvider provider : getExtendActionProviders()) {
provider.initCommonViewer(commonViewer);
}
// recycle
RepositoryNodeConfigurationManager.getRecycleBinNodeConfiguration().getActionProvider().initCommonViewer(commonViewer);
}
public AbstractRepositoryAction initRepositoryAction(AbstractRepositoryAction action, CommonViewer commonViewer) {
action.initCommonViewer(commonViewer);
return action;
}
private boolean hasValidateService() {
IModelValidationService service = (IModelValidationService) GlobalServiceRegister.getDefault().getService(
IModelValidationService.class);
return service != null;
}
public List<AbstractRepositoryAction> getActions(IRepositoryViewObject viewObj) {
List<AbstractRepositoryAction> actions = new LinkedList<AbstractRepositoryAction>();
//
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMItem) {
if (item instanceof ContainerItem) {
FolderType type = ((FolderItem) item).getType();
switch (type.getValue()) {
case FolderType.SYSTEM_FOLDER:
addAction(actions, createFolderAction, viewObj);
addAction(actions, pasteAction, viewObj);
actions.add(importServerObjectAction);
actions.add(importObjectAction);
break;
case FolderType.STABLE_SYSTEM_FOLDER:
break;
case FolderType.FOLDER:
addAction(actions, createFolderAction, viewObj);
if (!((ContainerItem) item).getRepObjType().equals(ERepositoryObjectType.PROCESS)) {
actions.add(removeFromRepositoryAction);
}
addAction(actions, pasteAction, viewObj);
break;
}
} else if (item instanceof MDMServerObjectItem) {
addAction(actions, removeFromRepositoryAction, viewObj);
addAction(actions, mdmEditPropertyAction, viewObj);
addAction(actions, openVersionAction, viewObj);
addAction(actions, copyAction, viewObj);
addAction(actions, pasteAction, viewObj);
addAction(actions, duplicateAction, viewObj);
if (exAdapter != null) {
exAdapter.addActions(actions, viewObj);
}
} else if (item instanceof WorkspaceRootItem) { // fix bug TMDM-3168
actions.add(importObjectAction);
}
}
if (enableDebug) {
// for debug digestValue
addAction(actions, debugDigestValueAction, viewObj);
}
//
actions.add(refreshAction);
actions.add(exportObjectAction);
// action provider
for (IRepositoryNodeActionProvider provider : getExtendActionProviders()) {
List<AbstractRepositoryAction> providerActions = provider.getActions(viewObj);
if (providerActions != null) {
actions.addAll(providerActions);
}
}
if (viewObj.getRepositoryObjectType() != null
&& IServerObjectRepositoryType.TYPE_EVENTMANAGER.equals(viewObj.getRepositoryObjectType())) {
actions.add(emAction);
}
//
return actions;
}
protected void addAction(List<AbstractRepositoryAction> actions, AbstractRepositoryAction action,
IRepositoryViewObject viewObj) {
action.selectionChanged(selection);
if (action.isVisible(viewObj)) {
actions.add(action);
}
}
/**
* The child class can override this method, current implement is adapt to most of MDMServerobject
*/
public IRepositoryViewEditorInput getOpenEditorInput(IRepositoryViewObject viewObj) {
Item item = viewObj.getProperty().getItem();
MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject();
if (serverObject.getType() == TreeObject.DATA_CLUSTER) {// Data Cluster
return new XObjectBrowserInput2(viewObj);
}
return new XObjectEditorInput2(viewObj);
}
public AbstractRepositoryAction getOpenAction(IRepositoryViewObject viewObj) {
return null;
}
public void setRepositoryViewGlobalActionHandler(IRepositoryViewGlobalActionHandler handler) {
this.globalActionHandler = handler;
}
public void updateSelection(IStructuredSelection selection) {
this.selection = selection;
for (IRepositoryNodeActionProvider provider : getExtendActionProviders()) {
provider.updateSelection(selection);
}
}
private static final String SVN_ACTION_PROVIDER_ID = "mdm.svn"; //$NON-NLS-1$
private static final String GIT_ACTION_PROVIDER_ID = "mdm.git"; //$NON-NLS-1$
IRepositoryNodeActionProvider[] extendActionProviders;
private IRepositoryNodeActionProvider[] getExtendActionProviders() {
if (extendActionProviders == null) {
boolean isLocalProj = ProjectManager.getInstance().getCurrentProject().isLocal();
boolean isOffline = ProxyRepositoryFactory.getInstance().getRepositoryContext().isOffline();
if (!isLocalProj && !isOffline) {
IRepositoryNodeActionProvider svnProvider = ActionProviderManager.getActionProvider(SVN_ACTION_PROVIDER_ID);
IRepositoryNodeActionProvider gitProvider = ActionProviderManager.getActionProvider(GIT_ACTION_PROVIDER_ID);
if (svnProvider != null && gitProvider != null) {
extendActionProviders = new IRepositoryNodeActionProvider[] { svnProvider, gitProvider };
} else if (svnProvider != null) {
extendActionProviders = new IRepositoryNodeActionProvider[] { svnProvider };
} else if (gitProvider != null) {
extendActionProviders = new IRepositoryNodeActionProvider[] { gitProvider };
}
}
if (extendActionProviders == null) {
extendActionProviders = new IRepositoryNodeActionProvider[0];
}
}
return extendActionProviders;
}
}