// ============================================================================
//
// 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.widgets;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbenchPartSite;
import org.talend.mdm.repository.core.service.RepositoryQueryService;
import org.talend.mdm.repository.core.service.RepositoryWebServiceAdapter;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef;
import org.talend.mdm.repository.model.mdmserverobject.WSDataModelE;
import org.talend.mdm.repository.ui.dialogs.xpath.XpathSelectDialog2;
import org.talend.mdm.repository.ui.navigator.MDMRepositoryView;
import org.talend.mdm.workbench.serverexplorer.core.ServerDefService;
import org.talend.mdm.workbench.serverexplorer.ui.dialogs.SelectServerDefDialog;
import com.amalto.workbench.exadapter.ExAdapterManager;
import com.amalto.workbench.utils.XtentisException;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSDataModel;
import com.amalto.workbench.webservices.WSDataModelPK;
import com.amalto.workbench.webservices.WSGetDataModel;
import com.amalto.workbench.widgets.celleditor.EditableComboBoxDialogCellEditor;
/**
* created by liusongbo on 2014-3-24
*/
public class UserSecurityComboBoxDialogCellEditor extends EditableComboBoxDialogCellEditor {
private static Logger log = Logger.getLogger(UserSecurityComboBoxDialogCellEditor.class);
private static final List<String> SPECIAL_FIELDS = Arrays.asList("roles", "applications", "properties"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
private IWorkbenchPartSite site;
private String dataModelName = "PROVISIONING"; //$NON-NLS-1$
private String conceptName = "User"; //$NON-NLS-1$
private IUserSecurityComboBoxDialogCellEditorExAdapter cellEditorAdapter;
public UserSecurityComboBoxDialogCellEditor(Composite parent, IWorkbenchPartSite site) {
super(parent, new String[0]);
this.site = site;
init();
}
private void init() {
cellEditorAdapter = ExAdapterManager.getAdapter(this, IUserSecurityComboBoxDialogCellEditorExAdapter.class);
if (cellEditorAdapter != null) {
cellEditorAdapter.init(this);
}
getButton().setToolTipText(Messages.UserSecurityComboBoxDialogCellEditor_SelectXpath);
getButton().setText("..."); //$NON-NLS-1$
}
@Override
protected FocusListener getComboFocusListener() {
if (comboFocusListener == null) {
comboFocusListener = new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
boolean isComboSelected = false;
CCombo comboBox = getComboBox();
int selectionIndex = comboBox.getSelectionIndex();
if (selectionIndex != -1 && selectionIndex < comboBox.getItemCount()) {
if (!comboBox.getItem(selectionIndex).isEmpty()) {
isComboSelected = true;
}
}
if (!getButton().isFocusControl() && !isComboSelected) {
UserSecurityComboBoxDialogCellEditor.this.focusLost();
}
}
};
}
return comboFocusListener;
}
@Override
protected SelectionListener getComboSelectionListener() {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
doSelection();
}
};
}
private void doSelection() {
String userVariable = getUserVariable();
if (userVariable == null) {
fireCancelEditor();
return;
}
if (SPECIAL_FIELDS.contains(userVariable)) {
userVariable += "[\"\"]"; //$NON-NLS-1$
}
userVariable = "${user_context." + userVariable + "}"; //$NON-NLS-1$ //$NON-NLS-2$
doSetValue(userVariable);
fireApplyEditorValue();
}
private String getUserVariable() {
String schema = getSchemaFromRepository();
if (schema == null) {
schema = getSchemaFromServer();
}
if (schema != null) {
UserVariableDialog dialog = new UserVariableDialog(site.getShell(), schema);
if (dialog.open() == IDialogConstants.OK_ID) {
return dialog.getResult();
}
}
return null;
}
private String getSchemaFromRepository() {
String schema = null;
WSDataModelE wsDataModel = RepositoryQueryService.findDataModelByName(dataModelName);
if (wsDataModel != null) {
schema = wsDataModel.getXsdSchema();
}
return schema;
}
private String getSchemaFromServer() {
String schema = null;
MDMServerDef serverDef = getServerDef();
if (isAccessible(serverDef)) {
TMDMService service = getService(serverDef);
WSDataModel wsDataModel = service.getDataModel(new WSGetDataModel(new WSDataModelPK(dataModelName)));
schema = wsDataModel.getXsdSchema();
}
return schema;
}
private MDMServerDef getServerDef() {
SelectServerDefDialog dialog = new SelectServerDefDialog(site.getShell());
if (dialog.open() == IDialogConstants.OK_ID) {
return dialog.getSelectedServerDef();
}
return null;
}
private TMDMService getService(MDMServerDef serverDef) {
TMDMService service = null;
try {
service = RepositoryWebServiceAdapter.getMDMService(serverDef);
} catch (XtentisException e) {
log.error(e.getMessage(), e);
}
return service;
}
private boolean isAccessible(MDMServerDef serverDef) {
if (serverDef != null) {
try {
ServerDefService.checkMDMConnection(serverDef);
return true;
} catch (XtentisException e) {
MessageDialog.openError(site.getShell(), Messages.UserSecurityComboBoxDialogCellEditor_CheckConnection,
Messages.UserSecurityComboBoxDialogCellEditor_UnableConnectMessage);
} catch (MalformedURLException e) {
MessageDialog.openError(site.getShell(), Messages.UserSecurityComboBoxDialogCellEditor_CheckConnection,
Messages.UserSecurityComboBoxDialogCellEditor_UnableConnectMessage);
}
}
return false;
}
@Override
protected void keyReleaseOccured(KeyEvent keyEvent) {
CCombo comboBox = getComboBox();
if (keyEvent.character == SWT.ESC) { // Esc key
if (comboBox != null && !comboBox.isDisposed()) {
fireCancelEditor();
}
} else if (keyEvent.character == SWT.CR) { //
applyEditorValueAndDeactivate();
}
}
@Override
protected Object openDialogBox(Control cellEditorWindow) {
if (site == null) {
site = MDMRepositoryView.show().getSite();
}
XpathSelectDialog2 dlg = new XpathSelectDialog2(site.getShell(),
Messages.UserSecurityComboBoxDialogCellEditor_SelectXpath, site, false, dataModelName);
dlg.setConceptName(conceptName);
if (dlg.open() == IDialogConstants.OK_ID) {
return dlg.getXpath();
}
return null;
}
}