// ============================================================================
//
// 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 java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProviderExtension;
import org.eclipse.ui.texteditor.IDocumentProviderExtension3;
import org.talend.commons.exception.LoginException;
import org.talend.commons.exception.PersistenceException;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.model.properties.Item;
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.core.service.IModelValidationService;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.ui.actions.IPostOpenAction;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.repository.RepositoryWorkUnit;
import com.amalto.workbench.editors.DataModelMainPage;
import com.amalto.workbench.editors.xsdeditor.XSDEditor;
import com.amalto.workbench.editors.xsdeditor.XSDSelectionListener;
import com.amalto.workbench.exadapter.ExAdapterManager;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.utils.CompositeViewersSelectionProvider;
import com.amalto.workbench.utils.Util;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class XSDEditor2 extends XSDEditor implements ISvnHistory, IPostOpenAction {
public static final String EDITOR_ID = "org.talend.mdm.repository.ui.editors.XSDEditor2"; //$NON-NLS-1$
static Logger log = Logger.getLogger(XObjectEditor2.class);
private DataModelMainPage2 dMainPage;
private CTabFolder folder;
private IXSDEditor2ExAdapter exAdapter;
public XSDEditor2() {
exAdapter = ExAdapterManager.getAdapter(this, IXSDEditor2ExAdapter.class);
}
@Override
protected void createPages() {
super.createPages();
XSDEditorInput2 editorInput = (XSDEditorInput2) getEditorInput();
TreeObject treeObject = editorInput.getTreeObject();
IRepositoryViewEditorInput xobjectEditorinput = new XObjectEditorInput2(editorInput.getViewObject(), treeObject,
treeObject.getDisplayName());
xobjectEditorinput.setReadOnly(editorInput.isReadOnly());
IFile xsdFile = null;
try {
xsdFile = getXSDFile(treeObject);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
dMainPage = new DataModelMainPage2(treeObject);
dMainPage.addPropertyListener(this);
try {
MODEL_PAGE_INDEX = addPage(dMainPage, xobjectEditorinput);
} catch (PartInitException e) {
log.error(e.getMessage(), e);
}
// Add ER Editor
if (isEE()) {
exAdapter.addPage(xsdFile, editorInput.isReadOnly());
}
// add repository view object in selectionprovider
IRepositoryViewObject repositoryViewObj = editorInput.getViewObject();// ContainerCacheService.get(editorInput.getInputItem().getProperty());
CompositeViewersSelectionProvider selectionProvider = (CompositeViewersSelectionProvider) dMainPage
.getSelectionProvider();
selectionProvider.setRepositoryViewObj(repositoryViewObj);
//
// add XSDSelectionListener
XSDSelectionListener xsdListener = new XSDSelectionListener(this, dMainPage);
dMainPage.getTypesViewer().addSelectionChangedListener(xsdListener);
dMainPage.getElementsViewer().addSelectionChangedListener(xsdListener);
//
setXObject(treeObject);
//
folder = (CTabFolder) dMainPage.getMainControl().getParent();
folder.getItem(MODEL_PAGE_INDEX).setText(treeObject.getDisplayName() + " " + Util.getRevision(treeObject));//$NON-NLS-1$
folder.getItem(SOURCE_PAGE_INDEX).setText(Messages.XSDEditor2_schemaSource);
// default use
activePage(xsdFile);
}
private boolean needValidate = false;
@Override
public String getPartName() {
IEditorInput input = getEditorInput();
if (input != null && input instanceof FileEditorInput) {
return ((FileEditorInput) input).getName();
} else {
return super.getPartName();
}
}
@Override
public String getContributorId() {
if (exAdapter != null) {
String contributorId = exAdapter.getContributorId();
if (contributorId != null) {
return contributorId;
}
}
return super.getContributorId();
}
@Override
public void propertyChanged(Object source, int propId) {
super.propertyChanged(source, propId);
if (propId == PROP_DIRTY) {
if (isDirty()) {
needValidate = true;
} else if (needValidate) {
needValidate = false;
IRepositoryViewObject viewObject = getCurrentViewObject();
validateModel(viewObject);
}
}
}
private void activePage(IFile xsdFile) {
validateXsdSourceEditor();
if (hasXSDErrors()) {
setActivePage(SOURCE_PAGE_INDEX);
preActivePageIndex = SOURCE_PAGE_INDEX;
return;
}
setActivePage(MODEL_PAGE_INDEX);
preActivePageIndex = SOURCE_PAGE_INDEX;
}
@Override
protected IFile getXSDFile(TreeObject xobject) throws Exception {
return ((IFileEditorInput) getEditorInput()).getFile();
}
@Override
public boolean isLocalInput() {
return true;
}
@Override
public boolean isReadOnly() {
IRepositoryViewEditorInput editorInput = (IRepositoryViewEditorInput) this.getEditorInput();
return editorInput.isReadOnly();
}
@Override
public void setFocus() {
super.setFocus();
if (folder != null) {
folder.setFocus();
}
}
private IRepositoryViewObject getCurrentViewObject() {
return ((IRepositoryViewEditorInput) getEditorInput()).getViewObject();
}
@Override
public void doSave(final IProgressMonitor monitor) {
RepositoryWorkUnit<Object> repositoryWorkUnit = new RepositoryWorkUnit<Object>("", this) { //$NON-NLS-1$
@Override
protected void run() throws LoginException, PersistenceException {
innerSave(monitor);
}
};
repositoryWorkUnit.setAvoidUnloadResources(true);
CoreRuntimePlugin.getInstance().getProxyRepositoryFactory().executeRepositoryWorkUnit(repositoryWorkUnit);
}
private void doSave(Item item, IProgressMonitor monitor) {
super.doSave(monitor);
if (isEE()) {
exAdapter.doSave(item, dMainPage, monitor);
}
}
private void innerSave(final IProgressMonitor monitor) {
IRepositoryViewObject viewObject = getCurrentViewObject();
final Item item = viewObject.getProperty().getItem();
int activePage = getActivePage();
//
final TransactionalEditingDomain editingDomain = (TransactionalEditingDomain) getAdapter(TransactionalEditingDomain.class);
if (editingDomain != null && (activePage != MODEL_PAGE_INDEX && activePage != SOURCE_PAGE_INDEX)) {
editingDomain.getCommandStack().execute(new AbstractCommand() {
@Override
public boolean canExecute() {
return true;
}
@Override
public void redo() {
// do nothing
}
@Override
public void execute() {
doSave(item, monitor);
}
});
} else {
doSave(item, monitor);
}
DeployService deployService = DeployService.getInstance();
if (deployService.isAutoDeploy()) {
deployService.autoDeploy(getSite().getShell(), viewObject);
} else {
MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(item);
if (lastServerDef != null) {
CommandManager.getInstance().pushCommand(ICommand.CMD_MODIFY, viewObject);
}
}
}
private void validateModel(final IRepositoryViewObject viewObject) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IModelValidationService service = (IModelValidationService) GlobalServiceRegister.getDefault().getService(
IModelValidationService.class);
List<IRepositoryViewObject> viewObjs = new ArrayList<IRepositoryViewObject>();
viewObjs.add(viewObject);
service.validate(viewObjs, IModelValidationService.VALIDATE_AFTER_SAVE);
}
});
}
@Override
public DataModelMainPage getdMainPage() {
return dMainPage;
}
@Override
public Object getAdapter(Class type) {
if (type == IGotoMarker.class) {
return dMainPage;
} else if (type == XSDEditorInput2.class) {
return getEditorInput();
}
if (type == MultiPageEditorPart.class) {
return this;
}
if (isEE()) {
Object adapter = exAdapter.getAdapter(type);
if (adapter != null) {
return adapter;
}
}
return super.getAdapter(type);
}
public void updateTabPageLabel(final int index, final String label) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
setPageText(index, label);
}
});
}
@Override
public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
super.init(site, editorInput);
if (isEE()) {
exAdapter.init(editorInput);
}
}
public void fireDirtyPropChange() {
getdMainPage().firePropertyChange();
}
private boolean isEE() {
return exAdapter != null;
}
@Override
public void dispose() {
if (isEE()) {
exAdapter.dispose();
}
super.dispose();
}
@Override
public boolean isDirty() {
boolean mapInfoDirty = false;
if (isEE()) {
mapInfoDirty = exAdapter.isDirty();
}
return super.isDirty() || mapInfoDirty;
}
@Override
protected void doPageChanged(int newPageIndex, int lastPageIndex) {
if (newPageIndex == SOURCE_PAGE_INDEX) {
handleSourceActivation();
}
super.doPageChanged(newPageIndex, lastPageIndex);
if (isEE()) {
exAdapter.doPageChanged(newPageIndex, lastPageIndex);
}
}
// Just avoid popup querying reload dialog
void handleSourceActivation() {
if (hasXSDErrors()) {
return;
}
final IDocumentProvider provider = getTextEditor().getDocumentProvider();
if (provider == null) {
return;
}
final IEditorInput input = getEditorInput();
if (provider instanceof IDocumentProviderExtension3) {
if (provider instanceof IDocumentProviderExtension) {
IDocumentProviderExtension extension = (IDocumentProviderExtension) provider;
try {
extension.synchronize(input);
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
}
}
}
@Override
public void doPostOpen() {
if (exAdapter != null) {
exAdapter.doPostOpen();
}
}
}