package husacct.define.presentation.utils;
import husacct.common.OSDetector;
import husacct.common.Resource;
import husacct.define.domain.appliedrule.AppliedRuleStrategy;
import husacct.define.domain.module.ModuleStrategy;
import husacct.define.domain.services.AppliedRuleDomainService;
import husacct.define.domain.services.ModuleDomainService;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.io.FileUtils;
public class ReportToHTML {
private static int ID = 1;
private ModuleDomainService moduleService;
private AppliedRuleDomainService ruleService;
public ReportToHTML(){
moduleService = new ModuleDomainService();
ruleService = new AppliedRuleDomainService();
}
public void createReport() throws URISyntaxException{
File htmlTemplateFile = new File(Resource.get(Resource.TEMPLATE_REPORT).toURI());
String htmlString = "";
try {
htmlString = FileUtils.readFileToString(htmlTemplateFile);
} catch (IOException e) {
System.out.println("Reading failed. (Define -> Presentation: ReportToHTML.java)");
e.printStackTrace();
}
String summary = getSummary();
String content = getContent(moduleService.getRootModules());
htmlString = htmlString.replace("%SUMMARY%", summary);
htmlString = htmlString.replace("%CONTENT%", content);
File file = new File(OSDetector.getAppFolder() + "/" + "report.html");
try {
FileUtils.writeStringToFile(file, htmlString);
Desktop.getDesktop().browse(file.toURI());
} catch (IOException e) {
System.out.println("Writing failed. (Define -> Presentation: ReportToHTML.java)");
e.printStackTrace();
}
}
/*
* For making a list with totals
*/
private String getSummary(){
String summary = "";
int modules = countModules(moduleService.getRootModules());
int appliedRules = ruleService.getAllMainRules().length;
int softwareUnits = countSoftwareUnits(moduleService.getRootModules());
summary += makeli(modules+" Modules;");
summary += makeli(appliedRules+" Applied Rules ("+ruleService.getAllEnabledMainRules().length+" enabled);");
summary += makeli(softwareUnits+" Software Units.");
return summary;
}
// These are all the root modules.
private int countModules(ModuleStrategy[] modules){
int counter = 0;
for(int i = 0; i < modules.length; i++){
counter += countModules(modules[i]);
}
return counter;
}
// Recursively search all modules
private int countModules(ModuleStrategy module){
int counter = 1;
if(module.hasSubModules()){
for(ModuleStrategy submodule : module.getSubModules()){
counter += countModules(submodule);
}
}
return counter;
}
// Put all software units per root module and further in one map.
private int countSoftwareUnits(ModuleStrategy[] modules){
int counter = 0;
for(ModuleStrategy module : modules){
counter += module.countSoftwareUnits();
}
return counter;
}
private String makeli(String content){
return String.format("<li>%s</li>", content);
}
/*
* For making the content, a jQuery tree sorted on Modules
*/
private String getContent(ModuleStrategy[] rootModules){
StringBuilder content = new StringBuilder();
for(int i = 0; i < rootModules.length; i++){
String moduleName = rootModules[i].getName();
HashMap<String, String> softwareUnits = getSoftwareUnits(rootModules[i]);
HashMap<String, Boolean> appliedRules = getAppliedRules(rootModules[i].getId());
content.append(makeTableRow(moduleName, softwareUnits, appliedRules));
int parentId = ID;
ID++;
if(rootModules[i].hasSubModules()){
content.append(makeChildRow(parentId, rootModules[i].getSubModules()));
}
}
return content.toString();
}
private HashMap<String, String> getSoftwareUnits(ModuleStrategy module){
return module.getSoftwareUnitNames();
}
private HashMap<String, Boolean> getAppliedRules(long moduleId){
HashMap<String, Boolean> appliedRules = new HashMap<String, Boolean>();
for(AppliedRuleStrategy rule : ruleService.getAllMainRules()){
if(rule.getModuleFrom().getId() == moduleId){
appliedRules.put(rule.getRuleTypeKey(), rule.isEnabled());
}
}
return appliedRules;
}
private String makeTableRow(String moduleName, HashMap<String,String> softwareUnits, HashMap<String,Boolean> appliedRules){
StringBuilder row = new StringBuilder();
String su = makeSUList(softwareUnits);
String rules = makeRulesList(appliedRules);
row.append("<tr data-tt-id=\""+ID+"\">");
row.append(makeTableData(moduleName)); // Module
row.append(makeTableData(su)); // Software Units
row.append(makeTableData(rules)); // Applied Rules
row.append("</tr>");
return row.toString();
}
private String makeTableData(String content){
return String.format("<td>%s</td>", content);
}
private String makeChildRow(int parentId, ArrayList<ModuleStrategy> subModules){
StringBuilder row = new StringBuilder();
for(ModuleStrategy sub : subModules){
HashMap<String, String> softwareUnits = getSoftwareUnits(sub);
HashMap<String, Boolean> appliedRules = getAppliedRules(sub.getId());
String su = makeSUList(softwareUnits);
String rules = makeRulesList(appliedRules);
row.append("<tr data-tt-id=\""+ID+"\" data-tt-parent-id=\""+parentId+"\">");
row.append(makeTableData(sub.getName())); // Module
row.append(makeTableData(su)); // Software Units
row.append(makeTableData(rules)); // Applied Rules
row.append("</tr>");
int thisId = ID;
ID++;
if(sub.hasSubModules()){
row.append(makeChildRow(thisId, sub.getSubModules()));
}
}
return row.toString();
}
private String makeSUList(HashMap<String, String> softwareUnits){
StringBuilder list = new StringBuilder();
Iterator<Map.Entry<String, String>> i = softwareUnits.entrySet().iterator();
while(i.hasNext()){
String key = i.next().getKey();
list.append(key+" ("+softwareUnits.get(key)+")");
if(i.hasNext()){
list.append("<br/>");
}
}
return list.toString();
}
private String makeRulesList(HashMap<String, Boolean> appliedRules){
StringBuilder list = new StringBuilder();
Iterator<Map.Entry<String, Boolean>> i = appliedRules.entrySet().iterator();
while(i.hasNext()){
String key = i.next().getKey();
if(appliedRules.get(key)){
list.append("<span>"+key+"</span>");
}else{
list.append("<span style=\"color: #C7C7C7; \">"+key+"</span>");
}
if(i.hasNext()){
list.append("<br/>");
}
}
return list.toString();
}
}