package blade.migrate.provider; import blade.migrate.api.Migration; import blade.migrate.api.Problem; import blade.migrate.api.Reporter; import blade.migrate.provider.templates.BladeTemplateLoader; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.osgi.framework.Constants; import org.osgi.service.component.annotations.Component; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; @Component( property = { Constants.SERVICE_RANKING + ":Integer=0", "format:String=html" } ) public class HtmlReporter implements Reporter { private Configuration _cfg; private Map<String, Object> _root; private List<Problem> _problems; private OutputStream _output; private int _detail; @Override public void beginReporting(int detail, OutputStream output) { _detail = detail; _output = output; _cfg = new Configuration(Configuration.VERSION_2_3_22); _cfg.setTemplateLoader(new BladeTemplateLoader()); _cfg.setDefaultEncoding("UTF-8"); _cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER); _root = new HashMap<>(); _problems = new ArrayList<>(); _root.put("problems", _problems); } @Override public void endReporting() { try { Template template = null; if(_detail == Migration.DETAIL_SHORT) { template = _cfg.getTemplate("html/reporter.ftl"); } else { template = _cfg.getTemplate("html/reporter_detailed.ftl"); } template.process(_root, new OutputStreamWriter(_output)); _output.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } } @Override public void report(Problem problem) { _problems.add(problem); } }