Revision: 3428
Author: [email protected]
Date: Mon Apr  5 08:45:43 2010
Log: NEW - bug 2733: Deleting a table in one client causes error in other
http://trillian.sqlpower.ca/bugzilla/show_bug.cgi?id=2733
This commit also contains possible fixes for other bugs (2734, and 2736). These need to be tested.

There were several problems with the persistence of the table and table pane. -One was the populated flag was being persisted but not set correctly in some objects, including SQLIndex. -Another was the events were not being wrapped in a transaction in the undo manager because the undo manager was not connected to the objects starting and ending the transaction. -Another problem was the PlayPenContentPane was splitting its child type too finely for persistence which was changing the
indices when the objects were being retrieved from the server.
-Another fix was to correct the list of descendant objects to remove descendants correctly when persisted.
http://code.google.com/p/power-architect/source/detail?r=3428

Modified:
 /trunk/buildlib/sqlpower_library-apt.jar
 /trunk/regress/ca/sqlpower/architect/swingui/TestPlayPen.java
 /trunk/regress/ca/sqlpower/architect/undo/TestArchitectUndoManager.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java
 /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java
 /trunk/src/main/java/ca/sqlpower/architect/undo/ArchitectUndoManager.java

=======================================
--- /trunk/buildlib/sqlpower_library-apt.jar    Mon Mar 29 13:18:45 2010
+++ /trunk/buildlib/sqlpower_library-apt.jar    Mon Apr  5 08:45:43 2010
Binary file, no diff available.
=======================================
--- /trunk/regress/ca/sqlpower/architect/swingui/TestPlayPen.java Wed Mar 3 12:03:13 2010 +++ /trunk/regress/ca/sqlpower/architect/swingui/TestPlayPen.java Mon Apr 5 08:45:43 2010
@@ -38,6 +38,7 @@
 import org.apache.log4j.Logger;

 import sun.font.FontManager;
+import ca.sqlpower.object.SPObject;
 import ca.sqlpower.sql.DataSourceCollection;
 import ca.sqlpower.sql.JDBCDataSource;
 import ca.sqlpower.sqlobject.SQLColumn;
@@ -46,6 +47,7 @@
 import ca.sqlpower.sqlobject.SQLRelationship;
 import ca.sqlpower.sqlobject.SQLTable;
 import ca.sqlpower.sqlobject.SQLTable.TransferStyles;
+import ca.sqlpower.util.SQLPowerUtils;

 public class TestPlayPen extends TestCase {
        ArchitectFrame af;
@@ -89,8 +91,14 @@

                TablePane tp = new TablePane(t, pp.getContentPane());

+
+               final SPObject root = 
SQLPowerUtils.getAncestorList(ppdb).get(0);
+               root.setMagicEnabled(false);
+        root.begin("Testing transaction");
                ppdb.addChild(t);
                pp.addTablePane(tp, new Point(99,98));
+               root.commit();
+               root.setMagicEnabled(true);

// this isn't the point of the test, but adding the tablepane has to work!
                assertNotNull(ppdb.getTableByName("test_me"));
=======================================
--- /trunk/regress/ca/sqlpower/architect/undo/TestArchitectUndoManager.java Wed Mar 17 14:29:59 2010 +++ /trunk/regress/ca/sqlpower/architect/undo/TestArchitectUndoManager.java Mon Apr 5 08:45:43 2010
@@ -162,6 +162,7 @@
TestingArchitectSwingSessionContext context = new TestingArchitectSwingSessionContext();
         session = context.createSession();
         pp = new PlayPen(session);
+        undoManager = new ArchitectUndoManager(pp);
         SQLDatabase db = session.getTargetDatabase();
         fkTable = new SQLTable(db,true);
         fkTable.setName("child");
@@ -171,16 +172,6 @@
         pkTable.setName("parent");
         tp2 = new TablePane(pkTable,pp.getContentPane());
         pp.addTablePane(tp2,new Point(1,1));
-        undoManager = new ArchitectUndoManager(pp);
-        final PropertyChangeListener l = undoManager.getEventAdapter();
-        pp.getPlayPenContentPane().addComponentPropertyListener(
- new String[] {"bounds", "fkConnectionPoint", "pkConnectionPoint"},
-                new AbstractSPListener() {
-                    public void propertyChanged(PropertyChangeEvent evt) {
-                        l.propertyChange(evt);
-                    }
-                }
-        );
         pkTable.addColumn(new SQLColumn());
         pkTable.addColumn(new SQLColumn());
         pkTable.addToPK(pkTable.getColumn(0));
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Mon Mar 29 09:06:23 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPen.java Mon Apr 5 08:45:43 2010
@@ -1708,6 +1708,9 @@
         */
        public void childAdded(SPChildEvent e) {
                logger.debug("SQLObject children got inserted: "+e); 
//$NON-NLS-1$
+
+ if (!contentPane.isMagicEnabled() || !e.getSource().isMagicEnabled()) return;
+
                childAdded = true;
                boolean fireEvent = false;
                SPObject child = e.getChild();
@@ -1745,6 +1748,9 @@
         */
        public void childRemoved(SPChildEvent e) {
                logger.debug("SQLObject children got removed: "+e); 
//$NON-NLS-1$
+
+ if (!contentPane.isMagicEnabled() || !e.getSource().isMagicEnabled()) return;
+
                boolean foundRemovedComponent = false;
                SPObject child = e.getChild();
                removeHierarchyListeners(child);
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java Mon Mar 29 09:06:23 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/swingui/PlayPenContentPane.java Mon Apr 5 08:45:43 2010
@@ -32,10 +32,6 @@
 import org.apache.log4j.Logger;

 import ca.sqlpower.architect.ArchitectProject;
-import ca.sqlpower.architect.swingui.olap.CubePane;
-import ca.sqlpower.architect.swingui.olap.DimensionPane;
-import ca.sqlpower.architect.swingui.olap.UsageComponent;
-import ca.sqlpower.architect.swingui.olap.VirtualCubePane;
 import ca.sqlpower.object.AbstractSPListener;
 import ca.sqlpower.object.AbstractSPObject;
 import ca.sqlpower.object.SPChildEvent;
@@ -50,10 +46,10 @@
 public class PlayPenContentPane extends AbstractSPObject {
private static final Logger logger = Logger.getLogger(PlayPenContentPane.class);

-       public static final List<Class<? extends SPObject>> allowedChildTypes =
+       @SuppressWarnings("unchecked")
+    public static final List<Class<? extends SPObject>> allowedChildTypes =
            Collections.unmodifiableList(new ArrayList<Class<? extends 
SPObject>>(
- Arrays.asList(TablePane.class, Relationship.class, UsageComponent.class, - CubePane.class, DimensionPane.class, VirtualCubePane.class)));
+                   Arrays.asList(PlayPenComponent.class)));

        protected PlayPen playPen;
private List<PlayPenComponent> children = new ArrayList<PlayPenComponent>();
@@ -246,9 +242,6 @@
        }

        protected void addChildImpl(SPObject child, int pos) {
-           if (child instanceof Relationship) {
-               pos += children.size();
-           }
            add((PlayPenComponent) child, pos);
        }

=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/undo/ArchitectUndoManager.java Thu Apr 1 12:24:42 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/undo/ArchitectUndoManager.java Mon Apr 5 08:45:43 2010
@@ -19,7 +19,11 @@

 package ca.sqlpower.architect.undo;

+import ca.sqlpower.architect.ArchitectProject;
 import ca.sqlpower.architect.swingui.PlayPen;
+import ca.sqlpower.architect.swingui.PlayPenContentPane;
+import ca.sqlpower.object.AbstractSPListener;
+import ca.sqlpower.object.SPChildEvent;
 import ca.sqlpower.sqlobject.SQLObjectException;
 import ca.sqlpower.sqlobject.SQLObject;
 import ca.sqlpower.sqlobject.SQLObjectRoot;
@@ -44,6 +48,34 @@
final SQLObjectUndoableEventAdapter undoListener = new SQLObjectUndoableEventAdapter(false);
         rootObject.addSPListener(undoListener);
         undoListener.attachToObject(rootObject);
+ final ArchitectProject workspace = playPen.getSession().getWorkspace();
+        playPen.getContentPane().addSPListener(eventAdapter);
+        eventAdapter.attachToObject(playPen.getContentPane());
+        workspace.addSPListener(new AbstractSPListener() {
+
+            /**
+             * The current play pen content pane. This is assigned from the
+ * ArchitectProject to ensure if the way the content pane is defined
+             * in the project is changed this will be changed as well.
+             */
+            private PlayPenContentPane lastPPCP =
+                workspace.getPlayPenContentPane();
+
+            @Override
+            public void childAdded(SPChildEvent e) {
+ if (e.getChild() != null && e.getChild().equals(workspace.getPlayPenContentPane())) {
+                    lastPPCP = workspace.getPlayPenContentPane();
+                    lastPPCP.addSPListener(eventAdapter);
+                }
+            }
+
+            @Override
+            public void childRemoved(SPChildEvent e) {
+                if (e.getChild().equals(lastPPCP)) {
+                    lastPPCP.removeSPListener(eventAdapter);
+                }
+            }
+        });
         if (playPen != null) {
             playPen.addUndoEventListener(eventAdapter);
         }


--
To unsubscribe, reply using "remove me" as the subject.

Reply via email to