Show following diagram for customer who wants too much…
Use “Assembler Plugin”:
How it looks:
optional.isPresent() ? optional.get().getSet() : Collections.emptySet();
could be refactored to
optional.map(e -> e.getSet()).orElse(Collections.emptySet());
My task was to rename many i18n files, because of technology migration. I found following solution:
rename 's/app_/messages_/' app*properties
Example of result:
app_it.properties -> messages_it.properties
Undoubtedly the most popular library for Java reporting is Jasper Reports. However in case of new projects is also nice to look for better approaches.
If you look at alternatives to Jasper Reports, you will find tones of similar products -> http://alternativeto.net/software/jasperreports/.
I had a few picks, but decided to test only DynamicReports. Here is why:
- it’s extension of JasperReports, it can be used along with jrxml – plus we can generate jrxml
- perfect for creating simple layouts, also thanks to many examples
- it has nice fluent API
- exports report to many formats: csv, docx, xtml, image, ods, odt, pdf, pptx, rtf, text, xls, xlsx, xml
After creating one pretty simple layout I find out some questions:
- how to effectively test changes in layout design? I’ve used “JasperReportBuilder.show();”, but I’m not sure it’s the best option.
- is any way to share “JasperReportBuilder” across many threads and pass only some parameters when compiling reports? So far in header and summary section I was creating components initialized with data, which I think is not good for performance.
- what is the right design pattern for class implementing reports with “JasperReportBuilder”? Example of class creating invoice report, called “InvoiceDesign.java”, has one huge method “build()” packed with styles and setup of “JasperReportBuilder”. I know it’s only demo, but also I was expecting some production-ready examples.
I like DynamicReports mainly because it’s pure Java. Support for JasperReports is also encouraging. If I develop answers for above questions, I’m sure I will use it in the future.