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.