code: @Override
      public void runReport(Map<String, Object> extra) {
          try
          {
              rows = new ArrayList<Map<String, Object>>();
              Script script = groovyShell.parse(groovyScript);
              script.setBinding(new Binding());
              script.getBinding().setVariable("rows", rows);
              script.getBinding().setVariable("columns", getColumns());
              script.getBinding().setVariable("page", getPage());
              script.getBinding().setVariable("pageLimit", getPageLimit());
              script.getBinding().setVariable("paramConfig", getParameterConfig());
              script.getBinding().setVariable("param", new HashMap<String, ParamConfig>() {{
                  for (ParamConfig paramConfig : getParameterConfig()) {
                      put(paramConfig.getId(), paramConfig);
                  }
              }});
              script.getBinding().setVariable("extra", extra);
              script.run();
          } catch (Exception ex)
          {
              ex.printStackTrace();
              getErrors().add(ex.getMessage());
          }
      }
docs: {@inheritDoc}