// ============================================================================
//
// 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.editors;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonViewer;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.runtime.CoreRuntimePlugin;
import org.talend.mdm.repository.core.command.CommandManager;
import org.talend.mdm.repository.core.command.ICommand;
import org.talend.mdm.repository.core.service.DeployService;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject;
import org.talend.mdm.repository.ui.navigator.MDMRepositoryView;
import org.talend.mdm.repository.utils.Bean2EObjUtil;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.repository.model.IProxyRepositoryFactory;
import com.amalto.workbench.editors.AFormPage;
import com.amalto.workbench.editors.DataClusterMainPage;
import com.amalto.workbench.editors.JobMainPage;
import com.amalto.workbench.editors.MenuMainPage;
import com.amalto.workbench.editors.XObjectEditor;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.views.MDMPerspective;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class XObjectEditor2 extends XObjectEditor implements ISvnHistory {
static Logger log = Logger.getLogger(XObjectEditor2.class);
public static final String EDITOR_ID = "org.talend.mdm.repository.ui.editors.XObjectEditor2"; //$NON-NLS-1$
@Override
public void doSave(IProgressMonitor monitor) {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
this.saveInProgress = true;
try {
int numPages = formPages.size();
monitor.beginTask(Messages.bind(Messages.XObjectEditor2_saving, this.getEditorInput().getName()), numPages + 1);
for (int i = 0; i < numPages; i++) {
if ((formPages.get(i)) instanceof AFormPage) {
if (!((AFormPage) (formPages.get(i))).beforeDoSave()) {
return;
}
}
(formPages.get(i)).doSave(monitor);
monitor.worked(1);
if (monitor.isCanceled()) {
this.saveInProgress = false;
return;
}
}
boolean saved = saveResourceToRepository();
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
monitor.done();
}
}
private boolean saveResourceToRepository() {
XObjectEditorInput2 editorInput = (XObjectEditorInput2) this.getEditorInput();
TreeObject xobject = (TreeObject) editorInput.getModel();
IRepositoryViewObject viewObject = editorInput.getViewObject();
IRepositoryViewObject refreshViewObject = RepositoryResourceUtil.assertViewObject(viewObject);
if (viewObject != refreshViewObject) {
editorInput.updateViewObject(refreshViewObject);
}
MDMServerObjectItem serverObjectItem = (MDMServerObjectItem) editorInput.getInputItem();
MDMServerObject serverObject = serverObjectItem.getMDMServerObject();
EObject eObj = Bean2EObjUtil.getInstance().convertFromBean2EObj(xobject.getWsObject(), serverObject);
if (eObj != null) {
IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory();
try {
factory.save(serverObjectItem);
// TODO should call the following,but the page in editor has many call to remote webService ,it will
// search ServerRoot which cause a NPE
// xobject.fireEvent(IXObjectModelListener.SAVE, xobject.getParent(), xobject);
editorDirtyStateChanged();
refreshDirtyCue();
DeployService deployService = DeployService.getInstance();
if (deployService.isAutoDeploy()) {
autoDeployProcess(deployService);
} else {
MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(serverObjectItem);
if (lastServerDef != null) {
CommandManager.getInstance().pushCommand(ICommand.CMD_MODIFY, editorInput.getViewObject());
}
}
return true;
} catch (PersistenceException e) {
log.error(e.getMessage(), e);
}
}
return false;
}
public void autoDeployProcess(DeployService deployService) {
if (deployService == null) {
return;
}
IEditorInput input = getEditorInput();
XObjectEditorInput2 theInput = null;
if (input instanceof XObjectEditorInput2) {
theInput = (XObjectEditorInput2) input;
}
IRepositoryViewObject viewObj = theInput.getViewObject();
deployService.autoDeploy(getSite().getShell(), viewObj);
}
private void refreshDirtyCue() {
IEditorInput input = getEditorInput();
XObjectEditorInput2 theInput = null;
if (input instanceof XObjectEditorInput2) {
theInput = (XObjectEditorInput2) input;
}
IRepositoryViewObject viewObj = theInput.getViewObject();
CommonViewer viewer = MDMRepositoryView.show().getCommonViewer();
viewer.refresh(viewObj);
}
@Override
protected void addPageForXObject(TreeObject xobject) {
try {
switch (xobject.getType()) {
case TreeObject.DATA_MODEL:
break;
case TreeObject.INBOUND_PLUGIN:
break;
case TreeObject.OUTBOUND_PLUGIN:
break;
case TreeObject.VIEW:
addPage(new ViewMainPage2(this));
break;
case TreeObject.DATA_CLUSTER:
addPage(new DataClusterMainPage(this));
break;
case TreeObject.STORED_PROCEDURE:
addPage(new StoredProcedureMainPage2(this));
break;
case TreeObject.MENU:
addPage(new MenuMainPage(this));
break;
case TreeObject.SERVICE_CONFIGURATION:
addPage(new MDMServiceConfigrationMainPage(this));
break;
/*
* case TreeObject.RESOURCES: case TreeObject.DATA_MODEL_RESOURCE: case
* TreeObject.DATA_MODEL_TYPES_RESOURCE: case TreeObject.CUSTOM_TYPES_RESOURCE: case
* TreeObject.PICTURES_RESOURCE: addPage(new ResourceMainPage(this)); break;
*/
case TreeObject.CUSTOM_TYPE:
// addPage(new CustomTypeMainPage(this));
break;
case TreeObject.ROUTING_RULE:
addPage(new RoutingRuleMainPage2(this));
break;
case TreeObject.TRANSFORMER:
addPage(new TransformerMainPage2(this));
break;
case TreeObject.JOB:
addPage(new JobMainPage(this));
break;
default:
return;
}
} catch (PartInitException e) {
log.error(e.getMessage(), e);
MessageDialog.openError(this.getSite().getShell(), Messages.Common_Error,
Messages.bind(Messages.XObjectEditor2_unableOpenEditor, e.getLocalizedMessage()));
}
}
@Override
public boolean isLocalInput() {
return true;
}
@Override
public boolean isReadOnly() {
IRepositoryViewEditorInput editorInput = (IRepositoryViewEditorInput) this.getEditorInput();
return editorInput.isReadOnly();
}
/*
* (non-Javadoc)
*
* @see com.amalto.workbench.editors.XObjectEditor#addPages()
*/
@Override
protected void addPages() {
super.addPages();
try {
refreshPropertyView();
} catch (PartInitException e) {
}
}
private void refreshPropertyView() throws PartInitException {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart propView = page.findView(MDMPerspective.VIEWID_PROPERTYVIEW);
if (propView != null) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().hideView(propView);
}
page.showView(MDMPerspective.VIEWID_PROPERTYVIEW);
}
}