Revision: 3644
Author: [email protected]
Date: Fri Jun 25 12:48:20 2010
Log: NEW - bug 2458: Create Critic Manager
http://trillian.sqlpower.ca/bugzilla/show_bug.cgi?id=2458

Added a critic to check for relationships that map columns that cannot contain null values but the update and delete rules use null values. For supporting critics replacing the existing quick fix implementation.
http://code.google.com/p/power-architect/source/detail?r=3644

Added:
/trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/SetNullOnNonNullableColumnCritic.java
Modified:
 /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java
/trunk/src/main/resources/ca/sqlpower/architect/ddl/critic/impl/messages.properties

=======================================
--- /dev/null
+++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/SetNullOnNonNullableColumnCritic.java Fri Jun 25 12:48:20 2010
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2010, SQL Power Group Inc.
+ *
+ * This file is part of SQL Power Architect.
+ *
+ * SQL Power Architect is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SQL Power Architect is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package ca.sqlpower.architect.ddl.critic.impl;
+
+import java.sql.DatabaseMetaData;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import ca.sqlpower.architect.ddl.critic.CriticAndSettings;
+import ca.sqlpower.architect.ddl.critic.Criticism;
+import ca.sqlpower.architect.ddl.critic.QuickFix;
+import ca.sqlpower.sqlobject.SQLColumn;
+import ca.sqlpower.sqlobject.SQLRelationship.ColumnMapping;
+import ca.sqlpower.sqlobject.SQLRelationship.UpdateDeleteRule;
+
+/**
+ * A critic about relationship update or delete rule that tries to set a
+ * non-nullable column to null. Some database platforms consider this an error, + * and others ignore it. In either case, we treat it as a mistake in the data
+ * model that the user should rectify.
+ */
+public class SetNullOnNonNullableColumnCritic extends CriticAndSettings {
+
+    public SetNullOnNonNullableColumnCritic() {
+ super(StarterPlatformTypes.GENERIC.getName(), Messages.getString("SetNullOnNonNullableColumnCritic.name"));
+    }
+
+    public List<Criticism> criticize(Object subject) {
+ if (!(subject instanceof ColumnMapping)) return Collections.emptyList();
+
+        List<Criticism> criticisms = new ArrayList<Criticism>();
+        ColumnMapping cm = (ColumnMapping) subject;
+        UpdateDeleteRule deleteRule = cm.getParent().getDeleteRule();
+        final SQLColumn fkcol = cm.getFkColumn();
+ if (deleteRule == UpdateDeleteRule.SET_NULL && !fkcol.isDefinitelyNullable()) {
+            criticisms.add(new Criticism(subject,
+ Messages.getString("SetNullOnNonNullableColumnCritic.deleteRuleCriticism", + cm.getParent().getName(), fkcol.getName()), this, + new QuickFix(Messages.getString("SetNullOnNonNullableColumnCritic.quickFix", fkcol.getName())) {
+                                @Override
+                                public void apply() {
+ fkcol.setNullable(DatabaseMetaData.columnNullable);
+                                }
+                            }));
+        }
+
+
+        UpdateDeleteRule updateRule = cm.getParent().getUpdateRule();
+ if (updateRule == UpdateDeleteRule.SET_NULL && !fkcol.isDefinitelyNullable()) {
+            criticisms.add(new Criticism(subject,
+ Messages.getString("SetNullOnNonNullableColumnCritic.updateRuleCriticism", + cm.getParent().getName(), fkcol.getName()), this, + new QuickFix(Messages.getString("SetNullOnNonNullableColumnCritic.quickFix", fkcol.getName())) {
+                                @Override
+                                public void apply() {
+ fkcol.setNullable(DatabaseMetaData.columnNullable);
+                                }
+                            }));
+        }
+        return criticisms;
+    }
+
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Fri Jun 25 12:27:31 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Fri Jun 25 12:48:20 2010
@@ -38,6 +38,7 @@
 import ca.sqlpower.architect.ddl.critic.impl.RelationshipMappingTypeCritic;
 import ca.sqlpower.architect.ddl.critic.impl.SQLServerReservedWordsCritic;
import ca.sqlpower.architect.ddl.critic.impl.SetDefaultOnColumnWithNoDefaultCritic; +import ca.sqlpower.architect.ddl.critic.impl.SetNullOnNonNullableColumnCritic;
 import ca.sqlpower.object.AbstractSPObject;
 import ca.sqlpower.object.SPObject;
 import ca.sqlpower.object.annotation.Constructor;
@@ -73,7 +74,8 @@
                 new MySQLCommentCritic(),
                 new MySQLReservedWordsCritic(),
                 new SQLServerReservedWordsCritic(),
-                new SetDefaultOnColumnWithNoDefaultCritic()
+                new SetDefaultOnColumnWithNoDefaultCritic(),
+                new SetNullOnNonNullableColumnCritic()
                 ));

     /**
=======================================
--- /trunk/src/main/resources/ca/sqlpower/architect/ddl/critic/impl/messages.properties Fri Jun 25 12:27:31 2010 +++ /trunk/src/main/resources/ca/sqlpower/architect/ddl/critic/impl/messages.properties Fri Jun 25 12:48:20 2010
@@ -11,6 +11,10 @@
ReservedWordsCritic.criticismDesc={0} named {1} is a reserved word. Please change the name.
 ReservedWordsCritic.quickFixDesc=Change the name to {0}.
SetDefaultOnColumnWithNoDefaultCritic.deleteRuleCriticism=SET DEFAULT delete action in relationship {0} references column {1} with no default value. -SetDefaultOnColumnWithNoDefaultCritic.name=Warns on relationships using defaults mapping columns with no defaults. +SetDefaultOnColumnWithNoDefaultCritic.name=Warns on relationships using default rules and maps columns with no defaults. SetDefaultOnColumnWithNoDefaultCritic.updateRuleCriticism=SET DEFAULT update action in relationship {0} references column {1} with no default value. +SetNullOnNonNullableColumnCritic.deleteRuleCriticism=SET NULL delete action in relationship {0} references non-nullable column {1}. +SetNullOnNonNullableColumnCritic.name=Warns on relationships using null rules and maps columns that are non-null.
+SetNullOnNonNullableColumnCritic.quickFix=Make {0} nullable.
+SetNullOnNonNullableColumnCritic.updateRuleCriticism=SET NULL update action in relationship {0} references non-nullable column {1}. SQLServerReservedWordsCritic.name=Warns when objects are named reserved words in SQL Server.

Reply via email to