--- /dev/null
+package com.quantum.actions;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.quantum.Messages;
+import com.quantum.model.Bookmark;
+import com.quantum.model.BookmarkCollection;
+import com.quantum.model.ConnectionException;
+import com.quantum.sql.MultiSQLServer;
+import com.quantum.sql.SQLParser;
+import com.quantum.sql.SQLResults;
+import com.quantum.ui.dialog.BookmarkSelectionDialog;
+import com.quantum.ui.dialog.ExceptionDisplayDialog;
+import com.quantum.util.io.InputStreamHelper;
+import com.quantum.view.tableview.DefaultSizes;
+import com.quantum.view.tableview.TableView;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * This action can be executed against any .sql file, regardless of
+ * whether or not the Quantum perspective is open.
+ *
+ * @author BC
+ */
+public class ExecuteAgainstAction extends BaseSQLAction
+ implements IObjectActionDelegate, PropertyChangeListener {
+
+ private String selectedBookmark = null;
+ private IFile[] files = null;
+
+ private IWorkbenchPart workbenchPart;
+
+ /**
+ * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ this.workbenchPart = targetPart;
+ }
+
+ protected Shell getShell() {
+ return this.workbenchPart.getSite().getShell();
+ }
+
+ /**
+ * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+ */
+ public void run(IAction action) {
+
+ BookmarkSelectionDialog dialog = new BookmarkSelectionDialog(getShell());
+ dialog.addPropertyChangeListener(this);
+ int result = dialog.open();
+
+ if (result == Window.OK) {
+ try {
+ executeAgainstBookmark();
+ } catch (SQLException e) {
+ ExceptionDisplayDialog.openError(getShell(),
+ null,
+ null, e);
+ } catch (IOException e) {
+ ExceptionDisplayDialog.openError(getShell(),
+ Messages.getString("ExecuteAgainstAction.title"),
+ Messages.getString("ExecuteAgainstAction.IOException"), e);
+ } catch (ConnectionException e) {
+ ExceptionDisplayDialog.openError(getShell(),
+ null,
+ null, e);
+ } catch (CoreException e) {
+ ErrorDialog.openError(getShell(), null, null, e.getStatus());
+ }
+ }
+ }
+
+ protected Bookmark getBookmark() {
+ return BookmarkCollection.getInstance().find(this.selectedBookmark);
+ }
+
+ private void executeAgainstBookmark()
+ throws SQLException, IOException, CoreException, ConnectionException {
+ Bookmark bookmark = getBookmark();
+ if (bookmark != null) {
+ boolean alreadyConnected = bookmark.isConnected();
+ Connection connection = getConnection();
+ try {
+ for (int i = 0,
+ length = (this.files == null) ? 0 : this.files.length;
+ connection != null && i < length;
+ i++) {
+ executeAgainstBookmark(bookmark, connection, this.files[i]);
+ }
+ } finally {
+ if (!alreadyConnected && connection != null) {
+ bookmark.disconnect();
+ }
+ }
+ }
+ }
+
+ private void executeAgainstBookmark(
+ Bookmark bookmark,
+ Connection connection,
+ IFile file)
+ throws SQLException, IOException, CoreException {
+ executeAgainstBookmark(
+ bookmark,
+ connection,
+ InputStreamHelper.readIntoString(file.getContents()));
+ }
+
+ private void executeAgainstBookmark(
+ Bookmark bookmark,
+ Connection connection,
+ String queries)
+ throws SQLException {
+ List queryList = SQLParser.parse(queries);
+ MultiSQLServer server = MultiSQLServer.getInstance();
+
+ for (Iterator i = queryList.iterator(); i.hasNext();) {
+ String query = (String) i.next();
+ SQLResults results =
+ server.execute(
+ connection,
+ query,
+ 1,
+ DefaultSizes.PAGE_SIZE,
+ DefaultSizes.MAX_COLUMN_SIZE);
+ if (results.isResultSet()) {
+ TableView view = TableView.getInstance();
+ if (view != null) {
+ view.loadQuery(bookmark, results);
+ }
+ }
+ }
+ }
+
+ /**
+ * This method is called with a new selection has been made on one
+ * of the views.
+ *
+ * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection =
+ (IStructuredSelection) selection;
+ List list = new ArrayList();
+
+ for (Iterator i = structuredSelection.iterator(); i.hasNext();) {
+ Object temp = i.next();
+ if (temp != null && temp instanceof IFile) {
+ System.out.println(((IFile) temp).getName());
+ list.add(temp);
+ }
+ }
+ this.files = (IFile[]) list.toArray(new IFile[list.size()]);
+ }
+ }
+
+ /**
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent event) {
+ if ("selection".equals(event.getPropertyName())) {
+ this.selectedBookmark = (String) event.getNewValue();
+ }
+ }
+}