// ============================================================================
//
// 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.actions.datamodel;
import java.util.Properties;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.intro.IIntroSite;
import org.eclipse.ui.intro.config.IIntroAction;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ItemState;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.core.ui.branding.IBrandingConfiguration;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.service.ContainerCacheService;
import org.talend.mdm.repository.core.service.IMatchRuleMapInfoService;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmproperties.ContainerItem;
import org.talend.mdm.repository.model.mdmproperties.MdmpropertiesFactory;
import org.talend.mdm.repository.model.mdmproperties.WSDataModelItem;
import org.talend.mdm.repository.model.mdmserverobject.MdmserverobjectFactory;
import org.talend.mdm.repository.model.mdmserverobject.WSDataModelE;
import org.talend.mdm.repository.models.FolderRepositoryObject;
import org.talend.mdm.repository.ui.actions.AbstractSimpleAddAction;
import org.talend.mdm.repository.ui.actions.datacontainer.NewDataContainerAction;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.repository.utils.ServiceUtil;
import org.talend.repository.model.IProxyRepositoryFactory;
import com.amalto.workbench.exadapter.ExAdapterManager;
/**
* DOC hbhong class global comment. Detailled comment <br/>
*
*/
public class NewDataModelAction extends AbstractSimpleAddAction implements IIntroAction {
private INewDataModelActionExAdapter exAdapter;
/**
* DOC hbhong NewDataModelAction constructor comment.
*
* @param text
*/
public NewDataModelAction() {
super();
exAdapter = ExAdapterManager.getAdapter(this, INewDataModelActionExAdapter.class);
}
boolean needCreateDataContainer;
@Override
protected String getDialogTitle() {
return Messages.NewDataModelAction_newDataModel;
}
private WSDataModelE newBlankDataModel(String key) {
WSDataModelE dataModel = MdmserverobjectFactory.eINSTANCE.createWSDataModelE();
dataModel.setName(key);
//
String defaultXSD = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"//$NON-NLS-1$
+ "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"/>"; //$NON-NLS-1$
dataModel.setXsdSchema(defaultXSD);
//
return dataModel;
}
@Override
protected Item createServerObject(String key) {
WSDataModelItem item = MdmpropertiesFactory.eINSTANCE.createWSDataModelItem();
ItemState itemState = PropertiesFactory.eINSTANCE.createItemState();
item.setState(itemState);
//
WSDataModelE dataModel = newBlankDataModel(key);
item.setWsDataModel(dataModel);
if (parentItem != null) {
item.getState().setPath(parentItem.getState().getPath());
RepositoryResourceUtil.createItem(item, key);
createERDocument(item);
createMatchRuleMapInfo(item);
}
if (needCreateDataContainer) {
createDataContainerObject(key);
}
return item;
}
private void createERDocument(WSDataModelItem item) {
if (exAdapter != null) {
exAdapter.createERDocument(item);
}
}
private void createMatchRuleMapInfo(WSDataModelItem item) {
IMatchRuleMapInfoService mapInfoService = ServiceUtil.getService(IMatchRuleMapInfoService.class);
if (mapInfoService != null) {
mapInfoService.loadMatchRuleMapInfo(item);
}
}
protected void createDataContainerObject(final String key) {
if (!RepositoryResourceUtil.isExistByName(IServerObjectRepositoryType.TYPE_DATACLUSTER, key)) {
NewDataContainerAction newDataContainerAction = new NewDataContainerAction() {
@Override
protected String getInputName() {
return key;
}
@Override
protected void updateParentItem() {
IRepositoryViewObject folderViewObj = ContainerCacheService.get(IServerObjectRepositoryType.TYPE_DATACLUSTER,
""); //$NON-NLS-1$
if (folderViewObj != null) {
Item pItem = folderViewObj.getProperty().getItem();
setParentItem((ContainerItem) pItem);
}
}
};
newDataContainerAction.run();
}
}
private boolean noSelection = false;
@Override
public void setParentItem(ContainerItem parentItem) {
this.parentItem = parentItem;
noSelection = true;
}
@Override
protected void updateParentItem() {
if (noSelection) {
return;
}
super.updateParentItem();
}
public void run(IIntroSite site, Properties params) {
IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance();
if (factory.isUserReadOnlyOnCurrentProject()) {
MessageDialog.openWarning(null, Messages.NewDataModelAction_UserAuthority,
Messages.NewDataModelAction_CanNotCreateModel);
} else {
PlatformUI.getWorkbench().getIntroManager().closeIntro(PlatformUI.getWorkbench().getIntroManager().getIntro());
IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (null == workbenchWindow) {
return;
}
IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
if (null == workbenchPage) {
return;
}
IPerspectiveDescriptor currentPerspective = workbenchPage.getPerspective();
if (!IBrandingConfiguration.PERSPECTIVE_MDM_ID.equals(currentPerspective.getId())) {
// show mdm perspective
try {
workbenchWindow.getWorkbench().showPerspective(IBrandingConfiguration.PERSPECTIVE_MDM_ID, workbenchWindow);
workbenchPage = workbenchWindow.getActivePage();
} catch (WorkbenchException e) {
ExceptionHandler.process(e);
return;
}
}
//
IRepositoryViewObject folderViewObj = ContainerCacheService.get(IServerObjectRepositoryType.TYPE_DATAMODEL, ""); //$NON-NLS-1$
selectObj = folderViewObj;
if (folderViewObj != null && folderViewObj instanceof FolderRepositoryObject) {
Item pItem = folderViewObj.getProperty().getItem();
if (pItem instanceof ContainerItem) {
setParentItem((ContainerItem) pItem);
}
}
run();
}
}
@Override
protected void extendDialogArea(Control area) {
needCreateDataContainer = true;
Composite composite = (Composite) area;
final Button createDCBun = new Button(composite, SWT.CHECK);
createDCBun.setText(Messages.NewDataModelAction_createDataContainer);
createDCBun.setSelection(needCreateDataContainer);
createDCBun.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
needCreateDataContainer = createDCBun.getSelection();
}
});
}
}