Revision: 3827
Author: [email protected]
Date: Tue Aug  3 08:39:01 2010
Log: Added in the ability to update outdated snapshots in Architect.

Users can now right-click on a snapshot in the DBTree and choose to update it.
http://code.google.com/p/power-architect/source/detail?r=3827

Modified:
 /trunk/regress/ca/sqlpower/architect/StubArchitectSession.java
 /trunk/regress/ca/sqlpower/architect/TestingArchitectSession.java
/trunk/regress/ca/sqlpower/architect/swingui/TestingArchitectSwingSession.java
 /trunk/src/main/java/ca/sqlpower/architect/ArchitectProject.java
 /trunk/src/main/java/ca/sqlpower/architect/ArchitectSession.java
 /trunk/src/main/java/ca/sqlpower/architect/ArchitectSessionImpl.java
/trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/DBTree.java

=======================================
--- /trunk/regress/ca/sqlpower/architect/StubArchitectSession.java Tue Jul 27 14:11:45 2010 +++ /trunk/regress/ca/sqlpower/architect/StubArchitectSession.java Tue Aug 3 08:39:01 2010
@@ -25,6 +25,7 @@
 import ca.sqlpower.architect.enterprise.DomainCategory;
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.swingui.LiquibaseSettings;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.SPDataSource;
@@ -193,4 +194,10 @@
         // TODO Auto-generated method stub
         return null;
     }
-}
+
+    @Override
+ public Runnable createUpdateSnapshotRunnable(SPObjectSnapshot<?> snapshot) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+}
=======================================
--- /trunk/regress/ca/sqlpower/architect/TestingArchitectSession.java Tue Jul 27 14:11:45 2010 +++ /trunk/regress/ca/sqlpower/architect/TestingArchitectSession.java Tue Aug 3 08:39:01 2010
@@ -39,6 +39,7 @@
 import ca.sqlpower.architect.olap.OLAPRootObject;
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.swingui.LiquibaseSettings;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.SPDataSource;
@@ -229,4 +230,10 @@
         // TODO Auto-generated method stub
         return null;
     }
-}
+
+    @Override
+ public Runnable createUpdateSnapshotRunnable(SPObjectSnapshot<?> snapshot) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+}
=======================================
--- /trunk/regress/ca/sqlpower/architect/swingui/TestingArchitectSwingSession.java Thu Jul 29 14:36:01 2010 +++ /trunk/regress/ca/sqlpower/architect/swingui/TestingArchitectSwingSession.java Tue Aug 3 08:39:01 2010
@@ -49,6 +49,7 @@
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.swingui.olap.OLAPEditSession;
 import ca.sqlpower.architect.undo.ArchitectUndoManager;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.SPDataSource;
@@ -542,4 +543,10 @@
         // TODO Auto-generated method stub
         return null;
     }
-}
+
+    @Override
+ public Runnable createUpdateSnapshotRunnable(SPObjectSnapshot<?> snapshot) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ArchitectProject.java Fri Jul 30 13:13:38 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ArchitectProject.java Tue Aug 3 08:39:01 2010
@@ -443,7 +443,7 @@
     }

     @NonProperty
-    protected List<UserDefinedSQLType> getSqlTypes() {
+    public List<UserDefinedSQLType> getSqlTypes() {
         return Collections.unmodifiableList(sqlTypes);
     }

@@ -453,7 +453,7 @@
     }

     @NonProperty
-    protected List<DomainCategory> getDomainCategories() {
+    public List<DomainCategory> getDomainCategories() {
         return Collections.unmodifiableList(domainCategories);
     }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ArchitectSession.java Tue Jul 27 14:11:45 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ArchitectSession.java Tue Aug 3 08:39:01 2010
@@ -26,6 +26,7 @@
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.swingui.CompareDMSettings;
 import ca.sqlpower.architect.swingui.LiquibaseSettings;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sqlobject.SQLDatabase;
@@ -191,5 +192,17 @@
      * headless mode).
      */
        public ArchitectStatusInformation getStatusInformation();
+
+       /**
+     * Returns a runnable that will update the snapshot object in the given
+ * snapshot to be the same as the type the snapshot maps to in the system
+     * workspace.
+     *
+     * @param snapshot
+     *            The snapshot to update. This currently only works for
+     *            snapshots of UserDefinedSQLTypes but will be extended to
+     *            others in the future.
+     */
+ public Runnable createUpdateSnapshotRunnable(final SPObjectSnapshot<?> snapshot);

 }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ArchitectSessionImpl.java Tue Jul 27 14:11:45 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ArchitectSessionImpl.java Tue Aug 3 08:39:01 2010
@@ -31,6 +31,7 @@
 import ca.sqlpower.architect.profile.ProfileManager;
 import ca.sqlpower.architect.profile.ProfileManagerImpl;
 import ca.sqlpower.architect.swingui.LiquibaseSettings;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.SPDataSource;
@@ -42,9 +43,9 @@
 import ca.sqlpower.swingui.event.SessionLifecycleListener;
 import ca.sqlpower.util.DefaultUserPrompterFactory;
 import ca.sqlpower.util.UserPrompter;
+import ca.sqlpower.util.UserPrompterFactory;
 import ca.sqlpower.util.UserPrompter.UserPromptOptions;
 import ca.sqlpower.util.UserPrompter.UserPromptResponse;
-import ca.sqlpower.util.UserPrompterFactory;

 /**
  * The ArchitectSession class represents a single user's session with
@@ -302,5 +303,16 @@
     public void setStatusInfo(ArchitectStatusInformation statusInfo) {
         this.statusInfo = statusInfo;
     }
+
+ public Runnable createUpdateSnapshotRunnable(final SPObjectSnapshot<?> snapshot) {
+        return new Runnable() {
+
+            @Override
+            public void run() {
+ createUserPrompter("Cannot update a snapshot from this session", + UserPromptType.MESSAGE, UserPromptOptions.OK, UserPromptResponse.OK, null);
+            }
+        };
+    }
 }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java Fri Jul 30 13:13:38 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java Tue Aug 3 08:39:01 2010
@@ -33,6 +33,7 @@
 import ca.sqlpower.sqlobject.SQLTable;
 import ca.sqlpower.sqlobject.UserDefinedSQLType;
 import ca.sqlpower.sqlobject.UserDefinedSQLTypeSnapshot;
+import ca.sqlpower.util.SQLPowerUtils;

 /**
* Add this listener to a SQLDatabase to have its columns have correct snapshot listeners
@@ -93,40 +94,28 @@

     private void addUpdateListener(UserDefinedSQLType columnProxyType) {
UserDefinedSQLType upstreamSnapshotType = columnProxyType.getUpstreamType();
-
-        //find snapshot by matching snapshot object
- for (SPObjectSnapshot<?> snapshot : session.getWorkspace().getSPObjectSnapshots()) {
-            if (snapshot.getSPObject() == upstreamSnapshotType) {
-                //find system UDT by uuid
- for (UserDefinedSQLType systemType : session.getSystemWorkspace().getSqlTypes()) { - if (systemType.getUUID().equals(snapshot.getOriginalUUID())) { - systemType.addSPListener(new SPObjectSnapshotUpdateListener(snapshot));
-                        break;
-                    }
-                }
-                //find system domain by uuid
- for (DomainCategory category : session.getSystemWorkspace().getDomainCategories()) {
-                    boolean typeFound = false;
- for (UserDefinedSQLType systemType : category.getChildren(UserDefinedSQLType.class)) { - if (systemType.getUUID().equals(snapshot.getOriginalUUID())) { - systemType.addSPListener(new SPObjectSnapshotUpdateListener(snapshot)); - for (SPObjectSnapshot<?> categorySnapshot : session.getWorkspace().getSPObjectSnapshots()) { - if (categorySnapshot.getOriginalUUID().equals(category.getUUID())) { - category.addSPListener(new SPObjectSnapshotUpdateListener(categorySnapshot));
-                                    break;
-                                }
-                            }
-                            typeFound = true;
-                            break;
-                        }
-                    }
-                    if (typeFound) break;
-                }
-                break;
+
+        SPObjectSnapshot<?> snapshot = null;
+ for (SPObjectSnapshot<?> workspaceSnapshot : session.getWorkspace().getSPObjectSnapshots()) {
+            if (workspaceSnapshot.getSPObject() == upstreamSnapshotType) {
+                snapshot = workspaceSnapshot;
+                break;
+            }
+        }
+
+ UserDefinedSQLType systemType = session.findSystemTypeFromSnapshot(snapshot); + SQLPowerUtils.listenToHierarchy(systemType, new SPObjectSnapshotUpdateListener(snapshot));
+        if (systemType.getParent() instanceof DomainCategory) {
+ DomainCategory category = (DomainCategory) systemType.getParent(); + for (SPObjectSnapshot<?> categorySnapshot : session.getWorkspace().getSPObjectSnapshots()) { + if (categorySnapshot.getOriginalUUID().equals(category.getUUID())) { + category.addSPListener(new SPObjectSnapshotUpdateListener(categorySnapshot));
+                    break;
+                }
             }
         }
     }
-
+
private void createSPObjectSnapshot(UserDefinedSQLType typeProxy, UserDefinedSQLType upstreamType) {
         SPObject upstreamTypeParent = upstreamType.getParent();

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java Thu Jul 29 11:37:29 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java Tue Aug 3 08:39:01 2010
@@ -18,6 +18,7 @@
 import java.util.Map;
 import java.util.prefs.Preferences;

+import javax.annotation.Nonnull;
 import javax.swing.SwingUtilities;
 import javax.swing.event.UndoableEditEvent;
 import javax.swing.event.UndoableEditListener;
@@ -70,6 +71,7 @@
 import ca.sqlpower.enterprise.client.RevisionController;
 import ca.sqlpower.enterprise.client.SPServerInfo;
 import ca.sqlpower.enterprise.client.User;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.object.SPObjectUUIDComparator;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.DatabaseListChangeEvent;
@@ -1166,4 +1168,51 @@
     public ArchitectSwingProject getWorkspace() {
         return (ArchitectSwingProject) super.getWorkspace();
     }
-}
+
+    /**
+     * Finds the UDT that has the same uuid as the given snapshot's
+ * {...@link SPObjectSnapshot#getOriginalUUID()} method. The snapshot given
+     * cannot be null. Returns null if no type is found.
+     */
+ public UserDefinedSQLType findSystemTypeFromSnapshot(@Nonnull SPObjectSnapshot<?> snapshot) { + for (UserDefinedSQLType systemType : getSystemWorkspace().getSqlTypes()) {
+            if (systemType.getUUID().equals(snapshot.getOriginalUUID())) {
+                return systemType;
+            }
+        }
+ for (DomainCategory category : getSystemWorkspace().getDomainCategories()) { + for (UserDefinedSQLType systemType : category.getChildren(UserDefinedSQLType.class)) { + if (systemType.getUUID().equals(snapshot.getOriginalUUID())) {
+                    return systemType;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns an action that will update the snapshot object in the given
+ * snapshot to be the same as the type the snapshot maps to in the system
+     * workspace.
+     *
+     * @param snapshot
+     *            The snapshot to update. This currently only works for
+     *            snapshots of UserDefinedSQLTypes but will be extended to
+     *            others in the future.
+     */
+ public Runnable createUpdateSnapshotRunnable(final SPObjectSnapshot<?> snapshot) {
+        return new Runnable() {
+
+            @Override
+            public void run() {
+ if (!(snapshot.getSPObject() instanceof UserDefinedSQLType)) return; + UserDefinedSQLType snapshotType = (UserDefinedSQLType) snapshot.getSPObject(); + UserDefinedSQLType systemType = findSystemTypeFromSnapshot(snapshot);
+                if (systemType == null) return;
+
+                snapshotType.updateToMatch(systemType);
+                snapshot.setObsolete(false);
+            }
+        };
+    }
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Fri Jul 30 09:40:47 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/ArchitectSwingSessionImpl.java Tue Aug 3 08:39:01 2010
@@ -84,6 +84,7 @@
 import ca.sqlpower.object.AbstractSPListener;
 import ca.sqlpower.object.SPChildEvent;
 import ca.sqlpower.object.SPListener;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.Olap4jDataSource;
@@ -1290,5 +1291,10 @@
         if (frame == null || frame.getStatusBar() == null) return null;
         return frame.getStatusBar();
     }
+
+    @Override
+ public Runnable createUpdateSnapshotRunnable(SPObjectSnapshot<?> snapshot) {
+        return delegateSession.createUpdateSnapshotRunnable(snapshot);
+    }

 }
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/DBTree.java Fri Jul 30 11:44:11 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/DBTree.java Tue Aug 3 08:39:01 2010
@@ -69,6 +69,7 @@
 import ca.sqlpower.architect.swingui.dbtree.DBTreeModel;
 import ca.sqlpower.object.ObjectDependentException;
 import ca.sqlpower.object.SPListener;
+import ca.sqlpower.object.SPObjectSnapshot;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sql.SPDataSource;
 import ca.sqlpower.sqlobject.SQLCatalog;
@@ -542,7 +543,18 @@
                        } else {
                                mi.setEnabled(false);
                        }
- } else if (p != null && !isTargetDatabaseNode(p)) { // clicked on DBCS item in DBTree + } else if (p != null && p.getLastPathComponent() instanceof SPObjectSnapshot<?>) { + final SPObjectSnapshot<?> snapshot = (SPObjectSnapshot<?>) p.getLastPathComponent();
+                   newMenu.addSeparator();
+
+                   newMenu.add(new AbstractAction("Update to latest changes") {
+                       @Override
+                       public void actionPerformed(ActionEvent e) {
+                           
session.createUpdateSnapshotRunnable(snapshot).run();
+                       }
+                   });
+               } else if (p != null && !isTargetDatabaseNode(p) &&
+ p.getLastPathComponent() != treeModel.getSnapshotContainer()) { // clicked on DBCS item in DBTree
                        newMenu.addSeparator();

                        newMenu.add(new RefreshAction(session));

Reply via email to