/* * Mylyn Connector for Serena Business Mashups * Copyright 2010 Brian Rosenberger (Brutex Network) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Serena, TeamTrack and Serena Business Mashup are * registered trademarks of SERENA Software Inc. */ package net.brutex.mylyn.sbmconnector.ui; import java.util.List; import net.brutex.mylyn.sbmconnector.SBMConnectorPlugin; import net.brutex.mylyn.sbmconnector.core.SBMClient; import net.brutex.mylyn.sbmconnector.core.SBMRepositoryConnector; import net.brutex.mylyn.sbmconnector.core.model.SBMField; import net.brutex.mylyn.sbmconnector.core.model.SBMSystemFields; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; public class SBMRepositorySettingsPage extends AbstractRepositorySettingsPage { private Combo table; private Table list; private String solutionTable = ""; private String solutionTableList = ""; private String tableFieldList = ""; private String tableFullFieldList = ""; public static final String STRING_SOLUTIONTABLE = "solutionTable"; public static final String STRING_SOLUTIONTABLELIST = "solutionTableList"; public static final String STRING_TABLEFIELDLIST = "tableFieldList"; public static final String STRING_TABLEFULLFIELDLIST = "tableFullFieldList"; public SBMRepositorySettingsPage(String title, String description, TaskRepository taskRepository) { super(title, description, taskRepository); setNeedsAdvanced(false); setNeedsValidation(true); setNeedsEncoding(false); // initialize table and table list if not null if (taskRepository.hasProperty(STRING_SOLUTIONTABLE)) { this.solutionTable = taskRepository .getProperty(STRING_SOLUTIONTABLE); } if (taskRepository.hasProperty(STRING_SOLUTIONTABLELIST)) { this.solutionTableList = taskRepository .getProperty(STRING_SOLUTIONTABLELIST); } if (taskRepository.hasProperty(STRING_TABLEFIELDLIST)) { this.tableFieldList = taskRepository .getProperty(STRING_TABLEFIELDLIST); } if (taskRepository.hasProperty(STRING_TABLEFULLFIELDLIST)) { this.tableFullFieldList = taskRepository .getProperty(STRING_TABLEFULLFIELDLIST); } } @Override public void applyTo(TaskRepository repository) { super.applyTo(repository); if (!solutionTable.isEmpty()) { repository.setProperty(STRING_SOLUTIONTABLE, solutionTable); repository.setProperty(STRING_SOLUTIONTABLELIST, solutionTableList); String fieldlist = ","; String fullfieldlist = ","; for (TableItem t : list.getItems()) { if (t.getChecked()) fieldlist = fieldlist + t.getText(2) + ","; fullfieldlist = fullfieldlist + t.getText(2) + ","; } repository.setProperty(STRING_TABLEFIELDLIST, fieldlist); repository.setProperty(STRING_TABLEFULLFIELDLIST, fullfieldlist); } } @Override public boolean isPageComplete() { if (table != null && table.getText().length() > 4 && getUserName() != null && getUserName().length() > 0) { return true; } return false; } @Override protected void createContributionControls(Composite parentControl) { ExpandableComposite expander = createSection(parentControl, "Mashup application"); FormToolkit toolkit = new FormToolkit(parentControl.getDisplay()); Composite control = toolkit.createComposite(expander, SWT.NONE); GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; gridLayout.verticalSpacing = 5; gridLayout.marginWidth = 0; control.setLayout(gridLayout); control.setBackground(parentControl.getBackground()); Label label = new Label(control, SWT.NONE); label.setText("Table:"); table = new Combo(control, SWT.SINGLE | SWT.BORDER); Label label_list = new Label(control, SWT.NONE | SWT.TOP); label_list.setText("Fields:"); list = new Table(control, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.CHECK); list.setLinesVisible(true); list.setHeaderVisible(true); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.heightHint = 200; list.setLayoutData(data); String[] titles = { " ", "Display Name", "DBName", "Type" }; for (int i = 0; i < titles.length; i++) { TableColumn column = new TableColumn(list, SWT.NONE); column.setText(titles[i]); } list.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { //avoid that a system field may be unchecked try { SBMSystemFields .valueOf(((TableItem) event.item).getText(2)); ((TableItem) event.item).setChecked(true); } catch (IllegalArgumentException e) { // do nothing } } }); table.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event arg0) { // when the table has been changed // try to re-read the field list tableFieldList = ""; tableFullFieldList = ""; try { SBMField[] fields = SBMRepositoryConnector.getClient( createTaskRepository()).getFields(table.getText()) .toArray(new SBMField[0]); fillList(list, fields); } catch (Exception e) { } if (getWizard() != null) { solutionTable = table.getText(); getWizard().getContainer().updateButtons(); } } }); regenerateTables(); expander.setClient(control); } @Override public String getConnectorKind() { return SBMConnectorPlugin.CONNECTOR_KIND; } @Override protected Validator getValidator(TaskRepository repository) { return new SBMConnectionValidator(repository); } @Override protected boolean isValidUrl(String url) { if (url.contains("")) return false; return true; } @Override protected void applyValidatorResult(Validator validator) { if (((SBMConnectionValidator) validator).getResult() != null) { setMessage("Validate first!", IMessageProvider.ERROR); setNeedsValidation(true); } else { regenerateTables(); } } private void regenerateTables() { try { List tables = SBMRepositoryConnector.getClient( createTaskRepository()).getPrimaryTables(); for (String table_name : tables) { table.add(table_name); if (solutionTable.equals(table_name)) { table.setText(table_name); } } } catch (Exception e) { // it was not possible to read the list of tables // from the server, so just restore saved settings table.add(solutionTable); table.setText(solutionTable); } try { SBMField[] fields = SBMRepositoryConnector.getClient( createTaskRepository()).getFields(table.getText()).toArray( new SBMField[0]); fillList(list, fields); } catch (Exception e) { // it was not possible to read the fields for the given table // do nothing } } protected class SBMConnectionValidator extends Validator { private TaskRepository repository; private String result = null; protected SBMConnectionValidator(TaskRepository repository) { this.repository = repository; } @Override public void run(IProgressMonitor monitor) throws CoreException { monitor.beginTask("Prüfe Verbindung", IProgressMonitor.UNKNOWN); SBMClient client = new SBMClient(repository); if (!client.canAuthenticate()) { result = "Verbindung fehlgeschlagen"; } else { result = null; } monitor.done(); } public String getResult() { return result; } } private void fillList(Table list, SBMField[] fields) { list.removeAll(); for (int i = 0; i < fields.length; i++) { TableItem item = new TableItem(list, 0); item.setText(0, ""); item.setText(1, fields[i].getLabel()); item.setText(2, fields[i].getName()); item.setText(3, fields[i].getType().getValue().replaceFirst( "FLDTYPE-", "")); try { // auto-select all system fields SBMSystemFields.valueOf(fields[i].getName()); item.setChecked(true); } catch (IllegalArgumentException e) { // do nothing } if (tableFieldList.contains(","+fields[i].getName()+",")) { // item has been checked before // so check it item.setChecked(true); } } for (TableColumn c : list.getColumns()) { c.pack(); } } @Override protected void createAdditionalControls(Composite arg0) { // TODO Auto-generated method stub } }