<url_template>

Abstract

Learn to configure the <url_template> element for Pull Reports™ Ad Hoc report and data service software.


Table of Contents

Catalog Configuration Java API analog:  ColumnConfigurationBuilder#setUrlTemplate

A <url_template> configures a URL for a <column> value in the Export Report REST API. <url_template>s are useful for creating drill-through reports. The URL implementation depends on the report format. For instance, the html format outputs the URL as an HTML anchor (<a>) element while the csv format type outputs the URL as an additional column. See the Export Report REST API chapter for more information.

Usage

Creating a <url_template>

A <url_template> is a Freemarker template which may reference column values within the result row within template expressions. Only references to columns which are guaranteed to be available at runtime are valid. These are:

  • Base table columns:  Reference the report's base table columns with @ prefixed column ids. For example: reference a base table <column> with id="name" with ${@name}.

  • Parent tables columns:  Reference the <url_template> parent table columns with @@ prefixed column ids. For example: reference a parent table date <column> with id="some_date" with ${@@some_date?date}. Note ?date is Freemarker date format.

Using @ or @@ within base table <url_template>s

When creating <url_template>s for <column>s within the <report>'s base table, it is permitted to refer to base table columns prefixed with either @ or @@. The former, @, always refers to columns within the base table. The later, @@, always refers to columns within the parent table - which is the base table in this case. The choice between the two prefixes is unimportant unless the base table is a global table which is itself referenced by base and non-base <table_ref>s. In this case, prefix column references in the global table's <url_template>s with @@ to have them refer to <column> idss within the global table.

Requiring a column to be non-null

To only export a URL when a referenced column is non-null, use the Freemarker ?? operator with an <#if > statement. For example, in this <column> definition, the @addressStreet column is only exported as a URL if the @addressId column is non-null.

<column id="addressStreet" name="address_street" displayName="Street Address"> 
    <url_template><![CDATA[<#if @addressId??>/addressLookup?id=${@addressId}</#if></url_template>]]>
</column>

Accessing the HttpServletRequest

Use methods provided by RequestMethodModels to contextualize urls to the HttpServletRequest.

Exceptions when processing <url_template> values

Since <url_template> values are filled for each result row, any java.lang.Exception thrown when processing the template will disrupt the HTTP response stream and cause an invalid response. For this reason, Pull Reports™ catches all <url_template> processing Exceptions, logs the Exception, and outputs "ERROR. Check log." instead of the true column value.

In order to prevent repetitive log entries, Pull Reports™ logs only one <url_template> processing Exception per export request.

Basic <url_template> usage

This example demonstrates two <url_template> elements, one associated with the <report>'s base table and one associated with a child <relationship>. The former demonstrates a hyperlink into an external URL and the latter demonstrates a hyperlink into another Pull Report within the same <catalog>.

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.pullreports.com/catalog-1.7.0" id="class_info" name="Class Information"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.pullreports.com/catalog-1.7.0
    https://www.pullreports.com/docs/xsd/pullreports-catalog-1.7.0.xsd">
    <report id="student" name="Student Report" >
        <export_config defaultColumns='id,complete_name'/>
        <table id="student" name="class_info.student" displayName="Student"> 
            <column id="id" name="id" displayName="Student ID" paramType="java.lang.Integer"/>
            <column id="complete_name" name="complete_name" displayName="Complete Name">
                <!--  ${@id} references column class_info.student.id. ${@@id} would also be valid. -->
                <url_template>https://www.school-district.com/rest/api/student/${@id}.html</url_template>
            </column>
            <relationship>
                <join_column columnName="student_id" referencedColumnName="id" />
                <table id="grade" displayName="Grade" name="class_info.grade">
                    <column id="id" name="id" displayName="Grade ID" paramType="java.lang.Integer" export="false"/>
                    <column id="grade" name="grade" displayName="Grade"/> 
                    <column id="year" name="year" displayName="Year" paramType="java.lang.Integer"> 
                        <!--  ${@id} references column class_info.student.id.
                              ${@@year} references column class_info.grade.year
                              
                              The <#if> check ensures both ${@id} and ${@@year}
                              are non-null for Pull Reports to output the URL.
                              
                              Although it is not used in this <url_template> example,
                              ${@@id} would reference class_info.grade.id 
                        -->
                        <url_template><![CDATA[
                        <#if @id?? && @@year??>
                        //${getServerName()}/${getContextPath()}/pullreports/catalog/class_info/report/evidence/export?format=htmltable&columns=%2Fevidence&filter=%40student_id%3D${@id}&filter=%2Fevidence%40year%3D${@@year}
                        </#if>
                        ]]></url_template>
                    </column>
                </table>
            </relationship>
        </table>
    </report>
    <report id="evidence" name="Grade Evidence Report" >
        <table id="student" name="class_info.student" displayName="Student"> 
            <column id="student_id" name="id" displayName="Student ID" paramType="java.lang.Integer"/>
            <column id="complete_name" name="complete_name" displayName="Complete Name"/>
            <relationship join="inner">
                <join_column columnName="student_id" referencedColumnName="id" />
                <table id="evidence" displayName="Evidence" name="class_info.grade_evidence">
                    <column id="year" name="year" displayName="Year" paramType="java.lang.Integer"/>
                    <column id="evidence" name="evidence_text" displayName="Evidence"/>
                </table>
            </relationship>
        </table>
    </report>
</catalog>

To demonstrate the actual URL output, start with the <report>'s base, student table with rows:

Table 1. student table rows
idcomplete_name
1Sylvia Martinez
2Roger Mullins
3Jackie Besanceney

Then the URL values for the rows will be:

Table 2. student table with URL values
idcomplete_namecomplete_name's URL
1Sylvia Martinezhttps://www.school-district.com/rest/api/student/1.html
2Roger Mullinshttps://www.school-district.com/rest/api/student/2.html
3Jackie Besanceneyhttps://www.school-district.com/rest/api/student/3.html

Then assume a grade table with rows:

Table 3. grade table rows
idstudent_idgradeyear
1001A2014
1011A-2015
1022B2015

The two tables may be joined via the Export Report REST API URL:

/[context]/pullreports/catalog/class_info/report/student/export?columns=/grade

And the joined result rows will be:

Table 4. student to gradetable left join with <url_template>s applied
idcomplete_namecomplete_name's URLgradeyearyear's URL
1Sylvia Martinezhttps://www.school-district.com /rest/api/student/1.htmlA2014//[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D1 &filter=%2Fevidence%40year%3D2014
1Sylvia Martinezhttps://www.school-district.com /rest/api/student/1.htmlA-2014//[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D1 &filter=%2Fevidence%40year%3D2015
2Roger Mullinshttps://www.school-district.com /rest/api/student/2.htmlB2015//[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D2 &filter=%2Fevidence%40year%3D2015
3Jackie Besanceneyhttps://www.school-district.com /rest/api/student/3.html   

Advanced <url_template> usage

<url_template>s may use Freemarker directives to fulfill complex use cases. The following Pull Reports™ XML Catalog file demonstrates directive usage.

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.pullreports.com/catalog-1.7.0" id="catalog" name="Catalog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.pullreports.com/catalog-1.7.0
    https://www.pullreports.com/docs/xsd/pullreports-catalog-1.7.0.xsd">
    <report id="report" name="Report" >
        <export_config defaultColumns='id'/>
        <table id="some_table" name="schema.table1" displayName="Table1"> 
            <column id="id" name="id" displayName="ID" paramType="java.lang.Integer"/>
            <column id="date1" name="date1_field" displayName="Date 1" paramType="java.sql.Date"/>
            <column id="string1" name="string1_field" displayName="String 1">
                <!-- Demonstrates use of Freemarker '?string[...]' and '?url' methods -->
                <url_template><![CDATA[
                /foo/bar?param1=${@date1?string['yyyy']}&param2=${@string1?url('ISO-8859-1')}
                ]]></url_template>
            </column>
            <column id="string2" name="string2_field" displayName="String 2">
                <!-- Demonstrates conditional logic -->
                <url_template>/foo2/bar2/${@id}${(@date1??)?then('/' + @date1?string['MM'],'')}</url_template>
            </column>
            <column id="integer1" name="integer1_field" displayName="Integer 1" paramType="java.lang.Integer"/>
            <relationship>
                <join_column columnName="ref_id" referencedColumnName="id" />
                <table id="table2" displayName="Table2" name="schema.table2">
                    <column id="code" name="code" displayName="Code"/>
                    <column id="name" name="name" displayName="name">
                        <!-- Demonstrates referencing columns on this relationship table
                        and the <report>'s base table -->
                        <url_template><![CDATA[
                        //www.acme.com/path1?code=${@@code}&date1=${@date1?date}
                        ]]></url_template>
                    </column>
                </table>
            </relationship>
        </table>
    </report>
</catalog>

Parents

<column>