Custom Expressions is the way we provide to let the developer make complex arranging of the data to be displayed in the report such as a concatenation of 2 or more fields from the data source, a math calculation, etc. Custom Expressions classes must implement the interface, which has a single method: evaluate(Object object) , the parameter is a java.util.Map which contains the elements of the current row.

Custom Expression may be defined in-line (they are like closures) Lets see an example.

AbstractColumn columnaCustomExpression = ColumnBuilder.getNew()
                return new CustomExpression() {

                        public Object evaluate(Map fields, Map variables, Map parameters) {
                                String state = (String) fields.get("state");
                                String branch = (String) fields.get("branch");
                                String productLine = (String) fields.get("productLine");
                                Integer count = (Integer) variables.get("REPORT_COUNT");
                                return count + ": " +state.toUpperCase() + " / " + branch.toUpperCase() + " / " + productLine;

                        public String getClassName() {
                                return String.class.getName();


As you can see, the keys of the map are the properties defined at the moment of the creation of the columns.

If we need to use fields from the data source that are not directly shown on any column, we must register them like this:

drb.addField("productLine", String.class.getName());
drb.addField("branch", String.class.getName());

The resulting report would be something like this


Out of the box CustomExpression

DJ already provides these implementations for common usages. They are in the package

RecordsInPageCustomExpression returns the record number for the current page
RecordsInReportCustomExpression returns the record number for the whole report
PageNumberCustomExpression returns the page number