package org.argeo.slc.akb.ui.editors; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import org.argeo.security.ui.PrivilegedJob; import org.argeo.slc.SlcException; import org.argeo.slc.akb.AkbNames; import org.argeo.slc.akb.AkbService; import org.argeo.slc.akb.ui.AkbUiUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; /** Test JDBC. */ public class JdbcTestPage extends FormPage implements AkbNames { private Node node; private AkbService akbService; private TableViewer viewer = null; private IContentProvider contentProvider; private PreparedStatement statement; public JdbcTestPage(AkbService akbService, FormEditor editor, String id, String title, Node node) { super(editor, id, title); this.akbService = akbService; this.node = node; } protected void createFormContent(IManagedForm managedForm) { super.createFormContent(managedForm); ScrolledForm form = managedForm.getForm(); form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Composite parent = form.getBody(); parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); FormToolkit toolkit = getEditor().getToolkit(); Table table = toolkit.createTable(parent, SWT.VIRTUAL); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.setHeaderVisible(true); table.setLinesVisible(true); viewer = new TableViewer(table); contentProvider = new JdbcTestContentProvider(viewer); viewer.setContentProvider(contentProvider); // viewer.setLabelProvider(new ColumnLabelProvider(){}); statement = akbService.prepareJdbcQuery(node); PrivilegedJob job = new PrivilegedJob("Execute query on " + node) { @Override protected IStatus doRun(IProgressMonitor progressMonitor) { try { final ResultSet resultSet = statement.executeQuery(); getEditorSite().getWorkbenchWindow().getShell() .getDisplay().syncExec(new Runnable() { @Override public void run() { viewer.setInput(resultSet); } }); return Status.OK_STATUS; } catch (SQLException e) { throw new SlcException("Cannot execute " + node, e); } } }; job.schedule(); } @Override public void dispose() { try { statement.close(); statement.getConnection().close(); } catch (SQLException e) { // silent } } private class JdbcTestContentProvider implements ILazyContentProvider { private TableViewer viewer; private ResultSet resultSet; private boolean isScrollable; private List buffer = new ArrayList(); private List columns = new ArrayList(); private Integer columnCount = 0; private int rowCount = 0; public JdbcTestContentProvider(TableViewer viewer) { this.viewer = viewer; } public void dispose() { try { resultSet.close(); } catch (SQLException e) { // silent } } public void inputChanged(Viewer v, Object oldInput, Object newInput) { if (newInput == null) return; TableViewer viewer = (TableViewer) v; resultSet = (ResultSet) newInput; try { isScrollable = resultSet.getType() != ResultSet.TYPE_FORWARD_ONLY; columnCount = resultSet.getMetaData().getColumnCount(); for (int i = 1; i <= columnCount; i++) { columns.add(new JdbcColumn(i, resultSet.getMetaData())); if (oldInput == null)// first time addColumn(viewer, i - 1); } if (isScrollable) { if (resultSet.next()) rowCount = 1; viewer.setItemCount(rowCount); } else { while (resultSet.next()) { Object[] lst = new Object[columnCount]; for (int i = 1; i <= columnCount; i++) { lst[i - 1] = resultSet.getObject(i); buffer.add(lst); } } viewer.setItemCount(buffer.size()); } } catch (SQLException e) { throw new SlcException("Cannot configure JDBC column", e); } } protected void addColumn(TableViewer viewer, final int index) { TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); col.getColumn().setWidth(100); col.getColumn().setText(columns.get(index).name); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((Object[]) element)[index].toString(); } }); } public void updateElement(int index) { if (resultSet == null) return; try { if (isScrollable) { resultSet.absolute(index + 1); Object[] lst = new Object[columnCount]; for (int i = 1; i <= columnCount; i++) { lst[i - 1] = resultSet.getObject(i); } viewer.replace(lst, index); int itemCount = viewer.getTable().getItemCount(); if (index == (itemCount - 1) && resultSet.next()) viewer.setItemCount(itemCount + 1); } else { viewer.replace(buffer.get(index), index); } } catch (Exception e) { throw new SlcException("Cannot update element", e); } } } private class JdbcColumn { // public final Integer index; public final String name; // public final Integer type; public JdbcColumn(int index, ResultSetMetaData metaData) throws SQLException { // this.index = index; this.name = metaData.getColumnName(index); // this.type = metaData.getColumnType(index); } } }