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

Added a critic for warning if a relationship is set to use the default values of columns but a column does not have a default value.
http://code.google.com/p/power-architect/source/detail?r=3643

Added:
/trunk/src/main/java/ca/sqlpower/architect/ddl/critic/impl/SetDefaultOnColumnWithNoDefaultCritic.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/SetDefaultOnColumnWithNoDefaultCritic.java Fri Jun 25 12:27:31 2010
@@ -0,0 +1,73 @@
+/*
+ * 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.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.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 default + * on a column with no default value. 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.
+ * <p>
+ * There is no quick fix for this one, because we can't guess what a suitable default
+ * value would be.
+ */
+public class SetDefaultOnColumnWithNoDefaultCritic extends CriticAndSettings {
+
+    public SetDefaultOnColumnWithNoDefaultCritic() {
+        super(StarterPlatformTypes.GENERIC.getName(),
+ Messages.getString("SetDefaultOnColumnWithNoDefaultCritic.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();
+        SQLColumn fkcol = cm.getFkColumn();
+        if (deleteRule == UpdateDeleteRule.SET_DEFAULT &&
+ (fkcol.getDefaultValue() == null || fkcol.getDefaultValue().length() == 0)) {
+            criticisms.add(new Criticism(subject,
+ Messages.getString("SetDefaultOnColumnWithNoDefaultCritic.deleteRuleCriticism", + cm.getParent().getName(), fkcol.getName()), this));
+        }
+
+        UpdateDeleteRule updateRule = cm.getParent().getUpdateRule();
+        if (updateRule == UpdateDeleteRule.SET_DEFAULT &&
+ (fkcol.getDefaultValue() == null || fkcol.getDefaultValue().length() == 0)) {
+            criticisms.add(new Criticism(subject,
+ Messages.getString("SetDefaultOnColumnWithNoDefaultCritic.updateRuleCriticism", + cm.getParent().getName(), fkcol.getName()), this));
+        }
+
+        return criticisms;
+    }
+
+}
=======================================
--- /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Fri Jun 25 11:31:05 2010 +++ /trunk/src/main/java/ca/sqlpower/architect/ddl/critic/CriticManager.java Fri Jun 25 12:27:31 2010
@@ -37,6 +37,7 @@
 import ca.sqlpower.architect.ddl.critic.impl.PrimaryKeyCritic;
 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.object.AbstractSPObject;
 import ca.sqlpower.object.SPObject;
 import ca.sqlpower.object.annotation.Constructor;
@@ -71,7 +72,8 @@
                 new OracleReservedWordsCritic(),
                 new MySQLCommentCritic(),
                 new MySQLReservedWordsCritic(),
-                new SQLServerReservedWordsCritic()
+                new SQLServerReservedWordsCritic(),
+                new SetDefaultOnColumnWithNoDefaultCritic()
                 ));

     /**
=======================================
--- /trunk/src/main/resources/ca/sqlpower/architect/ddl/critic/impl/messages.properties Fri Jun 25 12:04:13 2010 +++ /trunk/src/main/resources/ca/sqlpower/architect/ddl/critic/impl/messages.properties Fri Jun 25 12:27:31 2010
@@ -10,4 +10,7 @@
PostgreSQLReservedWordsCritic.name=Warns when objects are named reserved words in PostgreSQL. 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.updateRuleCriticism=SET DEFAULT update action in relationship {0} references column {1} with no default value. SQLServerReservedWordsCritic.name=Warns when objects are named reserved words in SQL Server.

Reply via email to