// ============================================================================
//
// 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 com.amalto.workbench.detailtabs.sections.composites;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDIdentityConstraintCategory;
import org.eclipse.xsd.XSDIdentityConstraintDefinition;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDXPathDefinition;
import com.amalto.workbench.detailtabs.sections.BasePropertySection;
import com.amalto.workbench.detailtabs.sections.model.entity.EntityWrapper;
import com.amalto.workbench.detailtabs.sections.model.entity.FieldWrapper;
import com.amalto.workbench.detailtabs.sections.model.entity.KeyWrapper;
import com.amalto.workbench.detailtabs.sections.providers.FieldWrapperLabelProvider;
import com.amalto.workbench.detailtabs.sections.providers.KeyWrapperLabelProvider;
import com.amalto.workbench.dialogs.IdentityConstraintInputDialog;
import com.amalto.workbench.dialogs.SelectFieldDialog;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
import com.amalto.workbench.providers.ListContentProvider;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.utils.inputvalidator.EditXSDIdentityConstraintNameValidator;
import com.amalto.workbench.utils.inputvalidator.NewXSDIndentityConstraintValidator;
public class EntityKeyConfigComposite extends Composite {
private static Log log = LogFactory.getLog(EntityKeyConfigComposite.class);
private EntityWrapper entityWrapper;
private Combo comboSelector;
private Text txtKeyName;
private Label lblKeyNameErrIndicator;
private TreeViewer tvKeys;
private TreeViewer tvFields;
private Button btnAddKey;
private Button btnDeleteKey;
private Button btnAddField;
private Button btnDeleteField;
private Button btnEditField;
private Image addKeyIcon = ImageCache.getImage(EImage.ADD_OBJ.getPath()).createImage();
private Image deleteKeyIcon = ImageCache.getImage(EImage.DELETE_OBJ.getPath()).createImage();
private Image addFieldIcon = ImageCache.getImage(EImage.ADD_OBJ.getPath()).createImage();
private Image deleteFieldIcon = ImageCache.getImage(EImage.DELETE_OBJ.getPath()).createImage();
private Image editFieldIcon = ImageCache.getImage(EImage.EDIT_OBJ.getPath()).createImage();
private Image errIcon = ImageCache.getImage(EImage.ERROR.getPath()).createImage();
private ISelectionChangedListener lTvKeysSelectionListener;
private ISelectionChangedListener lTvFieldsSelectionListener;
private ModifyListener lTxtKeyNameModifyListener;
private ModifyListener lComboSelectorModifyListner;
private MouseListener lComboSelectorMouseListener;
private SelectionListener lBtnRemoveKeySelectionListner;
private SelectionListener lBtnRemoveFieldListner;
private SelectionListener lBtnAddKeyListener;
private SelectionListener lBtnAddFieldListener;
private SelectionListener lBtnEditFieldListener;
private XSDElementDeclaration xsdElementDeclaration;
private BasePropertySection section;
public EntityKeyConfigComposite(Composite parent, int style, BasePropertySection section,XSDElementDeclaration xsdElementDeclaration) {
this(parent,style);
this.section=section;
this.xsdElementDeclaration=xsdElementDeclaration;
}
public EntityKeyConfigComposite(Composite parent, int style) {
super(parent, style);
setLayout(new FillLayout());
final SashForm sashForm = new SashForm(this, SWT.NONE);
sashForm.setSashWidth(2);
sashForm.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
final Composite compKeys = new Composite(sashForm, SWT.NONE);
compKeys.setLayout(new GridLayout());
compKeys.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
tvKeys = new TreeViewer(compKeys, SWT.BORDER | SWT.FULL_SELECTION);
Tree trKeys = tvKeys.getTree();
trKeys.setLinesVisible(true);
final GridData gd_trKeys = new GridData(SWT.FILL, SWT.FILL, true, true);
gd_trKeys.widthHint = 165;
trKeys.setLayoutData(gd_trKeys);
final Composite compKeyBtns = new Composite(compKeys, SWT.NONE);
compKeyBtns.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
final GridData gd_compKeyBtns = new GridData(SWT.FILL, SWT.CENTER, true, false);
compKeyBtns.setLayoutData(gd_compKeyBtns);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
compKeyBtns.setLayout(gridLayout);
btnAddKey = new Button(compKeyBtns, SWT.NONE);
btnAddKey.setToolTipText(Messages.EntityKeyConfigComposite_0);
btnAddKey.setImage(addKeyIcon);
btnDeleteKey = new Button(compKeyBtns, SWT.NONE);
btnDeleteKey.setToolTipText(Messages.EntityKeyConfigComposite_1);
btnDeleteKey.setImage(deleteKeyIcon);
final Composite compKeyInfo = new Composite(sashForm, SWT.NONE);
compKeyInfo.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
final GridLayout gridLayout_2 = new GridLayout();
compKeyInfo.setLayout(gridLayout_2);
final Composite composite = new Composite(compKeyInfo, SWT.NONE);
composite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
final GridLayout gridLayout_3 = new GridLayout();
gridLayout_3.marginWidth = 0;
gridLayout_3.marginHeight = 0;
gridLayout_3.numColumns = 2;
composite.setLayout(gridLayout_3);
final Label lblKeyName = new Label(composite, SWT.NONE);
lblKeyName.setText(Messages.EntityKeyConfigComposite_2);
lblKeyName.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
lblKeyNameErrIndicator = new Label(composite, SWT.NONE);
lblKeyNameErrIndicator.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
lblKeyNameErrIndicator.setImage(errIcon);
lblKeyNameErrIndicator.setVisible(false);
txtKeyName = new Text(compKeyInfo, SWT.BORDER);
final GridData gd_txtKeyName = new GridData(SWT.FILL, SWT.CENTER, true, false);
txtKeyName.setLayoutData(gd_txtKeyName);
final Label lblSelector = new Label(compKeyInfo, SWT.NONE);
lblSelector.setText(Messages.EntityKeyConfigComposite_Selector);
lblSelector.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
comboSelector = new Combo(compKeyInfo, SWT.BORDER);
final GridData gd_comboSelector = new GridData(SWT.FILL, SWT.CENTER, true, false);
comboSelector.setLayoutData(gd_comboSelector);
final Label lblFields = new Label(compKeyInfo, SWT.NONE);
lblFields.setText(Messages.EntityKeyConfigComposite_Fields);
lblFields.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
tvFields = new TreeViewer(compKeyInfo, SWT.BORDER | SWT.FULL_SELECTION);
Tree trFields = tvFields.getTree();
trFields.setLinesVisible(true);
final GridData gd_trFields = new GridData(SWT.FILL, SWT.FILL, true, true);
trFields.setLayoutData(gd_trFields);
final Composite compFieldBtns = new Composite(compKeyInfo, SWT.NONE);
compFieldBtns.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
final GridData gd_compFieldBtns = new GridData(SWT.FILL, SWT.CENTER, true, false);
compFieldBtns.setLayoutData(gd_compFieldBtns);
final GridLayout gridLayout_1 = new GridLayout();
gridLayout_1.numColumns = 3;
compFieldBtns.setLayout(gridLayout_1);
btnAddField = new Button(compFieldBtns, SWT.NONE);
btnAddField.setToolTipText(Messages.EntityKeyConfigComposite_AddField);
btnAddField.setImage(addFieldIcon);
btnEditField = new Button(compFieldBtns, SWT.NONE);
btnEditField.setToolTipText(Messages.EntityKeyConfigComposite_EditFields);
btnEditField.setImage(editFieldIcon);
btnDeleteField = new Button(compFieldBtns, SWT.NONE);
btnDeleteField.setToolTipText(Messages.EntityKeyConfigComposite_DelField);
btnDeleteField.setImage(deleteFieldIcon);
tvKeys.setContentProvider(new ListContentProvider());
tvKeys.setLabelProvider(new KeyWrapperLabelProvider());
tvFields.setContentProvider(new ListContentProvider());
tvFields.setLabelProvider(new FieldWrapperLabelProvider());
sashForm.setWeights(new int[] { 190, 308 });
initUIListeners();
addUIListeners();
}
public void setXSDElement(EntityWrapper sourceEntityWrapper) {
entityWrapper = sourceEntityWrapper;
removeUIListeners();
tvKeys.setInput(new ArrayList<KeyWrapper>());
if (entityWrapper != null) {
tvKeys.setInput(Arrays.asList(entityWrapper.getKeys()));
}
initUIContents();
addUIListeners();
selectFirstKeyInCurKeyList();
refreshUI();
}
private void initUIContents() {
txtKeyName.setText("");//$NON-NLS-1$
comboSelector.setText("");//$NON-NLS-1$
tvFields.setInput(new ArrayList<FieldWrapper>());
initComboSelectorContents();
}
private void initComboSelectorContents() {
if (entityWrapper != null) {
try {
List<String> list = new ArrayList<String>();//Util.getChildElementNames("", entityWrapper.getSourceEntity());
list.add(0,".");//$NON-NLS-1$
comboSelector.setItems(list.toArray(new String[0]));
} catch (Exception e) {
log.error(e.getMessage(), e);
comboSelector.setItems(new String[0]);
}
}
}
private void refreshUI() {
comboSelector.setEnabled(isKeySelected());
txtKeyName.setEnabled(isKeySelected());
tvFields.getControl().setEnabled(isKeySelected());
btnDeleteKey.setEnabled(isKeySelected());
btnAddField.setEnabled(isKeySelected());
btnDeleteField.setEnabled(isFieldSelected() && isKeySelected());
btnEditField.setEnabled(isFieldSelected() && isKeySelected());
lblKeyNameErrIndicator.setVisible(false);
lblKeyNameErrIndicator.setToolTipText("");//$NON-NLS-1$
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length > 0) {
String errMsg = isKeyNameValid(txtKeyName.getText().trim(), selectedKeys[0]);
lblKeyNameErrIndicator.setVisible(errMsg != null);
lblKeyNameErrIndicator.setToolTipText(errMsg == null ? "" : errMsg);//$NON-NLS-1$
}
tvKeys.refresh();
tvFields.refresh();
}
private boolean isFieldSelected() {
return !tvFields.getSelection().isEmpty();
}
private boolean isKeySelected() {
return !tvKeys.getSelection().isEmpty();
}
private KeyWrapper[] getSelectedKeys() {
if (!isKeySelected()) {
return new KeyWrapper[0];
}
List<KeyWrapper> results = new ArrayList<KeyWrapper>();
for (Object eachSelectedObj : ((IStructuredSelection) tvKeys.getSelection()).toArray()) {
if (eachSelectedObj instanceof KeyWrapper) {
results.add((KeyWrapper) eachSelectedObj);
}
}
return results.toArray(new KeyWrapper[0]);
}
private FieldWrapper[] getAllFields() {
return ((Collection<?>) tvFields.getInput()).toArray(new FieldWrapper[0]);
}
private FieldWrapper[] getSelectedFields() {
if (!isFieldSelected()) {
return new FieldWrapper[0];
}
List<FieldWrapper> results = new ArrayList<FieldWrapper>();
for (Object eachSelectedObj : ((IStructuredSelection) tvFields.getSelection()).toArray()) {
if (eachSelectedObj instanceof FieldWrapper) {
results.add((FieldWrapper) eachSelectedObj);
}
}
return results.toArray(new FieldWrapper[0]);
}
private void initUIListeners() {
initListener2TvKeys();
initListener2TvFields();
initListener2TxtKeyName();
initListener2ComboSelector();
initListener2BtnRemoveKey();
initListener2BtnRemoveField();
initListener2BtnEditField();
initListener2BtnAddField();
initListener2BtnAddKey();
}
private void addUIListeners() {
tvKeys.addSelectionChangedListener(lTvKeysSelectionListener);
tvFields.addSelectionChangedListener(lTvFieldsSelectionListener);
txtKeyName.addModifyListener(lTxtKeyNameModifyListener);
comboSelector.addModifyListener(lComboSelectorModifyListner);
comboSelector.addMouseListener(lComboSelectorMouseListener);
btnDeleteKey.addSelectionListener(lBtnRemoveKeySelectionListner);
btnDeleteField.addSelectionListener(lBtnRemoveFieldListner);
btnEditField.addSelectionListener(lBtnEditFieldListener);
btnAddField.addSelectionListener(lBtnAddFieldListener);
btnAddKey.addSelectionListener(lBtnAddKeyListener);
}
private void removeUIListeners() {
tvKeys.removeSelectionChangedListener(lTvKeysSelectionListener);
tvFields.removeSelectionChangedListener(lTvFieldsSelectionListener);
txtKeyName.removeModifyListener(lTxtKeyNameModifyListener);
comboSelector.removeModifyListener(lComboSelectorModifyListner);
btnDeleteKey.removeSelectionListener(lBtnRemoveKeySelectionListner);
btnDeleteField.removeSelectionListener(lBtnRemoveFieldListner);
btnEditField.removeSelectionListener(lBtnEditFieldListener);
btnAddField.removeSelectionListener(lBtnAddFieldListener);
btnAddKey.removeSelectionListener(lBtnAddKeyListener);
}
private void initListener2TvKeys() {
lTvKeysSelectionListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
Object selectedObj = ((IStructuredSelection) event.getSelection()).getFirstElement();
if (selectedObj instanceof KeyWrapper) {
txtKeyName.setText(((KeyWrapper) selectedObj).getName());
txtKeyName.setEditable(!((KeyWrapper) selectedObj).isUniqueKey());
comboSelector.setText(((KeyWrapper) selectedObj).getSelector());
tvFields.setInput(Arrays.asList(((KeyWrapper) selectedObj).getFields()));
}
refreshUI();
}
};
}
private void initListener2TvFields() {
lTvFieldsSelectionListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
refreshUI();
}
};
}
private void initListener2TxtKeyName() {
lTxtKeyNameModifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length > 0 && selectedKeys[0].getName().equals(txtKeyName.getText().trim())) {
return;
}
String errMsg = isKeyNameValid(txtKeyName.getText().trim(), selectedKeys[0]);
lblKeyNameErrIndicator.setVisible(errMsg != null);
lblKeyNameErrIndicator.setToolTipText(errMsg == null ? "" : errMsg);//$NON-NLS-1$
getSelectedKeys()[0].setName(txtKeyName.getText().trim());
tvKeys.refresh();
if(section!=null) {
section.autoCommit();
}
}
};
}
private void initListener2ComboSelector() {
lComboSelectorMouseListener = new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
initComboSelectorContents();
}
};
lComboSelectorModifyListner = new ModifyListener() {
public void modifyText(ModifyEvent e) {
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length > 0 && selectedKeys[0].getSelector().equals(comboSelector.getText().trim())) {
return;
}
if (!isSelectorValid(comboSelector.getText().trim())) {
if (selectedKeys.length > 0) {
comboSelector.setText(selectedKeys[0].getSelector());
}
return;
}
getSelectedKeys()[0].setSelector(comboSelector.getText().trim());
if(section!=null) {
section.autoCommit();
}
}
};
}
private void initListener2BtnRemoveKey() {
lBtnRemoveKeySelectionListner = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length == 0) {
return;
}
for (KeyWrapper eachSelectedKey : selectedKeys) {
entityWrapper.removeKey(eachSelectedKey);
}
tvKeys.setInput(Arrays.asList(entityWrapper.getKeys()));
selectFirstKeyInCurKeyList();
if(section!=null) {
section.autoCommit();
}
}
};
}
private void initListener2BtnRemoveField() {
lBtnRemoveFieldListner = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length == 0) {
return;
}
FieldWrapper[] selectedFields = getSelectedFields();
if (selectedFields.length == 0) {
return;
}
if (getAllFields().length == selectedFields.length) {
MessageDialog.openWarning(getShell(), Messages.Warning, Messages.EntityKeyConfigComposite_WarningMsg);
return;
}
for (FieldWrapper eachRemovedField : selectedFields) {
selectedKeys[0].removeField(eachRemovedField);
}
tvFields.setInput(Arrays.asList(selectedKeys[0].getFields()));
if(section!=null) {
section.autoCommit();
}
}
};
}
private void initListener2BtnEditField() {
lBtnEditFieldListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FieldWrapper[] selectedFields = getSelectedFields();
if (selectedFields.length == 0) {
return;
}
try {
KeyWrapper[] selectedKeys = getSelectedKeys();
List<String> topChilds = getTopChildrenNames();
// filter already exist fields
List<String> fieldNames = getFieldNames(selectedKeys[0].getSourceKey());
for (String fdv : fieldNames) {
if (topChilds.contains(fdv)) {
topChilds.remove(fdv);
}
}
SelectFieldDialog selectFieldDlg = new SelectFieldDialog(getShell(),
"Select one field", topChilds, selectedFields[0].getXPath());//$NON-NLS-1$
if (selectFieldDlg.open() != Window.OK) {
return;
}
selectedFields[0].setXPath(selectFieldDlg.getField().trim());
tvFields.refresh();
if(section!=null) {
section.autoCommit();
}
} catch (Exception exp) {
log.error(exp.getMessage(), exp);
}
}
};
}
private void initListener2BtnAddField() {
lBtnAddFieldListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
KeyWrapper[] selectedKeys = getSelectedKeys();
if (selectedKeys.length == 0) {
return;
}
List<String> topChilds = getTopChildrenNames();
// filter already exist fields
List<String> fieldNames = getFieldNames(selectedKeys[0].getSourceKey());
for (String fdv : fieldNames) {
if (topChilds.contains(fdv)) {
topChilds.remove(fdv);
}
}
SelectFieldDialog selectFieldDlg = new SelectFieldDialog(getShell(),
Messages.EntityKeyConfigComposite_SelectOneField, topChilds, null);
if (selectFieldDlg.open() != Window.OK) {
return;
}
if ("".equals(selectFieldDlg.getField().trim())) {
return;
}
FieldWrapper newFieldWrapper = new FieldWrapper(selectFieldDlg.getField().trim());
selectedKeys[0].addField(newFieldWrapper);
tvFields.setInput(Arrays.asList(selectedKeys[0].getFields()));
tvFields.setSelection(new StructuredSelection(newFieldWrapper));
if(section!=null) {
section.autoCommit();
}
} catch (Exception exp) {
log.error(exp.getMessage(), exp);
}
}
};
}
private List<String> getTopChildrenNames() throws Exception {
Map<String, XSDParticle> childElements = Util.getChildElements("", entityWrapper.getSourceEntity(), //$NON-NLS-1$
true, new HashSet<Object>());
List<String> names = new ArrayList<String>();
Iterator<String> iterator = childElements.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
XSDParticle next = childElements.get(key);
if (next.getMinOccurs() == 1 && next.getMaxOccurs() == 1) {
names.add(key);
}
}
// filter the non top level fields
List<String> topChilds = new ArrayList<String>();
for (String child : names) {
if (child.indexOf('/') == -1) {
topChilds.add(child);
}
}
return topChilds;
}
private List<String> getFieldNames(XSDIdentityConstraintDefinition xsdIdentityConstraintDefinition) {
List<String> fieldNames = new ArrayList<String>();
if (xsdIdentityConstraintDefinition == null) {
EList<XSDIdentityConstraintDefinition> identityConstraintDefinitions = entityWrapper.getSourceEntity()
.getIdentityConstraintDefinitions();
for (XSDIdentityConstraintDefinition idc : identityConstraintDefinitions) {
EList<XSDXPathDefinition> fields = idc.getFields();
for (XSDXPathDefinition fd : fields) {
fieldNames.add(fd.getValue());
}
}
} else {
XSDIdentityConstraintDefinition idc = xsdIdentityConstraintDefinition;
EList<XSDXPathDefinition> fields = idc.getFields();
for (XSDXPathDefinition fd : fields) {
fieldNames.add(fd.getValue());
}
}
return fieldNames;
}
private void initListener2BtnAddKey() {
lBtnAddKeyListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
List<String> topChilds = getTopChildrenNames();
IdentityConstraintInputDialog dialog = new IdentityConstraintInputDialog(entityWrapper.getSourceEntity(),
getShell(), Messages.EntityKeyConfigComposite_AddANewKey, topChilds,
entityWrapper.getSourceEntityName());
dialog.setInputValidator(new NewKeyWrapperValidator(entityWrapper));
if (dialog.open() != Window.OK) {
return;
}
KeyWrapper newKeyWrapper = new KeyWrapper(dialog.getKeyName(), ".", dialog.getType(),//$NON-NLS-1$
new FieldWrapper[] { new FieldWrapper(dialog.getFieldName()) });
entityWrapper.addKey(newKeyWrapper);
tvKeys.setInput(Arrays.asList(entityWrapper.getKeys()));
tvKeys.setSelection(new StructuredSelection(newKeyWrapper));
if(section!=null) {
section.autoCommit();
}
} catch (Exception exp) {
log.error(exp.getMessage(), exp);
}
}
};
}
private void selectFirstKeyInCurKeyList() {
if (tvKeys == null || entityWrapper == null) {
return;
}
if (entityWrapper.hasKey()) {
tvKeys.setSelection(new StructuredSelection(entityWrapper.getKeys()[0]));
return;
}
removeUIListeners();
initUIContents();
addUIListeners();
}
private boolean isSelectorValid(String selector) {
if (selector == null || "".equals(selector.trim())) { //$NON-NLS-1$
return false;
}
return true;
}
private String isKeyNameValid(String keyName, KeyWrapper keyBeforeModified) {
if (entityWrapper == null) {
return Messages.EntityKeyConfigComposite_EntityCannotbeNull;
}
return new EditKeyWrapperNameValidator(entityWrapper, keyBeforeModified).isValid(keyName);
}
@Override
public void dispose() {
super.dispose();
addKeyIcon.dispose();
deleteKeyIcon.dispose();
addFieldIcon.dispose();
deleteFieldIcon.dispose();
editFieldIcon.dispose();
errIcon.dispose();
}
class EditKeyWrapperNameValidator extends EditXSDIdentityConstraintNameValidator {
private EntityWrapper entityWrapper;
private KeyWrapper targetKeyWrapper;
public EditKeyWrapperNameValidator(EntityWrapper entityWrapper, KeyWrapper targetKeyWrapper) {
super(targetKeyWrapper.getSourceKey());
this.entityWrapper = entityWrapper;
this.targetKeyWrapper = targetKeyWrapper;
}
@Override
public String isValid(String newText) {
if (newText == null || "".equals(newText.trim())) { //$NON-NLS-1$
return Messages.EntityKeyConfigComposite_KeyNamecannotbeEmpty;
}
if (XSDIdentityConstraintCategory.UNIQUE_LITERAL.equals(targetKeyWrapper.getType())
&& !entityWrapper.getName().equals(targetKeyWrapper.getName())) {
return Messages.EntityKeyConfigComposite_ValidInfo1;
}
if (getSchema() != null && getSchema().getIdentityConstraintDefinitions() != null) {
for (XSDIdentityConstraintDefinition eachKey : getSchema().getIdentityConstraintDefinitions()) {
if (eachKey.getContainer().equals(entityWrapper.getSourceEntity())) {
continue;
}
if (eachKey.getName().equals(newText)) {
return Messages.bind(Messages.EntityKeyConfigComposite_ValidInfo2, newText);
}
}
}
for (KeyWrapper eachKeyWrapper : entityWrapper.getKeys()) {
if (eachKeyWrapper.equals(targetKeyWrapper)) {
continue;
}
if (eachKeyWrapper.getName().equals(newText)) {
return Messages.bind(Messages.EntityKeyConfigComposite_ValidInfo3, newText);
}
}
return null;
}
@Override
public XSDSchema getSchema() {
return entityWrapper.getSchema();
}
}
class NewKeyWrapperValidator extends NewXSDIndentityConstraintValidator {
private EntityWrapper entityWrapper;
public NewKeyWrapperValidator(EntityWrapper entityWrapper) {
super(entityWrapper.getSchema());
this.entityWrapper = entityWrapper;
}
@Override
public String isValid(String keyName, XSDIdentityConstraintCategory type, XSDElementDeclaration element) {
if (keyName == null || "".equals(keyName.trim())) { //$NON-NLS-1$
return Messages.EntityKeyConfigComposite_ValidInfo4;
}
for (XSDIdentityConstraintDefinition eachKey : getSchema().getIdentityConstraintDefinitions()) {
if (eachKey.getContainer().equals(element)) {
continue;
}
if (eachKey.getName().equals(keyName)) {
return Messages.bind(Messages.EntityKeyConfigComposite_ValidInfo5, keyName);
}
}
for (KeyWrapper eachKeyWrapper : entityWrapper.getKeys()) {
if (type.equals(XSDIdentityConstraintCategory.UNIQUE_LITERAL)
&& eachKeyWrapper.getType().equals(XSDIdentityConstraintCategory.UNIQUE_LITERAL)) {
return Messages.EntityKeyConfigComposite_ValidInfo6;
}
if (eachKeyWrapper.getName().equals(keyName)) {
return Messages.bind(Messages.EntityKeyConfigComposite_ValidInfo7, keyName);
}
}
return null;
}
}
}