<?xml version="1.0"?>
<rss version="2.0"><channel><title>Blog: Tech Poet</title><link>https://community.jaspersoft.com/blog/tech-poet/?d=9</link><description>Blog: Tech Poet</description><language>en</language><item><title> String Encoding</title><link>https://community.jaspersoft.com/blog/tech-poet/string-encoding/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><h2><span lang="en-gb" xml:lang="en-gb">String Encoding for Talend/JaspersoftETL for Basic Authentication/md5/sha-256</span></h2><h3 style="text-align:left;"><span lang="en-gb" xml:lang="en-gb">What is a convenient way to encode usernames/passwords for use in my ETL jobs?</span></h3><div><span lang="en-gb" xml:lang="en-gb"><b>First</b> copy the java code on this Github Gist into yourclipboard:</span><p></p></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><br /></div><div><span lang="en-gb" xml:lang="en-gb"><b><br /></b></span></div><div><span lang="en-gb" xml:lang="en-gb"><b>Second</b> Create a routine calledhashingUtils (name is important!). Paste the Java code from above and save theroutine</span><p></p></div><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-sao3plG5UwI/VUzr3a2RoVI/AAAAAAAADlk/B5B2ckDyWj4/s1600/routine.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-sao3plG5UwI/VUzr3a2RoVI/AAAAAAAADlk/B5B2ckDyWj4/s200/routine.png</span></a></div><div><span style="clear:left;float:left;margin-bottom:1em;margin-right:1em;"></span><span lang="en-gb" xml:lang="en-gb"></span><p></p></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><br /></div><div><b>Third</b> you can now use the following methodsin any component:</div><div><br /></div><div><span lang="en-gb" style="font-family:'Andale Mono';" xml:lang="en-gb">hashingUtils.basicAuth("username","password")</span><p></p></div><div><span lang="en-gb" style="font-family:'Andale Mono';" xml:lang="en-gb">hashingUtils.md5encode("string")</span><p></p></div><div><span lang="en-gb" style="font-family:'Andale Mono';" xml:lang="en-gb">hashingUtils.sha256encode("string")</span><p></p></div><div><span lang="en-gb" xml:lang="en-gb"><br /></span></div><div><span lang="en-gb" xml:lang="en-gb">For example, in a tHttpRequest Component:</span><p></p></div><div><span></span><span lang="en-gb" xml:lang="en-gb"></span><p></p></div><br /><div><br /></div><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-sQE7in1n64A/VUzsJJOwddI/AAAAAAAADls/Invobjf0YEM/s1600/example.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-sQE7in1n64A/VUzsJJOwddI/AAAAAAAADls/Invobjf0YEM/s400/example.png</span></a></div></div>]]></description><guid isPermaLink="false">292</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Dealing with Nested Documents in MongoDB and Talend (aka Baking a Cake)</title><link>https://community.jaspersoft.com/blog/tech-poet/dealing-nested-documents-mongodb-and-talend-aka-baking-cake/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><h4 style="text-align:left;">Abstract:</h4><div><a href="http://mongodb.com/" rel="external nofollow">MongoDB</a> is a very popular document database that gives you a huge amount of flexibility when it comes to storing data. On the other hand, the traditional relational model is far less flexible in how data is stored - you're limited to columns and rows. Sometimes you want to go from a flexible model like MongoDB to a relational one, that's what this post attempts to explain using <a href="http://talend.com/" rel="external nofollow">Talend</a>/<a href="http://jaspersoft.com/" rel="external nofollow">JaspersoftETL</a> (ETL tools).<br><br>I do not want to get into the relational vs non-relational model argument in this post - it's only an example if you need to do this for some reason...I'm pro choice :)</div><div><br></div><h4 style="text-align:left;">Scenario:</h4><div>We have a JSON document in MongoDB that looks like this:</div><pre style="background-color:#f0f0f0;border:1px dashed rgb(204,204,204);font-family:arial;font-size:12px;height:auto;line-height:20px;padding:0px;text-align:left;width:99%;"><code style="color:#000000;"> {        </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "0001",        </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "donut",        </code><code><span style="color:#0000FF;">"name"</span></code><code style="color:#000000;">: "Cake",        </code><code><span style="color:#0000FF;">"ppu"</span></code><code style="color:#000000;">: 0.55,        </code><code><span style="color:#0000FF;">"batters"</span></code><code style="color:#000000;">:             {                 </code><code><span style="color:#0000FF;"> "batter"</span></code><code style="color:#000000;">:                       [                            { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "1001", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Regular" },                            { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "1002", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Chocolate" },                            { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "1003", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Blueberry" },                            { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "1004", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Devil's Food" }                       ]             },        </code><code><span style="color:#0000FF;">"topping"</span></code><code style="color:#000000;">:             [                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5001", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "None" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5002", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Glazed" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5005", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Sugar" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5007", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Powdered Sugar" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5006", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Chocolate with Sprinkles" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5003", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Chocolate" },                  { </code><code><span style="color:#0000FF;">"id"</span></code><code style="color:#000000;">: "5004", </code><code><span style="color:#0000FF;">"type"</span></code><code style="color:#000000;">: "Maple" }             ]   }  </code></pre><div>We want to put the document into three different tables,  for use in a relational database:<br><h4 style="text-align:left;">Main Table:</h4><table>    <tbody><tr>        <th>ID</th>        <th>TYPE</th>        <th>NAME</th>        <th>PPU</th>    </tr><tr>        <td>0001</td>        <td>donut</td>        <td>cake</td>        <td>0.55</td>    </tr></tbody></table><h4 style="text-align:left;">Batter Table:</h4><table>    <tbody><tr>        <th>BATTERID</th>        <th>BATTERTYPE</th>        <th>CAKEID</th>    </tr><tr>        <td>1001</td>        <td>regular</td>        <td>0001</td>    </tr><tr>        <td>1002</td>        <td>chocolate</td>        <td>0001</td>    </tr><tr>        <td>1003</td>        <td>blueberry</td>        <td>0001</td>    </tr><tr>        <td>1004</td>        <td>devil's food</td>        <td>0001</td>    </tr></tbody></table><h4 style="text-align:left;">Topping Table:</h4><table>    <tbody><tr>        <th>TOPPINGID</th>        <th>TOPPINGTYPE</th>        <th>CAKEID</th>    </tr><tr>        <td>5001</td>        <td>None</td>        <td>0001</td>    </tr><tr>        <td>5002</td>        <td>Glazed</td>        <td>0001</td>    </tr><tr>        <td>5005</td>        <td>Sugar</td>        <td>0001</td>    </tr><tr>        <td>5007</td>        <td>Powdered Sugar</td>        <td>0001</td>    </tr><tr>        <td>5006</td>        <td>Chocolate with Sprinkles</td>        <td>0001</td>    </tr><tr>        <td>5003</td>        <td>Chocolate</td>        <td>0001</td>    </tr><tr>        <td>5004</td>        <td>Maple</td>        <td>0001</td>    </tr></tbody></table></div><h4 style="text-align:left;">Talend tMongoDBInput Component</h4><div>The tMongoDBInput component is what we'll use to extract the data from MongoDB and input into Talend. This is fairly straightforward, you can configure the connection and then you will have to map some fields. We map id, type, name, ppu as regular fields. The batter and topping fields are somewhat special. </div><div><br></div><div><b>Toppings:</b></div><div>The toppings field will be mapped a string and will contain an object in each row that we'll need to deal with later</div><div><br></div><div><b>Batters:</b></div><div>Batters is a nested document within another nested document and we'll need to define a parent node path. tMongoDBInput does not allow you to use node notation to select fields (like batters.batter) so you'll define a parent node like this:</div><div style="clear:both;text-align:center;"><a href="http://4.bp.blogspot.com/-AHhjABzmLsU/U5GmTz0cCHI/AAAAAAAADdM/52HE7WXplDQ/s1600/Untitled.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="66" width="640" alt="Untitled.png" src="https://4.bp.blogspot.com/-AHhjABzmLsU/U5GmTz0cCHI/AAAAAAAADdM/52HE7WXplDQ/s1600/Untitled.png" loading="lazy"></a></div><div style="clear:both;text-align:left;">In the end the schema for tMongoDBInput will look like this:</div><div><br></div><div style="clear:both;text-align:center;"><a href="http://4.bp.blogspot.com/-zHo1RKjm81I/U5GmCg40lkI/AAAAAAAADdE/xs0aII7SRWg/s1600/Screen+Shot+2014-06-06+at+12.28.40+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="234" width="320" alt="Screen+Shot+2014-06-06+at+12.28.40+PM.png" src="https://4.bp.blogspot.com/-zHo1RKjm81I/U5GmCg40lkI/AAAAAAAADdE/xs0aII7SRWg/s1600/Screen+Shot+2014-06-06+at+12.28.40+PM.png" loading="lazy"></a></div><h4 style="text-align:left;">tMap Component - Splitting</h4><div style="clear:both;text-align:left;">Now we'll use a tMap component to split the outputs into three (main, topping, batter)</div><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-FBCedjxneqY/U5Gm9Vx4rCI/AAAAAAAADdU/m_Qiqcz8Hf8/s1600/Screen+Shot+2014-06-06+at+12.32.50+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="198" width="640" alt="Screen+Shot+2014-06-06+at+12.32.50+PM.png" src="https://1.bp.blogspot.com/-FBCedjxneqY/U5Gm9Vx4rCI/AAAAAAAADdU/m_Qiqcz8Hf8/s1600/Screen+Shot+2014-06-06+at+12.32.50+PM.png" loading="lazy"></a></div><div style="clear:both;text-align:left;"><br></div><div><br></div><div><br></div><div><b>tExtractJSONFields - Expanding Documents</b><br>So now we have to deal with the special fields, batter and topping - each one of them contains a list that we want to denormalize into it's own rows. We can use the tExtractJSONFields component for this. The component has a couple of key things: schema, Loop XPath Query and XPath query. This determines what fields to map.<br><br><b>Schema:</b><br><div style="clear:both;text-align:center;"><a href="http://4.bp.blogspot.com/-pBJ37XrLWiE/U5Gn8evZvAI/AAAAAAAADdc/V1Kc_de93OA/s1600/Screen+Shot+2014-06-06+at+12.36.05+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="246" width="640" alt="Screen+Shot+2014-06-06+at+12.36.05+PM.png" src="https://4.bp.blogspot.com/-pBJ37XrLWiE/U5Gn8evZvAI/AAAAAAAADdc/V1Kc_de93OA/s1600/Screen+Shot+2014-06-06+at+12.36.05+PM.png" loading="lazy"></a></div><br><b>Then set the Xpath queries:</b><br><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-ByvY6cERBaE/U5GoOmu_wSI/AAAAAAAADdk/-5Nn1q5c9sI/s1600/Screen+Shot+2014-06-06+at+12.37.57+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="178" width="640" alt="Screen+Shot+2014-06-06+at+12.37.57+PM.png" src="https://1.bp.blogspot.com/-ByvY6cERBaE/U5GoOmu_wSI/AAAAAAAADdk/-5Nn1q5c9sI/s1600/Screen+Shot+2014-06-06+at+12.37.57+PM.png" loading="lazy"></a></div><br>And finally glue it all together:<br><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-vOqsV6fAKHY/U5GoXoNSedI/AAAAAAAADds/5IHZadq9108/s1600/Screen+Shot+2014-06-06+at+12.38.58+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><img border="0" height="418" width="640" alt="Screen+Shot+2014-06-06+at+12.38.58+PM.png" src="https://2.bp.blogspot.com/-vOqsV6fAKHY/U5GoXoNSedI/AAAAAAAADds/5IHZadq9108/s1600/Screen+Shot+2014-06-06+at+12.38.58+PM.png" loading="lazy"></a></div>Note that we have 3 input rows, then for each batter and topping we are extracting.<br><br><h4 style="text-align:left;">If you are interested in this example, you can download it here:</h4><div><ul style="text-align:left;"><li><a href="https://www.dropbox.com/s/7vvtl328xw7tew9/doc.json" rel="external nofollow">Data</a>: This is a JSON object you can import with mongoimport (like  <i>mongoimport --jsonArray --collection nestedSample &lt; doc.json</i>)</li><li><a href="https://www.dropbox.com/s/y3jtfcrp0vwcywp/TalendJob.zip" rel="external nofollow">JaspersoftETL Job</a>: This job works with JaspersoftETL 5.4.1 Big Data Edition (or presumably the Open Source Big Data edition of Talend)</li></ul></div></div></div>]]></description><guid isPermaLink="false">184</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Geospatial Features in MongoDB with Jaspersoft</title><link>https://community.jaspersoft.com/blog/tech-poet/geospatial-features-mongodb-jaspersoft/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><div dir="ltr" style="text-align:left;">Lately I have been posting technical examples to the Jaspersoft community wiki instead of this blog. I'll cross-post this one because there are not many examples of doing this. When working with Geospatial data, I found the $near operator to be pretty sweet. Let me show you by example.<br /><br />In the screenshots below you'll see that I constructed a report that shows "cases" on a map. When you click on a specific case you will be taken to a detail level report. The detail level report will show you cases nearby for that service. So for example, if someone reports a broken street light on Market Street, this might help you locate similar cases.<br /><div style="clear:both;text-align:center;"><a href="http://3.bp.blogspot.com/-AmWZsRUMTIc/UptlZkYSuCI/AAAAAAAADVI/ttNd-SOkUzo/s1600/Screen+Shot+2013-12-01+at+4.31.44+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><span>http://3.bp.blogspot.com/-AmWZsRUMTIc/UptlZkYSuCI/AAAAAAAADVI/ttNd-SOkUzo/s400/Screen+Shot+2013-12-01+at+4.31.44+PM.png</span></a></div><br /><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-JCz2rNSHVx4/UptlZpNmH-I/AAAAAAAADVE/9OLf8DICj4c/s1600/Screen+Shot+2013-12-01+at+4.28.52+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><span>http://2.bp.blogspot.com/-JCz2rNSHVx4/UptlZpNmH-I/AAAAAAAADVE/9OLf8DICj4c/s400/Screen+Shot+2013-12-01+at+4.28.52+PM.png</span></a></div><div style="clear:both;text-align:left;"><b>So how is it done?</b></div><div style="clear:both;text-align:left;"> Quite simple really, take a look at this mongodb <a href="https://gist.github.com/anonymous/7736499" rel="external nofollow">query</a>:</div><br /><br /><br /><br /><b>Line 8:</b> The $P{location} parameter is a java.util.List that contains longitude and latitude coordinates, something like [-122.4194200,37.7749300]<b>Line 11:</b> How many meters from the center (specified in line 8) should it search<b>Line 13:</b> The $P{service} parameter is a string containing the name of the Service, in the screenshot above it's Missing SignYou will need to have an index on your location field, like so: <span style="font-family:Arial;font-size:13px;">ensureIndex({"location" : "2dsphere" } )</span></div><div><br />That's it, I've never really done anything with geospatial data and this seemed like it was a piece of cake.<br /><h3 style="text-align:left;">References:</h3></div><div><ul style="text-align:left;"><li>Download the example data and reports from the <a href="http://community.jaspersoft.com/wiki/mongodb-city-cases-example" rel="external nofollow">Jaspersoft Community Wiki</a></li><li>Read about the <a href="http://docs.mongodb.org/manual/reference/operator/query/near/" rel="external nofollow">MongoDB $near operator</a></li><li>Watch me <a href="http://www.jaspersoft.com/watch/Reporting-Dashboards-Analytics-Big%20Data" rel="external nofollow">present on this subject</a></li></ul></div><br /></div>]]></description><guid isPermaLink="false">145</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Backing Up JasperServer in Linux</title><link>https://community.jaspersoft.com/blog/tech-poet/backing-jasperserver-linux/</link><description><![CDATA[<div dir="ltr" style="text-align:left;">This is a sysadmin how-to for backing up JasperReports Server (formerly JasperServer) and it's database (MySQL only for now).<br /><br />I wrote a fairly robust script to achieve this task. It will read the database configuration from your default_master.properties file, work with several versions of JasperServer, delete old backups, write to the syslog and export the repository contents to file.<br /><br />First drop my backup script into your <i>\buildomatic</i> folder if you're using 4.0 and abovie, 3.7 and below put in your <i>/scripts</i> folder.<br /><br /><b>Once the script is in place edit the variables at the top of the script:</b><br /><br />This is to signify that you're using JasperServer 3.7.1 and below:<br /><i>IS_PRE_4=false</i><br /><br />This is a name for the product:<br /><i>PRODUCT_NAME="JRS-4.0-Pro"</i><br /><br />This is where backups will be stored:<br /><i>BACKUP_DEST="/home/ernesto/Dropbox/Backups"</i><br /><br />This will delete old backups if set to true<br /><i>DELETE_OLD=true</i><br /><br />How many days to keep old backups<br /><i>DAYS=120</i><br /><br />Now add it to your crontab. I will do it once a week in a lazy manner so will add the script to vim /etc/cron.weekly/js-backups<br /><br /><code>#!/bin/bash</code><br /><code>/usr/local/jaspersoft/jasperserver4/buildomatic/js-backup.sh</code><br /><br /><br />The script will log to /var/log/messages:<br /><div style="clear:both;text-align:center;"><a href="http://4.bp.blogspot.com/-V2KqR4Isxwg/Tajnswn4XUI/AAAAAAAAArk/jW6hQy_gcy4/s1600/log.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://4.bp.blogspot.com/-V2KqR4Isxwg/Tajnswn4XUI/AAAAAAAAArk/jW6hQy_gcy4/s640/log.png</span></a></div><br /><br />The output files will look like this, I chose to stick them in my <a href="http://dropbox.com/" rel="external nofollow">Dropbox</a> folder for off-site backups:<br /><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-Nvnq569JUUQ/Tajn9xUTLuI/AAAAAAAAAro/nmKAmX-GJ0g/s1600/backup_dir.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-Nvnq569JUUQ/Tajn9xUTLuI/AAAAAAAAAro/nmKAmX-GJ0g/s400/backup_dir.png</span></a><a href="http://1.bp.blogspot.com/-Nvnq569JUUQ/Tajn9xUTLuI/AAAAAAAAAro/nmKAmX-GJ0g/s1600/backup_dir.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><br /></a><a href="http://1.bp.blogspot.com/-Nvnq569JUUQ/Tajn9xUTLuI/AAAAAAAAAro/nmKAmX-GJ0g/s1600/backup_dir.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><br /></a><a href="http://1.bp.blogspot.com/-Nvnq569JUUQ/Tajn9xUTLuI/AAAAAAAAAro/nmKAmX-GJ0g/s1600/backup_dir.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><br /></a></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />You can download the script from this<a href="http://jasperforge.org/plugins/espforum/view.php?group_id=112&amp;forumid=102&amp;topicid=86513" rel="external nofollow"> jasperforge forum post</a> or view it below:<br /><br /><div><a href="http://snipplr.com/view/52290/jasperserver-backup-script/" rel="external nofollow">Code snippet - JasperServer Backup Script</a> on Snipplr</div></div>]]></description><guid isPermaLink="false">89</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Icinga Reporting with JasperReports Server - Part 1: Installation</title><link>https://community.jaspersoft.com/blog/tech-poet/icinga-reporting-jasperreports-server-part-1-installation/</link><description><![CDATA[<div dir="ltr" style="text-align:left;">A quick overview of how to install and configure the reporting add-on packages for Icinga (a Nagios Monitoring Fork), written for JasperReports Server.<br><br><div style="clear:both;text-align:center;"><iframe allowfullscreen="allowfullscreen" width="320" height="266" frameborder="0" src="https://www.youtube.com/embed/SHLsTx3q6KY?feature=player_embedded" loading="lazy"></iframe></div><br><span></span><span></span></div>]]></description><guid isPermaLink="false">88</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Icinga Reporting with JasperReports Server - Part 2: Usage + Basic Report Development</title><link>https://community.jaspersoft.com/blog/tech-poet/icinga-reporting-jasperreports-server-part-2-usage-basic-report-development/</link><description><![CDATA[<div dir="ltr" style="text-align:left;">Short tutorial, shows how to schedule a report, how to change the way you are prompted for parameters and some basic editing of reports within iReport<br /><br /><div style="clear:both;text-align:center;"></div></div>]]></description><guid isPermaLink="false">87</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Using tGoogleAnalyticsInput in JasperETL/Talend</title><link>https://community.jaspersoft.com/blog/tech-poet/using-tgoogleanalyticsinput-jasperetltalend/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><div dir="ltr" style="text-align:left;">This is a short article on getting Google Analytics into <a href="http://www.jaspersoft.com/jasperetl" rel="external nofollow">JaspersoftETL</a>/<a href="http://www.talend.com/" rel="external nofollow">Talend ETL</a> tools. <a href="http://www.google.com/analytics/" rel="external nofollow">Google Analytics</a> has a nice interface and many great ways of analyzing web traffic, it'd be hard to beat the work Google did there. The purpose of this connector would be to bring the data into your own data warehouse and join it with other intelligence you might have. A great way to display the aggregated data would be with a BI tool like <a href="http://jaspersoft.com/" rel="external nofollow">Jaspersoft</a>.<br /><br />I'm writing because the <a href="http://blog.smile.fr/Recuperer-ses-donnees-de-trafic-de-GoogleAnalytics-avec-Talend-et-Smile" rel="external nofollow">help for the tGoogleAnalyticsInput is in French</a> and incomplete.<br /><br />So let's get started. You'll need JasperETL 4.1.2 or older (commercial editions <a href="http://jaspersoft.com/" rel="external nofollow">here</a>, open source <a href="http://jasperforge.org/" rel="external nofollow">here</a>).<br /><br />Installing the plugin:<br /><div style="text-align:left;"><a href="http://4.bp.blogspot.com/-L4o2riZbb8Y/TtgY5A-hoiI/AAAAAAAABlU/MJC_JhOi8N4/s1600/install.png" style="clear:left;margin-bottom:1em;" rel="external nofollow"><span>http://4.bp.blogspot.com/-L4o2riZbb8Y/TtgY5A-hoiI/AAAAAAAABlU/MJC_JhOi8N4/s1600/install.png</span></a></div><div style="text-align:left;">Create a new Job Design and drag the tGoogleAnalyticsInput component from the Palette (under Internet):</div><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-3Nui1tv4YKo/TtgaOHVCR2I/AAAAAAAABlc/5EXfIquQkiM/s1600/component.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://2.bp.blogspot.com/-3Nui1tv4YKo/TtgaOHVCR2I/AAAAAAAABlc/5EXfIquQkiM/s1600/component.png</span></a></div><div style="text-align:left;"><br /></div><div style="text-align:left;"><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Configure the component. First start with finding some fields you'd like to use from the Google API: <a href="http://code.google.com/apis/analytics/docs/gdata/dimsmets/dimsmets.html." rel="external nofollow">http://code.google.com/apis/analytics/docs/gdata/dimsmets/dimsmets.html.</a> Note that you need to have some metrics (can't be all dimensions, vice versa).</div><div style="text-align:left;"><br /></div><div style="text-align:left;">Here's an example schema (you'll have to put in the fields yourself):</div><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-IpIT5eUJln0/TtgdoTPN8lI/AAAAAAAABls/RLELzw_lrb8/s1600/schema.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://2.bp.blogspot.com/-IpIT5eUJln0/TtgdoTPN8lI/AAAAAAAABls/RLELzw_lrb8/s1600/schema.png</span></a></div></div><div style="text-align:left;">Now configure the component. In order to get your Profile ID (note it doesn't start with UA) read the cryptic Google Documentation about it. I got mine by examining the URL while logged into GA and looking at the &amp;id= parameter.<br /><br />The "value" column comes directly from the Google API and will also have to be filled in. I've also found that I HAVE to filter on period. You can do 1980-2020 if you want to include everything. </div><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-ql9dEfeMvUE/Ttgdkq_k8LI/AAAAAAAABlk/81KWdYA3hds/s1600/component_configure.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://2.bp.blogspot.com/-ql9dEfeMvUE/Ttgdkq_k8LI/AAAAAAAABlk/81KWdYA3hds/s1600/component_configure.png</span></a></div><div style="text-align:left;"><br /></div>Now you can run the the job and see your visitors:<br /><div style="clear:both;text-align:center;"><a href="http://2.bp.blogspot.com/-QNd9JPccXr8/TtguHWtNXiI/AAAAAAAABl0/_uJVbva41xU/s1600/output.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://2.bp.blogspot.com/-QNd9JPccXr8/TtguHWtNXiI/AAAAAAAABl0/_uJVbva41xU/s1600/output.png</span></a></div><br />Funny enough. If you're reading this right now then you will eventually flow through the GA database and the very job I'm displaying above ;)</div>]]></description><guid isPermaLink="false">86</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Flush Jaspersoft OLAP Cache from Talend/JasperETL</title><link>https://community.jaspersoft.com/blog/tech-poet/flush-jaspersoft-olap-cache-talendjasperetl/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><a href="http://www.jaspersoft.com/jasperetl" rel="external nofollow">JaspersoftETL</a> is a Java code generation tool designed to load your operational data into a <a href="http://en.wikipedia.org/wiki/Data_warehouse" rel="external nofollow">data warehouse</a> and get it ready for reporting and analysis.  <a href="http://www.jaspersoft.com/jaspersoft-olap" rel="external nofollow">Jaspersoft OLAP</a> takes advantage of aggregate tables and an in-memory cache to speed up queries. If you're running a nightly job to load the DW, it's a good idea to clear the OLAP cache at that time, otherwise your users will not take advantage of new data.<br /><br />There are several ways to clear the OLAP cache:<br /><ul style="text-align:left;"><li>Login with <span>superuser </span>privileges and display the OLAP Settings page.</li><li>In the OLAP Settings panel, click <span><b>Flush OLAP Cache</b></span>. </li><li><span><span> </span></span>Using utilities such as cURL and wget, send an HTTP request to this URL: <code><a href="http://server:8080/" rel="external nofollow">http://server:8080/</a>olap/flush.html?j_username=superuser&amp;j_password=</code></li><li>Restart the application server instance. </li><li>Call the Java API.</li></ul><div>I've created a small component that allows the clearing of cache via the URL method from a JasperETL/Talend job. Essentially it will prompt you for a username and password (and note that only superuser can clear the cache by default) and a server URL. The URL should point to something like <code><a href="http://server:8080/" rel="external nofollow">http://server:8080/</a>jasperserver-pro/olap/flush.html</code></div><div><br /></div><div>You may find the tJasperOLAPCache component on <a href="http://www.talendforge.org/exchange/index.php?eid=443&amp;product=tos&amp;action=view&amp;nav=1,1,1" rel="external nofollow">talendforge.org</a></div><div><br /></div><div style="clear:both;text-align:center;"><a href="http://1.bp.blogspot.com/-yyetbAxaLXo/Tuqk2yNLmgI/AAAAAAAABpk/KE5nvTvqVSE/s1600/Screen+shot+2011-12-15+at+5.29.28+PM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-yyetbAxaLXo/Tuqk2yNLmgI/AAAAAAAABpk/KE5nvTvqVSE/s400/Screen+shot+2011-12-15+at+5.29.28+PM.png</span></a></div><div style="clear:both;text-align:center;">Another useful thing to do would be to use the <a href="http://www.talendforge.org/exchange/index.php?eid=253&amp;product=tos&amp;action=view&amp;nav=0,1,1" rel="external nofollow">tJasperServerExec</a> plugin to re-populate the cache.</div></div>]]></description><guid isPermaLink="false">85</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>TalendDate</title><link>https://community.jaspersoft.com/blog/tech-poet/talenddate/</link><description><![CDATA[<div dir="ltr" style="text-align:left;">Not a lot of examples around TalendDate so thought I'd post a couple of quick examples:<br /><br /><b>Today's date:</b><br /><code>TalendDate.getDate("yyyy-MM-dd") </code><br /><b>Returns:</b><br />2012-04-12<br /><br /><b>Yesterday's date:</b><br /><code>TalendDate.addDate(TalendDate.getDate("yyyy-MM-dd"),"yyyy-MM-dd",-1,"dd")</code><br /><b>Returns:</b><br />2012-04-11<br /><br /><b>Tomorrow's date:</b><br /><code>TalendDate.addDate(TalendDate.getDate("yyyy-MM-dd"),"yyyy-MM-dd",1,"dd")</code><br /><b>Returns:</b><br />2012-04-13<br /><br /><b>Date format:</b><br />CC - century<br />YY - year<br />MM - month<br />DD - day of month<br />hh - hour<br />mm - minutes<br />ss - seconds<br /><br /><b>Return types:</b><br /><b>string!</b><br /><b><br /></b><br /><b>Other methods:</b><br /><br /><span style="font-family:monospace;"></span><br /><span style="font-family:monospace;">TalendDate.compareDate(myDate,myDate2,"yyyy-MM-dd")</span><br /><span style="font-family:monospace;">TalendDate.diffDate(myDate,myDate2,"MM")</span><br /><span style="font-family:monospace;">TalendDate.formatDate("yyyy-MM-dd HH:mm:ss",myDate)</span><br /><span style="font-family:monospace;">TalendDate.setDate(mydate,newValue,"MM")</span><br /><span style="font-family:monospace;">TalendDate.getFirstDayOfMonth(mydate)</span><br /><span style="font-family:monospace;">TalendDate.getLastDayOfMonth(mydate)</span><br /><span style="font-family:monospace;">TalendDate.getRandomDate("2007-01-01","2008-12-31")</span><br /><span style="font-family:monospace;">TalendDate.parseDate("yyyy-MM-dd HH:mm:ss","")</span><br /><br /><br /><div><code></code></div></div>]]></description><guid isPermaLink="false">84</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Jaspersoft Report Writing Best Practices</title><link>https://community.jaspersoft.com/blog/tech-poet/jaspersoft-report-writing-best-practices/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><br /><div style="clear:both;text-align:center;"></div><div style="text-align:left;"><span style="background-color:#FFFFFF;">The following is a set of guidelines for developing reports with iReport and JasperReports Server. It was compiled with the help of <a href="http://blog.frau-klein.org/" rel="external nofollow">Frau Klein</a></span><br /><br /><b style="background-color:#FFFFFF;">Best Practice - report resources:</b><br /><div style="text-align:left;"><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a><span style="background-color:#FFFFFF;">Report units contain references to the resources they use: images, styles, sub-reports, queries, input controls - <a href="http://screencast.com/t/i3fTvZbJW" rel="external nofollow">example</a></span></div><div><b>Why</b>?</div><div>Promotes re-usability (nothing is local to report unit). Easy maintenance around moving report units, replacing resources in a mass scale. </div><div><br /></div><div><b> Best Practice - references:</b></div><div><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a> Never hard code an entire repository path to resource, the image <i>repo:/reports/images/image.png </i>should come in as a reference like <i>repo:image.png</i><b style="background-color:#FFFFFF;"> </b><span style="background-color:#FFFFFF;">- <a href="http://screencast.com/t/NhbY5X1m" rel="external nofollow">example</a></span></div><div><b>Why?</b></div><div>When you use js-export with --uris option it only resolves repository dependencies, it doesn't look for expressions that maybe use an absolute repository path</div><div><br /></div><div> <b>Best Practice - styles:</b></div><div><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a>Do not hard code any style information to JRXML. Develop central style templates (jrtx, jrctx) for all your reports, add as a reference to reports - <a href="http://screencast.com/t/8V91Pg4CxKtH" rel="external nofollow">example</a></div><div><b>Why?</b></div><div>Fast change management, when the company style changes you will edit a couple of resources vs hundreds. <i>Note that conditional styles are not in the jrtx</i></div><div><br /></div><div><b>Best Practice - logged in user</b> </div><div><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a> Don't log in as superuser, use an organization specific user like jasperadmin - <a href="http://screencast.com/t/aKgb3JcF" rel="external nofollow">example</a></div><div><b>Why?</b></div><div> Complicates repo: paths. If logged in as superuser you must pass in the full uri ex: <i>repo:/organizations/organization_1/reports/drill_down_report </i>where being part of an organization you would just use<i> repo:/reports/drill_down_report</i>. Also, it's good for testing around multi-tenancy to be a "real" user.</div><div><br /></div><div><b>Best Practice - input controls</b></div><div><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a>Create shared input controls if they apply to more than one report, bring them in as a link - <a href="http://screencast.com/t/Uyshn928xFT9" rel="external nofollow">example</a></div><div><b>Why?</b></div><div>Reduce development time, useful for dashboards. <i>Note: Datasources won't switch if your sub-report switches</i><br /><i><br /></i><b>Best Practice - Use JNDI Datasources </b><i>(contributed by Guillaume AUTIER)</i><br /><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a><br />Have a unique entry point to change datasource details (ip:port:credentials)<br /><b>Why ?</b><br />When deploying the server in a different location, you would only have to change the datasource definition in one file: <i>context.xml</i> (this is valid in tomcat, see your app server settings for JNDI)<br /><br />When using export scripts the datasource will remain untouched, so you can use the same export on multiple servers without having to change the datasource detail after the import</div><div><br /></div><div>You can take advantage of Application Server pooling instead of creating many connections to the database (performance).<br /><br /><b>Best Practice – parametrized references with sub-reports </b><i>(contributed by Guillaume AUTIER)</i><br /><br /><a href="http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png" style="clear:left;float:left;margin-bottom:1em;margin-right:1em;" rel="external nofollow"><span>http://1.bp.blogspot.com/-UyV8ur79eis/T-RLMXYsTHI/AAAAAAAACsc/fSMu64z_QFs/s1600/lightbulb.png</span></a>Using the previous advice you can also access a report (with subreports) both locally and on the server without touching your expressions. <br /><b>Why?</b><br />This is useful when you want to quickly preview in iReport a report taken from the server. We assume that all reports and subreports .jasper files resides in the same local folder.<br /><br /><br /><ul style="text-align:left;"><li>Create a parameter <i>$P{SUB_REPORTDIR} </i>(string type, use as prompt, default value “repo:”)</li><li>Then have the following formula in your subreport expressions</li></ul><br /><br /><code>$P{SUB_REPORTDIR }.equals(“”)?”mySubReport.jasper”: $P{ SUB_REPORTDIR} + ”mySubReport.jrxml”</code><br /><br /><br /><ul style="text-align:left;"><li>Publish your report on the server as usual : do not create(or link) an input control for the SUB_REPORTDIR parameter</li></ul><br />Run your report :<br /><br /><ul style="text-align:left;"><li>In iReport you will be prompted for the SUB_REPORTDIR parameter leave it blank.</li><li>On the server : Without an input control for the SUB_REPORTDIR parameter the server will then take the default.</li></ul><br /><br /><i>If you have any other best practices tips, post them in the comments and I'll include into the post, happy reporting!</i></div></div></div>]]></description><guid isPermaLink="false">83</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>MongoDB Aggregation Queries Basics on MongoLab</title><link>https://community.jaspersoft.com/blog/tech-poet/mongodb-aggregation-queries-basics-mongolab/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><h3 style="text-align:left;">What is MongoLab?</h3><div>MongoLab is a hosted <a href="http://mongodb.org/" rel="external nofollow">MonoDB</a> service that offers one free database to developers wanting to learn the technology. It's a very elegant way to start learning or developing a small application. I started using this earlier in the year and had created a couple of collections on it. </div><h3 style="text-align:left;">What is the MongoDB Aggregation Framework?</h3><div>Traditionally in SQL databases you have the concept of a GROUP BY and an aggregation function like average or sum. In MongoDB, aggregation wasn't ever as easy, in order to do any aggregation you'd have to write your own complicated MapReduce jobs. Along comes MongoDB <a href="http://docs.mongodb.org/manual/release-notes/2.2/" rel="external nofollow">version 2.2</a>, which includes the aggregation framework.<br /><br />So consider this SQL statement:<br /><pre>SELECT <span style="background-color:#FFA500;">sum(duration)</span> <span style="background-color:#FFFF00;">FROM calls</span> <span style="background-color:#00FFFF;">GROUP BY disposition</span></pre><br />And here it is translated to MongoDB, I've attempted to color code the translations:</div><pre style="border:1px dashed rgb(153,153,153);color:#000000;font-family:'Andale Mono', 'Lucida Console', Monaco, fixed, monospace;font-size:12px;line-height:14px;padding:5px;width:100%;"><code><span style="background-color:#eeeeee;">   }runCommand: {   </span><span style="background-color:#FFFF00;">aggregate : 'calls',</span><span style="background-color:#eeeeee;">   pipeline : [                {                  $group : {                   </span><span style="background-color:#00FFFF;"> _id : '$disposition',</span><span style="background-color:#eeeeee;">                    durations: {                            </span><span style="background-color:#FFA500;"> $sum : '$duration'</span><span style="background-color:#eeeeee;">                                }                            }                 }               ]             }}</span></code></pre><div><br />Easy enough! There's much more to this of course. Here's a great reference: <a href="http://docs.mongodb.org/manual/reference/aggregation/" rel="external nofollow">http://docs.mongodb.org/manual/reference/aggregation/</a><br /><br /><h3 style="text-align:left;">MongoLabs and Aggregation Framework</h3></div><div>So to use this on MongoLabs you'll have to start a new database, old ones are on an older version, according to this <a href="https://support.mongolab.com/entries/20164341-what-version-of-mongodb-does-mongolab-use" rel="external nofollow">helpful article</a></div><div><br /></div><div><span style="background-color:#FFFFFF;color:#333333;font-family:'Century Gothic', 'Heiti TC', sans-serif;font-size:12px;">All free/starter databases created after Nov 30, 2012 will be running 2.2.x  will have </span>Aggregation Framework Support</div><div><br /></div><h3 style="text-align:left;">Why Do I care? </h3><div>Well I had some mongoDB Jaspersoft samples that would bring in an entire un-aggregated dataset into memory and then use the JasperReports library to do aggregations in-memory. This is fine and dandy if you're dealing with tens of thousands of records. When you move into millions of records this becomes a bit harry and I'd rather my database do the work!</div><div><br /></div><div>So using my example query from above, I was able to create this very cool looking report in iReport:</div><div style="clear:both;text-align:center;"><a href="http://3.bp.blogspot.com/-HzfF8TdDjGs/UMHe79U7pGI/AAAAAAAACtc/fnzJR9libs0/s1600/Screen+Shot+2012-12-07+at+11.35.15+AM.png" style="margin-left:1em;margin-right:1em;" rel="external nofollow"><span>http://3.bp.blogspot.com/-HzfF8TdDjGs/UMHe79U7pGI/AAAAAAAACtc/fnzJR9libs0/s640/Screen+Shot+2012-12-07+at+11.35.15+AM.png</span></a></div><div><br /></div><div></div><div><br /><h3 style="text-align:left;">Where can I learn more about Reporting and Analytics on MongoDB?</h3></div><div>First place to look is the Jaspersoft community wiki: <a href="http://community.jaspersoft.com/wiki/mongodb" rel="external nofollow">http://community.jaspersoft.com/wiki/mongodb</a></div><div>My colleague, Matt Dahlman has some excellent examples on his blog: <a href="http://mdahlman.wordpress.com/tag/mongodb/" rel="external nofollow">http://mdahlman.wordpress.com/tag/mongodb/</a></div></div>]]></description><guid isPermaLink="false">82</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>Report Bursting in JasperReports Server</title><link>https://community.jaspersoft.com/blog/tech-poet/report-bursting-jasperreports-server/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><h2 style="text-align:left;">What is report bursting?</h2>Take this example. You have a report that shows all the accounts that a particular employee owns in your company. The user can log into your reporting system and ask for the report, he'll be asked to enter his employee ID or maybe it will be filled in automatically based on who he/she is.<br><br>Now your boss asks you (a BI professional) to send each employee their list of accounts on a weekly basis...yikes! You need to automate this. What do you do?<br><br>As of Jaspersoft version 5.0 there's no UI built into the web-application to handle the complex task of report bursting. Designing an UI that let's you iterate through any possibility of inputs, read any possibility of values and output to any possible medium is tricky, for now you have to build your own utilities using the rich SOAP or REST APIs that are available in JasperReports Server. The easiest way I found to do this using is using JaspersoftETL (Talend) and a component called <a href="http://www.talendforge.org/exchange/tos/extension_view.php?eid=253" rel="external nofollow">tJasperServerExec</a><br><br>The custom component calls the API of Jaspersoft to handle the report execution end. There are more components like this coming one day soon that let you use the scheduler built into Jaspersoft, for this example we use the mail sending capabilities of Talend.<br><br>What the video doesn't cover is scheduling of this job. The community editions of ETL rely on you to schedule jobs yourself using cron or the Windows scheduler. The commercial editions allow you to publish the job to the Administration Server which have the ability to schedule from a web UI.<br><br>So here's how it's done:<br><div style="clear:both;text-align:center;"><iframe allowfullscreen="allowfullscreen" width="320" height="266" frameborder="0" src="https://www.youtube.com/embed/G0HuGxSROI4?feature=player_embedded" loading="lazy"></iframe></div><br></div>]]></description><guid isPermaLink="false">81</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item><item><title>New MongoDB Components in Talend/JaspersoftETL</title><link>https://community.jaspersoft.com/blog/tech-poet/new-mongodb-components-talendjaspersoftetl/</link><description><![CDATA[<div dir="ltr" style="text-align:left;"><div style="clear:both;text-align:left;">I uploaded two videos with examples of using the tMongoDBInput and tMongoDBRow components that are shipping with JaspersoftETL 5.2.2 (Plus edition) and Talend 5.2.2+</div><div style="clear:both;text-align:left;"><br></div><div style="clear:both;text-align:left;">I recommend you change the quality to 720p to watch the videos in better quality. I hope you find them useful!</div><div style="clear:both;text-align:center;"><br></div><div style="clear:both;text-align:left;">Part 1: Using tMongoDBInput (and using Talend's built in aggregation engine):</div><iframe allowfullscreen="" frameborder="0" height="390" width="420" src="https://www.youtube.com/embed/wtAv1WJYzxg" loading="lazy"></iframe><br><div style="clear:both;text-align:center;"><br></div><div style="clear:both;text-align:center;"><br></div><div style="clear:both;text-align:left;">Part 2: Using tMongoDBRow (and the aggregation framework):</div><iframe allowfullscreen="" frameborder="0" height="390" width="420" src="https://www.youtube.com/embed/x6C1SsVY_2I" loading="lazy"></iframe></div>]]></description><guid isPermaLink="false">80</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item></channel></rss>
