JasperReports Server REST API Reference
JasperReports Server REST API Reference
JasperReports Server REST API Reference
REST API REFERENCE
RELEASE 6.4
http://www.jaspersoft.com
Copyright ©2005-2017 TIBCO Software Inc. All Rights Reserved. TIBCO Software Inc.
This is version 0217-JSP64-28 of the TIBCO JasperReports Server REST API Reference.
TABLE OF CONTENTS
Chapter 1 REST API Overview 7
1.1 List of Services 7
1.2 Sending REST Requests from a Browser 9
1.3 HTTP Response Codes 9
1.4 Deprecated Web Services 11
Chapter 2 The serverInfo Service 13
Chapter 3 Authentication Methods 15
3.1 Overview of REST Authentication 15
3.2 HTTP Basic Authentication 16
3.3 The login Service 16
3.4 Login Encryption 18
3.5 The Security Check 19
3.6 Using an SSO Token 20
3.7 Using a Pre-Authentication Token 21
3.8 Logout 21
Chapter 4 Working With Resources 23
4.1 Resource URI 23
4.2 Custom Media Types 24
4.3 Accept HTTP Headers 24
4.4 Content-Type HTTP Headers 25
4.5 JSON Format 25
4.6 Nested Resources 26
4.7 Referenced Resources 26
4.8 Local Resources 28
4.9 Optimistic Locking 29
4.10 Update-only Passwords 29
Chapter 5 Resource Descriptors 31
5.1 Common Attributes 32
5.2 Folder 32
5.3 JNDI Data Source 33
5.4 JDBC Data Source 33
Login (optional) The following services use the rest/ prefix but are still supported as part of the REST API:
http://<host>:<port>/jasperserver[-pro]/rest/GetEncryptionKey
http://<host>:<port>/jasperserver[-pro]/rest/login
http://<host>:<port>/jasperserver[-pro]/j_spring_security_check
http://<host>:<port>/jasperserver[-pro]/logout.html
http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo
Repository http://<host>:<port>/jasperserver[-pro]/rest_v2/resources
http://<host>:<port>/jasperserver-pro/rest_v2/domains/.../metadata *
http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions
http://<host>:<port>/jasperserver[-pro]/rest_v2/export
http://<host>:<port>/jasperserver[-pro]/rest_v2/import
Reports http://<host>:<port>/jasperserver[-pro]/rest_v2/reports
http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/.../inputControls
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/.../options
http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs
http://<host>:<port>/jasperserver-pro/rest_v2/queryExecutor *
http://<host>:<port>/jasperserver-pro/rest_v2/caches/vds *
Administration http://<host>:<port>/jasperserver[-pro]/rest_v2/users
without http://<host>:<port>/jasperserver[-pro]/rest_v2/users/.../attributes
organizations
http://<host>:<port>/jasperserver[-pro]/rest_v2/roles
http://<host>:<port>/jasperserver[-pro]/rest_v2/attributes
Administration http://<host>:<port>/jasperserver-pro/rest_v2/organizations
with http://<host>:<port>/jasperserver-pro/rest_v2/organizations/.../attributes
organizations *
http://<host>:<port>/jasperserver-pro/rest_v2/organizations/.../users
http://<host>:<port>/jasperserver-pro/rest_v2/organizations/.../users/.../attributes
http://<host>:<port>/jasperserver-pro/rest_v2/organizations/.../roles
http://<host>:<port>/jasperserver-pro/rest_v2/attributes
For progammers creating a client application, the reference chapters in this guide give the full description of the
methods supported by each REST service, the path or resource expected for each method, and the parameters
that are required or optional in the URL. The description of each method includes an example of the descriptors
it uses and a sample of the return value.
For tools that can parse the Web Application Description Language (WADL), the following URL gives a
machine-readable XML description of all supported REST v2 services:
http://<host>:<port>/jasperserver[-pro]/rest_v2/application.wadl
203 Non-Authoritative 405 Method Not Allowed 505 HTTP Version Not
Information Supported
Repository http://<host>:<port>/jasperserver[-pro]/rest/resources
http://<host>:<port>/jasperserver[-pro]/rest/resource
http://<host>:<port>/jasperserver[-pro]/rest/permission
Reports http://<host>:<port>/jasperserver[-pro]/rest/report
http://<host>:<port>/jasperserver[-pro]/rest/jobsummary
http://<host>:<port>/jasperserver[-pro]/rest/job
Administration http://<host>:<port>/jasperserver[-pro]/rest/user
without http://<host>:<port>/jasperserver[-pro]/rest/attribute
organizations
http://<host>:<port>/jasperserver[-pro]/rest/role
Administration http://<host>:<port>/jasperserver-pro/rest/organization
with http://<host>:<port>/jasperserver-pro/rest/user
organizations *
http://<host>:<port>/jasperserver-pro/rest/attribute
http://<host>:<port>/jasperserver-pro/rest/role
The original SOAP web services at the following URLs are also deprecated and no longer supported. The SOAP
web services will no longer be maintained or updated to work with new features of the server. In particular, the
SOAP web services do not support interactive charts or interactive HTML5 tables. Though the server may still
respond to these methods, they are never guaranteed to work.
The SOAP web services often refer to the http://www.jasperforge.org/jasperserver/ws namespace. This
namespace is only an identifier; it is not intended to be a valid URL.
Table 1-4 Deprecated SOAP Web Services
Administration http://<host>:<port>/jasperserver/services/UserAndRoleManagementService
Domains http://<host>:<port>/jasperserver-pro/services/DomainServices
Administration http://<host>:<port>/jasperserver-
pro/services/UserAndRoleManagementService
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo
Options
accept: application/xml
accept: application/json
200 OK – Body described below. This request should always succeed when the server
is running.
The server returns a structure containing the information in the requested format, XML or JSON:
<serverInfo>
<build>20141121_1750</build>
<dateFormatPattern>yyyy-MM-dd</dateFormatPattern>
<datetimeFormatPattern>yyyy-MM-dd'T'HH:mm:ss</datetimeFormatPattern>
<edition>PRO</edition>
<editionName>Enterprise</editionName>
<features>Fusion AHD EXP DB AUD ANA MT </features>
<licenseType>Commercial</licenseType>
<version>6.0.0</version>
</serverInfo>
{
"dateFormatPattern": "yyyy-MM-dd",
"datetimeFormatPattern": "yyyy-MM-dd'T'HH:mm:ss",
"version": "6.0.0",
"edition": "PRO",
"editionName": "Enterprise",
"licenseType": "Commercial",
"build": "20150527_1942",
"features": "Fusion AHD EXP DB AUD ANA MT "
}
You can access each value separately with the following URLs. Note that some information does not apply to
community editions of the server. The response is the raw value, XML or JSON are not accepted formats.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo/version
http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo/edition
http://<host>:<port>/jasperserver-pro/rest_v2/serverInfo/editionName
http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo/build
http://<host>:<port>/jasperserver-pro/rest_v2/serverInfo/licenseType
http://<host>:<port>/jasperserver-pro/rest_v2/serverInfo/features
http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo/dateFormatPattern
http://<host>:<port>/jasperserver[-pro]/rest_v2/serverInfo/datetimeFormatPattern
200 OK – The requested value. These requests should always succeed when the
server is running.
• If your client makes sporadic requests, for example running a report every hour, it is easier to use basic
authentication and send the credentials in the same request.
• However, sessions are kept for 20 minutes by default, so if your client makes a request every 15 minutes
with the same credentials, the corresponding session will be kept in memory indefinitely. This can be a
problem if you have many different clients running large reports, because some report output is stored in the
user session, and they can fill up the available memory. In this case, you should use the logout call to make
sure the memory is freed. For more information, see 3.8, “Logout,” on page 21.
• If your server is configured with external authentication, repeatedly verifying credentials may be a
performance issue you can avoid with the login service.
• If your server is configured with SSO (Single Sign-On), you should use the security check method. For more
information, see 3.6, “Using an SSO Token,” on page 20.
• If your server is configured with Pre-Authentication, see 3.7, “Using a Pre-Authentication Token,” on
page 21.
The web services accept the same accounts and credentials as the JasperReports Server user interface.
• In commercial editions where there is only one organization, such as in the JasperReports Server default
installation, you should specify the user ID without any qualifiers, for example jasperadmin.
• In commercial deployments with multiple organizations, the organization ID or organization alias must be
appended to the user ID, for example jasperadmin|organization_1 or jasperadmin|org2.
If login encryption in enabled in your server, you must encrypt the password before base64-encoding it with the
username. For more information about encryption, see 3.4, “Login Encryption,” on page 18.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest/login/
GET http://<host>:<port>/jasperserver[-pro]/rest/login?<arguments>
j_username Text The user ID. In commercial editions of the server that implement multiple
organizations, the argument must specify the organization ID or alias in the
following format: j_username%7Corganization_id (%7C is the encoding for
the | character).
j_password? Text The user’s password. The argument is optional but authentication will fail
without the password. If the server has login encryption enabled, the
password must be encrypted as explained in 3.4, “Login Encryption,” on
page 18.
Content-Type Content
application/x-www-form- j_username=<userID>[%7C<organization_id>]&j_password=<password>
urlencoded Example: j_username=jasperadmin&j_password=jasperadmin
or j_username=jasperadmin%7Corganization_1&j_password=jasperadmin
200 OK – Session ID in cookie (POST only), empty 401 Unauthorized – Empty body.
body. 302 – License expired or otherwise not valid.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Wed, 31 Dec 1969 16:00:00 PST
Content-Length: 0
Date: Fri, 19 Aug 2011 00:52:48 GMT
The following example shows the content of a POST request where the credentials are passed in the content.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=52E79BCEE51381DF32637EC69AD698AE; Path=/jasperserver
Content-Length: 0
Date: Fri, 19 Aug 2011 01:52:48 GMT
For optimal performance, the session ID from the cookie should be used to keep the session open. To do this,
include the cookie in future requests to the other RESTful services. For example, given the response to the
POST request above, future requests to the repository services should include the following line in the header:
Cookie: $Version=0; JSESSIONID=52E79BCEE51381DF32637EC69AD698AE; $Path=/jasperserver
Maintaining a session with cookies is not mandatory, and your application can use any combination of session
cookie, HTTP Basic Authentication, or both. However, if you use the session ID, it is good practice to close the
session as described in 3.8, “Logout,” on page 21. Closing the session frees up any associated resources in
memory.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/GetEncryptionKey/
200 OK – Body contains a JSON representation of 200 OK – Body contains {Error: Key generation is off}
public key:
{
"maxdigits":"131",
"e":"10001",
"n":"9f8a2dc4baa260a5835fa33ef94c..."
}
Method URL
GET http://<host>:<port>/jasperserver[-pro]//j_spring_security_check?<arguments>
orgId? Text The organization ID or alias. Required for organization admins and users
when there is more than one organization defined. Not required for the sys-
tem admin (superuser by default).
j_password Text The user’s password. If the server has login encryption enabled, the
password must be encrypted as explained in 3.4, “Login Encryption,” on
page 18.
userLocale? Java locale Set the optional locale for user in this session.
string
userTimezone? Java time Set the optional time zone for the user in this session.
zone
Options
accept: application/json
302 Moved Temporarily – Response HTTP Header 302 Moved Temporarily – Response HTTP Header
"Location" redirects to /loginsuccess.html by default, "Location" redirects to /login.html?error=1.
but often depends on the last session operation.
See below if you specify JSON.
If you specify accept: application/json in your request, the location of the redirect in case of success is always
the file /scripts/bower_components/js-sdk/src/common/auth/loginSuccess.json. The content of this file is:
{
"success":true
}
You can configure the location of this file. Edit the configuration file .../WEB-INF/applicationContext-security-
web.xml and change the constructor value of the following bean:
<constructor-arg type="java.lang.String"
value="/scripts/bower_components/js-sdk/src/common/auth/loginSuccess.json"/>
</bean>
Method URL
GET http://<host>:<port>/jasperserver[-pro]//j_spring_security_check?<arguments>
ticket Text The ticket for your SSO mechanism. The default parameter name for an
SSO authentication token is ticket. This parameter name can be changed
in the configuration file applicationContext-externalAuth-<sso>.xml.
Options
accept: application/json
302 Moved Temporarily – Response HTTP Header 302 Moved Temporarily – Response HTTP Header
"Location" redirects to /loginsuccess.html by default, "Location" redirects to /login.html?error=1.
but often depends on the last session operation.
For example, if you have configured the server to use CAS as your SSO provider, you can authenticate and
receive the session ID with the following request:
GET http://localhost:8080/jasperserver-pro/j_spring_security_check?ticket=ST-40-CZeUUnGPxEqgScNbxh9l-
sso-cas.eng.jaspersoft.com
The response has the same behavior as the password-based security check, including the use of a JSON file if
requested.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/?<arguments>
pp Text The token for your pre-authentication mechanism. The default parameter
name for a pre authentication token is pp. This parameter name can be
changed in the configuration file .../WEB-INF/applicationContext-extern-
alAuth-preAuth.xml.
Options
accept: application/json
302 Moved Temporarily – Response HTTP Header 302 Moved Temporarily – Response HTTP Header
"Location" redirects to /loginsuccess.html by default, "Location" redirects to /login.html?error=1.
but often depends on the last session operation.
For example, if you have configured the server to use pre-authentication, you can authenticate and receive the
session ID with the following request:
GET http://localhost:8080/jasperserver-pro?pp=u%3DSteve%7Cr%3DExt_User%7Co%3Dorganization_
1%7Cpa1%3DUSA%7Cpa2%3D1
3.8 Logout
While REST calls are often stateless, JasperReports Server uses a session to hold some information such as
generated reports. The session and its report data take up space in memory and it's good practice to explicitly
close the session when it is no longer needed. This allows the server to free up and reuse resources much faster.
To close a session and free its resources, invoke the logout page and include the JSESSIONID cookie in the
request.
Method URL
GET http://<host>:<port>/jasperserver[-pro]//logout.htm
Header
user is the same resource as the path /organizations/organization_1/datasources/JServerJdbcDS for the system
admin (superuser). The /public folder is a special path that is absolute for any user in any organization
(including superuser).
As with all server operations, the folders and resources that are visible and accessible to a given user
depend on permissions that are set in the repository on those folders and resources. REST services
return an error when attempting an operation on resources that the authenticated user does not have
permission to access.
The URI and ID of a created resource is determined in one of the following ways:
• POST operations on the resources service specify a folder. The resource descriptor in the request is created
in the specified folder. The ID is created automatically from the label of the resource by replacing special
characters with underscores (_). The URI of the new resource is returned in the server's response and consists
of the target folder with the automatic ID appended to it.
• PUT operations on the resources service send a descriptor to create the resource at the URI specified in the
request. The resource ID is the last element of this URI, as long as it is unique in the parent folder. The
server's response should confirm that the resource was successfully created with the requested URI.
All resources also have a label string and a description string that can be presented to your client's users. The
label and description support special characters (such as spaces, punctuation, and accented characters) and even
Unicode if configured in your server during installation.
The server will respond with the specific custom media type for the requested resource, as described in the next
section.
However, there are some special cases where client must specify a precise resource type:
• When requesting the resource details of the root folder, client must specify
application/repository.folder+<format> to get its resource descriptor. Otherwise, the request is considered a
search of the root folder.
• When requesting the resource details of a file resource, as opposed to the file contents, the client must
specify application/repository.file+<format>. Without this Accept header, the response will contain the file
contents. The custom media type also distinguishes between the XML descriptor of a file and the contents
of an XML file.
If the client specifies a custom type in the Accept header that does not match the resource being requested, the
server responds with the error code 406 Not Acceptable.
{
"version": 0,
"permissionMask": 1,
"creationDate": "2013-10-03T16:32:37",
"updateDate": "2013-10-03T16:32:37",
"label": "Country Query",
"description": null,
"uri": "/adhoc/topics/Cascading_multi_select_topic_files/Country_multi_select_files/
country_query",
"dataSource": { contents }, <*>
"value": "select distinct billing_address_country from accounts order by billing_address_country",
"language": "sql"
}
<*> or "dataSourceReference": {
"uri": "/datasources/JServerJNDIDS"
},
To create referenced resources, send requests to the server that contain the appropriate reference objects for the
target resource. See 4.7, “Referenced Resources,” on page 26 for the specific reference objects available in each
resource descriptor.
When reading resources with referenced resources, the uri attribute gives the repository URI of the reference.
To simplify the parsing of referenced resources, the resources service GET method supports the expanded=true
parameter. Instead of following references and requiring two or more GET requests, the expanded=true parameter
returns all referenced resources fully expanded within the parent resource, as if it were a local resource.
The following resource types support referenced resources, and the table gives the name of the field that
contains the referenced URI, and the name of the expanded type that replaces the reference.
listOfValuesReference listOfValues
queryReference query
queryReference query
inputControlReference inputControl
{
"version": 0,
"permissionMask": 1,
"creationDate": "2013-10-03T16:32:37",
"updateDate": "2013-10-03T16:32:37",
"label": "Country Query",
"description": null,
"uri": "/adhoc/topics/Cascading_multi_select_topic_files/Country_multi_select_files/country_
query",
"dataSource": {
"jndiJdbcDataSource": {
"version": 0,
"permissionMask": 1,
"creationDate": "2013-10-03T16:32:05",
"updateDate": "2013-10-03T16:32:05",
"label": "my JNDI ds",
"description": "Local JNDI Data Source",
// URI of expanded nested resource is ignored. Resource is created locally
"uri": "/datasources/JServerJNDIDS",
"jndiName": "jdbc/sugarcrm",
"timezone": null
}
},
"value": "select distinct billing_address_country from accounts order by billing_address_country",
"language": "sql"
}
Use nested descriptors such as the ones above to create resources that contain local resources. Descriptors can be
nested to any level, as long as the syntax of each descriptor is valid. See 4.6, “Nested Resources,” on page 26
for the correct syntax of both the parent and the nested resource.
Internally, the resources service handles local resources as normal resources contained in a hidden folder. The
hidden folder containing local resources has the following name:
<parentURI>_files/
and local resources can be accessed at the following URI:
<parentURI>_files/<resourceID>
In the example above, we can see that the parent query resource is a nested resource itself. Its URI shows us that
it is the query resource for a query-based input-control of a topic resource:
/adhoc/topics/Cascading_multi_select_topic_files/Country_multi_select_files/country_query
and the new nested data source will have the following URI:
/adhoc/topics/Cascading_multi_select_topic_files/Country_multi_select_files/country_query_files/my_
JNDI_ds
The ID of the nested resource (my_JNDI_ds) is created automatically from the label of the nested resource.
The _files folder that exists in all parents of local resources is hidden so that its local resources do not appear in
repository searches. You can set the showHiddenItems=true parameter on the resources request to search for a
_files folder in all local resources, such as in a JRXML report (reportUnit).
Local resources in the hidden _files folder can also be created and updated separately from their parent resources
by using PUT and POST methods of the resources service and specifying the complete URI of the local resource
as shown above.
application/repository.{resourceType}+json application/repository.{resourceType}+xml
Throughout the rest of the resource type sections, the common attributes are included in every descriptor as
{commonAttributes}.
5.2 Folder
Folder types do not contain any additional fields beyond the common attributes shown above.
application/repository.folder+json application/repository.folder+xml
{ <folder>
"uri" :"{resourceUri}", <uri>/sample/resource/uri</uri>
"label":"Sample Label", <label>Sample Label</label>
"description":"Sample Description", <description>Sample Description
"permissionMask":"0", </description>
"creationDate": "2013-07-04T12:18:47", <permissionMask>0</permissionMask>
"updateDate": "2013-07-04T12:18:47", <creationDate>2013-07-04T12:18:47
"version":"0" </creationDate>
} <updateDate>2013-07-04T12:18:47
</updateDate>
<version>0</version>
</folder>
application/repository.jndiJdbcDataSource+json application/repository.jndiJdbcDataSource+xml
{ <jndiDataSource>
{commonAttributes}, {commonAttributes}
"jndiName":"{jndiName}", <jndiName>{jndiName}</jndiName>
"timezone":"{timezone}" <timezone>{timezone}</timezone>
} </jndiDataSource>
application/repository.jdbcDataSource+json application/repository.jdbcDataSource+xml
{ <jdbcDataSource>
{commonAttributes}, {commonAttributes}
"driverClass":"{driverClass}", <driverClass>{driverClass}</driverClass>
"password":"{password}", <password>{password}</password>
"username":"{username}", <username>{username}</username>
"connectionUrl":"{connectionUrl}", <connectionUrl>
"timezone":"{timezone}" {connectionUrl}
} </connectionUrl>
<timezone>{timezone}</timezone>
</jdbcDataSource>
application/repository.awsDataSource+json application/repository.awsDataSource+xml
{ <awsDataSource>
{commonAttributes}, {commonAttributes}
"driverClass":"{driverClass}", <driverClass>{driverClass}</driverClass>
"password":"{password}", <password>{password}</password>
"username":"{username}", <username>{username}</username>
"connectionUrl":"{connectionUrl}", <connectionUrl>
"timezone":"{timezone}", {connectionUrl}
"accessKey":"{accessKey}", </connectionUrl>
"secretKey":"{secretKey}", <timezone>{timezone}</timezone>
"roleArn":"{roleArn}", <accessKey>{accessKey}</accessKey>
"region":"{region}", <secretKey>{secretKey}</secretKey>
"dbName":"{dbName}", <roleArn>{roleArn}</roleArn>
"dbInstanceIdentifier":"{dbInstanceIdentifier}", <region>{region}</region>
"dbService":"{dbService}" <dbName>{dbName}</dbName>
} <dbInstanceIdentifier>
{dbInstanceIdentifier}
</dbInstanceIdentifier>
<dbService>{dbService}</dbService>
</awsDataSource>
The {region} values are specified in the file .../WEB-INF/application-context.xml, with their corresponding
display labels defined in .../WEB-INF/bundles/jasperserver_messages.properties. By default, the following
regions are defined:
application/repository.virtualDataSource+json application/repository.virtualDataSource+xml
{ <virtualDataSource>
{commonAttributes}, {commonAttributes}
"subDataSources":[ <subDataSources>
{ <subDataSource>
"id":"{subDataSourceId}", <id>{subDataSourceId}</id>
"uri":"{subDataSourceUri}" <uri>{subDataSourceUri}</uri>
}, </subDataSource>
... ...
] </subDataSources>
} </virtualDataSource>
application/repository.customDataSource+json application/repository.customDataSource+xml
{ <customDataSource>
{commonAttributes}, {commonAttributes}
"serviceClass":"{serviceClass}", <serviceClass>
"dataSourceName":"{dataSourceName}", {serviceClass}
"properties":[ </serviceClass>
{ <dataSourceName>
"key":"{key}", {dataSourceName}
"value":"{value}" </dataSourceName>
}, <properties>
... <property>
] <key>{key}</key>
} <value>{value}</value>
</property>
...
</properties>
</customDataSource>
application/repository.beanDataSource+json application/repository.beanDataSource+xml
{ <beanDataSource>
{commonAttributes}, {commonAttributes}
"beanName":"{beanName}", <beanName>{beanName}<beanName>
"beanMethod":"{beanMethod}" <beanMethod>{beanMethod}</beanMethod>
} </beanDataSource>
5.9 Datatypes
application/repository.dataType+json application/repository.dataType+xml
{ <dataType>
{commonAttributes}, {commonAttributes}
"type":"text|number|date|dateTime|time", <type>text|number|date|dateTime|time</type>
"pattern":"{pattern}", <pattern>{pattern}</pattern>
"maxValue":"{maxValue}", <maxValue>{maxValue}</maxValue>
"strictMax":"true|false", <strictMax>true|false</strictMax>
"minValue":"{minValue}", <minValue>{minValue}</minValue>
"strictMin":"true|false" <strictMin>true|false</strictMin>
"maxLength":"{maxLengthInteger}" <maxLength>{maxLengthInteger}</maxLength>
} </dataType>
application/repository.listOfValues+json application/repository.listOfValues+xml
{ <listOfValues>
{commonAttributes}, {commonAttributes}
"items":[ <items>
{ <item>
"label":"{label}", <label>{label}</label>
"value":"{value}" <value>{value}</value>
}, </item>
... ...
] </items>
} </listOfValues>
5.11 Query
The dataSource field of the query may be null. Set an empty dataSource field when you want to remove a local
data source, either a reference or a local definition. When the data source of a query is not defined, the query
uses the data source of its parent, for example its JRXML report (reportUnit).
application/repository.query+json application/repository.query+xml
{ <query>
{commonAttributes}, {commonAttributes}
"value":"{query}", <value>{query}</value>
"language":"{language}", <language>{language}</language>
"dataSource":{ <dataSourceReference>
"dataSourceReference": { <uri>{dataSourceUri}</uri>
"uri":"{dataSourceUri}" </dataSourceReference>
} </query>
}
}
application/repository.inputControl+json application/repository.inputControl+xml
{ <inputControl>
{commonAttributes}, {commonAttributes}
"mandatory":"{true|false}", <mandatory>true|false</mandatory>
"readOnly":"{true|false}", <readOnly>true|false</readOnly>
"visible":"{true|false}", <visible>true|false</visible>
"type":"{inputControlTypeByteValue}", <type>{inputControlTypeByteValue}</type>
"usedFields":"{field1;field2;...}", <usedFields>
"dataType": { {field1;field2;...}</usedFields>
"dataTypeReference": { <dataTypeReference>
"uri": "{dataTypeResourceUri}" <uri>{dataTypeResourceUri}</uri>
} </dataTypeReference>
}, <listOfValuesReference>
"listOfValues": { <uri>{listOfValuesResourceUri}</uri>
"listOfValuesReference": { </listOfValuesReference>
"uri": "listOfValuesResourceUri" <queryReference>
} <uri>{queryResourceUri}</uri>
} </queryReference>
"visibleColumns":["column1", "colum2", ...], <visibleColumns>
"valueColumn":"{valueColumn}", <column>{column1}</column>
"query": { <column>{column2}</column>
"queryReference": { <column>...</column>
"uri": "{queryResourceUri}" </visibleColumns>
} <valueColumn>{valueColumn}</valueColumn>
} </inputControl>
}
The following list shows the numerical code and meaning for {inputControlTypeByteValue}. The input control
type determines the other fields that are required. The list of required fields may appear in a field named
usedFields, separated by semi-colons (;).
1 Boolean None
5 Not used
5.13 File
The repository.file+<format> descriptor is used to identify the file type. The content field is used only when
uploading a file resource as base-64 encoded content. For other ways to upload file contents, see 7.3,
“Uploading File Resources,” on page 61. The content field is absent when requesting a file resource descriptor.
To download file contents, see 7.2, “Downloading File Resources,” on page 60.
application/repository.file+json application/repository.file+xml
{ <file>
{commonAttributes}, {commonAttributes}
"type":"pdf|html|xls|rtf|csv|odt|txt <type>pdf|html|xls|rtf|csv|odt|txt
|docx|ods|xlsx|img|font|jrxml |docx|ods|xlsx|img|font|jrxml
|jar|prop|jrtx|xml|css |jar|prop|jrtx|xml|css
|olapMondrianSchema |olapMondrianSchema
|accessGrantSchema |accessGrantSchema|unspecified}
|unspecified}", </type>
// content is write-only; <content>{base64EncodedContent}</content>
// it is not included in a response </file>
"content":"{base64EncodedContent}"
}
application/repository.reportUnit+json application/repository.reportUnit+xml
{ <reportUnit>
{commonAttributes}, {commonAttributes}
"alwaysPromptControls": <alwaysPromptControls>true|false
"{true|false}", </alwaysPromptControls>
// default is "popupScreen" <!-- default is "popupScreen" -->
"controlsLayout": <controlsLayout>
"{popupScreen|separatePage popupScreen|separatePage
|topOfPage|inPage}", |topOfPage|inPage
"inputControlRenderingView": </controlsLayout>
"{inputControlRenderingView}", <inputControlRenderingView>
"reportRenderingView": {inputControlRenderingView}
"{reportRenderingView}", </inputControlRenderingView>
"dataSource":{ <reportRenderingView>
"dataSourceReference": { {reportRenderingView}
"uri":"{dataSourceUri}" </reportRenderingView>
} <dataSource>
}, <dataSourceReference>
// "query" is nullable <uri>{dataSourceUri}</uri>
"query:" { </dataSourceReference>
"queryReference": { </dataSource>
uri: "{queryResourceUri}" <query>
} <queryReference>
}, <uri>{queryResourceUri}</uri>
"jrxml": { </queryReference>
"jrxmlFileReference": { </query>
"uri": "{jrxmlFileResourceUri}" <jrxml>
} or <jrxmlFileReference>
"jrxmlFile": { <uri>{jrxmlFileResourceUri}</uri>
"label": "Main jrxml", </jrxmlFileReference>
"type": "jrxml" </jrxml>
} <inputControls>
} <inputControlReference>
"inputControls": [ <uri>{inputControlUri}</uri>
{ </inputControlReference>
"inputControlReference": { ...
"uri": "{inputControlUri}" </inputControls>
} <resources>
}, <resource>
... <name>{resourceName}</name>
], <file>contents</file> {*}
"resources": [ </resource>
"resource": { ...
"name": "{resourceName}", </resources>
"file": {contents} <*> </reportUnit>
}
},
... {*} or <fileReference>
] <uri>{fileResourceUri}</uri>
} </fileReference>
<*> or "fileReference": {
"uri": "{fileResourceUri}"
}
application/repository.reportOptions+json application/repository.reportOptions+xml
{ <reportOptions>
{commonAttributes}, {commonAttributes}
"reportUri":"{reportUri}", <reportUri>{reportUri}</reportUri>
"reportParameters":[ <reportParameters>
{ <reportParameter>
"name":"{parameterName}", <name>{parameterName}</name>
"value":[ <value>value_1</value>
"value_1", <value>value_2</value>
"value_2", ...
... </reportParameter>
] ...
}, </reportParameters>
... </reportOptions>
]
}
application/repository.semanticLayerDataSource+js application/repository.semanticLayerDataSource
on +xml
{ <semanticLayerDataSource>
{commonAttributes}, {commonAttributes}
"dataSource":{ <dataSourceReference>
"dataSourceReference": { <uri>{dataSourceUri}</uri>
"uri":"{dataSourceUri}" </dataSourceReference>
} <schemaFileReference>
}, <uri>{schemaFileResourceUri}</uri>
"schema": { </schemaFileReference>
"schemaFileReference": { <bundles>
"uri": "{schemaFileResourceUri}" <bundle>
} <!-- <locale/> indicates default
}, bundle -->
"bundles": [ <locale>{localeString}</locale>
{ <fileReference>
// empty localeString indicates <uri>{prop-
default bundle ertiesFileResourceUri}</uri>
"locale": "{localeString}", </fileReference>
"file": { </bundle>
"fileReference": { ...
"uri": "{prop- </bundles>
ertiesFileResourceUri}" <securityFileReference>
} <uri>{securityFileResourceUri}</uri>
} </securityFileReference>
}, </semanticLayerDataSource>
...
],
"securityFile": {
"securityFileReference": {
"uri": "{securityFileResourceUri}"
}
}
}
application/repository.domainTopic+json application/repository.domainTopic+xml
application/repository.xmlaConnection+json application/repository.xmlaConnection+xml
{ <xmlaConnection>
{commonAttributes}, {commonAttributes}
"url":"{xmlaServiceUrl}", <url>{xmlaServiceUrl}</url>
"xmlaDataSource":"{xmlaDataSource}", <xmlaDataSource>
"catalog":"{catalog}", {xmlaDataSource}
"username":"{username}", </xmlaDataSource>
"password":"{password}" <catalog>{catalog}</catalog>
} <username>{username}</username>
<password>{password}</password>
</xmlaConnection>
application/repository.mondrianConnection+json application/repository.mondrianConnection+xml
{ <mondrianConnection>
{commonAttributes}, {commonAttributes}
"dataSource":{ <dataSourceReference>
"dataSourceReference": { <uri>{dataSourceUri}</uri>
"uri":"{dataSourceUri}" </dataSourceReference>
} <schemaReference>
}, <uri>{schemaFileResourceUri}</uri>
"schema": { </schemaReference>
"schemaReference": { </mondrianConnection>
"uri": "{schemaFileResourceUri}"
}
}
}
application/repository.secureMondrianConnection+j application/repository.secureMondrianConnection
son +xml
{ <secureMondrianConnection>
{commonAttributes}, {commonAttributes}
"dataSource":{ <dataSourceReference>
"dataSourceReference": { <uri>{dataSourceUri}</uri>
"uri":"{dataSourceUri}" </dataSourceReference>
} <schemaReference>
}, <uri>{schemaFileResourceUri}</uri>
"schema": { </schemaReference>
"schemaReference": { <accessGrantSchemas>
"uri": "{schemaFileResourceUri}" <accessGrantSchemaReference>
} <uri>{accessGrantS-
}, chemaFileResourceUri}</uri>
"accessGrantSchemas": [ </accessGrantSchemaReference>
{ </accessGrantSchemas>
"accessGrantSchemaReference": { </secureMondrianConnection>
"uri": "{accessGrantS-
chemaFileResourceUri}"
}
},
...
]
}
application/repository.olapUnit+json application/repository.olapUnit+xml
{ <olapUnit>
{commonAttributes}, {commonAttributes}
"mdxQuery":"{mdxQuery}", <mdxQuery>{mdxQuery}</mdxQuery>
"olapConnection": { <olapConnectionReference>
"olapConnectionReference": { <uri>{olapCon-
"uri": "{olapConnectionReferenceUri}" nectionReferenceUri}</uri>
</olapConnectionReference>
} </olapUnit>
}
}
application/repository.mondrianXmlaDefinition+x
application/repository.mondrianXmlaDefinition+json
ml
{ <mondrianXmlaDefinition>
{commonAttributes}, {commonAttributes}
"catalog":"{catalog}", <catalog>{catalog}</catalog>
"mondrianConnection": { <mondrianConnectionReference>
"mondrianConnectionReference": { <uri>{mon-
"uri": "{mon- drianConnectionResourceUri}</uri>
drianConnectionResourceUri}" </mondrianConnectionReference>
} </mondrianXmlaDefinition>
}
}
application/repository.adhocDataView+json The Ad Hoc view type is not fully defined yet and
application/repository.adhocDataView+xml subject to change. Ad Hoc views may be referenced
as data sources in other repository types, in which
case they are called advDataSource.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/resources?<parameters>
q String Search for resources having the specified text in the name or description.
Note that the search string does not match in the ID of resources.
folderUri String The path of the base folder for the search.
recursive true|false Indicates whether search should include all sub-folders recursively.
When omitted, the default behavior is recursive (true).
type String Match only resources of the given type. Valid types are listed in Chapter
5, “Resource Descriptors,” on page 31, for example: dataType,
jdbcDataSource, reportUnit, or file. Multiple type parameters are allowed.
Wrong values are ignored.
accessType viewed Filters the results by access events: viewed (by current user) or modified
|modified (by current user). By default, no access event filter is applied.
dependsOn /path/to/resource Searches for all resources depending on specified resource. Only data
source and reportUnit resources may be specified. If this parameter is spe-
cified, then all the other parameters except pagination are ignored.
showHidden true|false When set to true, results include nested local resources (in _files) as if
Items they were in the repository. For more information, see 4.8, “Local
Resources,” on page 28. By default, hidden items are not shown (false).
sortBy optional One of the following strings representing a field in the results to sort
String by: uri, label, description, type, creationDate, updateDate, accessTime, or
popularity (based on access events). By default, results are sorted
alphabetically by label.
limit Pagination is enabled by default, and the default limit is 100 results. If you
offset work with large repositories, you may not receive all results in a single
forceFullPage request, and you must handle pagination issues. These parameters are
forceTotalCount described in 6.2, “Paginating Search Results,” on page 47.
Note that the pagination limit is applied to raw search results before
permissions are computed. After permissions, the result set may be less
than 100. In extreme cases, the search may return only a few items, but
the search is still incomplete. In that case use forceFullPage as described
in 6.2.2, “Full Page Pagination,” on page 49, or set the limit to 0 as
described in 6.2.3, “No Pagination,” on page 50.
Options
200 OK – The body contains a list of 404 Not Found – The specified folder is not found in the
resourceLookup descriptors representing the repository.
results of the search. 204 No Content – All type values specified are invalid.
The response of a search is a set of shortened descriptors showing only the common attributes of each resource.
One additional attribute specifies the type of the resource. This allows the client to quickly receive a list of
resources for display or further processing.
application/json application/xml
[ <resources>
{ <resourceLookup>
"uri" :"/sample/resource/uri", <uri>/sample/resource/uri</uri>
"label":"Sample Label", <label>Sample Label</label>
"description": <description>Sample Description
"Sample Description", </description>
"type":"folder" <type>folder</type>
"permissionMask":"0", <permissionMask>0</permissionMask>
"creationDate": <creationDate>2013-07-04T12:18:47
"2013-07-04T12:18:47", </creationDate>
"updateDate": <updateDate>2013-07-04T12:18:47
"2013-07-04T12:18:47", </updateDate>
"version":"0" <version>0</version>
}, </resourceLookup>
... ...
] </resources>
When any folder in your repository contains more than 100 subfolders and resources, then the search
results will be paginated by default. This means you will not receive all results in a single request. In this
case, you must use the pagination parameters to obtain more pages or change the pagination strategy as
explained below.
Your application could perform further optimizations such as requesting a page and storing it before the user
requests it. That way, the results can be displayed immediately, and each page can be fetched in the background
while the user is looking at the previous page.
Pagination is complicated by the fact that JasperReports Server enforces permissions after performing the query
based on your search parameters. This means that a default search can return fewer results than a full page, but
this behavior can be configured.
There are 3 different combinations of settings that you can use for pagination.
• Default pagination - Every page may have less than a complete page of results, but this is the fastest
strategy and the easiest to implement.
• Full page pagination - Ensures that every page has exactly the number of results that you specify, but this
makes the server perform more queries, and it requires extra logic in the client.
• No pagination - Requests all search results in a single reply, which is simplest to process but can block the
caller for a noticeable delay when there are many results.
The advantages and disadvantages of each pagination strategy are described in the following sections. Choose a
strategy for your repository searches based on the types searches being performed, the user performing the
search, and the contents of your repository. Every request to the resources service can use a different pagination
strategy; it's up to your client app to use the appropriate strategy and process the results accordingly.
limit integer This defines the page size, which is maximum number of resources to return
default is 100 in each response. However, with default pagination, the response is likely
have less than this value of responses. The default limit is 100. You can set
the limit higher or lower if you want to process generally larger or smaller
pages, respectively.
offset integer By setting the offset to a whole multiple of the limit, you select a specific
page of the results. The default offset is 0 (first page). With a limit of 100,
subsequent calls should set offset=100 (second page), offset=200 (third
page), etc.
forceFullPage false (default) The default is false, so you do not need to specify this parameter.
forceTotal true|false When true, the Total-Count header is set in every paginated response,
Count which impacts performance. When false, the default, the header is set in the
first page only. Note that Total-Count is the intermediate, unfiltered count of
results, not the number of results returned by this service.
With each response, you can process the HTTP headers to help you display pagination controls:
Header Description
Result-Count This is the number of results that are contained in the current response. It can be less than or
equal to the limit.
Start-Index The Start-Index in the response is equal to the offset specified in the request. With a limit=100,
it will be 0 on the first page, 100 on the second page, etc.
Next-Offset This is the offset to request the next page. With forceFullPage=false, the Next-Offset is equi-
valent to Start-Index+limit, except on the last page. On the last page, the Next-Offset is omitted
to indicate there are no further pages.
Total-Count This is the total number of results before permissions are applied. This is not the total number
of results for this search by this user, but it is an upper bound. Dividing this number by the limit
gives the number of pages that will be required, though not every page will have the full
number of results.
As described in the previous table, this header only appears on the first response, unless
forceTotalCount=true.
limit integer Specifies the exact number of resources to return in each response. This is
default is 100 equivalent to the number of results per page. The default limit is 100. You
can set the limit higher or lower if you want to process larger or smaller
pages, respectively.
offset integer Specifies the overall offset to use for retrieving the next page of results. The
default offset is 0 (first page). For subsequent pages, you must specify the
value given by the Next-Offset header, as described in the next table.
forceFullPage true Setting this parameter to true enables full page pagination. Depending on
the type of search and user permissions, this parameter can cause sig-
nificant performance delays.
forceTotal do not use When forceFullPage is true, the Total-Count header is set in every
Count response, even if this parameter is false by default.
With each response, you must process the HTTP headers as follows:
Header Description
Result-Count This is the number of results that are contained in the current response. With full page pagin-
ation, it is equal to the limit in every response except for the last page.
Start-Index The Start-Index in the response is equal to the offset specified in the request. It changes with
every request-response.
Next-Offset The server calculates this value based on the extra queries it performed to fill the page with
permission-filtered results. In order to avoid duplicate results or skipped results, your client
must read this number and submit it as the offset in the request for the next page. When this
value is omitted from the header, it indicates there are no further pages.
Total-Count This is the total number of results before permissions are applied. This is not the total number
of results for this search by this user, but it is an upper bound.
6.2.3 No Pagination
In certain cases, you can turn off pagination. Use this for small search request that you want to process as a
whole, for example a listing of all reports in a folder. In this case, you receive and process all results in a single
response and do not need to implement the logic for pagination. You should only use this for result sets that are
known to be small.
To turn off pagination, set the pagination parameters of the resources service as follows:
limit 0 To return all results without pagination, set limit=0. Do not set limit=0 for
large searches, for example from the root of the repository, because it can
cause significant delays and return a very large number of results.
offset do not use The default offset is 0, which is the start of the single page of results.
forceFullPage do not use This setting has no meaning when there is no limit.
forceTotal do not use The Total-Count header is included in the first (and only) response. Note
Count that Total-Count is the intermediate, unfiltered count of results, not the
number of results returned by this service.
With each response, you must process the HTTP headers as follows:
Header Description
Result-Count This is the number of results contained in the current response. Thus, this header indicates
how many results you should process in the single response.
Start-Index This is 0 for a single response containing all the search results.
Total-Count This is the total number of results before permissions are applied. It is of little use.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
expanded true|false When true, all nested resources will be given as full descriptors. The default
behavior, false, has all nested resources given as references. For more
information, see 4.8, “Local Resources,” on page 28.
Options
200 OK – The response will indicate the content-type 404 Not Found – The specified resource is not found
and contain the corresponding descriptor, for in the repository.
example:
application/repository.dataType+json
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
create true|false By default, this is true, and the service will create all parent folders if they
Folders don't already exist. When set to false, the folders specified in the URL must
all exist, otherwise the service returns an error.
Content-Type Content
application/repository. A well defined descriptor of the specified type and format. See Chapter 5,
<resourceType>+json “Resource Descriptors,” on page 31
application/repository.
<resourceType>+xml
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full descriptor type and the fields or syntax of the actual descriptor.
of the resource that was just created.
With the PUT method, specify a unique new resource ID as part of the URL. For more information, see 4.1,
“Resource URI,” on page 23.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
?<parameters>
create true|false True by default, and the service will create all parent folders if they don't
Folders already exist. When set to false, the folders specified in the URL must all
exist, otherwise the service returns an error.
overwrite true|false When true, the resource given in the URL is overwritten even if it is a
different type than the resource descriptor in the content. The default is false.
Content-Type Content
application/repository. A well defined descriptor of the specified type and format. See Chapter 5,
<resourceType>+json “Resource Descriptors,” on page 31
application/repository.
<resourceType>+xml
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full descriptor type and the fields or syntax of the actual descriptor.
of the resource that was just created.
The POST method also supports a way to create complex resources and their nested resources in a single
multipart request.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
Content-Type Content
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the
confirmation, the response contains the full descriptor of content-type and the fields or syntax of the actual
the resource that was just created. descriptor.
Method URL
PATCH http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
Content-Type Content
application/json {
"version" : 0,
"patch":[
{
"field":"label",
"value":"New Label"
},
{
"field":"query",
"value":"/path/to/query/resource"
},
{
"expression":"inputControls.add(new com.jaspersoft.
jasperserver.dto.resources.ClientReference().
setUri('/datatypes/decorate'))"
}
]
}
application/xml <patchItems>
<version>0</version>
<patch>
<field>label</field>
<value>New Label</value>
</patch>
<patch>
<field>query</field>
<value>/path/to/query/resource</value>
</patch>
<patch>
<expression>inputControls.add(new com.jaspersoft.
jasperserver.dto.resources.ClientReference().
setUri('/datatypes/decorate'))
</expression>
</patch>
</patchItems>
For confirmation, the response contains the full descriptor of the 400 Bad Request – Mismatch between the
resource that was just modified. patch fields and the fields or syntax of the
actual descriptor.
409 Conflict – Old version number; the
resource was updated more recently than
the last version number received.
The patch descriptor contains attributes of the target resource. It can't be used to specify the attributes of nested
resources. However, you can apply the patch operation directly to the local resource in the hidden _files folder.
If your client does not support the PATCH method, use the POST method and specify the following HTTP
header:
X-HTTP-Method-Override: PATCH
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
?<parameters>
create true|false True by default, and the service will create all parent folders if they don't
Folders already exist. When set to false, the folders specified in the URL must all
exist, otherwise the service returns an error.
overwrite true|false When true, the target resource given in the URL is overwritten even if it is a
different type than the resource descriptor in the content. The default is false.
Options
201 Created – The request was successful and, for 404 Not Found – When the {resourceSourceUri} is not
confirmation, the response contains the full descriptor valid.
of the resource that was just copied.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
?<parameters>
create true|false True by default, and the service will create all parent folders if they don't
Folders already exist. When set to false, the folders specified in the URL must all
exist, otherwise the service returns an error.
overwrite true|false When true, the target resource given in the URL is overwritten even if it is a
different type than the resource descriptor in the content. The default is false.
Options
201 Created – The request was successful and, for 404 Not Found – When the {resourceSourceUri} is not
confirmation, the response contains the full descriptor valid.
of the resource that was just moved.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
204 No Content – The request was successful and 404 Not Found – When the resource path or ID is not
there is no descriptor to return. valid.
To delete multiple resources at once, specify multiple URIs with the resourceUri parameter.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/resources?resourceUri={uri}&...
resourceUri string Specifies a resource to delete. Repeat this parameter to delete multiple
resources.
204 No Content – The request was successful and 404 Not Found – When the resourceUri is not valid.
there is no descriptor to return.
pdf application/pdf
html text/html
xls application/xls
rtf application/rtf
csv text/csv
ods application/vnd.oasis.opendocument.spreadsheet
odt application/vnd.oasis.opendocument.text
txt text/plain
docx application/vnd.openxmlformats-officedocument.wordprocessingml.
document
xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
font font/*
img image/*
jrxml application/jrxml
jar application/zip
prop application/properties
jrtx application/jrtx
xml application/xml
css text/css
accessGrantSchema application/accessGrantSchema
olapMondrianSchema application/olapMondrianSchema
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/file/resource
Options
accept: application/repository.file+json
accept: application/repository.file+xml
200 OK – The response will contain the file resource 404 Not Found – The specified resource is not found
descriptor. in the repository.
The type attribute of the file resource descriptor indicates the format of the contents. However, you can also
download the binary file contents directly, with the format indicated by the MIME content-type of the response:
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/file/resource
200 OK – The response content-type will indicate the 404 Not Found – The specified resource is not found
MIME type of the binary contents. See Table 7-1, in the repository.
“MIME Types for File Contents,” on page 59 for the
list of MIME types that correspond to file resource
types.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
create true|false True by default, and the service will create all parent folders if they don't
Folders already exist. When set to false, the folders specified in the URL must all
exist, otherwise the service returns an error.
Content-Type Content
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full type and the fields or syntax of the actual descriptor.
descriptor of the resource that was just created.
You can also create a file resource with a multipart form request. The request parameters contain information
that becomes the name and description of the new file resource.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
Content-Type Content
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full descriptor type and the fields or syntax of the actual descriptor.
of the resource that was just created.
Another form allows you to create a file resource by direct streaming, without needing to create it first as a
descriptor object. In this case, the required fields of the file descriptor are specified in HTTP headers.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/folder
Options
Content-Description: <file-description> – Becomes the description field of the created file resource
Content-Disposition: attachment; filename=<filename> – Becomes the name of the file resource
Content-Type Content
{MIME type} The MIME type from Table 7-1, “MIME Types for File Contents,” on
page 59 that corresponds to the desired file type. The body of the request
then contains the binary data representation of that file format.
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full descriptor type and the fields or syntax of the actual descriptor.
of the resource that was just created.
The simplest way is to PUT a file descriptor containing the new file in base64 encoding. This new definition of
the file resource overwrites the previous one.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
Content-Type Content
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full type and the fields or syntax of the actual descriptor.
descriptor of the resource that was just created.
The second method allows you to update a file resource by direct streaming. You can specify the Content-
Description and Content-Disposition headers to update the resource description or name, respectively.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/resources/path/to/resource
Options
Content-Description: <file-description> – Becomes the description field of the created file resource
Content-Disposition: attachment; filename=<filename> – Becomes the name of the file resource
Content-Type Content
{MIME type} The MIME type from Table 7-1, “MIME Types for File Contents,” on
page 59 that corresponds to the desired file type. The body of the request
then contains the binary data representation of that file format.
201 Created – The request was successful and, for 400 Bad Request – Mismatch between the content-
confirmation, the response contains the full descriptor type and the fields or syntax of the actual descriptor.
of the resource that was just created.
This chapter explains the limited interaction with Domains that is available through the REST API. The
metadata service retrieves the display layer of a Domain containing sets and items and their labels. You can also
retrieve the full Domain schema and security files through the resources service, but the API provides no
functionality to parse these.
This chapter includes the following sections:
• The metadata Service
• Fetching a Domain Schema
• Fetching Domain Bundles and Security Files
A limitation of the metadata service only allows it to operate on Domains with a single data island. A data
island is a group of fields that are all related by joins between the database tables in the Domain. Fields
that belong to tables that are not joined in the Domain belong to separate data islands.
If your Domain contains localization bundles you can specify a locale and an optional alternate locale and
preference (called q-value, a decimal between 0 and 1).
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/domains/path/to/Domain/metadata
Options
200 OK – The body is XML containing the list of 404 Not Found – The specified Domain URI is not
resourceDescriptors. found in the repository. This service also returns an
XML errorDescriptor giving a human-readable
error message.
The response of the metadata service is an XML or JSON structure that describes the sets and items available in
the selected Domain. This metadata includes the localized labels for the sets and items, as well as the datatypes
of the items. The resourceId of the sets and items are internal to the Domain and not meaningful or otherwise
useable.
For more information about Domains, refer to the JasperReports Server User Guide.
The following example shows the JSON response for a Domain with:
• A set named expense containing:
• An item named Exp Date of type Date
• An item named Amount of type BigDecimal
• A set named store containing:
• An item named Store Type of type String
• ...
{
"rootLevel": {
"id":"root",
"subLevels":[
{
"id":"expense_join",
"label":"expense",
"properties": {
"resourceId": "expense_join"
},
"items":[
{
"id":"ej_expense_fact_exp_date",
"label":"Exp Date",
"properties": {
"JavaType": "java.sql.Date",
"resourceId": "expense_join.e.exp_date"
}
},
{
"id":"ej_expense_fact_amount",
"label":"Amount",
"properties": {
"JavaType": "java.math.BigDecimal",
"resourceId": "expense_join.e.amount"
}
}
]
},
{
"id":"expense_join_store",
"label":"store",
"properties": {
"resourceId":"expense_join"
},
"items":[
{
"id":"ej_store_store_type",
"label":"Store Type",
"properties": {
"JavaType": "java.lang.String",
"resourceId": "expense_join.s.store_type"
}
},
...
]
}
]
}
}
The following example shows the same Domain as returned by the metadata service in XML format:
<key>resourceId</key>
<value>expense_join.e.exp_date</value>
</entry>
</properties>
</item>
<item>
<id>ej_expense_fact_amount</id>
<label>Amount</label>
<properties>
<entry>
<key>JavaType</key>
<value>java.math.BigDecimal</value>
</entry>
<entry>
<key>resourceId</key>
<value>expense_join.e.amount</value>
</entry>
</properties>
</item>
</items>
</subLevel>
<subLevel>
<id>expense_join_store</id>
<label>store</label>
<properties>
<entry>
<key>resourceId</key>
<value>expense_join</value>
</entry>
</properties>
<items>
<item>
<id>ej_store_store_type</id>
<label>Store Type</label>
<properties>
<entry>
<key>JavaType</key>
<value>java.lang.String</value>
</entry>
<entry>
<key>resourceId</key>
<value>expense_join.s.store_type</value>
</entry>
</properties>
</item>
...
</items>
</subLevel>
</subLevels>
</rootLevel>
</domainMetadata>
</bundle>
<bundle>
<fileReference><uri>/organizations/organization_1/Domains/supermartDomain_files/supermart_
domain_zh_CN.properties</uri></fileReference>
<locale>zh_CN</locale>
</bundle>
</bundles>
<schemaFileReference>
<uri>/organizations/organization_1/Domains/supermartDomain_files/supermartDomain_schema</uri>
</schemaFileReference>
<securityFileReference>
<uri>/organizations/organization_1/Domains/supermartDomain_files/supermartDomain_domain_secur-
ity</uri>
</securityFileReference>
</semanticLayerDataSource>
Use the following request to access the Domain schema file inside the Domain resource:
GET http://<host>:<port>/jasperserver-pro/rest_v2/resources/Domains/supermartDomain_
files/supermartDomain_schema
The Domain schema is an XML file with a structure explained in the JasperReports Server User Guide. If you
wish to modify the schema programmatically, you must write your own parser to access its fields and
definitions. You can then replace the schema file in the Domain with one of the file updating methods
described in 7.3, “Uploading File Resources,” on page 61.
Recipients are listed when viewing permissions, and they are also used to set a permission. A recipient can be
specified in a URL parameter when allowed, but in this case, the slash (/) character must be encoded as %2F.
There are two qualities of a permission:
• The assigned permission is one that is set explicitly for a given resource and a given user or role. Not all
permissions are assigned, in which case the permission is inherited from the parent folder.
• The effective permission is the permission that is being enforced, whether it is assigned or inherited.
There is one permission that is not defined: you cannot read or write the permission for ROLE_
SUPERUSER on the root .
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource/?<arguments>
effective Boolean When set to true, the effective permissions are returned. By default, this
Permissions optional argument is false and only assigned permissions are returned.
recipientType String Either user or role. When not specified, the recipient type is the role.
optional
recipientId String Id of the user or role. In environments with multiple organizations, specify
optional the organization as %2F<orgID>%2F<recipientID> (%2F is the / character).
resolveAll Boolean When set to true, shows the effective permissions for all users and all roles.
optional
Options
200 OK – The body describes the requested 400 Bad Request – When the recipient type is invalid.
permissions for the resource. 404 Not Found – When the specified resource URI is
not found in the repository or the recipient ID cannot
be resolved.
For example, the following request shows all permission for a resource, similar to the permissions dialog in the
user interface:
GET http://localhost:8080/jasperserver-pro/rest_v2/permissions/public?resolveAll=true
<permissions>
<permission>
<mask>0</mask>
<recipient>user:/anonymousUser</recipient>
</permission>
<permission>
<mask>0</mask>
<recipient>user:/organization_1/CaliforniaUser</recipient>
</permission>
...
<permission>
<mask>2</mask>
<recipient>role:/ROLE_USER</recipient>
<uri>/public</uri>
</permission>
</permissions>
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource;recipient=
<recipient>
recipient string The recipient format specifies user or role, the object ID, and the
required organization ID if necessary. The slash character must be encoded, for
example:
user:%2Forganization_1%2Fjoeuser
Options
200 OK – The body describes the requested 404 Not Found – When the specified resource URI or
permission. recipient is invalid, or when the recipient does not
have any assigned permission (only inherited ).
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions
Content-Type Content
201 Created – The request was successful. 400 Bad Request – A permission is already
assigned or the given permission mask is invalid.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource
Content-Type Content
200 OK – The request was successful. 400 Bad Request – If a recipient or mask is
invalid.
404 Not Found – If the resource in the URL
is invalid.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions
Content-Type Content
application/json A JSON object that describes a single permission on a single resource, for
example:
{
"uri":"/properties",
"recipient":"role:/ROLE_USER",
"mask":"1"
}
201 Created – The request was successful. 400 Bad Request – The permission is already
assigned or the given mask is invalid.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource;recipient=
<recipient>
recipient string The recipient format specifies user or role, the organization if necessary,
required and the object ID. The slash characters must be encoded, for example:
user:%2Forganization_1%2Fjoeuser
Content-Type Content
application/json A JSON object that describes only the mask, for example:
{
"uri": null,
"recipient": null,
"mask":"2"
}
200 OK – The request was successful, and the 400 Bad Request – If the mask is invalid.
response body contains the single permission that 404 Not Found – If the resource or the recipient in the
was modified. URL is invalid.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource
204 No Content – The request was successful. 404 Not Found – If the resource in the URL is invalid.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/permissions/path/to/resource;recipient=
<recipient>
recipient string The recipient format specifies user or role, the organization if necessary,
required and the object ID. The slash characters must be encoded, for example:
user:%2Forganization_1%2Fjoeuser
204 No Content – The request was successful. 404 Not Found – If the resource or the recipient in the
URL is invalid.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/export/
Content-Type Content
200 OK – Returns a JSON object that gives the ID of 401 Unauthorized – Export is available only to the
the running export operation. system admin user (superuser).
{
"roles": ["ROLE_USER","ROLE_MANAGER|organization_1"],
"users": ["superuser","joeuser|organization_1"],
"uris": ["/public/Samples/Reports/AllAccounts",
"/organizations/organization_1/reports/Survey/Survey_Data"]
"parameters": ["role-users", "repository-permissions"]
}
As shown above, commercial editions must use the organization syntax for all roles, users, and URIs.
The following table describes the options you can list in the request.
roles A list of role names to export. Specify the role-users parameter to also
export all users who have these roles.
scheduledJobs A list of report URIs for which all scheduled jobs are exported. If you
specify a folder URIs, the scheduled jobs for all reports in the folder,
recursively, are exported.
resourceTypes A list of resource types that filters any selected resources for export.
When omitted, all resources specified by URI or folder URI are
exported. When specified, only the resource types in this list are
exported.
The following table describes the export parameters that can be specified in the parameters option:
role-users When this option is present, each role export triggers the export of all
users belonging to that role. This option should only be used if roles
are specified.
skip-dependent-resources When specified, only the resources specified by URIs are exported,
no dependent resources such as data sources, queries, or files
included by reference are exported. This will create broken
dependencies during import unless the same dependencies already
exist in the same relative locations in the destination.
skip-suborganizations When specified, the export will omit all the items such as roles, users,
and resources that belong to suborganizations, even if they are
directly specified using the corresponding options. When no
organization ID is specified, this flag applies to the root such that no
top-level organizations are included in the export, only the contents of
the root.
include-attributes Includes all attributes that are associated with a item being exported,
such as a user, an organization, or the root.
include-server-settings When specified, the configuration and security settings on the server
are exported. When imported into another server, these settings will
take effect immediately.
include-access-events When this option is present, access events (date, time, and user
name of last modification) are exported along with each exported
folder and resource. This option should only be used if URIs are
specified.
include-audit-events Include audit data for all resources and users in the export. The audit
feature must be enabled in the server configuration.
The body of the response contains the ID of the export operation needed to check its status and later download
the file:
{
"id": "njkhfs8374",
"phase": "inprogress",
"message": "Progress..."
}
The response may also warn you of any broken dependencies in the export that may affect a future import
operation:
{
"id": "njkhfs8374",
"phase": "inprogress",
"message": "Progress..."
"warnings": [
{
"code": "export.broken.dependency",
"message":"Resource with broken dependencies",
"parameters": [
"path_to_broken_resource"]
}, ...
]
}
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/export/<export-id>/state
200 OK – Returns a JSON object that gives the 404 Not Found – When the specified export ID is not
current state of the export operation. found.
The body of the response contains the current state of the export operation:
{
{ {
"phase": "failure",
"phase": "inprogress", "phase": "ready",
"message": "Not enough space on
"message": "Progress..." "message": "Ready!"
disk"
} }
}
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/export/<export-id>/<fileName>
200 OK – Returns the exported catalog as a zip file 404 Not Found – When the specified export ID is not
with the given <fileName>. found.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/export/<export-id>
204 No Content – The specified export operation was 404 Not Found – When the specified export ID is not
canceled. found.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/import?<arguments>
update? true Resources in the catalog replace those in the repository if their URIs
and types match.
skipUserUpdate? true When used with update=true, users in the catalog are not imported or
updated. Use this option to import catalogs without overwriting currently
defined users.
broken skip Defines the strategy when importing a resource with broken
Dependencies? include dependencies. The default value is fail.
fail • skip – The resource with broken dependency won't be imported, but
the import operation will continue.
• include – Attempts to import the resource by resolving
dependencies with local resources. If unsuccessful, this resource is
skipped.
• fail – The import operation will stop and return an error.
organization? orgID Destination organization for importing. The file being imported must
have been exported from an organization, not the root of the server. If
this argument is not specified, the organization of the user performing
the operation is used.
merge true When importing from one organization into a different organization,
Organization? specify this argument. The resulting organization takes its ID from the
import file. If organization IDs of import and destination do not match,
and this argument is not specified, the operation stops with an error.
skipThemes? true When this argument is specified, any themes in the import other than
the default theme is ignored. Use this argument when importing
catalogs from servers before release 5.5 whose themes are
incompatible.
includeAccess true Restores the date, time, and user name of last modification if they are
Events? included in the catalog to import.
includeAudit true Imports audit events if they are included in the catalog.
Events?
includeMonitoring true Imports audit events if they are included in the catalog.
Events?
includeServer true Imports server settings if they are included in the catalog.
Setting?
Content-Type Content
200 OK – Returns a JSON object that indicates the import 401 Unauthorized – Import is available only to the
was a success. system admin user (superuser).
The body of the response contains the ID of the import operation needed to check its status:
<state>
<id>2cc871ee-4645-4be0-b5b4-7d7c45c561cb</id>
<message>Import in progress.</message>
<phase>inprogress</phase>
</state>
To check the status of the import, use its ID in the following method:
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/import/<import-id>/state
200 OK – The body of the response gives the current 404 Not Found – When the specified import ID is not
state of the import operation. found.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/
path/to/report.<format>?<arguments>
<format> output One of the following formats: pdf, html, xls, xlsx, rtf, csv, xml, docx, odt, ods,
type jrprint.
As of JasperReports Server 6.0, it is also possible to specify json if your
reports are designed for data export. For more information, see the
JasperReports Library samples documentation.
ignore Boolean When set to true, the report will be generated as a single page. This can be
pagination? useful for some formats such as csv. When omitted, this argument's default
value is false and the report is paginated normally.
<inputControl> String Any input control that is defined for the report. Input controls that are multi-
select may appear more than once. See examples below.
interactive? Boolean In a commercial editions of the server where HighCharts are used in the
report, this property determines whether the JavaScript necessary for
interaction is generated when exporting to HTML. By default it is true. If set to
false, the chart is generated as a non-interactive image file.
onePage Boolean Valid only for the XLS format. When true, each page of the report is on a
PerSheet? separate spreadsheet. When false or omitted, the entire report is on a single
spreadsheet. If your reports are very long, set this argument to true, otherwise
the report will not fit on a single spreadsheet and cause an error.
baseUrl String Specifies the base URL that the report will use to load static resources such
as JavaScript files. You can also set the deploy.base.url property in the
.../WEB-INF/js.config.properties file to set this value permanently. If both are
set, the baseUrl parameter in this request takes precedence.
200 OK – The content is the requested file. 404 Not Found – When the specified
report URI is not found in the
repository.
The follow examples show various combinations of formats, arguments, and input controls:
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/AllAccounts.html (all pages)
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/AllAccounts.html?page=43
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/AllAccounts.pdf (all pages)
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/AllAccounts.pdf?page=1
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/EmployeeAccounts.html?
EmployeeID=sarah_id
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/Cascading_multi_select_report.html?
Country_multi_select=USA&Cascading_state_multi_select=WA&Cascading_state_multi_select=CA
JasperReports Server does not support exporting Highcharts charts with background images to PDF,
ODT, DOCX, or RTF formats. When exporting or downloading reports with Highcharts that have
background images to these formats, the background image is removed from the chart. The data in the
chart is not affected.
This syntax of the reports service is deprecated. See Chapter 13, “The reportExecutions Service,”
on page 91.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports?<arguments>
jobID? String Find the running report based on its jobID in the scheduler.
jobLabel? String Find the running report based on its jobLabel in the scheduler.
userName? String Name of user who has scheduled a report, in the format
<username>%7C<organizationID>. In the commercial editions,
%7C<organizationID> is required for all users except system admins
(superuser).
fireTime date/time Date and time in the following pattern: yyyy-MM-dd'T'HH:mmZ. Together,
From? these arguments create a time range to find when the running report was
started. Both of the range limits are inclusive. Either argument may be null to
fireTimeTo? date/time signify an open-ended range.
200 OK – The content is a list of execution IDs that 404 Not Found – When the specified report URI is not
can be used for cancellation. found in the repository.
For security purposes, the search for running reports is has the following restrictions:
• The system administrator (superuser) can see and cancel any report running on the server.
• An organization admin (jasperadmin) can see every running report, but can cancel only the reports that
were started by a user of the same organization or one of its child organizations.
• A regular user can see every running report, but can cancel only the reports that he initiated.
This syntax of the reports service is deprecated. See Chapter 13, “The reportExecutions Service,”
on page 91.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/<executionID>/status/
Content-Type Content
200 OK – The content also contains: 204 No Content – When the specified execution ID is
<status>cancelled</status>. not found on the server, and the response body is
empty.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions
Content-Type Content
200 OK – The content contains a ReportExecution 403 Forbidden – When the logged-in user does not
descriptor. See below for an example have permission to access the report in the request.
404 Not Found – When the report URI specified in the
request does not exist.
<reportExecutionRequest>
<reportUnitUri>/supermart/details/CustomerDetailReport</reportUnitUri>
<async>true</async>
<freshData>false</freshData>
<saveDataSnapshot>false</saveDataSnapshot>
<outputFormat>html</outputFormat>
<interactive>true</interactive>
<ignorePagination>false</ignorePagination>
<pages>1-5</pages>
<parameters>
<reportParameter name="someParameterName">
<value>value 1</value>
<value>value 2</value>
</reportParameter>
<reportParameter name="someAnotherParameterName">
<value>another value</value>
</reportParameter>
</parameters>
</reportExecutionRequest>
The following table describes the properties you can specify in the ReportExecutionRequest:
Table 13-1 Report Execution Properties
reportUnitUri Required Repository path (URI) of the report to run. For commercial editions
with organizations, the URI is relative to the logged-in user’s
organization.
outputFormat Required Specifies the desired output format: pdf, html, xls, xlsx, rtf, csv, xml,
docx, odt, ods, jrprint.
As of JasperReports Server 6.0, it is also possible to specify json if
your reports are designed for data export. For more information,
see the JasperReports Library samples documentation.
freshData false When data snapshots are enabled, specifies whether the report
should get fresh data by querying the data source or if false, use a
previously saved data snapshot (if any). By default, if a saved data
snapshot exists for the report it will be used when running the
report.
saveDataSnapshot false When data snapshots are enabled, specifies whether the data
snapshot for the report should be written or overwritten with the
new data from this execution of the report.
interactive true In a commercial editions of the server where HighCharts are used
in the report, this property determines whether the JavaScript
necessary for interaction is generated and returned as an
attachment when exporting to HTML. If false, the chart is generated
as a non-interactive image file (also as an attachment).
allowInlineScripts true Affects HTML export only. If true, then inline scripts are allowed, oth-
erwise no inline script is included in the HTML output.
ignorePagination Optional When set to true, the report is generated as a single long page.
This can be used with HTML output to avoid pagination. When
omitted, the ignorePagination property on the JRXML, if any, is
used.
pages Optional Specify a page range to generate a partial report. The format is:
<startPageNumber>-<endPageNumber>
attachmentsPrefix attachments For HTML output, this property specifies the URL path to use for
downloading the attachment files (JavaScript and images). The full
path of the default value is:
{contextPath}/rest_v2/reportExecutions/{reportExecutionId}/exports/
{exportExecutionId}/attachments/
You can specify a different URL path using the placeholders
{contextPath}, {reportExecutionId}, and {exportExecutionId}.
baseUrl String Specifies the base URL that the report will use to load static
resources such as JavaScript files. You can also set the deploy.-
base.url property in the .../WEB-INF/js.config.properties file to set
this value permanently. If both are set, the baseUrl parameter in this
request takes precedence.
parameters see example A list of input control parameters and their values.
When successful, the reply from the server contains the reportExecution descriptor. This descriptor contains
the request ID and status needed in order for the client to request the output. There are two statuses, one for the
report execution itself, and one for the chosen output format. The following descriptor shows that the report is
still executing (<status>execution</status>).
<reportExecution>
<currentPage>1</currentPage>
<exports>
<export>
<id>html</id>
<status>queued</status>
</export>
</exports>
<reportURI>/supermart/details/CustomerDetailReport</reportURI>
<requestId>f3a9805a-4089-4b53-b9e9-b54752f91586</requestId>
<status>execution</status>
</reportExecution>
The value of the async property in the request determines whether or not the report output is available when
the response is received. Your client should implement either synchronous or asynchronous processing of the
response depending on the value you set for the async property.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID/status/
accept: <status>
<errorDescriptor>
application/status+xml
<errorCode>input.controls.validation.error</errorCode>
<message>Input controls validation failure</message>
<parameters>
<parameter>Specify a valid value for type Integer.
</parameter>
</parameters>
</errorDescriptor>
<value>failed</value>
</status>
accept: {
"value": "failed",
application/status+json
"errorDescriptor": {
"message": "Input controls validation failure",
"errorCode": "input.controls.validation.error",
"parameters": ["Specify a valid value for type Integer."]
}
}
200 OK – The content contains the report status, as shown above. 404 Not Found – When the specified
In the extended format, error reports contain error messages requestID does not exist.
suitable for display.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID
Options
accept: application/xml
accept: application/json
200 OK – The content contains a ReportExecution 404 Not Found – When the request ID specified in the
descriptor. See below for an example. request does not exist.
The reportExecution descriptor now contains the list of exports for the report, including the report output
itself and any other file attachments. File attachments such as images and JavaScript occur only with HTML
export.
{
"status": "ready",
"totalPages": 47,
"requestId": "b487a05a-4989-8b53-b2b9-b54752f998c4",
"reportURI": "/reports/samples/AllAccounts",
"exports": [{
"id": "195a65cb-1762-450a-be2b-1196a02bb625",
"options": {
"outputFormat": "html",
"attachmentsPrefix": "./images/",
"allowInlineScripts": false
},
"status": "ready",
"outputResource": {
"contentType": "text/html"
},
"attachments": [{
"contentType": "image/png",
"fileName": "img_0_46_0"
},
{
"contentType": "image/png",
"fileName": "img_0_0_0"
},
{
"contentType": "image/jpeg",
"fileName": "img_0_46_1"
}]
},
{
"id": "4bac4889-0e63-4f09-bbe8-9593674f0700",
"options": {
"outputFormat": "html",
"attachmentsPrefix": "{contextPath}/rest_v2/reportExecutions/{reportExecutionId}/exports/
{exportExecutionId}/attachments/",
"baseUrl": "http://localhost:8080/jasperserver-pro",
"allowInlineScripts": true
},
"status": "ready",
"outputResource": {
"contentType": "text/html"
},
"attachments": [{
"contentType": "image/png",
"fileName": "img_0_0_0"
}]
}]
}
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_
v2/reportExecutions/requestID/exports/exportID/outputResource
output-final As of JasperReports Server 5.6, this value indicates whether the output is in
its final form or not. When false, report items such as total page count are not
finalized, but output is available early. You should reload the output
resource again until this value is true.
200 OK – The content is the main output of the report, 404 Not Found – When the request ID specified in the
in the format specified by the contentType property request does not exist.
of the outputResource descriptor, for example:
text/html
For example, to download the main HTML of the report execution response above, use the following URL:
GET http://localhost:8080/jasperserver-pro/rest_v2/reportExecutions/b487a05a-4989-8b53-b2b9-
b54752f998c4/exports/195a65cb-1762-450a-be2b-1196a02bb625/outputResource
JasperReports Server does not support exporting Highcharts charts with background images to PDF,
ODT, DOCX, or RTF formats. When exporting or downloading reports with Highcharts that have
background images to these formats, the background image is removed from the chart. The data in the
chart is not affected.
To download file attachments for HTML output, use the following method. You must download all attachments
to display the HTML content properly. The given URL is the default path, but it can be modified with the
attachmentsPrefix property in the reportExecutionRequest, as described in Table 13-1, “Report
Execution Properties,” on page 92.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_
v2/reportExecutions/requestID/exports/exportID/attachments/fileName
200 OK – The content is the attachment in the format 404 Not Found – When the request ID specified in the
specified in the contentType property of the request does not exist.
attachment descriptor, for example:
image/png
For example, to download the one of the images for the HTML report execution response above, use the
following URL:
GET http://localhost:8080/jasperserver-pro/rest_v2/reportExecutions/912382875_1366638024956_
2/exports/html/attachments/img_0_46_0
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID/exports/
Content-Type Content
application/xml Send an export descriptor in either XML or JSON format to specify the format
application/json and details of your request. For example:
<export>
<outputFormat>html</outputFormat>
<pages>10-20</pages>
<attachmentsPrefix>./images/</attachmentsPrefix>
</export>
Options
200 OK – The content contains an exportExecution 404 Not Found – When the request ID
descriptor. See below for an example. specified in the request does not exist.
The following example shows the exportExecution descriptor that the server sends in response to the export
request:
<exportExecution>
<id>html;attachmentsPrefix=./images/</id>
<status>ready</status>
<outputResource>
<contentType>text/html</contentType>
</outputResource>
</exportExecution>
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID/parameters
freshData default=true When data snapshots are enabled, new parameters must force the server to
get fresh data by querying the data source. This overrides the default in
Table 13-1, “Report Execution Properties,” on page 92.
Media-Type Content
application/json [
{
"name":"someParameterName",
"value":["value 1", "value 2"]
},
{
"name":"someAnotherParameterName",
"value":["another value"]
}
]
application/xml <reportParameters>
<reportParameter name="Country_multi_select">
<value>Mexico</value>
</reportParameter>
<reportParameter name="Cascading_state_multi_select">
<value>Guerrero</value>
<value>Sinaloa</value>
</reportParameter>
</reportParameters>
204 No Content – There is no content to return. 404 Not Found – When the request ID
specified in the request does not exist.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID/exports/
exportID/status
accept: <status>
<errorDescriptor>
application/status+xml
<errorCode>input.controls.validation.error</errorCode>
<message>Input controls validation failure</message>
<parameters>
<parameter>Specify a valid value for type Integer.</parameter>
</parameters>
</errorDescriptor>
<value>failed</value>
</status>
accept: {
"value": "failed",
application/status+json
"errorDescriptor": {
"message": "Input controls validation failure",
"errorCode": "input.controls.validation.error",
"parameters": ["Specify a valid value for type Integer."]
}
}
200 OK – The content contains the export status, as shown above. In 404 Not Found – When the specified
the extended format, error reports contain error messages suitable request ID does not exist.
for display.
For example, to get the status of the HTML export in the previous example, use the following URL:
GET http://localhost:8080/jasperserver-pro/rest_v2/reportExecutions/912382875_1366638024956_
2/exports/html/status
When the status is "ready" your client can download the new export output and any attachments as described in
13.4, “Requesting Report Output,” on page 97. For example:
GET http://localhost:8080/jasperserver-pro/rest_v2/reportExecutions/912382875_1366638024956_
2/exports/html/outputResource
GET http://localhost:8080/jasperserver-pro/rest_v2/reportExecutions/912382875_1366638024956_
2/exports/html/images/img_0_46_0
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions?<arguments>
reportURI Optional This string matches the repository URI of the running report, relative the
String currently logged-in user’s organization.
jobID Optional For scheduler jobs, this argument matches the ID of the job that triggered
String the running report.
jobLabel Optional For scheduler jobs, this argument matches the name of the job that
String triggered the running report.
userName Optional For scheduler jobs, this argument matches the user ID that created the job.
String
fireTimeFrom Optional For scheduler jobs, the fire time arguments define a range of time that
Date/Time matches if the job that is currently running was triggered during this time.
You can specify either or both of the arguments. Specify the date and time
fireTimeTo
in the following pattern: yyyy-MM-dd'T'HH:mmZ.
Options
The response contains a list of summary reportExecution descriptors, for example in XML:
<reportExecutions>
<reportExecution>
<reportURI>repo:/supermart/details/CustomerDetailReport</reportURI>
<requestId>2071593484_1355224559918_5</requestId>
</reportExecution>
</reportExecutions>
Given the request ID, you can obtain more information about each result by downloading the full
reportExecution descriptor, as described in 13.3, “Requesting Report Execution Details,” on page 95.
For security purposes, the search for running reports is has the following restrictions:
• The system administrator (superuser) can see and cancel any report running on the server.
• An organization admin (jasperadmin) can see every running report, but can cancel only the reports that
were started by a user of the same organization or one of its child organizations.
• A regular user can see every running report, but can cancel only the reports that he initiated.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/reportExecutions/requestID/status/
Content-Type Content
application/xml Send a status descriptor in either XML or JSON format with the value
application/json cancelled. For example:
XML: <status>cancelled</status>
JSON: { "value": "cancelled" }
Options
200 OK – When the report execution was successfully 404 Not Found – When the request ID specified in the
stopped, the server replies with the same status: request does not exist.
XML: <status>cancelled</status>
JSON: { "value": "cancelled" }
204 No Content – When the report specified by the
request ID is not running, either because it finished
running, failed, or was stopped by another process.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/inputControls/
Options
accept: application/json
200 OK – The content is a JSON object that describes 404 Not Found – When the specified report URI is not
the input control structure. See example below. found in the repository.
The body of the response contains the structure of the input controls for the report. This structure contains the
information needed by your application to display the input controls to your users and allow them to make a
selection. In particular, this includes any cascading structure as a set of dependencies between input controls.
Each input control also has a type that indicates how the user should be allowed to make a choice:
bool singleValue
singleSelect singleValueText
singleSelectRadio singleValueNumber
multiSelectCheckbox singleValueDate
multiSelect singleValueDatetime
singleValueTime
The following example shows a response in the JSON format:
{
"inputControl" : [ {
"id":"Cascading_name_single_select",
"label":"Cascading name single select",
"mandatory":"true",
"readOnly":"false",
"type":"singleSelect",
"uri":"repo:/reports/samples/Cascading_multi_select_report_files/Cascading_name_single_select",
"visible":"true",
"masterDependencies":{"controlId":["Country_multi_select","Cascading_state_multi_
select"]},
"slaveDependencies":null,
"validationRules": [{ ... }]
"dataType": {
"type": "number",
"maxValue": "20",
"strictMax": true,
"minValue": "5",
"strictMin": true
}
"state": {
"uri": "/reports/samples/Cascading_multi_select_report_files/
Cascading_name_single_select",
"id": "Cascading_name_single_select",
"value": null,
"options": [{
"selected": false,
"label": "A & U Jaramillo Telecommunications, Inc",
"value": "A & U Jaramillo Telecommunications, Inc"
}, ... ]} }
},
...
]}
The structure includes a set of validation rules for each input control. These rules indicate what type of
validation your client should perform on input control values it receives from your users, and if the validation
fails, the message to display. Depending on the type of the input control, the following validations are possible:
• mandatoryValidationRule – This input is required and your client should ensure the user enters a value.
• dateTimeFormatValidation – This input must have a data time format and your client should ensure the user
enters a valid date and time.
The following sample shows the structure of these two possible validation rules.
"validationRules": [{
"mandatoryValidationRule" : {
"errorMessage" : "This field is mandatory so you must enter data."
},
"dateTimeFormatValidationRule" : {
"errorMessage" : "Specify a valid date value.",
"format" : "yyyy-MM-dd"
}
}]
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/inputControls/values/
Options
accept: application/json
200 OK – The content is a JSON object that describes 404 Not Found – When the specified report URI is not
the input control values and selection. found in the repository.
The body of the response contains the structure of the input controls for the report. The following example
shows a response in the JSON format:
{
"inputControlState" : [ {
"uri" : "/reports/samples/.../Country_multi_select",
"value" : "",
"options" : {
"label" : "Canada",
"selected" : "false",
"value" : "Canada"
}, {
"label" : "Mexico",
"selected" : "false",
"value" : "Mexico"
}, {
"label" : "USA",
"selected" : "true",
"value" : "USA"
}
},
...
]
}
If a selection-type input control has a null value, it is given as ~NULL~. If no selection is made, its
value is given as ~NOTHING~.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/inputControls/<ic1>;
<ic2>;.../values/
Content-Type Content
application/json A JSON object that lists your selected values. The value of every input control is
given as an array of string values, even for single-select controls or multi-select
controls with a single value. See also the example below:
{
"boolean-input-control" : ["true"],
"integer-input-control" : ["123456"],
"single-select-input-control" : ["some value"],
"multiple-select-input-control-1" : ["another value"],
"multiple-select-input-control-2" : ["first", "second", "third"]
}
Options
accept: application/json
200 OK – The content is a JSON object that describes the new 404 Not Found – When the specified
selection of input control values. report URI is not found in the repository.
Assuming the client receives the response given in 14.2, “Listing Input Control Values,” on page 107, it can
send the following request body:
{
"Country_multi_select":["Mexico"],
"Cascading_state_multi_select":["Guerrero", "Sinaloa"]
}
When specifying the option for the JSON format, the server’s response is:
{
"inputControlState" : [ {
"uri" : "/reports/samples/.../Country_multi_select",
"value" : "",
"options" : {
"label" : "Canada",
"selected" : "false",
"value" : "Canada"
}, {
"label" : "Mexico",
"selected" : "true",
"value" : "Mexico"
}, {
"label" : "USA",
"selected" : "false",
"value" : "USA"
}
},
...
]
}
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/options/
Options
accept: application/json
200 OK – The content is a JSON object that lists the 404 Not Found – When the specified report URI is not
names of the report options for the given report. found in the repository.
The body of the response contains the labels of the report options, for example:
{
"reportOptionsSummary": [{
"uri": "/reports/samples/Options",
"id": "Options",
"label": "Options"
},
{
"uri": "/reports/samples/Options_2",
"id": "Options_2",
"label": "Options 2"
}]
}
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/options?<arguments>
overwrite? true / false If true, any report option that has the same label is replaced. If false or
omitted, any report option with the same label will not be replaced.
Content-Type Content
application/json A JSON object that lists the input control selections. See example below.
Options
accept: application/json
200 OK – The content is a JSON object that describes 404 Not Found – When the specified report URI is not
the new selection of input control values. found in the repository.
In this example, we create new options for the sample report named Cascading_multi_select_report:
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/Cascading_multi_select_
report/options?label=MyReportOption
With the following request body:
{
"Country_multi_select":["Mexico"],
"Cascading_state_multi_select":["Guerrero", "Sinaloa"]
}
When successful, the server responds with a JSON object that describes the new report options, for example:
{
"uri":"/reports/samples/MyReportOption",
"id":"MyReportOption",
"label":"MyReportOption"
}
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/options/<optionID>/
Content-Type Content
application/json A JSON object that lists the input control selections. See example below.
200 OK 404 Not Found – When the specified report URI is not
found in the repository.
For example, we change the report option we created in 15.2, “Creating Report Options,” on page 112 with
the following header:
http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/reports/samples/Cascading_multi_select_
report/options/MyReportOption
And the following request body:
{
"Country_multi_select":["USA"],
"Cascading_state_multi_select":["CA", "WA"]
}
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/reports/path/to/report/options/<optionID>/
200 OK 404 Not Found – When the specified report URI is not
found in the repository.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs
reportUnitURI? /path/to/report Optional URI of a report or report option to list all of its jobs. When
specified, the results are only for the specified report or report option.
Options
accept: application/xml
accept: application/json
200 OK – The body contains and array or list of 404 Not Found – When no job is found.
jobsummary descriptors.
The jobs are described in a jobsummary element such as the following example:
The jobsummary XML element returned by the rest_v2/jobs service has a different structure than the
element with the same name returned by the deprecated rest/jobsummary (v1) service.
JSON: {
"jobsummary": [
{
"id": 1898,
"version": 0,
"reportUnitURI": "/reports/AllAccounts",
"label": "SampleJobName",
"description": "Accounts Sample Job",
"owner": "jasperadmin|organization_1",
"reportLabel": "Accounts Report",
"state": {
"previousFireTime": null,
"nextFireTime": "2013-10-12T00:00:00+03:00",
"value": "NORMAL"
}
},
...
]
}
XML: <jobs>
<jobsummary>
<id>1898</id>
<label>SampleJobName</label>
<description>Accounts Sample Job</description>
<reportUnitURI>/reports/AllAccounts</reportUnitURI>
<reportLabel>Accounts Report</reportLabel>
<state>
<nextFireTime>2013-10-12T00:00:00+03:00</nextFireTime>
<value>NORMAL</value>
</state>
<owner>jasperadmin|organization_1</owner>
<version>0</version>
</jobsummary>
...
</jobs>
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs?<arguments>
label string Performs a case-insensitive string search for this value anywhere within the
label field of every job.
owner string The name of the user who scheduled the report, if necessary in the format
<username>%7C<organization> (%7C is the | character).
reportUnitURI? /path/to/report Specify the URI of a report or report option to list all of its jobs.
example? JSON Searches for jobs that match the JSON jobModel, which is a fragment of a
jobModel job descriptor containing one or more fields to be matched. Because the
JSON fragment appears as an argument to the URL, it must be properly
URL-encoded (percent-encoded). See the example below.
limit integer Turns on pagination of the result by specifying the number of jobsummary
descriptors per results page. The default is -1 for no limit and thus no
pagination (all results are returned together).
offset integer Determines the page number in paginated results by specifying the index
of the first jobsummary to be returned.
isAscending true / false Determines the sort order: ascending if true, descending if false or omitted.
Options
accept: application/xml
accept: application/json
200 OK – The body contains and array or list of 404 Not Found – When no matching job is found in
jobsummary descriptors that match the search criteria. the server.
The body of the response contains jobsummary elements, in the same format as shown in 16.1, “Listing Report
Jobs,” on page 115.
The example parameter lets you specify a search on fields in the job descriptor, such as output formats. You can
specify any field in the job descriptor or in any of its nested structures. Some fields may be specified in both the
example parameter and in a dedicated parameter, for example label. In that case, the search specified in the
example parameter takes precedence.
For example, you can search for all jobs that specify an output format of PDF. The JSON jobModel to specify
this field is:
{"outputFormat":"PDF"}
And the corresponding URI, with proper encoding, is:
http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs?example=
%7b%22outputFormat%22%3a%22PDF%22%7d
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/<jobID>/
Options
accept: application/job+xml
accept: application/job+json
200 OK – The body contains a descriptor with all 404 Not Found – When the specified job is not found
details about the job. in the server.
The GET method returns a descriptor that fully describes all the aspects of a scheduled job, such as recurrence,
parameters, output, email notifications, and alerts, if any. For additional options around file output, see 16.12,
“Specifying FTP Output,” on page 128 and 16.13, “Specifying File System Output,” on page 130.
JSON:
{
"id": 1906,
"version": 0,
"username": "jasperadmin|organization_1",
"label": "Sample Job Name",
"description": "Sample desctiption",
"creationDate": "2013-10-11T14:52:04.955+03:00",
"outputFormats": {
"outputFormat": ["XLS",
"PDF"]
"trigger": {
"simpleTrigger": {
"id": 0,
"version": 0,
"timezone": "America/Los_Angeles",
"calendarName": null,
"startType": 2,
"startDate": "2016-10-26 10:00",
"endDate": null,
"misfireInstruction": 0,
"occurrenceCount": 1,
"recurrenceInterval": null
}
},
"source": {
"reportUnitURI": "/adhoc/topics/Cascading_multi_select_topic",
"parameters": {
"parameterValues": {
"Country_multi_select": ["Mexico"],
"Cascading_name_single_select": ["Chin-Lovell Engineering Associates"],
"Cascading_state_multi_select": ["DF",
"Jalisco",
"Mexico"]
}
}
},
"alert": {
"id": 0,
"version": -1,
"recipient": "OWNER_AND_ADMIN",
"toAddresses": {
"address": []
},
"jobState": "FAIL_ONLY",
"messageText": null,
"messageTextWhenJobFails": null,
"subject": null,
"includingStackTrace": true,
"includingReportJobInfo": true
},
"baseOutputFilename": "Cascading_multi_select_report",
"outputLocale": null,
"mailNotification": null,
"outputTimeZone": null,
"repositoryDestination": {
"id": 0,
"version": -1,
"folderURI": "/temp",
"sequentialFilenames": false,
"overwriteFiles": false,
"outputDescription": null,
"timestampPattern": null,
"saveToRepository": true,
"defaultReportOutputFolderURI": null,
"usingDefaultReportOutputFolderURI": false,
"outputLocalFolder": null,
"outputFTPInfo": {
"userName": "anonymous",
"password": null,
"folderPath": null,
"serverName": null,
"type": "ftps",
"protocol": null,
"port": 990,
"implicit": true,
"pbsz": 0,
"prot": null
}
},
}
XML:
<simpleTrigger>
<id>5482</id>
<misfireInstruction>0</misfireInstruction>
<startDate>2015-11-06T00:00:00+02:00</startDate>
<startType>2</startType>
<timezone>Europe/Helsinki</timezone>
<version>0</version>
<occurrenceCount>1</occurrenceCount>
<startDate>2015-11-06 00:00</startDate>
</simpleTrigger>
<source>
<parameters>
<parameterValues>
<entry>
<key>Country_multi_select</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:-
type="collection">
<item xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:string">Mexico</item>
</value>
</entry>
<entry>
<key>Cascading_name_single_select</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:-
type="collection">
<item xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Chin-
Lovell Engineering Associates</item>
</value>
</entry>
<entry>
<key>Cascading_state_multi_select</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:-
type="collection">
<item xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:string">DF</item>
<item xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:-
type="xs:string">Jalisco</item>
<item xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:string">Mexico</item>
</value>
</entry>
</parameterValues>
</parameters>
<reportUnitURI>/organizations/organization_1/adhoc/topics/Cascading_multi_select_top-
ic</reportUnitURI>
</source>
<outputTimeZone>Europe/Helsinki</outputTimeZone>
<baseOutputFilename>Cascading_multi_select_topic</baseOutputFilename>
<repositoryDestination>
<folderURI>/organizations/organization_1/adhoc/topics</folderURI>
<id>5483</id>
<outputFTPInfo>
<implicit>true</implicit>
<password/>
<pbsz>0</pbsz>
<port>21</port>
<type>ftp</type>
<userName>anonymous</userName>
</outputFTPInfo>
<overwriteFiles>true</overwriteFiles>
<saveToRepository>true</saveToRepository>
<sequentialFilenames>false</sequentialFilenames>
<usingDefaultReportOutputFolderURI>false</usingDefaultReportOutputFolderURI>
<version>-1</version>
</repositoryDestination>
</clientJob>
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/
Content-Type Content
Options
accept: application/job+xml
accept: application/job+json
201 Created – The body contains the job descriptor of 404 Not Found – When the report specified in the job
the newly created job. It is similar to the one that was descriptor is not found in the server.
sent but now contains the jobID for the new job.
When you schedule a report, you need only specify the relevant fields in the job descriptor. For example in
JSON:
{
"label": "Sample Job Name",
"description": "Sample desctiption",
"trigger": {
"simpleTrigger": {
"timezone": "America/Los_Angeles",
"startType": 2,
"startDate": "2013-10-26 10:00",
"occurrenceCount": 1
}
},
"source": {
"reportUnitURI": "/adhoc/topics/Cascading_multi_select_topic",
"parameters": {
"parameterValues": {
"Country_multi_select": ["Mexico"],
"Cascading_name_single_select": ["Chin-Lovell Engineering Associates"],
"Cascading_state_multi_select": ["DF",
"Jalisco",
"Mexico"]
}
}
},
"baseOutputFilename": "Cascading_multi_select_report",
"outputTimeZone": "America/Los_Angeles",
"repositoryDestination": {
"folderURI": "/temp"
},
"outputFormats": {
"outputFormat": ["PDF", "XLS"]
}
}
The response of the PUT request is the same as the GET request shown in 16.3, “Viewing a Job Definition,” on
page 118. It includes all the fields of the job descriptor, including the server-assigned ID and all the null fields.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/<jobID>/state/
200 OK – Body contains the status descriptor. 404 Not Found – When the specified <jobID> does
not exist.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/<jobID>/
Content-Type Content
application/job+xml A well-formed XML or JSON job descriptor. The request can include either a
application/job+json complete descriptor such as the result of a GET request described in 16.3,
“Viewing a Job Definition,” on page 118, or it can be a minimally sufficient
descriptor as shown in 16.4, “Scheduling a Report,” on page 121.
Options
accept: application/job+xml
accept: application/job+json
200 OK – The response include the complete job 404 Not Found – When the specified <jobID> does
descriptor, for an example, see 16.3, “Viewing a Job not exist.
Definition,” on page 118.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs?<arguments>
id? jobID string Can be used multiple times to create a list of job IDs to update.
replace true / false Specify true when you send a new trigger type. By default, this is false, and
Trigger the trigger can be updated but not changed to a different type. See below.
IgnoreType
Content-Type Content
Options
accept: application/json
accept: application/xml
200 OK – The array or list of jobs that were restarted. 404 Not Found – When the specified <jobID> does
not exist.
In this usage, the POST method allows you to send a partial job description, called a jobModel, that contains
any subset of the job descriptor's fields. This update applies to one or more jobs whose ID is specified by the id
argument. For example, the following simple request will update the job description in several jobs:
POST http://localhost:8080/jasperserver-pro/rest_v2/jobs?id=3798&id=3799&id=3800
<jobModel>
<description>This description updated in bulk</description>
</jobModel>
JSON: {
"label":"Modified label",
"isDescriptionModified":true,
"triggerModel":{
"simpleTriggerModel":{
"timezone":"Europe/Helsinki",
}
}
"baseOutputFilename":"NewOutputName"
}
XML: <jobModel>
<label>Modified label</label>
<isDescriptionModified>true</isDescriptionModified>
<simpleTriggerModel>
<timezone>Europe/Helsinki</timezone>
</simpleTriggerModel>
<baseOutputFilename>NewOutputName</baseOutputFilename>
</jobModel>
The response has an array or list of jobId elements that were updated:
JSON: {"jobId":[8321,8322]}
XML: <jobIdList>
<jobId>8321</jobId>
<jobId>8322</jobId>
</jobIdList>
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/pause/
Content-Type Content
application/xml An array or list of job IDs to pause. See example below. If the body of the
application/json request is empty, or the list is empty, all jobs in the scheduler will be paused.
Options
accept: application/json
accept: application/xml
The request and the response have the same format, an array or list of jobId elements:
JSON: {"jobId":[1236,1237,1238,1239]}
XML: <jobIdList>
<jobId>1236</jobId>
<jobId>1237</jobId>
<jobId>1238</jobId>
<jobId>1239</jobId>
</jobIdList>
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/resume/
Content-Type Content
application/xml An array or list of job IDs to resume. See example below. If the body of the
application/json request is empty, or the list is empty, all paused jobs in the scheduler will
resume.
Options
accept: application/json
accept: application/xml
The request and the response have the same format, an array or list of jobId elements:
JSON: {"jobId":[1236,1237]}
XML: <jobIdList>
<jobId>1236</jobId>
<jobId>1237</jobId>
</jobIdList>
request body will run once immediately after issuing this command. The single-run copies have a misfire policy
set so that they do not trigger any further failures (MISFIRE_ INSTRUCTION_IGNORE_MISFIRE_POLICY). If the
single-run copies fail themselves, no further attempts are made automatically.
Method URL
POST http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/restart/
Content-Type Content
Options
accept: application/json
accept: application/xml
The request and the response have the same array or list of jobId elements:
JSON: {"jobId":[8321,8322]}
XML: <jobIdList>
<jobId>8321</jobId>
<jobId>8322</jobId>
</jobIdList>
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/<jobID>/
200 OK – The body contains the ID of the deleted job. 404 Not Found – When the specified job is not found
in the server.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs?<arguments>
id Multiple Enter as many job IDs as you want to delete, for example:
String ?id=5594&id=5645&id=5761
Options
accept: application/xml
accept: application/json
The list of deleted jobs in the response has an array or list of jobId elements:
JSON: {"jobId":[5594,5645,5761]}
XML: <jobIdList>
<jobId>5594</jobId>
<jobId>5645</jobId>
<jobId>5761</jobId>
</jobIdList>
<job>
<reportUnitURI>/reports/samples/AllAccounts</reportUnitURI>
<label>MyJob</label>
<description>MyJob description</description>
<baseOutputFilename>WeeklyAccountsReport</baseOutputFilename>
<repositoryDestination>
<folderURI>/reports/samples</folderURI>
<overwriteFiles>true</overwriteFiles>
<sequentialFilenames>false</sequentialFilenames>
<outputFTPInfo>
<serverName>ftpserver.example.com</serverName>
<userName>ftpUser</userName>
<password>ftpPassword</password>
<folderPath>/Shared/Users/ftpUser</folderPath>
</outputFTPInfo>
</repositoryDestination>
<outputFormats>
<outputFormat>XLS</outputFormat>
<outputFormat>PDF</outputFormat>
</outputFormats>
...
</job>
FTP output is always specified in addition to repository output, and the output will be written to both the
repository and the FTP location. You cannot specify FTP output alone. The file names to be written are the
same ones that are generated by the job output, as specified by the baseOutputFilename, sequential pattern if
any, and format extensions such as .pdf. Similarly, the file overwrite and sequential filename behavior specified
for repository output also apply to FTP output.
As of JasperReports Server 6.3, FTP output also supports SSH private keys stored in the repository for
authentication. All of the fields for the outputFTPInfo element are described in the following table:
userName The login user name for the FTP server. "userName": "anonymous"
password The login password for the given userName on "password": "securePassword"
the FTP server.
folderPath The path of the folder where the job output "folderPath": "/path/to/folder"
resources should be created.
implicit Specifies the security mode for FTPS, Implicit if "implicit": {true|false}
true (default) or Explicit if false. If implicit is true,
the default port is set to 990.
sshKey Repository URI of the SSH private key resource "sshKey": "/sshKeys/myOpenSSHKey"
(used for SFTP authentication).
sshPassphrase The passphrase for the SSH private key (used "sshPassphrase": "mySecurePhrase"
for SFTP authentication).
Administrators can store SSH key files in the repository by right-clicking a folder and selecting Add Resource
> File > Secure File from the context menu. For more information, see the JasperReports Server Administrator
Guide.
<job>
<reportUnitURI>/reports/samples/AllAccounts</reportUnitURI>
<label>MyJob</label>
<description>MyJob description</description>
<baseOutputFilename>WeeklyAccountsReport</baseOutputFilename>
<repositoryDestination>
<folderURI>/reports/samples</folderURI>
<overwriteFiles>true</overwriteFiles>
<sequentialFilenames>false</sequentialFilenames>
<outputLocalFolder>/temp/scheduledReports/</outputLocalFolder>
</repositoryDestination>
<outputFormats>
<outputFormat>XLS</outputFormat>
<outputFormat>PDF</outputFormat>
</outputFormats>
...
</job>
As with FTP output, file system output is always specified in addition to repository output, and the output will
be written to both the repository and the local folder. The file names to be written are the same ones that are
generated by the job output, as specified by the baseOutputFilename, sequential pattern if any, and format
extensions such as .pdf. Similarly, the file overwrite and sequential filename behavior specified for repository
output also apply to file system output.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/calendars/?<parameter>
calendar optional string A type of calendar to return: annual, cron, daily, holiday, monthly, or weekly.
Type See 17.4, “Adding or Updating an Exclusion Calendar,” on page 135 for a
description of the various types. You may specify only one calendarType
parameter. When calendarType isn't specified, all calendars names are
returned. If calendarType has an invalid value, then an empty collection is
returned.
The list of calendar names in the result has the following XML format:
<calendarNameList>
<calendarName>name1</calendarName>
<calendarName>name2</calendarName>
</calendarNameList>
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/calendars/<calendarName>/
200 OK – Body is XML that contains the requested 404 Not Found – When the specified calendar name
calendar. does not exist.
The calendar descriptor in the result has the following XML format:
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/jobs/calendars/<calendarName>/
200 OK – The calendar has been deleted. 404 Not Found – When the specified calendar name
does not exist.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_
v2/jobs/calendars/<calendarName>?<arguments>
replace? true / false If true, any existing calendar with the same name is overwritten. When this
argument is omitted, it is false by default.
update true / false Whether or not to update existing triggers that referenced the already
Triggers? existing calendar so that they are based on the new trigger.
Content-Type Content
200 OK – The calendars are updates. 404 Not Found – When the specified calendar name
does not exist.
The following examples show the types of exclusion calendars that you can add to the scheduler:
• Annual calendar – A list of days that you want to exclude every year.
<excludeDays>
<excludeDay>2012-03-20</excludeDay>
<excludeDay>2012-03-21</excludeDay>
<excludeDay>2012-03-22</excludeDay>
</excludeDays>
</reportJobCalendar>
• Cron calendar – Defines the days and times to exclude as a cron expression.
• Holiday calendar – Defines a set of days to exclude that can be updated every year.
<excludeDayFlag>false</excludeDayFlag> <!--16--->
<excludeDayFlag>false</excludeDayFlag> <!--17--->
<excludeDayFlag>false</excludeDayFlag> <!--18--->
<excludeDayFlag>false</excludeDayFlag> <!--19--->
<excludeDayFlag>false</excludeDayFlag> <!--20--->
<excludeDayFlag>false</excludeDayFlag> <!--21--->
<excludeDayFlag>false</excludeDayFlag> <!--22--->
<excludeDayFlag>false</excludeDayFlag> <!--23--->
<excludeDayFlag>false</excludeDayFlag> <!--24--->
<excludeDayFlag>false</excludeDayFlag> <!--25--->
<excludeDayFlag>false</excludeDayFlag> <!--26--->
<excludeDayFlag>false</excludeDayFlag> <!--27--->
<excludeDayFlag>false</excludeDayFlag> <!--28--->
<excludeDayFlag>false</excludeDayFlag> <!--29--->
<excludeDayFlag>false</excludeDayFlag> <!--30--->
<excludeDayFlag>false</excludeDayFlag> <!--31--->
</excludeDaysFlags>
<timeZone>GMT+03:00</timeZone>
</reportJobCalendar>
Method URL
GET http://<host>:<port>/jasperserver-pro/rest_v2/queryExecutor/path/to/Domain/?q=<query>
q Required The query string is a special format that references the fields and measures
String exposed by the Domain. To write this query, you must have knowledge of
the Domain schema that is not available through the REST services. See
below.
Options
200 OK – The body contains the data that is the result 404 Not Found – When the specified Domain does
of the query. See the format of the data below. not exist.
If the query is too large to fit in the argument in the URL, use the POST method to send it as request content:
Method URL
POST http://<host>:<port>/jasperserver-pro/rest_v2/queryExecutor/path/to/Domain/
Content-Type Content
application/xml The query string is a special format that references the fields and measures
exposed by the Domain. To write this query, you must have knowledge of
the Domain schema that is not available through the REST services. See
below.
Options
200 OK – The body contains the data that is the result 404 Not Found – When the specified Domain does
of the query. See the format of the data below. not exist.
<query>
<queryFields>
<queryField id="expense_join_store.ej_store_store_city"/>
<queryField id="expense_join_store.ej_store_store_country"/>
<queryField id="expense_join_store.ej_store_store_name"/>
<queryField id="expense_join_store.ej_store_store_state"/>
<queryField id="expense_join_store.ej_store_store_street_address"/>
</queryFields>
<queryFilterString>expense_join_store.ej_store_store_country == 'USA'
and expense_join_store.ej_store_store_state == 'CA'
</queryFilterString>
</query>
And the following sample shows the result of query. In order to optimize the size of the response, rows are
presented as sets of values without the column names repeated for each row. The column IDs appear at the top
of the result, as shown in the following example. As with the query, the result requires knowledge of the
Domain schema to identify the human-readable column names.
<queryResult>
<names>
<name>expense_join_account.ej_account_account_description</name>
<name>expense_join_account.ej_expense_fact_account_id</name>
<name>expense_join_account.ej_account_account_parent</name>
<name>expense_join_account.ej_account_account_rollup</name>
<name>expense_join_account.ej_account_account_type</name>
<name>expense_join_account.ej_account_Custom_Members</name>
<name>expense_join.ej_expense_fact_amount</name>
<name>expense_join_store.ej_store_store_type</name>
<name>expense_join_store.ej_store_store_street_address</name>
<name>expense_join_store.ej_store_store_city</name>
<name>expense_join_store.ej_store_store_state</name>
<name>expense_join_store.ej_store_store_postal_code</name>
<name>expense_join_store.sample_time</name>
</names>
<values>
<row>
<value xsi:type="xs:string">Marketing</value>
<value xsi:type="xs:int">4300</value>
<value xsi:type="xs:int">4000</value>
<value xsi:type="xs:string">+</value>
<value xsi:type="xs:string">Expense</value>
<value xsi:nil="true"/>
<value xsi:type="xs:double">1884.0000</value>
<value xsi:type="xs:dateTime">1997-01-01T04:05:06+02:00</value>
<value xsi:type="xs:string">HeadQuarters</value>
<value xsi:type="xs:string">1 Alameda Way</value>
<value xsi:type="xs:string">Alameda</value>
<value xsi:type="xs:string">CA</value>
<value xsi:type="xs:int">94502</value>
<value xsi:type="xs:string">USA</value>
<value xsi:type="xs:time">04:05:06+02:00</value>
</row>
...
</values>
</queryResult>
Both date-only and timestamp fields are given in the ISO date-time format such as 1997-01-
01T04:05:06+02:00.
For database columns that store a time and date that includes a time zone, such as "timestamp with
time zone" in PostgreSQL, the result is not guaranteed to be in the same time zone as stored in the
database. These dates and times are converted to the server's time zone.
Method URL
DELETE http://<host>:<port>/jasperserver-pro/rest_v2/caches/vds/
204 No Content – There is nothing to return. 404 Not Found – When the specified cache does not
exist.
The rest_v2/organizations service provides methods that allow you to list, view, create, modify, and delete
organizations (also known as tenants). Search functionality allows you to find organizations by name and
retrieve hierarchies of organizations.
Because the organization ID is used in the URL, this service can operate only on organizations whose ID is less
than 100 characters long and does not contain spaces or special symbols. As with resource IDs, the organization
ID is permanent and cannot be modified for the life of the organization.
Only administrative users may access the organizations service. System admins (superuser) can operate on top-
level organizations, and organization admins (jasperadmin) can operate on their own organization or any sub-
organizations.
This chapter includes the following sections:
• Searching for Organizations
• Viewing an Organization
• Creating an Organization
• Modifying Organization Properties
• Setting the Theme of an Organization
• Deleting an Organization
Method URL
GET http://<host>:<port>/jasperserver-pro/rest_v2/organizations?<arguments>
q Optional Specify a string or substring to match the organization ID, alias, or name of
String any organization. The search is not case sensitive. Only the matching
organizations are returned in the results, regardless of their hierarchy.
include Optional When used with a search, the result will include the parent hierarchy of
Parents Boolean each matching organization. When not specified, this argument is false by
default.
rootTenantId Optional Specifies an organization ID as a base for searching and listing child
String organizations. The base is not included in the results. Regardless of this
base, the tenantFolderURI values in the result are always relative to the
logged-in user’s organization. When not specified, the default base is the
logged-in user’s organization.
sortBy Optional Specifies a sort order for results. When not specified, lists of organizations
String are in the order that they were created. The possible values are:
name – Sort results alphabetically by organization name.
alias – Sort results alphabetically by organization alias.
id – Sort results alphabetically by organization ID.
Options
The following example shows a search for an organization and its parent hierarchy:
GET http://localhost:8080/jasperserver-pro/rest_v2/organizations?q=acc&includeParents=true
This request has the following response, as viewed by superuser at the root of the organization hierarchy:
<organizations>
<organization>
<alias>Finance</alias>
<id>Finance</id>
<parentId>organizations</parentId>
<tenantDesc></tenantDesc>
<tenantFolderUri>/organizations/Finance</tenantFolderUri>
<tenantName>Finance</tenantName>
<tenantUri>/Finance</tenantUri>
<theme>default</theme>
</organization>
<organization>
<alias>Accounts</alias>
<id>Accounts</id>
<parentId>Finance</parentId>
<tenantDesc></tenantDesc>
<tenantFolderUri>/organizations/Finance/organizations/Accounts</tenantFolderUri>
<tenantName>Accounts</tenantName>
<tenantUri>/Finance/Accounts</tenantUri>
<theme>default</theme>
</organization>
</organizations>
Method URL
GET http://<host>:<port>/jasperserver-pro/rest_v2/organizations/organizationID
Options
200 OK – The content is the descriptor for the given 404 Not Found – When the ID does not match any
organization. organization. The content includes an error message.
403 Forbidden – When the logged-in user does not
have permission to view the given organization
The organization descriptor is identical to the one returned when searching or listing organization, but only a
single descriptor is ever returned. The following example shows the descriptor in JSON format:
{
"id":"Finance",
"alias":"Finance",
"parentId":"organizations",
"tenantName":"Finance",
"tenantDesc":" ",
"tenantNote":null,
"tenantUri":"/Finance",
"tenantFolderUri":"/organizations/Finance",
"theme":"default"
}
Method URL
POST http://<host>:<port>/jasperserver-pro/rest_v2/organizations?<argument>
create Optional Set this argument to false to suppress the creation of default users
Default Boolean (joeuser, jasperadmin) in the new organization. When not specified, the
Users default behavior is true and organizations are created with the standard
default users.
Content-Type Content
201 Created – The organization was successfully 404 Not Found – When the ID of the parent
created using the values in the descriptor or default organization cannot be resolved.
values if missing. 400 Bad Request – When the ID or alias of the new
organization is not unique on the server, or when the
ID in the description contains illegal symbols. The
following symbols are not allowed:
id and alias: ~!+-#$%^|
tenantName: |&*?<>/\
The descriptor sent in the request should contain all the properties you want to set on the new organization.
Specify the parentId value to set the parent of the organization, not the tenantUri or tenantFolderUri
properties. The following example shows the descriptor in JSON format:
{
"id":"Audit",
"alias":"Audit",
"parentId":"Finance",
"tenantName":"Audit",
"tenantDesc":"Audit Department of Finance",
"theme":"default"
}
However, all properties have defaults or can be determined based on the alias value. The minimal descriptor
necessary to create an organization is simply the alias property. In this case, the organization is created as a
child of the logged-in user’s home organization. For example, if superuser posts the following descriptor, the
server creates an organization with the name, ID, and alias of HR as a child of the root organization:
{
"alias":"HR"
}
Method URL
PUT http://<host>:<port>/jasperserver-pro/rest_v2/organizations/organizationID/
Content-Type Content
200 OK – The organization was successfully updated. 400 Bad Request – When some dependent resources
cannot be resolved.
The following example shows a descriptor sent to update the name and description of an organization:
{
"tenantName":"Audit Dept",
"tenantDesc":"Audit Department of Finance Division"
}
{
"theme":"jasper_dark"
}
For more information about themes, see the JasperReports Server Administrator Guide.
Method URL
DELETE http://<host>:<port>/jasperserver-pro/rest_v2/organizations/organizationID/
204 No Content – The organization was successfully 400 Bad Request – When attempting to delete the
deleted. organization of the logged-in user.
404 Not Found – When the ID of the organization
cannot be resolved.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/users?<arguments>
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/users?<arguments>
search Optional Specify a string or substring to match the user ID or full name of any user.
String The search is not case sensitive.
requiredRole Optional Specify a role name to list only users with this role. Repeat this argument
String to filter with multiple roles. In commercial editions with multiple
organizations, specify roles as <roleName>%7C<orgID> (%7C is the |
character).
hasAll Optional When set to false with multiple requiredRole arguments, users will match if
Required Boolean they have any of the given roles (OR operation). When true or not
Roles specified, users must match all of the given roles (AND operation).
include Optional Limits the scope of the search or list in commercial editions with multiple
SubOrgs Boolean organizations. When set to false, the first URL form is limited to the logged-
in user’s organization, and the second URL form is limited to the
organization specified in the URL. When true or not specified, the scope
includes the hierarchy of all child organizations.
Options
200 OK – The content is a set of descriptors for all 404 Not Found – When the organization ID does not
users in the result. match any organization. The content includes an error
204 No Content – The search did not return any message.
users.
The following example shows the first form of the URL on a community edition server:
GET http://localhost:8080/jasperserver/rest_v2/users?search=j
The response is a set of summary descriptors for all users containing the string "j":
<users>
<user>
<externallyDefined>false</externallyDefined>
<fullName>jasperadmin User</fullName>
<username>jasperadmin</username>
</user>
<user>
<externallyDefined>false</externallyDefined>
<fullName>Joe User</fullName>
<username>joeuser</username>
</user>
</users>
The next example shows the second form of the URL on a commercial edition server with multiple
organizations:
GET http://localhost:8080/jasperserver/rest_v2/organizations/Finance/users
On servers with multiple organizations, the summary user descriptors include the organization (tenant) ID:
<users>
<user>
<externallyDefined>false</externallyDefined>
<fullName>jasperadmin</fullName>
<tenantId>Finance</tenantId>
<username>jasperadmin</username>
</user>
<user>
<externallyDefined>false</externallyDefined>
<fullName>jasperadmin</fullName>
<tenantId>Audit</tenantId>
<username>jasperadmin</username>
</user>
<user>
<externallyDefined>false</externallyDefined>
<fullName>joeuser</fullName>
<tenantId>Finance</tenantId>
<username>joeuser</username>
</user>
<user>
<externallyDefined>false</externallyDefined>
<fullName>joeuser</fullName>
<tenantId>Audit</tenantId>
<username>joeuser</username>
</user>
</users>
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/users/userID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/users/userID
Options
200 OK – The content is the descriptor for the given 404 Not Found – When the user ID or organization ID
user. does not match any user or organization. The content
includes an error message.
The full user descriptor includes detailed information about the user account, including any roles. The following
example shows the descriptor in XML format:
GET http://localhost:8080/jasperserver/rest_v2/users/joeuser
<user>
<enabled>true</enabled>
<externallyDefined>false</externallyDefined>
<fullName>Joe User</fullName>
<previousPasswordChangeTime>2013-04-19T18:53:07.602-07:00
</previousPasswordChangeTime>
<roles>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_USER</name>
</role>
</roles>
<username>joeuser</username>
</user>
In servers with multiple organizations, the full descriptor includes the organization (tenant) ID. The following
example shows the descriptor in JSON format:
GET http://localhost:8080/jasperserver/rest_v2/organizations/Finance/users/joeuser
{
"fullName":"joeuser",
"emailAddress":"",
"externallyDefined":false,
"enabled":true,
"previousPasswordChangeTime":1366429181984,
"tenantId":"Finance",
"username":"joeuser",
"roles":[
{"name":"ROLE_USER","externallyDefined":false}]
}
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/users/userID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/users/userID
Content-Type Content
application/xml A user descriptor that includes at least the fullName and password for the
application/json user. The role ROLE_USER is automatically assigned to all users, so it does
not need to be specified. Do not specify the following properties:
username – Specified in the URL and cannot be modified in the descriptor.
tenantID – Specified in the URL and cannot be modified in the descriptor.
externallyDefined – Computed automatically by the server.
previousPasswordChangeTime – Computed automatically by the server.
201 Created – The user was successfully created 404 Not Found – When the organization ID cannot be
using the values in the descriptor. The response resolved.
contains the full descriptor of the new user.
The descriptor sent in the request should contain all the properties you want to set on the new user, except for
the username that is specified in the URL. To set roles on the user, specify them as a list of roles that includes
the name and organization of each role. The following example shows the descriptor in JSON format:
{
"fullName":"Joe User",
"emailAddress":"juser@example.com",
"enabled":false,
"password":"mySecretPassword",
"roles":[
{"name":"ROLE_MANAGER", "tenantId":"organization_1"}]
}
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/users/userID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/users/userID
Content-Type Content
application/xml A user descriptor that includes the properties you want to change. Do not
application/json specify the following properties:
username – Specified in the URL and cannot be modified in the descriptor.
tenantID – Specified in the URL and cannot be modified in the descriptor.
externallyDefined – Computed automatically by the server.
previousPasswordChangeTime – Computed automatically by the server.
200 OK – The user properties were successfully 404 Not Found – When the organization ID cannot be
updated. resolved.
To add a role to the user, specify the entire list of roles with the desired role added. To remove a role from a
user, specify the entire list of roles with the desired role removed. The following example shows the descriptor
in JSON format:
{
"enabled":true,
"password":"newPassword",
"roles":[
{"name":"ROLE_USER"},
{"name":"ROLE_STOREMANAGER", "tenantId":"organization_1"}]
}
• In commercial editions with organizations, use the second URL to specify the user’s organization. When
specifying the organization, use its unique ID, not its path. When logged in as the system admin
(superuser), use the first URL to delete users of the root organization.
When this method is successful, the user is permanently deleted.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/users/userID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/users/userID
204 No Content – The user was successfully deleted. 404 Not Found – When the ID of the organization
cannot be resolved.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/roles?<arguments>
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/roles?<arguments>
search Optional Specify a string or substring to match the role ID (name) of any role. The
String search is not case sensitive.
user Optional Specify a username (ID) to list the roles to which this user belongs. Repeat
String this argument to list all roles of multiple users. In commercial editions with
multiple organizations, specify users as <userID>%7C<orgID> (%7C is
the | character).
hasAllUsers Optional When set to true with multiple user arguments, this method returns only
Boolean the roles to which all specified users belong (intersection of all users'
roles). When false or not specified, all roles of all specified users are found
(union of all users' roles).
include Optional Limits the scope of the search or list in commercial editions with multiple
SubOrgs Boolean tenants. When set to false, the first URL form is limited to the logged-in
user’s organization, and the second URL form is limited to the
organization specified in the URL. When true or not specified, the scope
includes the hierarchy of all child organizations.
Options
200 OK – The content is a set of descriptors for all 404 Not Found – When the organization ID does not
roles in the result. match any organization. The content includes an error
204 No Content – The search did not return any roles. message.
The following example shows the first form URL on a commercial edition server with multiple organizations:
GET http://localhost:8080/jasperserver/rest_v2/roles
This method returns the set of all default system and root roles defined on a server with the sample data (no
organization roles have been defined yet):
<roles>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_ADMINISTRATOR</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_ANONYMOUS</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_DEMO</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_PORTLET</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_SUPERMART_MANAGER</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_SUPERUSER</name>
</role>
<role>
<externallyDefined>false</externallyDefined>
<name>ROLE_USER</name>
</role>
</roles>
The externallyDefined property is true when the role is synchronized from a 3rd party such as an
LDAP directory or single sign-on mechanism. For more information, see the JasperReports Server
External Authentication Cookbook.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/roles/roleID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/roles/roleID
Options
200 OK – The content is the descriptor for the given 404 Not Found – When the role ID or organization ID
role. does not match any role or organization. The content
includes an error message.
After adding roles to an organization, the following example shows the simple role descriptor for an
organization role in JSON format:
GET http://localhost:8080/jasperserver-pro/rest_v2/organizations/Finance/roles/ROLE_MANAGER
{
"name":"ROLE_MANAGER",
"externallyDefined":false,
"tenantId":"Finance"
}
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/roles/roleID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/roles/roleID
Content-Type Content
application/xml An empty role descriptor, either <role></role> or {}. Do not specify the
application/json following properties:
name – Specified in the URL and should not be modified in the descriptor.
tenantID – Specified in the URL and cannot be modified in the descriptor.
externallyDefined – Computed automatically by the server.
201 Created – The role was successfully created. The 404 Not Found – When the organization ID cannot be
response contains the full descriptor of the new role. resolved.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/roles/roleID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/roles/roleID
Content-Type Content
200 OK – The role was successfully updated. The 404 Not Found – When the organization ID cannot be
response contains the full descriptor of the updated resolved.
role.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/roles/roleID
http://<host>:<port>/jasperserver[-pro]/rest_v2/organizations/orgID/roles/roleID
204 No Content – The role was successfully deleted. 404 Not Found – When the ID of the organization
cannot be resolved.
{
"name": "Attr1",
"value": "Value1"
}
Each attribute may only have one value, however that value may contain a comma-separated list that, in certain
uses, is interpreted by the server as being multi-valued. Such attributes can be used in Domain security filters
that match against a collection of values.
{
"name": "Attr2",
"value": "Value2a,Value2b,Value2c"
}
Attributes with the same name may be defined on different entities. For example, a user has a specific value for
an attribute, the organization he belongs to has a default value for the same attribute, and the server level has
yet another value for it. In this example, three separate attributes are defined, but they have the same name
because they occur on different entities. The mechanisms described in 23.5, “Referencing Attributes,” on
page 167 can take advantage of this to implement default values.
{
"name": "Attr3",
"secure": "true"
}
When setting the value of a secure attribute, your application should specify both the secure field and the value
field.
{
"name": "Attr3"
"value": "SecureValue3"
"secure": "true"
}
Applications that set secure attributes should consider enabling HTTPS so that the clear-text value of the
attribute is encrypted in all communication with the server.
User organizations/organizationID/users/userID/
Organization-level organizations/organizationID/
User users/userID/
When specifying the organization, use its unique ID, not its path. In commercial edition servers that use
the single default organization, you must specify organization_1.
• Domain security files: you can reference attribute values associated with the logged-in user (or his
organization) to create rules to access data in the Domain. For more information, see the chapter "Advanced
Domains Features" in the JasperReports Server User Guide.
• Data source definitions: the fields that define a data source, such as its server, port number, database, and
user credentials, can all reference attributes of the logged-in user's organization (or a server-specific
attribute). In this way, different organizations or different servers can share the same data source yet still
access a different database. For more information, see the chapter "Data Sources" in the JasperReports
Server Administrator Guide.
The server provides two different methods to reference attributes:
• Categorical reference: requests the value of a named attribute from a specific entity, either the logged-in
user's profile, the logged-in user's organization, or from the server-wide set of attributes. If the named
attribute is not defined in the specified entity, an error is returned.
• Hierarchical reference: searches for the value of a named attribute first in the logged-in user's account, and if
not found, then in the logged-in user's organization, and if still not found, then at the server level. This
allows attributes to be defined at several levels, with the definition at a lower level (the user profile) having
higher priority, and the definition at a higher lever (the organization or server level) providing a default
value. If the named attribute is not defined at any level, an error is returned.
The methods you use to reference attributes will then determine the entities where you need to create attributes
and the values of those attributes.
Some methods of the attributes service operate on multiple attributes on a given entity. Such batch operations
are not transactional, meaning the operation terminates with no rollback functionality when encountering an
error. Attributes that have been processed (modified or deleted) before the error remain so, and attributes after
the error are not processed.
All attribute operations apply to a single specific entity; there are no operations for reading or setting attributes
on multiple entities.
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes?<arguments>
name Optional Specify an attribute name to list the value of that specific attribute. Repeat
String this argument to view multiple attributes. When this argument is omitted, all
attributes and their values are returned for the given entity.
Options
200 OK – The content is the list of attributes for the 404 Not Found – When the user ID or organization ID
given entity. does not match any user or organization. The content
204 No Content – The search did not return any includes an error message.
attributes or the entity has no attributes.
The list of attributes includes the name and value of each attribute. The following example shows user-level
attributes in JSON format:
GET http://localhost:8080/jasperserver-pro/rest_v2/organizations/organzation_1/users/joeuser/attributes
{
"attribute":[
{
"name": "Attr1",
"value":"Value1"
},
...
{
"name": "AttrN",
"value":"ValueN"
}
]
}
The second syntax reads a single attribute by specifying its name in the URL:
Method URL
GET http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes/attrName
Options
200 OK – The content is a single attribute for the 404 Not Found – When the user ID, organization ID,
given entity. or attribute name does not match any user,
organization, or attribute. The content includes an
error message.
The response is a single attribute name-value pair. The following example shows an organization-level attribute
in JSON format:
GET http://localhost:8080/jasperserver-pro/rest_v2/organizations/organization_1/attributes/Attr2
{
"name": "Attr2",
"value":"Value2a,Value2b,Value2c"
}
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes
Content-Type Content
application/xml An attribute descriptor that includes the new list of attributes. All previously
application/json defined attributes are replaced by this new list.
201 Created – When the attributes were successfully 404 Not Found – When the user ID or organization ID
created on the given entity. does not match any user or organization. The content
200 OK – When the attributes were successfully includes an error message.
updated. 400 Bad Request – When an attribute name or value
is null, blank, or too long (see 23.6, “Attribute
Limitations,” on page 168). If one attribute causes an
error, the operation stops and returns an error, but
attributes that were already set remain.
The following example shows how to set all attributes on an organization. The list of attributes in JSON format
defines the name and value of each attribute.
PUT http://localhost:8080/jasperserver-pro/rest_v2/organizations/organization_1/attributes
{
"attribute":[
{
"name": "Attr1",
"value":"newValue1"
},
{
"name": "Attr2",
"value":"newValue2a, newValue2b"
},
{
"name": "Attr3"
"value": "SecureValue3"
"secure": "true"
}
]
}
The second syntax of the PUT attributes method is for adding or replacing individual attributes.
Method URL
PUT http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes/attrName
Content-Type Content
application/xml A single attribute name-value pair. The attribute name must match the
application/json attrName exactly as it appears in the URL. If this attribute name already
exists on the specified user, this attribute’s value is updated. If the attribute
does not exist, it is added to the user’s list of attributes.
201 Created – When the attribute was successfully 404 Not Found – When the user ID or organization ID
created on the given entity. does not match any user or organization. The content
200 OK – When the attribute was successfully includes an error message.
updated.
{
"name": "Attr2",
"value":"NewValue2"
}
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes?<arguments>
name Optional Specify an attribute name to remove that attribute. Repeat this argument to
String delete multiple attributes. When this argument is omitted, all attributes are
deleted from the given entity.
204 No Content – The attributes were 404 Not Found – When the user ID or organization ID
successfully removed from the given entity. does not match any user or organization. The content
includes an error message.
400 Bad Request – When an attribute name is null, blank,
or too long (see 23.6, “Attribute Limitations,” on
page 168). If one attribute causes an error, the operation
stops and returns an error, but attributes that were already
deleted remain deleted.
The second syntax deletes a single attribute named in the URL from the specified entity.
Method URL
DELETE http://<host>:<port>/jasperserver[-pro]/rest_v2/<entity>attributes/attrName
204 No Content – The attribute was successfully 404 Not Found – When the user ID, organization ID,
removed from the given entity. or attribute name does not match any user,
organization, or attribute. The content includes an
error message.
400 Bad Request – When an attribute name is null,
blank, or too long (see 23.6, “Attribute Limitations,”
on page 168).