diff --git a/src/main/java/com/inovia/magnifier/reports/Report.java b/src/main/java/com/inovia/magnifier/reports/Report.java
index eeb7409..795e713 100644
--- a/src/main/java/com/inovia/magnifier/reports/Report.java
+++ b/src/main/java/com/inovia/magnifier/reports/Report.java
@@ -165,7 +165,10 @@ public int compare(RuleReport r1, RuleReport r2) {
for(String column : rr.getColumns()) {
html = html + "
" + column + " | ";
}
-
+ if(rr.getRule().hasSuggestions()) {
+ html = html
+ + " suggestions | ";
+ }
html = html
+ " "
+ " ";
@@ -182,6 +185,12 @@ public int compare(RuleReport r1, RuleReport r2) {
html = html
+ "" + data + " | ";
}
+
+ if(rr.getRule().hasSuggestions()) {
+ html = html
+ + " " + (e.getDetails() != null ? e.getDetails() : "") + " | ";
+ }
+
html = html
+ "";
}
diff --git a/src/main/java/com/inovia/magnifier/reports/ReportEntry.java b/src/main/java/com/inovia/magnifier/reports/ReportEntry.java
index 6751ba7..c838b45 100644
--- a/src/main/java/com/inovia/magnifier/reports/ReportEntry.java
+++ b/src/main/java/com/inovia/magnifier/reports/ReportEntry.java
@@ -1,5 +1,7 @@
package com.inovia.magnifier.reports;
+import com.inovia.magnifier.rule.RuleResult;
+
/**
* it is the result of the execution of a rule on a single database entity.
* for example: performing rule "TableHasPrimaryKey" on table "User" is summarized in a report entry
@@ -7,14 +9,20 @@
public class ReportEntry {
private String[] dataToDisplay;
private Boolean isSuccess;
+ private String details;
- public ReportEntry(String[] dataToDisplay, Boolean isSuccess) {
+ public ReportEntry(String[] dataToDisplay, RuleResult result) {
this.dataToDisplay = dataToDisplay.clone();
- this.isSuccess = isSuccess;
+ this.isSuccess = result.isSuccess();
+ this.details = result.getDetails();
}
public Boolean isSuccess() {
- return isSuccess;
+ return this.isSuccess;
+ }
+
+ public String getDetails() {
+ return this.details;
}
public String[] getDataToDisplay() {
diff --git a/src/main/java/com/inovia/magnifier/rule/ForeignKeyName.java b/src/main/java/com/inovia/magnifier/rule/ForeignKeyName.java
index a3f0228..afb2358 100644
--- a/src/main/java/com/inovia/magnifier/rule/ForeignKeyName.java
+++ b/src/main/java/com/inovia/magnifier/rule/ForeignKeyName.java
@@ -18,28 +18,31 @@ public class ForeignKeyName implements Rule {
public ForeignKeyName() { }
+ public Boolean hasSuggestions() { return true; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Table t : database.getTables()) {
for(ForeignKey fk : t.getForeignKeys()) {
- Boolean isSuccess = assertion(fk);
+ RuleResult result = assertion(fk);
String[] dataToDisplay = {t.getSchemaName(), t.getName(), fk.getColumnName(), fk.getForeignSchemaName(), fk.getForeignTableName(), fk.getForeignColumnName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
}
return ruleReport;
}
- private Boolean assertion(ForeignKey fk) {
- if(fk.getColumnName().equals(fk.getForeignTableName() + "_" + fk.getForeignColumnName())) {
- return true;
- } else if(fk.getColumnName().endsWith("_" + fk.getForeignTableName() + "_" + fk.getForeignColumnName())) {
- return true;
+ private RuleResult assertion(ForeignKey fk) {
+ if(fk.getColumnName().equals(fk.getForeignTableName() + "_" + fk.getForeignColumnName())
+ || fk.getColumnName().endsWith("_" + fk.getForeignTableName() + "_" + fk.getForeignColumnName())) {
+ return new RuleResult(true, "");
}
+
+ String message = fk.getForeignTableName() + "_" + fk.getForeignColumnName();
- return false;
+ return new RuleResult(false, message);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/FunctionHasComment.java b/src/main/java/com/inovia/magnifier/rule/FunctionHasComment.java
index 2195677..e16d893 100644
--- a/src/main/java/com/inovia/magnifier/rule/FunctionHasComment.java
+++ b/src/main/java/com/inovia/magnifier/rule/FunctionHasComment.java
@@ -19,29 +19,31 @@ public class FunctionHasComment implements Rule {
public static final String[] FORMAT = {"schema", "function"};
public FunctionHasComment() { }
+
+ public Boolean hasSuggestions() { return false; }
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Function f : database.getFunctions()) {
- Boolean isSuccess = assertion(f, database.getComments());
+ RuleResult result = assertion(f, database.getComments());
String[] dataToDisplay = {f.getSchemaName(), f.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Function function, List comments) {
+ private RuleResult assertion(Function function, List comments) {
for(Comment c : comments) {
if(c.getEntityType().equals(Comment.FUNCTION_TYPE)
&& c.getSchemaName().equals(function.getSchemaName())
&& c.getEntityName().equals(function.getName())) {
- return true;
+ return new RuleResult(true, null);
}
}
- return false;
+ return new RuleResult(false, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/FunctionParameterName.java b/src/main/java/com/inovia/magnifier/rule/FunctionParameterName.java
index 332eb67..3dac43b 100644
--- a/src/main/java/com/inovia/magnifier/rule/FunctionParameterName.java
+++ b/src/main/java/com/inovia/magnifier/rule/FunctionParameterName.java
@@ -18,24 +18,27 @@ public class FunctionParameterName implements Rule {
public FunctionParameterName() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Function f : database.getFunctions()) {
for(FunctionParameter p : f.getParameters()) {
- Boolean isSuccess = assertion(p);
+ RuleResult result = assertion(p);
String[] dataToDisplay = {f.getSchemaName(), f.getName(), p.getName() == null ? "" : p.getName(), p.getMode()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
}
return ruleReport;
}
- private Boolean assertion(FunctionParameter p) {
- return p.getName() != null
- && !p.getName().isEmpty()
- && p.getName().endsWith("_" + p.getMode().toLowerCase());
+ private RuleResult assertion(FunctionParameter p) {
+ Boolean isSuccess = p.getName() != null
+ && !p.getName().isEmpty()
+ && p.getName().endsWith("_" + p.getMode().toLowerCase());
+ return new RuleResult(isSuccess, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/IndexName.java b/src/main/java/com/inovia/magnifier/rule/IndexName.java
index e0e7d75..0a87190 100644
--- a/src/main/java/com/inovia/magnifier/rule/IndexName.java
+++ b/src/main/java/com/inovia/magnifier/rule/IndexName.java
@@ -17,27 +17,29 @@ public class IndexName implements Rule {
public IndexName() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Index i : database.getIndexes()) {
- Boolean isSuccess = assertion(i);
+ RuleResult result = assertion(i);
String[] dataToDisplay = {i.getSchemaName(), i.getTableName(), i.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Index i) {
+ private RuleResult assertion(Index i) {
if(i.getName().endsWith("_idx")) {
// Inovia convention
- return true;
+ return new RuleResult(true, "");
} else if(i.getName().endsWith("_pkey") || i.getName().endsWith("_key")) {
// Postgres Convention
- return true;
+ return new RuleResult(true, "");
}
- return false;
+ return new RuleResult(false, "");
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/Rule.java b/src/main/java/com/inovia/magnifier/rule/Rule.java
index 5bc3176..adb3273 100644
--- a/src/main/java/com/inovia/magnifier/rule/Rule.java
+++ b/src/main/java/com/inovia/magnifier/rule/Rule.java
@@ -13,6 +13,7 @@ public interface Rule {
* @return a report about the execution of the rule on the database
*/
public RuleReport run(Database database);
+ public Boolean hasSuggestions();
public String[] getRuleReportFormat();
public String getName();
}
diff --git a/src/main/java/com/inovia/magnifier/rule/RuleResult.java b/src/main/java/com/inovia/magnifier/rule/RuleResult.java
new file mode 100644
index 0000000..1f6c2f1
--- /dev/null
+++ b/src/main/java/com/inovia/magnifier/rule/RuleResult.java
@@ -0,0 +1,19 @@
+package com.inovia.magnifier.rule;
+
+public class RuleResult {
+ private Boolean isSuccess;
+ private String details;
+
+ public RuleResult(Boolean isSuccess, String details) {
+ this.isSuccess = isSuccess;
+ this.details = details;
+ }
+
+ public Boolean isSuccess() {
+ return this.isSuccess;
+ }
+
+ public String getDetails() {
+ return this.details;
+ }
+}
diff --git a/src/main/java/com/inovia/magnifier/rule/TableHasComment.java b/src/main/java/com/inovia/magnifier/rule/TableHasComment.java
index 0bdefb5..bc18648 100644
--- a/src/main/java/com/inovia/magnifier/rule/TableHasComment.java
+++ b/src/main/java/com/inovia/magnifier/rule/TableHasComment.java
@@ -19,26 +19,28 @@ public class TableHasComment implements Rule {
public TableHasComment() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Table t : database.getTables()) {
- Boolean isSuccess = assertion(t, database.getComments());
+ RuleResult result = assertion(t, database.getComments());
String[] dataToDisplay = {t.getSchemaName(), t.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Table table, List comments) {
+ private RuleResult assertion(Table table, List comments) {
for(Comment c : comments) {
if(c.getEntityType().equals("table") && c.getSchemaName().equals(table.getSchemaName()) && c.getEntityName().equals(table.getName())) {
- return true;
+ return new RuleResult(true, null);
}
}
- return false;
+ return new RuleResult(false, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/TableHasPrimaryKey.java b/src/main/java/com/inovia/magnifier/rule/TableHasPrimaryKey.java
index 107381e..d67a9d9 100644
--- a/src/main/java/com/inovia/magnifier/rule/TableHasPrimaryKey.java
+++ b/src/main/java/com/inovia/magnifier/rule/TableHasPrimaryKey.java
@@ -16,20 +16,22 @@ public class TableHasPrimaryKey implements Rule {
public TableHasPrimaryKey() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Table t : database.getTables()) {
- Boolean isSuccess = assertion(t);
+ RuleResult result = assertion(t);
String[] dataToDisplay = {t.getSchemaName(), t.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Table table) {
- return table.hasPrimaryKey();
+ private RuleResult assertion(Table table) {
+ return new RuleResult(table.hasPrimaryKey(), null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/TriggerHasComment.java b/src/main/java/com/inovia/magnifier/rule/TriggerHasComment.java
index f3b2dbf..d9e8c46 100644
--- a/src/main/java/com/inovia/magnifier/rule/TriggerHasComment.java
+++ b/src/main/java/com/inovia/magnifier/rule/TriggerHasComment.java
@@ -19,26 +19,28 @@ public class TriggerHasComment implements Rule {
public TriggerHasComment() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Trigger t : database.getTriggers()) {
- Boolean isSuccess = assertion(t, database.getComments());
+ RuleResult result = assertion(t, database.getComments());
String[] dataToDisplay = {t.getSchemaName(), t.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Trigger trigger, List comments) {
+ private RuleResult assertion(Trigger trigger, List comments) {
for(Comment c : comments) {
if(c.getEntityType().equals("trigger") && c.getSchemaName().equals(trigger.getSchemaName()) && c.getEntityName().equals(trigger.getName())) {
- return true;
+ return new RuleResult(true, null);
}
}
- return false;
+ return new RuleResult(false, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/TriggerName.java b/src/main/java/com/inovia/magnifier/rule/TriggerName.java
index 1cc30ab..ebbc652 100644
--- a/src/main/java/com/inovia/magnifier/rule/TriggerName.java
+++ b/src/main/java/com/inovia/magnifier/rule/TriggerName.java
@@ -16,20 +16,24 @@ public class TriggerName implements Rule {
public TriggerName() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(Trigger t : database.getTriggers()) {
- Boolean isSuccess = assertion(t);
+ RuleResult result = assertion(t);
String[] dataToDisplay = {t.getSchemaName(), t.getTableName(), t.getName(), t.getTiming(), t.getAction()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(Trigger t) {
- return t.getName().equalsIgnoreCase("on_" + t.getTiming() + "_" + t.getAction() + "_" + t.getTableName());
+ private RuleResult assertion(Trigger t) {
+ Boolean isSuccess = t.getName().equalsIgnoreCase("on_" + t.getTiming() + "_" + t.getAction() + "_" + t.getTableName());
+
+ return new RuleResult(isSuccess, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/ViewHasComment.java b/src/main/java/com/inovia/magnifier/rule/ViewHasComment.java
index a572f50..9e96aec 100644
--- a/src/main/java/com/inovia/magnifier/rule/ViewHasComment.java
+++ b/src/main/java/com/inovia/magnifier/rule/ViewHasComment.java
@@ -19,26 +19,28 @@ public class ViewHasComment implements Rule {
public ViewHasComment() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(View v : database.getViews()) {
- Boolean isSuccess = assertion(v, database.getComments());
+ RuleResult result = assertion(v, database.getComments());
String[] dataToDisplay = {v.getSchemaName(), v.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(View view, List comments) {
+ private RuleResult assertion(View view, List comments) {
for(Comment c : comments) {
if(c.getSchemaName().equals(view.getSchemaName()) && c.getEntityName().equals(view.getName())) {
- return true;
+ return new RuleResult(true, null);
}
}
- return false;
+ return new RuleResult(false, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/main/java/com/inovia/magnifier/rule/ViewName.java b/src/main/java/com/inovia/magnifier/rule/ViewName.java
index bbd56f5..5a23ba6 100644
--- a/src/main/java/com/inovia/magnifier/rule/ViewName.java
+++ b/src/main/java/com/inovia/magnifier/rule/ViewName.java
@@ -16,24 +16,26 @@ public class ViewName implements Rule {
public ViewName() { }
+ public Boolean hasSuggestions() { return false; }
+
public RuleReport run(Database database) {
RuleReport ruleReport = new RuleReport(this, SUGGESTION, DEBT);
for(View v : database.getViews()) {
- Boolean isSuccess = assertion(v);
+ RuleResult result = assertion(v);
String[] dataToDisplay = {v.getSchemaName(), v.getName()};
- ruleReport.addEntry(new ReportEntry(dataToDisplay, isSuccess));
+ ruleReport.addEntry(new ReportEntry(dataToDisplay, result));
}
return ruleReport;
}
- private Boolean assertion(View view) {
+ private RuleResult assertion(View view) {
if(view.getName().endsWith(SUFFIX)) {
- return true;
+ return new RuleResult(true, null);
}
- return false;
+ return new RuleResult(false, null);
}
public String[] getRuleReportFormat() {
diff --git a/src/test/java/com/inovia/magnifier/reports/ReportEntryTest.java b/src/test/java/com/inovia/magnifier/reports/ReportEntryTest.java
index 523d068..6320b57 100644
--- a/src/test/java/com/inovia/magnifier/reports/ReportEntryTest.java
+++ b/src/test/java/com/inovia/magnifier/reports/ReportEntryTest.java
@@ -1,5 +1,11 @@
package com.inovia.magnifier.reports;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.inovia.magnifier.database.Function;
+import com.inovia.magnifier.rule.RuleResult;
+
import junit.framework.*;
public class ReportEntryTest extends TestCase {
@@ -12,11 +18,16 @@ public static Test suite() {
}
public void testConstructorAndGetters() {
+ final RuleResult mockRuleResult = mock(RuleResult.class);
+ when(mockRuleResult.isSuccess()).thenReturn(true);
+
String[] dataToDisplay = {"fake", "oki"};
- ReportEntry goodEntry = new ReportEntry(dataToDisplay, true);
+ ReportEntry goodEntry = new ReportEntry(dataToDisplay, mockRuleResult);
assertTrue(goodEntry.isSuccess());
- ReportEntry badEntry = new ReportEntry(dataToDisplay, false);
+ when(mockRuleResult.isSuccess()).thenReturn(false);
+
+ ReportEntry badEntry = new ReportEntry(dataToDisplay, mockRuleResult);
assertFalse(badEntry.isSuccess());
}
}