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.