Release Notes for ReportServer 3.0.6

These release notes reflect the changes with respect to ReportServer RS3.0.6.

Some Important Features and Noteworthy Improvements

Scheduling

he scheduling mechanism is greatly extended in ReportServer 3.0.6. This is a step on the way to the future n:m scheduling mechanism (n reports to m recipients in a single job). The scheduler administrator is able to set three different scheduling actors:


In the following screenshot you can see the new scheduling dialog.

Conditional Scheduling

Conditional scheduling is much more flexible and powerful in ReportServer 3.0.6. The administrator is able to create predefined scheduled conditions by scripting. The user just has to select the condition needed and that's it. No more formula typing for the user, which improves user experience and avoids common errors. Of course, the previous scheduling mechanism is further supported.

As a standard predefined scheduler condition, we offer the "not empty" condition shown in the following screenshot.

As you can see, the report is only executed if the report is not empty.

It is important to emphasize that completely new conditions may be created by scripting. As an example, please take a look at the following simple script:


import net.datenwerke.rs.condition.service.condition.hooks.ConditionProviderHook;
import net.datenwerke.rs.condition.client.condition.dto.SimpleCondition;
import java.util.Calendar;
 
def HOOK_NAME = "IS_WORKINGDAY_HOOK"
 
def callback = [
 provideConditionFor: { report ->
 SimpleCondition cond = new SimpleCondition();
 cond.setKey(HOOK_NAME);
 cond.setName("Is working day");
 cond.setDescription("Actions are executed if today is a working day");
 return cond; },
 consumes: { key -> return HOOK_NAME.equals(key); },
 execute: { key, expression, user, rjob ->
 Calendar c1 = Calendar.getInstance();
 c1.setTime(new Date());
 return ( c1.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || 
          c1.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ) ? false: true;
 },
 isBeforeActions: { -> return true; },
 isBeforeJob: { -> return true; },
] as ConditionProviderHook
 
GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, ConditionProviderHook.class, callback)

The results are shown in the following screenshot:

Of course, predefined conditions may be combined with another predefined conditions and with other (user-defined) conditions. For example:

Object Resolver Query

In order to find objects using the terminal, we are consolidating the so called object resolver queries. These are standard ways of locating objects (entities) in ReportServer, e.g. Reports, Users, Groups, etc. In ReportServer 3.0.6 and further versions, more and more commands will support object resolver queries. Entities are stored objects such as reports, users or TeamSpaces. You can find entities by searching for classes annotated with "@Entity". You can also find a list of all entities in our ReportServer SourceForge project https://sourceforge.net/projects/dw-rs/. Download the latest apidocs file from the src directory for this.

Currently, there are three object resolvers:

  1. ID Resolver: Allows you to locate an entity by its entity ID.
  2. Path Resolver: Allows you to find an entity by its Virtual File System path.
  3. HQL Resolver: Allows you to find entities by a HQL (Hibernate Query Language) query.

We will illustrate these object resolvers by using the locate command. Any other command supporting object resolvers works analogously to the examples provided below.

The locate command allows you, as its name suggests, to locate entities by using an object resolver query. Refer to the locate command documentation for more information on this.

The ID object resolver uses an entity ID for locating an entity. Since entity IDs are unique, the query resolves to zero or one entity. The syntax is: "id:EntityType:entityId" where "EntityType" is the specific entity class, e.g. "Report" or "TeamSpace". Refer to the entity list mentioned above for the specific entity types. "entityId" is the specific entity ID. E.g.:


reportserver$ locate id:TableReport:123
Report Root/Dynamic Lists/myReport (Reportmanager)

The path resolver requires a Virtual File System path for locating the specific entity. Note that the path requires quotation marks if it contains spaces. E.g.:


reportserver$ locate "/reportmanager/Dynamic Lists/myReport"
Report Root/Dynamic Lists/myReport (Reportmanager)

You can also insert a relative path to the current location, e.g.:


reportserver$ locate myReport
Report Root/Dynamic Lists/myReport (Reportmanager)

Further, you can use an HQL query (Hibernate Query Language) for locating the needed entity or group of entities. Refer to https://docs.jboss.org/hibernate/orm/5.0/userguide/en-US/html/ch13.html for the HQL documentation. The syntax is: "hql:query" where the "query" is a valid select HQL query. Since HQL queries have blank spaces, quotation marks are needed. E.g.:


reportserver$ locate "hql:from TableReport where id=123"
Report Root/Dynamic Lists/myReport (Reportmanager)

You can also search for entity attributes, e.g.:


reportserver$ locate "hql:from TableReport where name like '%myReport%'"
Report Root/Dynamic Lists/myReport (Reportmanager)
Report Root/myReport2 (Reportmanager)

Performance

Using ReportServer with a large number of users imposes some challenges on the software regarding user experience. We have identified some issues with a large number of nodes (approx. 100 000) and improved performance in ReportServer 3.0.6 in many cases:

  1. Tree node selection: We changed most of the dialogs to use a dynamic node loading tree, i.e. the new functionalty does not load all nodes at the beginning, as in ReportServer 3.0.5. They now only load only what you see. This is done in an analogous way as the main tree, where you can open a node and the node's children are loaded on-the-fly. With this new behavior, all trees are now loading in less than one second. Until ReportServer 3.0.5, and with 100 000 nodes, these needed more than 2 hours to load. We changed many dialogs to use this new behavior: e.g. the group administration dialogs, the TeamSpace administration dialogs, and the scheduler administration dialogs. Further, all old tree dialogs were replaced with this new behavior. For example, when you can search for a datasource, or for a file, the trees are not completely loaded at start, but on-the-fly.
  2. Search: since all trees in the node selection dialogs load on-the-fly, the search functionality becomes more and more important to perform well. We greatly improved performance by filtering only the needed number of results before the search is performed.

Please note that we have still some performance issues with large number of nodes, which we will handle in next reportserver versions. Stay tuned for this.

Language support

With ReportServer 3.0.6, support for more than 34 languages will be added to the existing language support of 28 languages. So, in total, 62 languages are supported. Please note that this was done in a semi-automatic manner. So if you created a new language version, or improved an existing one, send us your excel language spreadsheet and we will include it into the official build. If you send us translations please include a short statement that you provide the translation under a creative commons zero (CC0 – http://creativecommons.org/publicdomain/zero/1.0/) license. More information on language support here.

Note that you can filter the languages shown to the user with the new configuration property "locales" in main/localization.cf. Refer to the internal configuration changes for this.

Allow to provide hook for modifying BIRT Export Options

RS-2199: Here you can find an example hook that modifies the PDFRenderOption in the BIRT PDF export to false:


import net.datenwerke.rs.birt.service.reportengine.hooks.AdaptBirtRenderOptionsHook;
import org.eclipse.birt.report.engine.api.IPDFRenderOption;
 
def HOOK_NAME = "MY_BIRT_EXPORT_HOOK"
 
def callback = [
  adapt: { options ->
    options.setOption(IPDFRenderOption.FIT_TO_PAGE, false);
    return options; }
] as AdaptBirtRenderOptionsHook
 
GLOBALS.services.callbackRegistry.attachHook(HOOK_NAME, AdaptBirtRenderOptionsHook.class, callback)

TeamSpace members and group members administration via terminal

TeamSpace members and group members can now be administrated via terminal via "teamspacemod" and "groupmod" terminal commands. These work analogously to each other. Some examples:

Add three members (two users and one group) to the TeamSpace with id 123:


teamspacemod addmembers id:TeamSpace:123 id:User:456 "hql:from Group where id=789" "/usermanager/myOU/myUser"

Deletes all members from the group with id 123:


groupmod addmembers -c id:Group:123

More details can be found in the administration guide.

Improvements and security issue fix in hookldappam demo script

RS-3245: We improved and closed a security issue in the ​hookldappam.groovy demo script. Please modify your script accordingly.

You can find the new script here: https://reportserver.net/en/guides/script/chapters/hookldappamgroovy/ The option "ALLOW_LOCAL_USERS" can be used to allow or disallow local users login.

Internal Configuration

Changed Internal Configuration Files

The following configuration files changed.

mail/mail.cf

RS-3300: The option "senderName" was added in order to allow setting the sender's name in emails sent by ReportServer if the option "forceSender" is set to true.

Following is a sample configuration


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <smtp>
	<host>mail.infofabrik.net</host>
	<port>25</port>
	<!--<username>rs@infofabrik.net</username>
	<password></password>
	-->
	<ssl>false</ssl>
	<tls>
		<enable>false</enable>
		<require>false</require>
	</tls>
  </smtp>
  <mail>
	<sender>rs@infofabrik.net</sender>
	<senderName>ReportServer</senderName>
	<forceSender>true</forceSender>
	<encryptionPolicy>allow_mixed</encryptionPolicy>
  </mail>
</configuration>

main/localisation.cf

RS-3168: The option "locales" was added in order to allow filtering the languages shown in the language selection box.

Following is a sample configuration


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <localization>
	<default>en</default>
	<locales>en,fr,de</locales>
	<format>
	<!--
		<shortDatePattern></shortDatePattern>
		<longDatePattern></longDatePattern>
		<shortTimePattern></shortTimePattern>
		<longTimePattern></longTimePattern>
		<shortDateTimePattern></shortDateTimePattern>
		<longDateTimePattern></longDateTimePattern>
		<numberPattern></numberPattern>
		<currencyPattern></currencyPattern>
		<integerPattern></integerPattern>
		<percentPattern></percentPattern>
	-->
	</format>
  </localization>
</configuration>

New Features, Improvements and Bug Fixes for ReportServer RS3.0.6

RS-1953New Feature Extend text parameters to allow for NULL return on empty strings
RS-2199New Feature Allow to provide hook for modifying BIRT Export Options (e.g., PDFRenderOption)
RS-2217New Feature Provide predefined scheduler condition to allow execution to "skip on empty"
RS-2347New Feature Allow to set aggregation in dynamic list preview context menu
RS-2372New Feature Add owner(s) to scheduler and allow to change these owner(s)
RS-2424New Feature Allow providing hookable predefined scheduler conditions
RS-2973New Feature Allow parameters in Saiku Mondrian cubes' sql queries
RS-3109New Feature locate command supports object resolver queries
RS-3117New Feature rcondition remove command supports object resolver queries
RS-3120New Feature rcondition create command: support report id syntax without object resolver query
RS-3126New Feature The scheduler user/executor should be able to be changed
RS-3135New Feature Provide scheduling admin area with "executor" and "owner" fields for filtering
RS-3138New Feature New field "scheduled by" for scheduled jobs. This field is now separated from the old "user" field, since the user/executor can now be changed.
RS-3141New Feature New scheduler filter field: "scheduled by"
RS-3145New Feature Japanese language support
RS-3146New Feature Korean language support
RS-3151New Feature Hindi language support
RS-3152New Feature Bengali language support
RS-3153New Feature Thai language support
RS-3154New Feature Malaysian language support
RS-3155New Feature Norwegian language support
RS-3156New Feature Icelandic language support
RS-3157New Feature Serbian language support
RS-3158New Feature Luxembourgish language support
RS-3168New Feature New configuration property in localization.cf: "locales". This property filters available languages. E.g. <locales>en,fr,de</locales>
RS-3177New Feature Vietnamese language support
RS-3178New Feature Afrikaans language support
RS-3188New Feature Albanian language support
RS-3189New Feature Armenian language support
RS-3190New Feature Basque language support
RS-3191New Feature Bosnian language support
RS-3192New Feature Georgian language support
RS-3193New Feature Macedonian language support
RS-3194New Feature Myanmar language support
RS-3195New Feature Laotian language support
RS-3196New Feature Ukrainian language support
RS-3197New Feature Indonesian language support
RS-3198New Feature Belorussian language support
RS-3199New Feature Uzbek language support
RS-3200New Feature Kazakh language support
RS-3201New Feature Nepali language support
RS-3202New Feature Javanese language support
RS-3203New Feature Mongolian language support
RS-3204New Feature Catalan language support
RS-3205New Feature Scottish Gaelic language support
RS-3206New Feature Tamil language support
RS-3207New Feature Singhalese language support
RS-3208New Feature Tagalog (Filipino) language support
RS-3209New Feature Khmer language support
RS-3237New Feature groupmod addmembers command: Allow to add users, groups, and OUs to group via terminal
RS-3238New Feature Allow to remove specific group members via terminal using the groupmod -c command
RS-3250New Feature Allow to remove specific teamspace members via terminal using the teamspacemod -c command
RS-3272New Feature Tree selection dialog loads dynamically only the visible children of visible nodes
RS-3274New Feature Tree selection dialog loads only the needed node types
RS-3275New Feature Allow the search to filter results on classes and their inherited classes
RS-3280New Feature Provide mappings between Dto and Dto2PosoMapper classes
RS-3291New Feature Provide form user tree selection field
RS-3318New Feature Check that the scheduler job executor is included in the owner list
RS-3319New Feature Check that all scheduler job owners have executing rights on the scheduled report
RS-3351New Feature Show both "executor" and "scheduled by" in scheduler admin view
RS-2203Improvement Allow pkg command to return its results to the terminal
RS-2271Improvement Show nicer error message if a wrongly formatted file is uploaded for import
RS-2388Improvement Indicate that file has been saved if a file is changed via the Edit file view.
RS-3122Improvement Consolidate scheduler permission checks
RS-3143Improvement Provide new field "scheduledBy" in script execution jobs
RS-3144Improvement Clear "scheduled by" job field on user removal
RS-3159Improvement Allow only scheduler admins to change the schedule executor
RS-3160Improvement Set the scheduler "scheduledBy" field when the user is removed and is contained in an active job
RS-3174Improvement ServletRequest logout in reportserver logout
RS-3231Improvement Provide Mondrian overrides in source files
RS-3241Improvement Allow "Add user to group" dialog to load stripped down data from the database
RS-3242Improvement Allow "Add group to group" dialog to load stripped down data from the database
RS-3243Improvement Load only OUs in "add OUs to group" dialog
RS-3249Improvement Extend teamspacemod addusers command to allow adding groups to teamspace. Rename "addusers" to "addmembers".
RS-3259Improvement Change internal demo jdbc driver to MariaDB
RS-3262Improvement Allow dragging users and groups to stripped down components in group administration
RS-3267Improvement Replace "Add ou to group" dialog with dynamic node loading dialog
RS-3269Improvement Speed up loading complete user tree
RS-3270Improvement Provide StrippedDownOrganisationalUnit analogous to StrippedDownUser, StrippedDownGroup
RS-3278Improvement Unify tree selection dialog and main node selection view
RS-3284Improvement Replace "Add user to group" and "group to group" dialogs with dynamic node loading dialog
RS-3285Improvement Replace TeamSpace "Add user to group" and "group to group" dialogs with dynamic node loading dialog
RS-3286Improvement Replace "su" dialog with dynamic node loading dialog
RS-3289Improvement Replace user selection dialogs in "scheduler" window with dynamic node loading dialogs
RS-3293Improvement Optimization of "search" functionality taking into account the limit set
RS-3300Improvement Allow to specify default sender name along with default sender email address in mail.cf
RS-2202Bug pkg command confirms "ok" even if script throws errors
RS-2423Bug Allow removing reports referenced in conditions
RS-2470Bug Users cannot be removed if they have a bookmark dadget
RS-2805Bug Items and menus are not shown over PDF in IE
RS-2902Bug Deleting a report does not delete the teamspace references after asking if deletion should be forced
RS-3104Bug locate command is not showing any results
RS-3108Bug Edit scheduler dialog not shown when report has properties set
RS-3111Bug locate command is not working with quotation marks in object resolver query
RS-3112Bug rcondition create command: incorrect name and key argument order
RS-3115Bug rcondition create command: bug using some object resolver queries
RS-3125Bug Exception when deleting a user having scheduled report execution tasks
RS-3128Bug NPE when displaying scheduler information with the executor user being previously deleted
RS-3130Bug Exception when deleting a user having scheduled script execution tasks
RS-3132Bug Archived scheduler jobs with current user as owner and null as executor are not shown in the job list
RS-3140Bug Client-side filtering bug in scheduling admin area: the "from user" and "to user" fields copy their values into the other field
RS-3166Bug Audit logs: change "report" to "report_id" for consistency
RS-3222Bug Count und count distinct aggregations are not working correctly in pivot reports
RS-3223Bug Oracle numeric overflow in some pivot/Mondrian reports with count measures
RS-3226Bug Variant "Properties", "Report Properties" and "Metadata" tabs are not being shown and cannot be edited, including write and configuration protection.
RS-3230Bug Dynamic list sorting is not working with MariaDB
RS-3245Bug Improvements and security issue fix in hookldappam demo script
RS-3246Bug Bug while trying to edit reportserver files in the UI
RS-3261Bug Connection leak in Jasper reports
RS-3292Bug "Cannot find property lastname" error during search when user's lastname or forename is null
RS-3298Bug Query preview in datasource parameters throws an exception for reports different than dynamic lists
RS-3317Bug Tree dialog search is not finding entries in some cases
RS-3327Bug NPE in some "tree expand all" cases
RS-3328Bug Incorrect behavior in tree report variant expansion
RS-3343Bug NPE in Mondrian Reports with empty queries
RS-3344Bug Exception in Mondrian Reports with queries containing both SQL and Mondrian fields
RS-3345Bug Search index is not adding elements if these are hibernate proxys
RS-3346Bug Consolidate external jar overrides
RS-3347Bug Exception in user search if teamspace elements found along with tree elements
RS-3348Bug Log output not working in some cases
RS-3349Bug Reports with conditions are not being correctly evaluated after upgrade