Revision: 3862
Author: [email protected]
Date: Tue Aug 10 09:28:49 2010
Log: Fixed an issue with transactions and snapshots. Also made the snapshot hierarchy listener respect multiple property changes in one transaction.
http://code.google.com/p/power-architect/source/detail?r=3862

Modified:
/trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java Tue Aug 10 08:18:41 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/SPObjectSnapshotHierarchyListener.java Tue Aug 10 09:28:49 2010
@@ -23,6 +23,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;

 import org.apache.log4j.Logger;

@@ -68,7 +69,7 @@
      * type so that the event details can be used to create a
      * new snapshot.
      */
-    private PropertyChangeEvent upstreamTypeChangeEvent;
+ private Map<UserDefinedSQLType, PropertyChangeEvent> upstreamTypeChangeEventMap = new HashMap<UserDefinedSQLType, PropertyChangeEvent>();;

     /**
      * True if this listener is in the middle of
@@ -150,15 +151,13 @@
        public void propertyChanged(PropertyChangeEvent e) {
                if (e.getSource() instanceof UserDefinedSQLType
                                && e.getPropertyName().equals("upstreamType")) {
-                   if (upstreamTypeChangeEvent == null &&
-                           !(e.getNewValue() instanceof UserDefinedSQLType &&
- ((UserDefinedSQLType)e.getNewValue()).getParent() == session.getWorkspace().getSnapshotCollection() &&
-                           settingSnapshot)) {
-                       logger.debug("Got a property change event for 
upstreamType!");
-                       upstreamTypeChangeEvent = e;
+                   Object oldValue;
+                   if (upstreamTypeChangeEventMap.containsKey(e.getSource())) {
+ oldValue = upstreamTypeChangeEventMap.get(e.getSource()).getOldValue();
                    } else {
- logger.debug("Got another upstreamType change event in the middle of another");
-                   }
+                       oldValue = e.getOldValue();
+                   }
+ upstreamTypeChangeEventMap.put((UserDefinedSQLType) e.getSource(), new PropertyChangeEvent(e.getSource(), e.getPropertyName(), oldValue, e.getNewValue()));
                }
        }

@@ -382,44 +381,61 @@

     @Override
     public void transactionStarted(TransactionEvent e) {
+        if (settingSnapshot) {
+            logger.debug("Ignoring begin");
+            return;
+        }
         if (e.getSource() instanceof UserDefinedSQLType) {
+            logger.debug("Processing begin (\"" + e.getMessage() + "\")");
             UserDefinedSQLType udt = (UserDefinedSQLType) e.getSource();
             transactionCount++;
logger.debug("Incremented transaction counter to " + transactionCount);
             if (transactionCount == 1) {
-                udt.begin("setting upstream type (snapshot)");
+                logger.debug("Firing snapshot begin");
+                try {
+                    settingSnapshot = true;
+                    udt.begin("setting upstream type (snapshot)");
+                } finally {
+                    settingSnapshot = false;
+                }
             }
         }
     }

-   @Override
+    @Override
     public void transactionEnded(TransactionEvent e) {
+        if (settingSnapshot) {
+            logger.debug("Ignoring commit");
+            return;
+        }
         if (e.getSource() instanceof UserDefinedSQLType) {
+            logger.debug("Processing commit (\"" + e.getMessage() + "\")");
             UserDefinedSQLType udt = (UserDefinedSQLType) e.getSource();
-
+
             transactionCount--;
logger.debug("Decremented transaction counter to " + transactionCount);
-            if (transactionCount == 1) {
-                if (upstreamTypeChangeEvent != null) {
- UserDefinedSQLType newValue = (UserDefinedSQLType) upstreamTypeChangeEvent.getNewValue(); - UserDefinedSQLType source = (UserDefinedSQLType) upstreamTypeChangeEvent.getSource(); - UserDefinedSQLType oldValue = (UserDefinedSQLType) upstreamTypeChangeEvent.getOldValue();
-                    upstreamTypeChangeEvent = null;
-
-                    logger.debug("Replacing upstreamType with snapshot!");
+            if (transactionCount == 0) {
+                try {
                     settingSnapshot = true;
-                    createSPObjectSnapshot(source, newValue);
-
-                    if (oldValue != null && source.isMagicEnabled()) {
-                        cleanupSnapshot(oldValue);
-                    }
-
-                    UserDefinedSQLType columnProxyType = source;
-                    addUpdateListener(columnProxyType.getUpstreamType());
-                }
-                if (!settingSnapshot) {
-                    udt.commit();
-                } else {
+ for (Entry<UserDefinedSQLType, PropertyChangeEvent> entry : upstreamTypeChangeEventMap.entrySet()) { + UserDefinedSQLType newValue = (UserDefinedSQLType) entry.getValue().getNewValue(); + UserDefinedSQLType source = (UserDefinedSQLType) entry.getKey(); + UserDefinedSQLType oldValue = (UserDefinedSQLType) entry.getValue().getOldValue();
+
+ logger.debug("Replacing upstreamType with snapshot!");
+                        createSPObjectSnapshot(source, newValue);
+
+                        if (oldValue != null && source.isMagicEnabled()) {
+                            cleanupSnapshot(oldValue);
+                        }
+
+                        UserDefinedSQLType columnProxyType = source;
+ addUpdateListener(columnProxyType.getUpstreamType());
+                    }
+                    upstreamTypeChangeEventMap.clear();
+                    udt.commit("snapshot commit");
+                    logger.debug("Firing snapshot commit");
+                } finally {
                     settingSnapshot = false;
                 }
             }

Reply via email to