// ============================================================================
//
// 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;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.navigator.CommonViewer;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
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.ui.dialogs.message.MultiStatusDialog;
import org.talend.mdm.repository.ui.navigator.MDMRepositoryView;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.repository.RepositoryWorkUnit;
/**
* DOC hbhong class global comment. Detailled comment <br/>
*
*/
public abstract class AbstractRepositoryAction extends BaseSelectionListenerAction {
public static final String GROUP_EDIT = "group.edit"; //$NON-NLS-1$
public static final String GROUP_COMMON = "group.common"; //$NON-NLS-1$
public static final String GROUP_EXPORT = "group.export"; //$NON-NLS-1$
public static final String GROUP_SERVER = "group.server"; //$NON-NLS-1$
public static final String GROUP_DEPLOY = "group.deploy"; //$NON-NLS-1$
public static final String GROUP_SVN = "group.svn"; //$NON-NLS-1$
public static final String GROUP_GIT = "group.git"; //$NON-NLS-1$
protected CommonViewer commonViewer;
/**
* DOC hbhong AbstractRepositoryAction constructor comment.
*
* @param text
*/
protected AbstractRepositoryAction(String text) {
super(text);
}
public abstract String getGroupName();
public void initCommonViewer(CommonViewer commonViewer) {
this.commonViewer = commonViewer;
}
@SuppressWarnings("unchecked")
public List<Object> getSelectedObject() {
IStructuredSelection structuredSelection = getStructuredSelection();
if (structuredSelection.isEmpty()) {
return Collections.EMPTY_LIST;
}
List<Object> result = new LinkedList<Object>();
for (Iterator<Object> il = structuredSelection.iterator(); il.hasNext();) {
result.add(il.next());
}
return result;
}
protected Shell getShell() {
if (commonViewer != null) {
return commonViewer.getControl().getShell();
} else {
return MDMRepositoryView.show().getCommonViewer().getControl().getShell();
}
}
public boolean isVisible(IRepositoryViewObject viewObj) {
return true;
}
@Override
public void run() {
if (needValidateLockedObject()) {
if (isLocked()) {
MessageDialog.openError(getShell(), Messages.AbstractRepositoryAction_lockedObjTitle, getAlertLockedMsg());
} else {
runRWU();
}
} else {
runRWU();
}
}
protected boolean isLocked() {
List<Object> selectedObject = getSelectedObject();
if (selectedObject != null && !selectedObject.isEmpty()) {
Object object = selectedObject.get(0);
if (object instanceof IRepositoryViewObject) {
return RepositoryResourceUtil.isLockedAndEdited((IRepositoryViewObject) object);
}
}
return false;
}
protected boolean needValidateLockedObject() {
return false;
}
protected String getAlertLockedMsg() {
return Messages.AbstractRepositoryAction_lockedObjMessage;
}
protected void runRWU() {
RepositoryWorkUnit<Object> repositoryWorkUnit = new RepositoryWorkUnit<Object>(Messages.OpenObjectAction_open, this) {
@Override
protected void run() throws LoginException, PersistenceException {
doRun();
}
};
repositoryWorkUnit.setAvoidUnloadResources(true);
CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().executeRepositoryWorkUnit(repositoryWorkUnit);
}
protected abstract void doRun();
protected void refreshParent() {
Object object = getSelectedObject().get(0);
commonViewer.setSelection(new StructuredSelection());
if (object instanceof IRepositoryViewObject) {
final IRepositoryViewObject parent = ContainerCacheService.getParent((IRepositoryViewObject) object);
if (parent != null) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
if (parent != null) {
commonViewer.refresh(parent);
}
}
});
commonViewer.refresh(parent);
}
}
}
protected void refreshRepositoryRoot(ERepositoryObjectType type) {
Object input = getCommonViewer().getInput();
if (input != null && input instanceof IRepositoryViewObject[]) {
for (IRepositoryViewObject viewObject : (IRepositoryViewObject[]) input) {
if (refreshRepositoryContainer(viewObject, type)) {
return;
}
List<IRepositoryViewObject> children = viewObject.getChildren();
if (children != null) {
for (IRepositoryViewObject child : children) {
if (refreshRepositoryContainer(child, type)) {
return;
}
}
}
}
}
}
public CommonViewer getCommonViewer() {
if (commonViewer == null) {
commonViewer = MDMRepositoryView.show().getCommonViewer();
}
return commonViewer;
}
private boolean refreshRepositoryContainer(IRepositoryViewObject viewObj, ERepositoryObjectType type) {
if (viewObj instanceof FolderRepositoryObject) {
FolderRepositoryObject containerRepositoryObject = (FolderRepositoryObject) viewObj;
if (containerRepositoryObject.getRepositoryObjectType().equals(type)) {
commonViewer.refresh(containerRepositoryObject);
return true;
}
}
return false;
}
protected void showRemoveStatus(IStatus status) {
MultiStatusDialog dialog = new MultiStatusDialog(getShell(), status.getChildren().length
+ Messages.AbstractDeployAction_removeMessage, status);
dialog.open();
}
}