/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.jdbc.ui.wizards; import java.sql.Types; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.ViewForm; 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.graphics.Point; 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.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.I18nUtil; import org.teiid.core.designer.util.StringConstants; import org.teiid.designer.jdbc.JdbcException; import org.teiid.designer.jdbc.data.Request; import org.teiid.designer.jdbc.data.Results; import org.teiid.designer.jdbc.data.ResultsMetadata.ColumnMetadata; import org.teiid.designer.jdbc.metadata.JdbcDatabase; import org.teiid.designer.jdbc.metadata.JdbcNode; import org.teiid.designer.jdbc.metadata.JdbcSchema; import org.teiid.designer.jdbc.metadata.impl.ItemFilter; import org.teiid.designer.jdbc.relational.JdbcImporter; import org.teiid.designer.jdbc.ui.InternalModelerJdbcUiPluginConstants; import org.teiid.designer.jdbc.ui.ModelerJdbcUiConstants; import org.teiid.designer.jdbc.ui.ModelerJdbcUiPlugin; import org.teiid.designer.jdbc.ui.util.JdbcUiUtil; import org.teiid.designer.ui.PluginConstants; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.UiPlugin; import org.teiid.designer.ui.common.InternalUiConstants; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.designer.ui.common.util.WizardUtil; import org.teiid.designer.ui.common.widget.AbstractTableLabelProvider; import org.teiid.designer.ui.common.widget.DefaultScrolledComposite; /** * @since 8.0 */ public class JdbcImportObjectsPage extends WizardPage implements InternalUiConstants.Widgets, ModelerJdbcUiConstants.Images, PluginConstants.Images, CoreStringUtil.Constants, UiConstants { private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(JdbcImportObjectsPage.class); private static final String TITLE = getString("title"); //$NON-NLS-1$ private static final String TITLE_WITH_VDB_SOURCE = TITLE + " (VDB source model)"; //$NON-NLS-1$ private static final int COLUMN_COUNT = 1; private static final String INITIAL_MESSAGE_ID = "initialMessage"; //$NON-NLS-1$ private static final String STATUS_LABEL_ID = "statusLabel"; //$NON-NLS-1$ private static final String SHOW_ALL_SCHEMAS_ID = "showAllSchemasValue"; //$NON-NLS-1$ private static final String SHOW_SELECTED_SCHEMAS_ID = "showSelectedSchemasValue"; //$NON-NLS-1$ private static final String SHOW_FILTERED_SCHEMAS_ID = "showFilteredSchemasValue"; //$NON-NLS-1$ private static final String INVALID_PAGE_MESSAGE = getString("invalidPageMessage"); //$NON-NLS-1$ private static final String TOO_MANY_SCHEMA_MESSAGE = getString("tooManySchemaSelectedMessage"); //$NON-NLS-1$ private static final String NO_OBJECTS = getString("noObjects"); //$NON-NLS-1$ private static final String AND = "and"; //$NON-NLS-1$ private static final String REFRESH_TOOLTIP = getString("refreshTooltip"); //$NON-NLS-1$ private static final int[] SPLITTER_WEIGHTS = new int[] {30, 70}; private static final String NA = getString("na"); //$NON-NLS-1$ private static final String REQUEST_ERROR_MESSAGE_ID = "requestErrorMessage"; //$NON-NLS-1$ private static final String UNKNOWN_COLUMN_LABEL = "Col_"; //$NON-NLS-1$ private static final String CHECK_SELECTED = getString("checkSelected"); //$NON-NLS-1$ private static final String UNCHECK_SELECTED = getString("uncheckSelected"); //$NON-NLS-1$ private static final String RADIO_SHOW_ALL_SCHEMA_TXT = getInternalString("radioShowAllSchemaText"); //$NON-NLS-1$ private static final String RADIO_SHOW_SELECTED_SCHEMA_TXT = getInternalString("radioShowSelectedSchemaText"); //$NON-NLS-1$ private static final String RADIO_SHOW_FILTERED_SCHEMA_TXT = getInternalString("radioShowFilteredSchemaText"); //$NON-NLS-1$ private static final String RADIO_SHOW_ALL_SCHEMA_TIP = getInternalString("radioShowAllSchemaTooltip"); //$NON-NLS-1$ private static final String RADIO_SHOW_SELECTED_SCHEMA_TIP = getInternalString("radioShowSelectedSchemaTooltip"); //$NON-NLS-1$ private static final String RADIO_SHOW_FILTERED_SCHEMA_TIP = getInternalString("radioShowFilteredSchemaTooltip"); //$NON-NLS-1$ private static final String TYPE_NAME_SCHEMA = "schema"; //$NON-NLS-1$ private static final String TYPE_NAME_TABLE = "table"; //$NON-NLS-1$ private static final String TYPE_NAME_STORED_PROC = "storedproc"; //$NON-NLS-1$ /** * @since 4.0 */ private static String getString( final String id ) { return UiConstants.Util.getString(I18N_PREFIX + id); } /** * @since 4.0 */ private static String getString( final String id, final String parameter ) { return UiConstants.Util.getString(I18N_PREFIX + id, parameter); } private static String getInternalString( final String id ) { return InternalModelerJdbcUiPluginConstants.Util.getString(I18N_PREFIX + id); } JdbcDatabase db; private SashForm splitter; private ViewForm objsView; TreeViewer treeViewer; private CTabFolder tabFolder; private SelectionAdapter tabListener; private CLabel dbLabel, statusLabel; Button showAllSchemaButton; Button showSelectedSchemaButton; Button showFilteredSchemaButton; private JdbcNode selectedNode; private Map counts; private IAction checkSelectedAction; private IAction uncheckSelectedAction; private JdbcImporter importer; boolean refreshing; /** * @param pageName * @since 4.0 */ protected JdbcImportObjectsPage() { super(JdbcImportObjectsPage.class.getSimpleName(), TITLE, null); this.counts = new HashMap(0); } /** * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) * @since 4.0 */ @Override public void createControl( final Composite parent ) { // Create page // final Composite pg = new Composite(parent, SWT.NONE) { // // @Override // public Point computeSize( final int widthHint, // final int heightHint, // final boolean changed ) { // final Point size = super.computeSize(widthHint, heightHint, changed); // size.x = 800; // return size; // } // }; final Composite hostPanel = new Composite(parent, SWT.NONE); hostPanel.setLayout(new GridLayout(1, false)); hostPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Create page DefaultScrolledComposite scrolledComposite = new DefaultScrolledComposite(hostPanel, SWT.H_SCROLL | SWT.V_SCROLL); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); GridLayoutFactory.fillDefaults().equalWidth(false).applyTo(scrolledComposite); GridDataFactory.fillDefaults().grab(true, false); final Composite mainPanel = scrolledComposite.getPanel(); //new Composite(scrolledComposite, SWT.NONE); mainPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); mainPanel.setLayout(new GridLayout(1, false)); // Add widgets to page this.splitter = WidgetFactory.createSplitter(mainPanel); { this.objsView = new ViewForm(this.splitter, SWT.BORDER); { // Add title label to view form's title bar this.dbLabel = WidgetFactory.createLabel(this.objsView, ModelerJdbcUiPlugin.getDefault().getImage(DATABASE)); this.objsView.setTopLeft(this.dbLabel); // Add refresh button to view form's title bar final ToolBar bar = new ToolBar(this.objsView, SWT.FLAT); final ToolBarManager mgr = new ToolBarManager(bar); final Action action = new Action() { @Override public void run() { refresh(); } }; // defect 18678 -- now uses modeler.ui.UiPlugin instead of metamatrix.ui.UiPlugin to use an image that exists. action.setImageDescriptor(UiPlugin.getDefault().getImageDescriptor(PluginConstants.Images.REFRESH_ICON)); action.setToolTipText(REFRESH_TOOLTIP); mgr.add(action); mgr.update(true); this.objsView.setTopRight(bar); // Add contents to view form this.treeViewer = new TreeViewer(this.objsView, SWT.MULTI | SWT.CHECK | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); final Tree tree = this.treeViewer.getTree(); GridDataFactory.fillDefaults().hint(120, 120).applyTo(tree); this.objsView.setContent(tree); this.treeViewer.setContentProvider(createTreeContentProvider()); MenuManager menuMgr = createContextMenu(); Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); // Check events can occur separate from selection events. // In this case move the selected node. // Also trigger selection of node in model. this.treeViewer.getTree().addSelectionListener(new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { if (e.detail == SWT.CHECK) { TreeItem treeItem = (TreeItem)e.item; JdbcNode jdbcNode = (JdbcNode)treeItem.getData(); JdbcImportObjectsPage.this.treeViewer.getTree().setSelection(new TreeItem[] {treeItem}); nodeSelected(jdbcNode); setNodeSelected(jdbcNode, treeItem, jdbcNode.getSelectionMode() != JdbcNode.SELECTED); } } @Override public void widgetDefaultSelected( SelectionEvent e ) { } }); this.treeViewer.setLabelProvider(new LabelProvider() { @Override public String getText( final Object node ) { return ((JdbcNode)node).getName(); } }); // Add listener to display details when a node is selected. this.treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged( final SelectionChangedEvent event ) { if( !SelectionUtilities.isMultiSelection(event.getSelection()) ) { JdbcNode node = (JdbcNode)((IStructuredSelection)event.getSelection()).getFirstElement(); nodeSelected(node); } else { nodeSelected(null); } } }); // Add listener to expand/collapse node when double-clicked this.treeViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick( final DoubleClickEvent event ) { nodeDoubleClicked(event); } }); // Add listener to select node when expanded/collapsed this.treeViewer.addTreeListener(new ITreeViewerListener() { @Override public void treeCollapsed( final TreeExpansionEvent event ) { // nodeExpandedOrCollapsed(event); } @Override public void treeExpanded( final TreeExpansionEvent event ) { nodeExpanded(event); } }); } final ViewForm tabView = new ViewForm(this.splitter, SWT.BORDER); this.tabFolder = WidgetFactory.createTabFolder(tabView); tabView.setContent(this.tabFolder); // Create listener to populate tabs upon selection. Added to tab folder only after tab selected. this.tabListener = new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { tabSelected(); } }; } this.splitter.setWeights(SPLITTER_WEIGHTS); this.statusLabel = WidgetFactory.createLabel(mainPanel, GridData.HORIZONTAL_ALIGN_FILL); final Button deselectAllButton = WidgetFactory.createButton(mainPanel, DESELECT_ALL_BUTTON); deselectAllButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { deselectAllButtonSelected(); } }); final Group showGroup = WidgetFactory.createGroup(mainPanel, "Show", GridData.HORIZONTAL_ALIGN_FILL, 1, 3); GridLayoutFactory.fillDefaults().numColumns(3).margins(5, 5).applyTo(showGroup); GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(showGroup); //========================= // Schema Display Options //========================= this.showAllSchemaButton = WidgetFactory.createRadioButton(showGroup, "All schema"); //RADIO_SHOW_ALL_SCHEMA_TXT); this.showAllSchemaButton.setToolTipText(RADIO_SHOW_ALL_SCHEMA_TIP); this.showAllSchemaButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { if( !refreshing ) refresh(); saveWidgetValues(); } }); this.showSelectedSchemaButton = WidgetFactory.createRadioButton(showGroup, "Only selected schema"); // RADIO_SHOW_SELECTED_SCHEMA_TXT); this.showSelectedSchemaButton.setToolTipText(RADIO_SHOW_SELECTED_SCHEMA_TIP); this.showSelectedSchemaButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { if( !refreshing ) refresh(); saveWidgetValues(); } }); this.showFilteredSchemaButton = WidgetFactory.createRadioButton(showGroup, "Selected and connection filtered schema"); //RADIO_SHOW_FILTERED_SCHEMA_TXT); this.showFilteredSchemaButton.setToolTipText(RADIO_SHOW_FILTERED_SCHEMA_TIP); this.showFilteredSchemaButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { if( !refreshing ) refresh(); saveWidgetValues(); } }); scrolledComposite.sizeScrolledPanel(); setControl(hostPanel); restoreWidgetValues(); } private MenuManager createContextMenu() { MenuManager mgr = new MenuManager(); this.checkSelectedAction = new Action(CHECK_SELECTED, SWT.BORDER) { /** * {@inheritDoc} * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { TreeItem[] items = JdbcImportObjectsPage.this.treeViewer.getTree().getSelection(); for( TreeItem item : items ) { JdbcNode jdbcNode = (JdbcNode)item.getData(); item.setChecked(true); nodeSelected(jdbcNode); setNodeSelected(jdbcNode, item, true); } } }; this.uncheckSelectedAction = new Action(UNCHECK_SELECTED, SWT.BORDER) { /** * {@inheritDoc} * * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { TreeItem[] items = JdbcImportObjectsPage.this.treeViewer.getTree().getSelection(); for( TreeItem item : items ) { JdbcNode jdbcNode = (JdbcNode)item.getData(); item.setChecked(false); nodeSelected(jdbcNode); setNodeSelected(jdbcNode, item, false); } } }; mgr.add(this.checkSelectedAction); mgr.add(this.uncheckSelectedAction); return mgr; } /** * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean) * @since 4.0 */ @Override public void setVisible( final boolean visible ) { if (visible) { this.db = ((JdbcImportWizard)getWizard()).getDatabase(); refresh(); this.importer.setReachedObjectsPage(true); } super.setVisible(visible); if( this.importer.isVdbSourceModel() ) { this.setTitle(TITLE_WITH_VDB_SOURCE); } else { this.setTitle(TITLE); } } /** * @since 4.0 */ protected void deselectAllButtonSelected() { final TreeItem[] items = this.treeViewer.getTree().getItems(); for (int ndx = items.length; --ndx >= 0;) { final TreeItem item = items[ndx]; final JdbcNode node = (JdbcNode)item.getData(); setNodeSelected(node, item, false); } } /** * @since 4.0 */ void nodeDoubleClicked( final DoubleClickEvent event ) { final Object node = ((IStructuredSelection)event.getSelection()).getFirstElement(); this.treeViewer.setExpandedState(node, !this.treeViewer.getExpandedState(node)); } /** * @since 4.0 */ void nodeExpanded( final TreeExpansionEvent event ) { // nodeExpandedOrCollapsed(event); updateCheckBoxes(WidgetUtil.findTreeItem(event.getElement(), this.treeViewer).getItems()); } /** * @since 4.0 */ void nodeSelected( final JdbcNode node ) { // Return if node already selected if (node == null || node == this.selectedNode) { return; } // Remember selected node this.selectedNode = node; // Remove tab listener this.tabFolder.removeSelectionListener(this.tabListener); // Remove old tabs final CTabItem[] items = this.tabFolder.getItems(); for (int ndx = items.length; --ndx >= 0;) { items[ndx].dispose(); } try { final String[] names = node.getNamesOfResults(); // Hide description/value areas if no details available if (names.length == 0) { WidgetFactory.createTab(this.tabFolder, NA); return; } // Create tabs for (int ndx = 0; ndx < names.length; ++ndx) { WidgetFactory.createTab(this.tabFolder, names[ndx]); } // Add listener to populate tabs upon selection this.tabFolder.addSelectionListener(this.tabListener); // Select first tab if (names.length > 0) { // Select first tab this.tabFolder.setSelection(this.tabFolder.getItem(0)); this.tabFolder.notifyListeners(SWT.Selection, new Event()); } } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); } } /** * @since 4.0 */ protected void refresh() { refreshing = true; this.db.refresh(); JdbcNode[] selectedNodes = getSelectedChildren(); if (selectedNodes == null || selectedNodes.length == 0) { if (showSelectedSchemaButton.getSelection()) { // We need to show ALL schemas because user has to select at least one showAllSchemaButton.setSelection(true); if( !refreshing ) refresh(); showSelectedSchemaButton.setEnabled(false); } } else { showSelectedSchemaButton.setEnabled(true); } final String name = this.db.getName(); this.dbLabel.setText(name); this.treeViewer.setInput(this.db); validatePage(this.treeViewer.getTree().getItems()); // Set initial message if (isPageComplete()) { setMessage(getString(INITIAL_MESSAGE_ID, name)); } // Scroll to first selected node try { final JdbcNode[] nodes = this.db.getChildren(); for (int ndx = 0; ndx < nodes.length; ++ndx) { final JdbcNode node = nodes[ndx]; if (node.getSelectionMode() != JdbcNode.UNSELECTED) { this.treeViewer.setSelection(new StructuredSelection(node), true); break; } } } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); } refreshing = false; } /** * @since 4.0 */ void tabSelected() { // Populate tab final CTabFolder tabFolder = this.tabFolder; final CTabItem tab = tabFolder.getSelection(); // Return if table already created if (tab.getControl() != null) { return; } try { final Request rqst = this.selectedNode.getRequest(this.selectedNode.getNamesOfResults()[tabFolder.getSelectionIndex()]); final Results results = rqst.getResults(); final List metadatas = results.getMetadata().getColumnMetadata(); if (metadatas.isEmpty()) { final Object[] row = results.getRows(); if (row.length > 0) { final Object obj = row[0]; if (obj != null) { WidgetFactory.createLabel(this.tabFolder, obj.toString(), SWT.WRAP); } } } else { // Create table final TableViewer viewer = new TableViewer(this.tabFolder, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); tab.setControl(viewer.getTable()); // Create label provider viewer.setLabelProvider(new AbstractTableLabelProvider() { @Override public String getColumnText( final Object row, final int column ) { final Object obj = ((List)row).get(column); return (obj == null ? EMPTY_STRING : obj.toString()); } }); // Create content provider viewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements( final Object inputElement ) { return results.getRows(); } @Override public void dispose() { } @Override public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } }); // Add columns to table final Table table = viewer.getTable(); table.setHeaderVisible(true); // Defect in case there is no metadata label, we'll provide one (EXCEL import case) // Defect 22706 int nUnknownColumns = 0; for (final Iterator iter = metadatas.iterator(); iter.hasNext();) { final TableColumn col = new TableColumn(table, SWT.NONE); final ColumnMetadata metadata = (ColumnMetadata)iter.next(); if (metadata.getLabel() != null) { col.setText(metadata.getLabel()); } else { col.setText(UNKNOWN_COLUMN_LABEL + nUnknownColumns); nUnknownColumns++; } switch (metadata.getType()) { case Types.BIGINT: case Types.BIT: case Types.DECIMAL: case Types.DOUBLE: case Types.FLOAT: case Types.INTEGER: case Types.NUMERIC: case Types.REAL: case Types.SMALLINT: case Types.TINYINT: { col.setAlignment(SWT.RIGHT); break; } } } // Initialize table viewer.setInput(this); final TableColumn[] cols = table.getColumns(); for (int ndx = 0; ndx < cols.length; ++ndx) { cols[ndx].pack(); } } } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); } } /** * @since 4.0 */ protected void setNodeSelected( final JdbcNode node, final TreeItem item, final boolean selected ) { // Select node in model // this.treeViewer.setSelection(new StructuredSelection(node)); node.setSelected(selected); // Update check boxes of item, ancestors, and expanded (now or previously) children updateCheckBox(item); for (TreeItem parent = item.getParentItem(); parent != null; parent = parent.getParentItem()) { updateCheckBox(parent); } validatePage(item.getItems()); } protected JdbcNode[] getSelectedChildren() { try { return getDatabase().getSelectedChildren(); } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); return null; } } protected JdbcNode[] getSelectedPlusFilteredChildren() { // Add selected children (if any) to list List<JdbcNode> filteredList = new ArrayList<JdbcNode>(); JdbcNode[] selectedChildren = getSelectedChildren(); if(selectedChildren!=null) { for (int i=0 ; i<selectedChildren.length; i++) { filteredList.add(selectedChildren[i]); } } // Apply CP filter, adding children that match try { String schemaFilterStr = importer.getSchemaFilter(); String tableFilterStr = importer.getTableFilter(); String storedProcFilterStr = importer.getStoredProcFilter(); ItemFilter schemaFilter = null; ItemFilter tableFilter = null; ItemFilter storedProcFilter = null; if(!CoreStringUtil.isEmpty(schemaFilterStr)) { schemaFilter = new ItemFilter(schemaFilterStr); } if(!CoreStringUtil.isEmpty(tableFilterStr)) { tableFilter = new ItemFilter(tableFilterStr); } if(!CoreStringUtil.isEmpty(storedProcFilterStr)) { storedProcFilter = new ItemFilter(storedProcFilterStr); } JdbcNode[] allChildren = getDatabase().getChildren(); for(int i=0; i<allChildren.length; i++) { JdbcNode node = allChildren[i]; String typeName = node.getTypeName(); if(typeName.equals(TYPE_NAME_SCHEMA)) { if(schemaFilter!=null) { if(schemaFilter.isMatch(node.getName())) { filteredList.add(node); } } else { filteredList.add(node); } } else if(typeName.equals(TYPE_NAME_TABLE)) { if(tableFilter!=null) { if(tableFilter.isMatch(node.getName())) { filteredList.add(node); } } else { filteredList.add(node); } } else if (typeName.equals(TYPE_NAME_STORED_PROC)) { if(storedProcFilter!=null) { if(storedProcFilter.isMatch(node.getName())) { filteredList.add(node); } } else { filteredList.add(node); } } } JdbcNode[] resultArr = new JdbcNode[filteredList.size()]; resultArr = filteredList.toArray(resultArr); return resultArr; } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); return null; } } /** * @since 4.0 */ protected void updateCheckBox( final TreeItem item ) { final JdbcNode node = (JdbcNode)item.getData(); if (node == null) { return; } final int selection = node.getSelectionMode(); item.setChecked(selection != JdbcNode.UNSELECTED); item.setGrayed(selection == JdbcNode.PARTIALLY_SELECTED); } /** * @since 4.0 */ private void updateCheckBoxes( final TreeItem[] items ) { for (int ndx = items.length; --ndx >= 0;) { final TreeItem item = items[ndx]; updateCheckBoxes(item.getItems()); updateCheckBox(item); } } /** * @since 4.0 */ private void updateCounts( final JdbcNode[] nodes ) throws JdbcException { for (int ndx = nodes.length; --ndx >= 0;) { final JdbcNode node = nodes[ndx]; final int selection = node.getSelectionMode(); if (selection != JdbcNode.UNSELECTED) { if (node.allowsChildren()) { updateCounts(node.getChildren()); } else if (selection == JdbcNode.SELECTED) { final String name = node.getTypeName(); final Integer count = (Integer)this.counts.get(name); if (count == null) { this.counts.put(name, new Integer(1)); } else { this.counts.put(name, new Integer(count.intValue() + 1)); } } } } } /** * @since 4.0 */ protected void validatePage( final TreeItem[] items ) { boolean isOK = true; try { // Recalculate node type selection counts this.counts.clear(); updateCounts(this.db.getChildren()); // Update check boxes updateCheckBoxes(items); // Update status label, page message, and page completeness final boolean valid = (this.counts.size() > 0); if (valid) { final StringBuffer msg = new StringBuffer(); final Set set = this.counts.entrySet(); for (final Iterator iter = set.iterator(); iter.hasNext();) { final Entry entry = (Entry)iter.next(); if (msg.length() > 0) { if (set.size() > 2) { msg.append(','); } msg.append(' '); if (!iter.hasNext()) { msg.append(Util.keyExists(AND) ? Util.getString(AND) : AND); msg.append(' '); } } msg.append(entry.getValue()); msg.append(' '); msg.append(entry.getKey().toString().toLowerCase()); this.statusLabel.setText(getString(STATUS_LABEL_ID, msg.toString())); WizardUtil.setPageComplete(this); } } else { this.statusLabel.setText(getString(STATUS_LABEL_ID, NO_OBJECTS)); WizardUtil.setPageComplete(this, INVALID_PAGE_MESSAGE, ERROR); isOK = false; } } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); } // If is a vdb source model, then need to validate to insure that only ONE schema is selected if (isOK && this.importer.isVdbSourceModel()) { JdbcNode[] selectedNodes = getSelectedChildren(); if (selectedNodes != null && selectedNodes.length > 0) { int nSchema = 0; String schemaName = null; for (JdbcNode node : selectedNodes) { if (node instanceof JdbcSchema) { nSchema++; schemaName = node.getName(); } if (nSchema > 1) { WizardUtil.setPageComplete(this, TOO_MANY_SCHEMA_MESSAGE,ERROR); break; } } if(nSchema == 1 ) { this.importer.setVdbSourceModelName(schemaName); } } } if (getSelectedChildren().length == 0) showSelectedSchemaButton.setEnabled(false); else showSelectedSchemaButton.setEnabled(true); } /** * @return Returns the database. * @since 4.3 */ public final JdbcDatabase getDatabase() { return db; } /** * Since Finish was pressed, write widget values to the dialog store so that they will persist into the next invocation of * this wizard page */ protected void saveWidgetValues() { final IDialogSettings dlgSettings = getDialogSettings(); dlgSettings.put(SHOW_ALL_SCHEMAS_ID, showAllSchemaButton.getSelection()); dlgSettings.put(SHOW_SELECTED_SCHEMAS_ID, showSelectedSchemaButton.getSelection()); dlgSettings.put(SHOW_FILTERED_SCHEMAS_ID, showFilteredSchemaButton.getSelection()); } /** * Use the dialog store to restore widget values to the values that they held last time this wizard was used to completion */ protected void restoreWidgetValues() { final IDialogSettings dlgSettings = getDialogSettings(); boolean showAllSchemas = dlgSettings.getBoolean(SHOW_ALL_SCHEMAS_ID); boolean showSelectedSchemas = dlgSettings.getBoolean(SHOW_SELECTED_SCHEMAS_ID); boolean showFilteredSchemas = dlgSettings.getBoolean(SHOW_FILTERED_SCHEMAS_ID); // If all false, then default to showAllSchemas if(!showAllSchemas && !showSelectedSchemas && !showFilteredSchemas) { showAllSchemas = true; } if(showAllSchemas) { showAllSchemaButton.setSelection(showAllSchemas); } else if(showSelectedSchemas) { showSelectedSchemaButton.setSelection(showSelectedSchemas); } else if(showFilteredSchemas) { showFilteredSchemaButton.setSelection(showFilteredSchemas); } } /** * @param importer the importer to set */ public void setImporter(JdbcImporter importer) { this.importer = importer; } /** * @return The TreeContentProvider used by this page. * @since 4.3 */ protected ITreeContentProvider createTreeContentProvider() { return new TreeContentProvider(); } /** * @since 4.0 */ class TreeContentProvider implements ITreeContentProvider { /** * @see org.eclipse.jface.viewers.IContentProvider#dispose() * @since 4.0 */ @Override public void dispose() { } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) * @since 4.0 */ @Override public Object[] getChildren( final Object node ) { try { if (showSelectedSchemaButton.getSelection()) { if (node instanceof JdbcDatabase) return getSelectedChildren(); } else if(showFilteredSchemaButton.getSelection()) { if (node instanceof JdbcDatabase) return getSelectedPlusFilteredChildren(); } return ((JdbcNode)node).getChildren(); } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); return null; } } /** * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) * @since 4.0 */ @Override public Object[] getElements( final Object inputElement ) { try { if (showSelectedSchemaButton.getSelection()) { return getSelectedChildren(); } else if(showFilteredSchemaButton.getSelection()) { return getSelectedPlusFilteredChildren(); } return JdbcImportObjectsPage.this.db.getChildren(); } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); return null; } } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) * @since 4.0 */ @Override public Object getParent( final Object node ) { return ((JdbcNode)node).getParent(); } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) * @since 4.0 */ @Override public boolean hasChildren( final Object node ) { try { return (((JdbcNode)node).getChildren().length > 0); } catch (final JdbcException err) { JdbcUiUtil.showAccessError(err); return false; } } /** * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) * @since 4.0 */ @Override public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } } }