Revision: 3416
Author: silva.josemanuel1
Date: Mon Mar 29 09:06:23 2010
Log: Wrapped the reverse engineering, copying, and deletion of multiple objects into a transaction.

Enterprise sessions no longer ask to be saved upon closing.

Resolved some UI conflicts involivng one user dragging an object while the other does something else before the first is done. However, currently only works correctly if the other user is moving the same object.

Changes to reflect the name change of ClientSideSession to RevisionController.
http://code.google.com/p/power-architect/source/detail?r=3416

Modified:
/trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java /trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java Wed Mar 24 07:30:37 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java Mon Mar 29 09:06:23 2010
@@ -59,7 +59,7 @@
 import ca.sqlpower.diff.DiffInfo;
 import ca.sqlpower.diff.SimpleDiffChunkJSONConverter;
 import ca.sqlpower.enterprise.TransactionInformation;
-import ca.sqlpower.enterprise.client.ClientSideSession;
+import ca.sqlpower.enterprise.client.RevisionController;
 import ca.sqlpower.enterprise.client.SPServerInfo;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.DatabaseListChangeEvent;
@@ -77,7 +77,7 @@
 import ca.sqlpower.util.UserPrompter.UserPromptOptions;
 import ca.sqlpower.util.UserPrompter.UserPromptResponse;

-public class ArchitectClientSideSession extends ArchitectSessionImpl implements ClientSideSession { +public class ArchitectClientSideSession extends ArchitectSessionImpl implements RevisionController {

private static Logger logger = Logger.getLogger(ArchitectClientSideSession.class);
        private static CookieStore cookieStore = new BasicCookieStore();
@@ -868,4 +868,8 @@
     public String getPref(String prefName, String def) {
         return prefs.get(projectLocation.getUUID() + "." + prefName, def);
     }
-}
+
+    public int getCurrentRevisionNumber() {
+        return updater.getRevision();
+    }
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java Mon Mar 22 10:45:23 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/enterprise/NetworkConflictResolver.java Mon Mar 29 09:06:23 2010
@@ -435,7 +435,12 @@
     }

     public static interface UpdateListener {
-        // true indicates that the updater should be removed from the list.
+        /**
+ * Fired when an update from the server has been performed on the client + * @param resolver The NetworkConflictResolver that received the update
+         * @return true if the listener should be removed from
+         * listener list and should not receive any more calls
+         */
         public boolean updatePerformed(NetworkConflictResolver resolver);
     }
 }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Thu Mar 18 10:14:14 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Mon Mar 29 09:06:23 2010
@@ -606,13 +606,10 @@
      * shutting down running threads, and so on.
      */
     public boolean close() {
-        return close(true);
-    }
-
-    private boolean close(boolean promptForSave) {
// IMPORTANT NOTE: If the GUI hasn't been initialized, frame will be null.
-
-        if (promptForSave) {
+
+        if (!delegateSession.isEnterpriseSession()) {
+            // Only prompt to save if it is not an enterprise session
             if (getProjectLoader().isSaveInProgress()) {
                 // project save is in progress, don't allow exit
                 JOptionPane.showMessageDialog(frame,
@@ -624,9 +621,7 @@
             if (!promptForUnsavedModifications()) {
                 return false;
             }
-        }
-
-        if (delegateSession.isEnterpriseSession()) {
+        } else {
             getEnterpriseSession().putPref("zoom", playPen.getZoom());
         }

@@ -1186,7 +1181,7 @@
                 dialog.setAlwaysOnTop(true);
                 dialog.setVisible(true);

-                close(false);
+                close();

((ArchitectClientSideSession) ((ArchitectSwingSessionImpl) newSession).getDelegateSession()) .getUpdater().addListener(new NetworkConflictResolver.UpdateListener() {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java Wed Mar 17 14:29:59 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ContainerPane.java Mon Mar 29 09:06:23 2010
@@ -234,7 +234,8 @@
Iterator<ContainerPane<?, ?> > it = pp.getSelectedContainers().iterator();
                 logger.debug("event point: " + p); //$NON-NLS-1$
logger.debug("zoomed event point: " + pp.zoomPoint(new Point(p))); //$NON-NLS-1$
-                pp.draggingTablePanes = true;
+                pp.setDraggingTablePanes(true);
+                startedDragging();

                 while (it.hasNext()) {
// create FloatingContainerPaneListener for each selected item
@@ -255,7 +256,7 @@
             }
} else if (evt.getID() == MouseEvent.MOUSE_MOVED || evt.getID() == MouseEvent.MOUSE_DRAGGED) { setSelected(pp.rubberBand.intersects(getBounds(new Rectangle())),SelectionEvent.SINGLE_SELECT);
-        }
+        }
     }


=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Thu Mar 18 10:14:14 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Mon Mar 29 09:06:23 2010
@@ -1575,12 +1575,13 @@
                                }
                        }

-                       session.getPlayPen().startCompoundEdit("Drag to 
Playpen"); //$NON-NLS-1$
+                       session.getPlayPen().startCompoundEdit("Drag to 
Playpen"); //$NON-NLS-1$

// Filter out objects that would lose ETL lineage against the user's will.
                        ImportSafetyChecker checker = new 
ImportSafetyChecker(session);
                        sqlObjects = checker.filterImportedItems(sqlObjects);

+                       session.getPlayPen().getPlayPenContentPane().begin("Drag to 
Playpen");
                        try {

                                // reset iterator
@@ -1641,9 +1642,14 @@
logger.error("Unknown object dropped in PlayPen: "+someData); //$NON-NLS-1$
                                        }
                                }
+                               
session.getPlayPen().getPlayPenContentPane().commit();
                        } catch (SQLObjectException e) {
+ session.getPlayPen().getPlayPenContentPane().rollback(e.getMessage());
                                ASUtils.showExceptionDialog(session,
                     "Unexpected Exception During Import", e); //$NON-NLS-1$
+                       } catch (Throwable e) {
+ session.getPlayPen().getPlayPenContentPane().rollback(e.getMessage());
+                           throw new RuntimeException(e);
                        } finally {
session.getArchitectFrame().getContentPane().setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); session.getPlayPen().endCompoundEdit("Ending multi-select"); //$NON-NLS-1$
@@ -2083,27 +2089,38 @@

                        Transferable t = dtde.getTransferable();
                        PlayPen playpen = (PlayPen) 
dtde.getDropTargetContext().getComponent();
+                       PlayPenContentPane cp = playpen.getPlayPenContentPane();
                        try {
-                           Point dropLoc = playpen.unzoomPoint(new 
Point(dtde.getLocation()));
- if (playpen.addTransferable(t, dropLoc, TransferStyles.REVERSE_ENGINEER)){
+                           Point dropLoc = playpen.unzoomPoint(new 
Point(dtde.getLocation()));
+                           cp.begin("Reverse engineering database");
+ if (playpen.addTransferable(t, dropLoc, TransferStyles.REVERSE_ENGINEER)){
                                dtde.acceptDrop(DnDConstants.ACTION_COPY);
                                dtde.dropComplete(true);
+                               cp.commit();
                            } else {
                                dtde.rejectDrop();
+                               cp.rollback("Reverse engineer unsuccessful");
                            }

                        } catch (UnsupportedFlavorException ufe) {
                            logger.error(ufe);
                            dtde.rejectDrop();
+                           cp.rollback("Reverse engineer unsuccessful");
                        } catch (IOException ioe) {
                            logger.error(ioe);
                            dtde.rejectDrop();
+                           cp.rollback("Reverse engineer unsuccessful");
                        } catch (InvalidDnDOperationException ex) {
                            logger.error(ex);
                            dtde.rejectDrop();
+                           cp.rollback("Reverse engineer unsuccessful");
                        } catch (SQLObjectException ex) {
                            logger.error(ex);
                            dtde.rejectDrop();
+                           cp.rollback("Reverse engineer unsuccessful");
+                       } catch (Throwable ex) {
+                           cp.rollback("Reverse engineer unsuccessful");
+                           throw new RuntimeException(ex);
                        }
                }

@@ -2385,9 +2402,16 @@
                }

                public void mouseReleased(MouseEvent evt) {
-                       draggingTablePanes = false;
+                       if (draggingTablePanes) {
+                           draggingTablePanes = false;
+                   Point p = evt.getPoint();
+                   unzoomPoint(p);
+                   PlayPenComponent c = contentPane.getComponentAt(p);
+                   if (c != null && c.isMoving()) {
+                       c.doneDragging();
+                   }
+                       }
             selectionInProgress = false;
-            contentPane.doneDragging();

                        if (rubberBand != null && evt.getButton() == 
MouseEvent.BUTTON1) {
                            Rectangle dirtyRegion = rubberBand;
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java Mon Mar 22 09:39:58 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenComponent.java Mon Mar 29 09:06:23 2010
@@ -34,11 +34,14 @@
 import java.util.LinkedList;
 import java.util.List;

+import javax.swing.JOptionPane;
 import javax.swing.JPopupMenu;

 import org.apache.log4j.Logger;

 import ca.sqlpower.architect.ArchitectUtils;
+import ca.sqlpower.architect.enterprise.NetworkConflictResolver;
+import ca.sqlpower.architect.enterprise.NetworkConflictResolver.UpdateListener;
 import ca.sqlpower.architect.swingui.event.SelectionEvent;
 import ca.sqlpower.architect.swingui.event.SelectionListener;
 import ca.sqlpower.object.AbstractSPObject;
@@ -77,6 +80,19 @@

     protected boolean componentPreviouslySelected;

+    /**
+     * This listens for updates in case the user is dragging a table
+     * the same time an update comes in.
+     */
+ private final UpdateListener updateWhileMovingListener = new UpdateListener() {
+        public boolean updatePerformed(NetworkConflictResolver resolver) {
+            if (isMoving) {
+                doneDragging(false);
+            }
+            return true;
+        }
+    };
+
     protected PlayPenComponent(String name) {
         setName(name);
     }
@@ -124,7 +140,7 @@
     @Transient @Accessor
     public PlayPen getPlayPen() {
         if (getParent() == null) return null;
-        return ((PlayPenContentPane) getParent()).getPlayPen();
+        return getParent().getPlayPen();
     }

     @Transient @Accessor
@@ -225,13 +241,6 @@
             logger.debug("Updating bounds on "+getName() //$NON-NLS-1$
+" to ["+r.x+","+r.y+","+r.width+","+r.height+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
         }
-
- if (this instanceof TablePane && !getParent().isWaitingToPersistLocation()) {
-            PlayPen pp = getParent().getPlayPen();
-            if (pp != null  && pp.isDraggingTablePanes()) {
-                getParent().startedDragging();
-            }
-        }

         bounds.setBounds(r.x,r.y,r.width,r.height);
         firePropertyChange("bounds", oldBounds, new Rectangle(bounds));
@@ -515,6 +524,11 @@

private final List<SelectionListener> selectionListeners = new LinkedList<SelectionListener>();

+    /**
+     * Keeps track of whether this component is being dragged or not.
+     */
+    private boolean isMoving = false;
+
     public final void addSelectionListener(SelectionListener l) {
         logger.info("" + this + " is adding " + l);
         selectionListeners.add(l);
@@ -569,6 +583,50 @@
             repaint();
         }
     }
+
+    @NonBound
+    public boolean isMoving() {
+        return isMoving;
+    }
+
+    /**
+     * Initiate a drag, which begins a transaction for this object
+ * and sets up an update listener to listen for conflicts while dragging
+     */
+    public void startedDragging() {
+        if (!isMoving) {
+            isMoving = true;
+            if (getPlayPen().getSession().isEnterpriseSession()) {
+ getPlayPen().getSession().getEnterpriseSession().getUpdater().addListener(updateWhileMovingListener);
+            }
+            begin("Dragging " + this);
+        } else {
+ throw new IllegalStateException("Component is already in the middle of a drag");
+        }
+    }
+
+    public void doneDragging() {
+        doneDragging(true);
+    }
+
+    /**
+     * Completes the drag on this component by ending the transaction.
+     * @param ok If false, this component will rollback instead of commit.
+     * Used by the update conflict listener to rollback the drag.
+     */
+    public void doneDragging(boolean ok) {
+        if (isMoving) {
+            isMoving = false;
+            if (ok) {
+                commit();
+            } else {
+                rollback("Update received while dragging");
+ JOptionPane.showMessageDialog(getPlayPen(), "There was an update while you were dragging");
+            }
+        } else {
+ throw new IllegalStateException("Component is not in the middle of a drag");
+        }
+    }

     public boolean allowsChildren() {
         return (allowedChildTypes.size() > 0);
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java Wed Mar 17 14:29:59 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java Mon Mar 29 09:06:23 2010
@@ -50,7 +50,6 @@
 public class PlayPenContentPane extends AbstractSPObject {
private static final Logger logger = Logger.getLogger(PlayPenContentPane.class);

-
        public static final List<Class<? extends SPObject>> allowedChildTypes =
            Collections.unmodifiableList(new ArrayList<Class<? extends 
SPObject>>(
Arrays.asList(TablePane.class, Relationship.class, UsageComponent.class,
@@ -66,14 +65,6 @@
* to the filtered listener that is created in addComponentPropertyListener
         */
private HashMap<SPListener, SPListener> componentListeners = new HashMap<SPListener, SPListener>();
-
-       /**
-        * This boolean becomes true when a table pane has begun moving,
-        * and will remain true until doneDragging() is called by the
-        * PlayPen's mouseReleased() method. This allows for location
-        * changes to be wrapped in a transaction.
-        */
-       private boolean waitingToPersistLocation = false;

        @Constructor
        public PlayPenContentPane() {
@@ -365,27 +356,6 @@
     public void removeComponentPropertyListener(SPListener listener) {
         componentListeners.remove(listener);
     }
-
-    @NonBound
-    public boolean isWaitingToPersistLocation() {
-        return waitingToPersistLocation;
-    }
-
-    public void startedDragging() {
-        waitingToPersistLocation = true;
-        begin("Started moving table pane");
-    }
-
-    /**
- * Called by PlayPen on its mouseReleased event to notify a component that - * it may complete its location-change transaction if it has been waiting to.
-     */
-    public void doneDragging() {
-        if (waitingToPersistLocation) {
-            waitingToPersistLocation = false;
-            commit();
-        }
-    }

     @NonBound
     public HashMap<SPListener, SPListener> getComponentListeners() {
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java Mon Mar 22 09:39:58 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/Relationship.java Mon Mar 29 09:06:23 2010
@@ -464,7 +464,8 @@
                        this.movingPk = movePk;
this.startingPk = new Point(r.getPkConnectionPoint().x, r.getPkConnectionPoint().y); this.startingFk = new Point(r.getFkConnectionPoint().x, r.getFkConnectionPoint().y);
-                       r.getModel().begin("Reposition relationship");
+                       r.getPlayPen().startCompoundEdit("Dragging 
relationship");
+                       r.startedDragging();
                        r.getPlayPen().addMouseMotionListener(this);
                        r.getPlayPen().addMouseListener(this);
r.getPlayPen().setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
@@ -521,20 +522,13 @@
                 * instance's creator saved a reference).
                 */
                public void mouseReleased(MouseEvent e) {
-                   if (!r.getPkConnectionPoint().equals(startingPk)) {
- r.firePropertyChange("pkConnectionPoint", startingPk, r.getPkConnectionPoint());
-                   }
-                   if (!r.getFkConnectionPoint().equals(startingFk)) {
- r.firePropertyChange("fkConnectionPoint", startingFk, r.getFkConnectionPoint());
-                   }
-                       cleanup();
-               }
-
-               protected void cleanup() {
+                   if (r.isMoving()) {
+                       r.doneDragging();
+                   }
+                   r.getPlayPen().endCompoundEdit("Done dragging 
relationship");
                        r.getPlayPen().removeMouseMotionListener(this);
                        r.getPlayPen().removeMouseListener(this);
                        r.getPlayPen().setCursor(null);
-                       r.getModel().commit();
                }
        }

@@ -697,7 +691,7 @@
} else if (evt.getID() == MouseEvent.MOUSE_MOVED || evt.getID() == MouseEvent.MOUSE_DRAGGED) { // relationship is non-rectangular so we can't use getBounds for intersection testing setSelected(intersects(pp.rubberBand),SelectionEvent.SINGLE_SELECT);
-        }
+        }
     }

     @Transient @Mutator
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java Thu Mar 4 08:08:10 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/action/DeleteSelectedAction.java Mon Mar 29 09:06:23 2010
@@ -116,6 +116,7 @@
             }
         }

+        playpen.getPlayPenContentPane().begin("Delete");
         try {
             playpen.startCompoundEdit("Delete"); //$NON-NLS-1$

@@ -150,15 +151,20 @@
Messages.getString("DeleteSelectedAction.couldNotDeleteColumnDialogTitle"), //$NON-NLS-1$
                             JOptionPane.YES_NO_OPTION);
                     if (decision == JOptionPane.NO_OPTION) {
+                        playpen.getPlayPenContentPane().commit();
                         return;
                     }
                 } catch (IllegalArgumentException e) {
+                    playpen.getPlayPenContentPane().rollback(e.toString());
                     throw new RuntimeException(e);
                 } catch (ObjectDependentException e) {
+                    playpen.getPlayPenContentPane().rollback(e.toString());
                     throw new RuntimeException(e);
-                }
-            }
-
+                } catch (Throwable e) {
+                    playpen.getPlayPenContentPane().rollback(e.toString());
+                }
+            }
+            playpen.getPlayPenContentPane().commit();
         } finally {
             playpen.endCompoundEdit("Ending multi-select"); //$NON-NLS-1$
             playpen.setIgnoreTreeSelection(false);
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java Mon Mar 22 09:39:58 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionListPanel.java Mon Mar 29 09:06:23 2010
@@ -248,8 +248,7 @@

         DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(
                 "default:grow, 5dlu, pref",
-                "pref, 2dlu, default:grow"));
-
+                "pref, 2dlu, default:grow"));

         int currentRevision = session.getUpdater().getRevision();
         long from = currentRevision - 100;
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java Wed Mar 24 07:30:37 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/enterprise/RevisionsTable.java Mon Mar 29 09:06:23 2010
@@ -46,7 +46,7 @@
 import javax.swing.table.DefaultTableModel;

 import ca.sqlpower.enterprise.TransactionInformation;
-import ca.sqlpower.enterprise.client.ClientSideSession;
+import ca.sqlpower.enterprise.client.RevisionController;
 import ca.sqlpower.swingui.SPSUtils;

 /**
@@ -56,7 +56,7 @@

private static final String[] HEADERS = {"Version", "Time Created", "Author", "Description"};

-    private ClientSideSession session;
+    private RevisionController session;

private List<TransactionInformation> transactions = new ArrayList<TransactionInformation>();

@@ -123,7 +123,7 @@
         }
      }

- public RevisionsTable(ClientSideSession session, long fromRevision, long toRevision) { + public RevisionsTable(RevisionController session, long fromRevision, long toRevision) {
         super();

         this.session = session;

To unsubscribe from this group, send email to 
architect-commits+unsubscribegooglegroups.com or reply to this email with the words 
"REMOVE ME" as the subject.

Reply via email to