/** * Copyright (C) 2011, Starschema Ltd. <info at starschema.net> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. **/ package org.talend.repository.sapwizard.ui.wizard; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.ICellEditorListener; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.talend.commons.ui.runtime.image.EImage; import org.talend.commons.ui.runtime.image.ImageProvider; import org.talend.commons.ui.swt.formtools.Form; import org.talend.commons.ui.swt.formtools.LabelledText; import org.talend.commons.ui.swt.formtools.UtilsButton; import org.talend.commons.ui.swt.tableviewer.TableViewerCreator; import org.talend.commons.ui.swt.tableviewer.TableViewerCreatorColumn; import org.talend.commons.ui.swt.tableviewer.behavior.CellEditorValueAdapter; import org.talend.commons.ui.swt.tableviewer.behavior.ComboEditorValueAdapter; import org.talend.commons.ui.swt.tableviewer.behavior.IColumnImageProvider; import org.talend.commons.ui.utils.ControlUtils; import org.talend.commons.utils.data.text.IndiceHelper; import org.talend.core.language.LanguageManager; import org.talend.core.model.metadata.builder.connection.ConnectionFactory; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.core.model.metadata.builder.connection.MetadataTable; import org.talend.core.model.metadata.builder.connection.SAPConnection; import org.talend.core.model.metadata.builder.connection.SAPFunctionUnit; import org.talend.core.model.metadata.builder.connection.impl.MetadataColumnImpl; import org.talend.core.model.metadata.editor.MetadataEmfTableEditor; import org.talend.core.model.metadata.types.JavaTypesManager; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.ui.metadata.editor.MetadataEmfTableEditorView; import org.talend.core.utils.TalendQuoteUtils; import org.talend.repository.sap.i18n.Messages; import org.talend.repository.sapwizard.service.SapUtil; import orgomg.cwm.objectmodel.core.Expression; /** * @author Ammu * */ public class SapTableForm extends BaseSAPForm { private enum SearchMode { OVERRIDE, MANUAL } private SearchMode searchMode; /** * tableNameText */ private LabelledText tableNameText; /** * findButton */ private UtilsButton findButton; /** * readOnly */ private boolean readOnly; /** * newTableList */ private List<MetadataTable> newTableList; /** * functionUnit */ private SAPFunctionUnit functionUnit; /** * metadataTable */ private MetadataTable metadataTable; private MetadataEmfTableEditor metadataEditor; private MetadataEmfTableEditorView tableEditorView; ComboBoxCellEditor nameColumnCellEditor; Map<String, MetadataColumn> columnNameMetadataColumnMap; Map<String, MetadataColumn> retrievedColumnsMap = new HashMap<String, MetadataColumn>(); List<String> customizedColumnsList = new ArrayList<String>(); Button btnRadioAddSchema; Button btnRadioOverrideSchema; String lastValidValue = ""; SelectionListener comboSelectionListener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { int selectedIdx = ((CCombo) e.getSource()).getSelectionIndex(); String selectedItem = ((CCombo) e.getSource()).getItem(selectedIdx); MetadataColumn column = columnNameMetadataColumnMap.get(selectedItem); TableItem item = (TableItem) ((CCombo) e.getSource()).getData(); Table table = item.getParent(); int columnIdx = table.getSelectionIndex(); if (!metadataTable.getColumns().get(columnIdx).equals(column)) { metadataTable.getColumns().remove(columnIdx); metadataEditor.setMetadataTable(metadataTable); } metadataTable.getColumns().add(columnIdx, column); metadataEditor.setMetadataTable(metadataTable); retrievedColumnsMap.remove(column.getLabel()); tableEditorView.setMetadataEditor(metadataEditor); table.select(columnIdx); } }; /** * @param parent * @param connectionItem * @param functionUnit * @param metadataTable */ public SapTableForm(Composite parent, ConnectionItem connectionItem, SAPFunctionUnit functionUnit, MetadataTable metadataTable, String[] existingNames) { super(parent, 0, existingNames); this.connectionItem = connectionItem; this.functionUnit = functionUnit; this.metadataTable = metadataTable; this.newTableList = new ArrayList<MetadataTable>(); this.columnNameMetadataColumnMap = new HashMap<String, MetadataColumn>(); setConnectionItem(connectionItem); setupForm(false); TableItem[] items = tableEditorView.getTableViewerCreator().getTableViewer().getTable().getItems(); if (items.length == 0) { btnRadioOverrideSchema.setSelection(true); btnRadioAddSchema.setSelection(false); searchMode = SearchMode.OVERRIDE; } else { btnRadioOverrideSchema.setSelection(false); btnRadioAddSchema.setSelection(true); searchMode = SearchMode.MANUAL; } } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#adaptFormToReadOnly() */ protected void adaptFormToReadOnly() { this.readOnly = isReadOnly(); this.tableNameText.setReadOnly(isReadOnly()); this.tableEditorView.setReadOnly(isReadOnly()); } /* * (non-Javadoc) * * @see org.eclipse.swt.widgets.Control#setVisible(boolean) */ public void setVisible(boolean visible) { super.setVisible(visible); updateFindButton(); if (isContextMode()) { adaptFormToEditable(); } if (isReadOnly() != this.readOnly) { adaptFormToReadOnly(); } tableNameText.forceFocus(); } /** * */ protected void addMetadataTable() { ProxyRepositoryFactory proxyRepositoryFactory = ProxyRepositoryFactory.getInstance(); this.metadataTable = ConnectionFactory.eINSTANCE.createMetadataTable(); getFunctionUnit().getTables().add(this.metadataTable); this.newTableList.add(this.metadataTable); this.metadataTable.setId(proxyRepositoryFactory.getNextId()); this.metadataTable.setLabel(IndiceHelper.getIndexedLabel(this.metadataTable.getLabel(), this.existingNames)); } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#addFields() */ protected void addFields() { Composite parent = new Composite(this, SWT.NONE); parent.setLayout(new GridLayout(2, false)); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); parent.setLayoutData(gridData); this.tableNameText = new LabelledText(parent, Messages.getString("SapTableForm.Name"), true); addFindButton(parent); Group group = Form.createGroup(parent, 1, Messages.getString("SapTableForm.GroupColumnsToDownload"), 1); gridData = new GridData(SWT.FILL, SWT.FILL, true, true); gridData.horizontalSpan = 2; group.setLayoutData(gridData); Composite compositeMetaData = Form.startNewGridLayout(group, 1); int rightCompositeWidth = 100; int tableCompositeHeight = 220; Composite compositeTable = Form.startNewDimensionnedGridLayout(compositeMetaData, 1, rightCompositeWidth, tableCompositeHeight); compositeTable.setLayout(new FillLayout()); this.metadataEditor = new MetadataEmfTableEditor(""); //$NON-NLS-1$ this.tableEditorView = new SapMetadataEmfTableEditorView(compositeTable); this.tableEditorView.setShowDbTypeColumn(false, false, false); this.tableEditorView.setShowDbColumnName(false, false); this.tableEditorView.setCurrentDbms("sap"); this.tableEditorView.initGraphicComponents(); } /** * @param composite */ private void addFindButton(Composite composite) { Group group = new Group(composite, SWT.NONE); group.setLayout(new GridLayout(2, false)); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); gridData.horizontalSpan = 2; group.setLayoutData(gridData); SelectionListener radioListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { if (((Button) e.getSource()).getSelection()) { searchMode = SearchMode.OVERRIDE; } else { searchMode = SearchMode.MANUAL; } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; btnRadioOverrideSchema = new Button(group, SWT.RADIO); btnRadioOverrideSchema.setText("Override Existing Schema"); btnRadioOverrideSchema.addSelectionListener(radioListener); Composite btnComposite = new Composite(group, SWT.NONE); btnComposite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 2)); this.findButton = new UtilsButton(btnComposite, Messages.getString("SapTableForm.FindButton"), 180, 30); this.findButton.setEnabled(false); btnRadioAddSchema = new Button(group, SWT.RADIO); btnRadioAddSchema.setText("Add New Columns Manually"); } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#addUtilsButtonListeners() */ protected void addUtilsButtonListeners() { this.findButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent selectionEvent) { searchFunction(); } }); } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#addFieldsListeners() */ @Override protected void addFieldsListeners() { this.tableNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent modifyEvent) { boolean status = checkFieldsValue(); findButton.setEnabled(status); } }); } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#checkFieldsValue() */ protected boolean checkFieldsValue() { if (isContextMode()) { return true; } if (this.tableNameText.getCharCount() == 0) { updateStatus(4, Messages.getString("SapForm.Alert", new Object[] { this.tableNameText.getLabelText() })); return false; } updateFindButton(); updateStatus(0, null); return true; } /** * */ private void updateFindButton() { if (isContextMode()) { this.findButton.setEnabled(true); } else { boolean bool = (this.tableNameText.getCharCount() != 0); this.findButton.setEnabled(bool); } } /** * */ public void performCancel() { processWhenDispose(); cleanModel(); } /** * */ private void cleanModel() { getFunctionUnit().getTables().removeAll(this.newTableList); } /* * (non-Javadoc) * * @see org.talend.repository.ui.swt.utils.AbstractForm#initialize() */ protected void initialize() { if (this.functionUnit != null) { if (metadataTable == null) { metadataTable = functionUnit.getMetadataTable(); } this.tableNameText.setText(functionUnit.getName()); this.metadataEditor.setMetadataTable(metadataTable); this.tableEditorView.setMetadataEditor(metadataEditor); this.tableEditorView.getTableViewerCreator().layout(); } this.tableNameText.forceFocus(); updateStatus(2, ""); } /** * @return */ protected SAPFunctionUnit getFunctionUnit() { return this.functionUnit; } /** * */ private void searchFunction() { if (getStatusLevel() == Status.OK) { columnNameMetadataColumnMap = new HashMap<String, MetadataColumn>(); String tableName = this.tableNameText.getText(); try { if (existingNames.contains(tableName)) { SAPConnection sapConnection = (SAPConnection) getConnection(); final EList<SAPFunctionUnit> funtions = sapConnection.getFuntions(); for (SAPFunctionUnit unit : new ArrayList<SAPFunctionUnit>(funtions)) { if (unit.getMetadataTable().getLabel().equals(tableName)) { SapUtil.updateFunctionForGivenTable(unit, tableName, sapConnection); functionUnit = unit; break; } } } else { functionUnit = SapUtil.createFunctionForGivenTable(tableName, getConnection()); } if (functionUnit == null) { MessageDialog.openWarning(getShell(), "SAP", Messages.getString("SapTableForm.NoTable")); } else { metadataTable = functionUnit.getMetadataTable(); if (searchMode == SearchMode.OVERRIDE) { metadataEditor.setMetadataTable(metadataTable); tableEditorView.setMetadataEditor(metadataEditor); } tableEditorView.getTableViewerCreator().layout(); handleDefaultValue(metadataEditor.getMetadataColumnList()); TableItem[] items = tableEditorView.getTableViewerCreator().getTableViewer().getTable().getItems(); List<String> existingTableColumnNames = new ArrayList<String>(); for (TableItem item : items) { MetadataColumnImpl column = (MetadataColumnImpl) item.getData(); existingTableColumnNames.add(column.getLabel()); } for (MetadataColumn metadataColumn : metadataTable.getColumns()) { if (!existingTableColumnNames.contains(metadataColumn.getLabel())) { retrievedColumnsMap.put(metadataColumn.getLabel(), metadataColumn); } columnNameMetadataColumnMap.put(metadataColumn.getLabel(), metadataColumn); } for (MetadataColumn metadataColumn : metadataEditor.getMetadataTable().getColumns()) { if (!columnNameMetadataColumnMap.keySet().contains(metadataColumn.getLabel())) { customizedColumnsList.add(metadataColumn.getLabel()); } } for (String columnName : retrievedColumnsMap.keySet()) { metadataTable.getColumns().remove(retrievedColumnsMap.get(columnName)); } if (searchMode == SearchMode.MANUAL) { metadataTable = metadataEditor.getMetadataTable(); functionUnit.setMetadataTable(metadataTable); } String[] retrievedColumns = retrievedColumnsMap.keySet().toArray(new String[retrievedColumnsMap.size()]); nameColumnCellEditor.setItems(retrievedColumns); updateStatus(0, ""); } } catch (Exception exception) { String message = exception.getMessage(); if (message.equalsIgnoreCase("NO_FUNCTION_FOUND")) { message = Messages.getString("SapTableForm.NoTable"); } MessageDialog.openWarning(getShell(), "SAP", message); } } } private void handleDefaultValue(List<MetadataColumn> metadataColumnList) { for (MetadataColumn metadataColumn : metadataColumnList) { if (metadataColumn == null) { continue; } switch (LanguageManager.getCurrentLanguage()) { case JAVA: Expression initialValue = metadataColumn.getInitialValue(); String returnValue = initialValue == null ? null : initialValue.getBody(); if (metadataColumn.getTalendType().equals(JavaTypesManager.STRING.getId()) || metadataColumn.getTalendType().equals(JavaTypesManager.DATE.getId())) { if ((returnValue == null) || (returnValue.length() == 0)) { returnValue = null; } else if (returnValue.equalsIgnoreCase("null")) { returnValue = "null"; } else { returnValue = returnValue.replaceAll("\'", ""); } } else { String returnBoolean = TalendQuoteUtils.removeQuotes(returnValue); if (returnBoolean != null && returnBoolean.length() > 0 && returnBoolean.getBytes()[0] == 1) { returnValue = TalendQuoteUtils.addQuotes("1"); //$NON-NLS-1$ } } metadataColumn.setDefaultValue(returnValue); default: break; } } } class SapMetadataEmfTableEditorView extends MetadataEmfTableEditorView { public static final String ID_COLUMN_UNTRANSCODE = "ID_COLUMN_UNTRANSCODE"; public SapMetadataEmfTableEditorView(Composite parent) { super(parent, SWT.NONE, false); } @Override protected void createColumns(TableViewerCreator<MetadataColumn> tableViewerCreator, Table table) { tableViewerCreator.setReadOnly(this.readOnly); TableViewerCreatorColumn<MetadataColumn, Object> localTableViewerCreatorColumn = new TableViewerCreatorColumn<MetadataColumn, Object>(tableViewerCreator); localTableViewerCreatorColumn.setTitle(""); localTableViewerCreatorColumn.setDefaultInternalValue(""); localTableViewerCreatorColumn.setWidth(15); configureNameColumn(tableViewerCreator); configureTypeColumns(tableViewerCreator); configureLengthColumn(tableViewerCreator); configureCommentColumn(tableViewerCreator); } @Override protected void configureNameColumn(final TableViewerCreator<MetadataColumn> tableViewerCreator) { TableViewerCreatorColumn column = new TableViewerCreatorColumn(tableViewerCreator); column.setId(ID_COLUMN_NAME); column.setTitle(Messages.getString("MetadataTableEditorView.ColumnTitle")); //$NON-NLS-1$ column.setToolTipHeader(Messages.getString("MetadataTableEditorView.ColumnTitle")); //$NON-NLS-1$ column.setBeanPropertyAccessors(getLabelAccessor()); final Image imageKey = ImageProvider.getImage(EImage.KEY_ICON); final Image imageEmpty = ImageProvider.getImage(EImage.EMPTY); column.setImageProvider(new IColumnImageProvider() { public Image getImage(Object element) { if (getKeyAccesor().get((MetadataColumn) element)) { return imageKey; } else { return imageEmpty; } } }); column.setWeight(25); column.setModifiable(!isReadOnly()); column.setMinimumWidth(45); List<String> columnsList = new ArrayList<String>(); if (metadataTable != null) { for (MetadataColumn metadataColumn : metadataTable.getColumns()) { columnsList.add(metadataColumn.getLabel()); } } String[] columns = columnsList.toArray(new String[columnsList.size()]); nameColumnCellEditor = new ComboBoxCellEditor(tableViewerCreator.getTable(), columns); nameColumnCellEditor.addListener(new ICellEditorListener() { @Override public void editorValueChanged(boolean oldValidState, boolean newValidState) { } @Override public void cancelEditor() { } @Override public void applyEditorValue() { lastValidValue = ControlUtils.getText(nameColumnCellEditor.getControl()); if (columnNameMetadataColumnMap.get(lastValidValue) == null) { final TableItem[] items = ((Table) nameColumnCellEditor.getControl().getParent()).getSelection(); MetadataColumn metadataColumn = (MetadataColumn) items[0].getData(); metadataColumn.setLabel(lastValidValue); metadataColumn.setName(lastValidValue); customizedColumnsList.add(lastValidValue); metadataEditor.setMetadataTable(metadataTable); tableEditorView.setMetadataEditor(metadataEditor); } } }); CellEditorValueAdapter comboValueAdapter = new ComboEditorValueAdapter(null) { @Override public String[] getItems(CellEditor cellEditor) { if (columnNameMetadataColumnMap.isEmpty()) { for (MetadataColumn metadataColumn : metadataTable.getColumns()) { columnNameMetadataColumnMap.put(metadataColumn.getLabel(), metadataColumn); } } String[] columns = ((ComboBoxCellEditor) cellEditor).getItems(); final TableItem[] items = ((Table) cellEditor.getControl().getParent()).getSelection(); if (items != null && items.length > 0) { final String selectedColumnName = ((MetadataColumn) items[0].getData()).getLabel(); boolean isSAPColumn = columnNameMetadataColumnMap.keySet().contains(selectedColumnName); if (isSAPColumn) { columns = new String[] { ((MetadataColumn) items[0].getData()).getLabel() }; } else { if (customizedColumnsList.contains(selectedColumnName)) { columns = new String[] { selectedColumnName }; } else if (retrievedColumnsMap == null || retrievedColumnsMap.isEmpty()) { columns = new String[] { "" }; } else { columns = retrievedColumnsMap.keySet().toArray(new String[retrievedColumnsMap.size()]); } } nameColumnCellEditor.setItems(columns); ((CCombo) cellEditor.getControl()).setText(columns[0]); ((CCombo) cellEditor.getControl()).setEditable(!isSAPColumn); ((CCombo) cellEditor.getControl()).setData(items[0]); ((CCombo) cellEditor.getControl()).removeSelectionListener(comboSelectionListener); ((CCombo) cellEditor.getControl()).addSelectionListener(comboSelectionListener); } return columns; } }; column.setCellEditor(nameColumnCellEditor, comboValueAdapter); } } }