initial quantum version
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / actions / ExecuteAgainstAction.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAgainstAction.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAgainstAction.java
new file mode 100644 (file)
index 0000000..c1e2486
--- /dev/null
@@ -0,0 +1,184 @@
+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();
+        }
+    }
+}