Chapter 7. Script Datasinks

7. Script Datasinks

Script datasinks are your swiss army knife when it comes to sending your reports/your data to custom locations or when you need any logic or any additional files. Basically, you can use script datasinks to send your reports/your data to virtually any location you may need.

When defining a script datasource, you have the following variables available to use:

data contains the report or the data. Depending on the type of the data, this may be a String or a byte array. Note you can always use ReportService.createInputStream(Object) for creating an InputStream out of the data object.
report the same as the ''data'' variable above. Recommended is to use data, report is included for consistency.
script the FileServerFile containing the script of the datasink. You can use script.data for accessing the data in the script, or script.contentType for its content-type, or script.name for its name. Refer to the FileServerFile javadocs for a complete overview.
user the User executing the script datasink.
datasinkConfiguration the datasink configuration object which contains the selected filename of the report/the data. This may be accessed with datasinkConfiguration.filename.

An example script datasink is shown below. It creates a ZIP containing the report/the data, adds the groovy script to the ZIP and sends this per email to a given user list.

The script is available here: https://github.com/infofabrik/reportserver-samples/blob/main/src/net/datenwerke/rs/samples/tools/datasinks/scriptDatasinkPerEmail.groovy.

import net.datenwerke.rs.core.service.mail.MailBuilderFactory
import net.datenwerke.rs.core.service.mail.MailService
import net.datenwerke.security.service.usermanager.UserManagerService
import net.datenwerke.rs.utils.misc.MimeUtils
import net.datenwerke.rs.core.service.mail.SimpleAttachment
import java.nio.file.Paths

import java.time.LocalDateTime

def mailBuilder = GLOBALS.getInstance(MailBuilderFactory)
def mailService = GLOBALS.getInstance(MailService)
def userService = GLOBALS.getInstance(UserManagerService)
def mimeUtils = GLOBALS.getInstance(MimeUtils)

// the user ids. They have to exist and the ids are passed as long (L)
def to = [123L]
def subject = 'Script datasink'
def content = "ReportServer script datasink ${LocalDateTime.now()}"
// name of the zip
def attachmentFilename = 'data.zip'

def attachments = [
   new SimpleAttachment(data, // you can also use report
   mimeUtils.getMimeTypeByExtension(datasinkConfiguration.filename),
   datasinkConfiguration.filename),
   // add the script
   new SimpleAttachment(script.data, script.contentType, script.name) 
]

def mail = mailBuilder.create(
      subject,
      content,
      to.collect{userId -> userService.getNodeById(userId)})
      .withAttachments(attachments)
      .withZippedAttachments(attachmentFilename)
      .build()

mailService.sendMail mail