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()); } }