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));