\n ...\n\u003C/Persons>\n","xml","",[81,82,83,91,97,103,109],"code",{"__ignoreMap":79},[84,85,88],"span",{"class":86,"line":87},"line",1,[84,89,90],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[84,92,94],{"class":86,"line":93},2,[84,95,96],{},"\u003CPersons>\n",[84,98,100],{"class":86,"line":99},3,[84,101,102],{}," \u003CPerson firstname=\"First\" lastname=\"Last\" mail=\"first.last@test.test\" title=\"nice guy\" age=\"47\" status=\"married\"/>\n",[84,104,106],{"class":86,"line":105},4,[84,107,108],{}," ...\n",[84,110,112],{"class":86,"line":111},5,[84,113,114],{},"\u003C/Persons>\n",[66,116,118],{"id":117},"the-custom-data-source","The custom data source",[18,120,121,122,125],{},"The custom data source extends the ",[25,123,124],{},"JRAbstractTextDataSource"," and therefore the sample implementation has to override\nthe methods",[127,128,129,136],"ul",{},[40,130,131,135],{},[132,133,134],"em",{},"boolean next():"," Determines whether or not there is another row to display",[40,137,138,141],{},[132,139,140],{},"Object getFieldValue(JRField field)",": Requests the value for the given field/cell",[18,143,144],{},"It simply implements the Iterator pattern in order to render all columns of the report.",[18,146,147],{},[25,148,149],{},"Initialization",[18,151,152,153,156],{},"The constructor of the class expects an Inputstream that represents the XML source. Based on that stream the class\ninitializes a ",[25,154,155],{},"XMLStreamReader"," which is basically an iterator over the XML tags.",[18,158,159],{},[25,160,161],{},"boolean next()",[18,163,164,165,168],{},"The implementation of the ",[132,166,167],{},"next()"," method initially iterates over the XML tags till it reaches the first Person tag and\nstops at this point. Unfortunately this means that the custom implementation contains knowledge about how the XML is\nstructured and makes it very hard to reuse.",[18,170,171,172,174],{},"Every subsequent call to the ",[132,173,167],{}," method sets the current pointer to the next Person element and returns true, until\nthe Persons tag has been reached or the end of the document appeared.",[74,176,180],{"className":177,"code":178,"language":179,"meta":79,"style":79},"language-java shiki shiki-themes github-light github-dark"," int eventType = xmlStreamReader.getEventType();\n String tagName = null;\n boolean isStart = false;\n while (xmlStreamReader.hasNext()) {\n eventType = xmlStreamReader.next();\n switch (eventType) {\n case XMLEvent.START_ELEMENT:\n isStart = true;\n case XMLEvent.END_ELEMENT:\n tagName = xmlStreamReader.getLocalName();\n // check if there is still a person element left\n if (isStart && PERSON_TAG_NAME.equals(tagName)) {\n return true;\n } else if (!isStart && PERSONS_TAG_NAME.equals(tagName)) {\n // end tag of persons, nothing else to handle\n return false;\n }\n break;\n case XMLEvent.END_DOCUMENT:\n return false;\n }\n isStart = false;\n }\n","java",[81,181,182,187,192,197,202,207,213,219,225,231,237,243,249,255,261,267,273,279,285,291,297,303,309],{"__ignoreMap":79},[84,183,184],{"class":86,"line":87},[84,185,186],{}," int eventType = xmlStreamReader.getEventType();\n",[84,188,189],{"class":86,"line":93},[84,190,191],{}," String tagName = null;\n",[84,193,194],{"class":86,"line":99},[84,195,196],{}," boolean isStart = false;\n",[84,198,199],{"class":86,"line":105},[84,200,201],{}," while (xmlStreamReader.hasNext()) {\n",[84,203,204],{"class":86,"line":111},[84,205,206],{}," eventType = xmlStreamReader.next();\n",[84,208,210],{"class":86,"line":209},6,[84,211,212],{}," switch (eventType) {\n",[84,214,216],{"class":86,"line":215},7,[84,217,218],{}," case XMLEvent.START_ELEMENT:\n",[84,220,222],{"class":86,"line":221},8,[84,223,224],{}," isStart = true;\n",[84,226,228],{"class":86,"line":227},9,[84,229,230],{}," case XMLEvent.END_ELEMENT:\n",[84,232,234],{"class":86,"line":233},10,[84,235,236],{}," tagName = xmlStreamReader.getLocalName();\n",[84,238,240],{"class":86,"line":239},11,[84,241,242],{}," // check if there is still a person element left\n",[84,244,246],{"class":86,"line":245},12,[84,247,248],{}," if (isStart && PERSON_TAG_NAME.equals(tagName)) {\n",[84,250,252],{"class":86,"line":251},13,[84,253,254],{}," return true;\n",[84,256,258],{"class":86,"line":257},14,[84,259,260],{}," } else if (!isStart && PERSONS_TAG_NAME.equals(tagName)) {\n",[84,262,264],{"class":86,"line":263},15,[84,265,266],{}," // end tag of persons, nothing else to handle\n",[84,268,270],{"class":86,"line":269},16,[84,271,272],{}," return false;\n",[84,274,276],{"class":86,"line":275},17,[84,277,278],{}," }\n",[84,280,282],{"class":86,"line":281},18,[84,283,284],{}," break;\n",[84,286,288],{"class":86,"line":287},19,[84,289,290],{}," case XMLEvent.END_DOCUMENT:\n",[84,292,294],{"class":86,"line":293},20,[84,295,296],{}," return false;\n",[84,298,300],{"class":86,"line":299},21,[84,301,302],{}," }\n",[84,304,306],{"class":86,"line":305},22,[84,307,308],{}," isStart = false;\n",[84,310,312],{"class":86,"line":311},23,[84,313,314],{}," }\n",[18,316,317],{},[25,318,140],{},[18,320,321,322,325],{},"The implementation of",[132,323,324],{},"getFieldValue(JRField field)"," is very simple, because the attribute name is exactly the name that\nis assigned in the Jasper Report document.",[74,327,329],{"className":177,"code":328,"language":179,"meta":79,"style":79},"return xmlStreamReader.getAttributeValue(null, field.getName());\n",[81,330,331],{"__ignoreMap":79},[84,332,333],{"class":86,"line":87},[84,334,328],{},[50,336,338],{"id":337},"brining-all-together","Brining all together",[18,340,341],{},"We have now a XML file that contains our test persons and a custom data source that iterates one by one over each\nperson. It is time to see how this improved the report generation time and bringing all pieces together.",[18,343,56,344,347],{},[25,345,346],{},"ReportGenerator"," class accepts the XML source and the template as stream and via an additional flag it is\npossible to switch between the default and the custom data source. A simple Junit test is using this class to run 4\nreport generations and measures the amount of time it needed. Here the result of the Junit test on my local machine:",[18,349,350],{},"`Running com.jasperreports.ReportGeneratorTest",[18,352,353],{},"INFO ReportGenerator - Created report with default XML data source in 4.136 seconds.",[18,355,356],{},"INFO ReportGenerator - Created report with custom datasource in 0.684 seconds.",[18,358,359],{},"INFO ReportGenerator - Created report with default XML data source in 21.463 seconds.",[18,361,362],{},"INFO ReportGenerator - Created report with custom datasource in 3.495 seconds.",[18,364,365],{},"Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30.267 sec`",[18,367,368],{},"The first two results are using a XML source with 100 Persons, the following two are processing 5000 Persons. The custom\ndata source implementation is about 6 times faster than the default implementation and this sample “only” uses only a\nfraction of what we had to process in our project. In fact our worst case scenario mentioned in the beginning is using\n50000 records on multiple tabs and therefore this improvement pays of very fast.",[370,371,372],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":79,"searchDepth":93,"depth":93,"links":374},[375,376],{"id":52,"depth":99,"text":53},{"id":337,"depth":99,"text":338},[378],"open-source-blog","2012-08-29T02:40:26","While working on one of my projects we were faced with the problem of creating a report with a big amount of data to\\nshow on multiple Excel tabs (about 50000 entries grouped by different criteria’s). We had a couple of requirements that\\nlead us to choose Jasper Reports as our report generation engine. Other requirements lead us to use XML as data source –\\ne.g. to generate the report on the fly without wasting hard disk space for different languages.","md","https://synyx.de/blog/big-jasper-reports-with-custom-xml-datasource/",{},true,"/blog/big-jasper-reports-with-custom-xml-datasource",{"title":7,"description":20},"blog/big-jasper-reports-with-custom-xml-datasource",[389,390,391],"custom-datasource","jasper-reports","saxpullparser","While working on one of my projects we were faced with the problem of creating a report with a big amount of data to show on multiple Excel tabs (about…","SYnjblwoql00btIP3Bhd2-4MQoGLcsdaZYWx_o08uoA",[395,398,401,404,407,410,413,416,419,422,425,428,431,434,437,440,443,446,449,452,455,458,460,463,466,469,472,474,477,480,483,486,489,492,495,498,501,504,507,510,513,516,519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678,681,684,687,689,692,695,698,701,703,706,709,712,715,718,721,724,727,730,733,736,739,742,745,748,751,754,757,760,763,766,769,772,774,777,779,782,785,788,791,794,797,800,803,806,809,812],{"slug":396,"name":397},"abel","Jennifer Abel",{"slug":399,"name":400},"allmendinger","Otto Allmendinger",{"slug":402,"name":403},"antony","Ben Antony",{"slug":405,"name":406},"arrasz","Joachim Arrasz",{"slug":408,"name":409},"bauer","David Bauer",{"slug":411,"name":412},"bechtold","Janine Bechtold",{"slug":414,"name":415},"boersig","Jasmin Börsig",{"slug":417,"name":418},"buch","Fabian Buch",{"slug":420,"name":421},"buchloh","Aljona Buchloh",{"slug":423,"name":424},"burgard","Julia Burgard",{"slug":426,"name":427},"caspar-schwedes","Caspar Schwedes",{"slug":429,"name":430},"christina-schmitt","Christina Schmitt",{"slug":432,"name":433},"clausen","Michael Clausen",{"slug":435,"name":436},"contargo_poetzsch","Thomas Pötzsch",{"slug":438,"name":439},"damrath","Sebastian Damrath",{"slug":441,"name":442},"daniel","Markus Daniel",{"slug":444,"name":445},"dasch","Julia Dasch",{"slug":447,"name":448},"denman","Joffrey Denman",{"slug":450,"name":451},"dfuchs","Daniel Fuchs",{"slug":453,"name":454},"dobler","Max Dobler",{"slug":456,"name":457},"dobriakov","Vladimir Dobriakov",{"slug":459,"name":459},"dreiqbik",{"slug":461,"name":462},"dschaefer","Denise Schäfer",{"slug":464,"name":465},"dschneider","Dominik Schneider",{"slug":467,"name":468},"duerlich","Isabell Duerlich",{"slug":470,"name":471},"dutkowski","Bernd Dutkowski",{"slug":473,"name":473},"eifler",{"slug":475,"name":476},"essig","Tim Essig",{"slug":478,"name":479},"ferstl","Maximilian Ferstl",{"slug":481,"name":482},"fey","Prisca Fey",{"slug":484,"name":485},"frank","Leonard Frank",{"slug":487,"name":488},"franke","Arnold Franke",{"slug":490,"name":491},"frischer","Nicolette Rudmann",{"slug":493,"name":494},"fuchs","Petra Fuchs",{"slug":496,"name":497},"gari","Sarah Gari",{"slug":499,"name":500},"gast","Gast",{"slug":502,"name":503},"graf","Johannes Graf",{"slug":505,"name":506},"grammlich","Daniela Grammlich",{"slug":508,"name":509},"guthardt","Sabrina Guthardt",{"slug":511,"name":512},"haeussler","Johannes Häussler",{"slug":514,"name":515},"hammann","Daniel Hammann",{"slug":517,"name":518},"heetel","Julian Heetel",{"slug":520,"name":521},"heft","Florian Heft",{"slug":523,"name":524},"heib","Sebastian Heib",{"slug":526,"name":527},"heisler","Ida Heisler",{"slug":529,"name":530},"helm","Patrick Helm",{"slug":532,"name":533},"herbold","Michael Herbold",{"slug":535,"name":536},"hofmann","Peter Hofmann",{"slug":538,"name":539},"hopf","Florian Hopf",{"slug":541,"name":542},"jaud","Alina Jaud",{"slug":544,"name":545},"jayasinghe","Robin De Silva Jayasinghe",{"slug":547,"name":548},"jbuch","Jonathan Buch",{"slug":550,"name":551},"junghanss","Gitta Junghanß",{"slug":553,"name":554},"kadyietska","Khrystyna Kadyietska",{"slug":556,"name":557},"kannegiesser","Marc Kannegiesser",{"slug":559,"name":560},"karoly","Robert Károly",{"slug":562,"name":563},"karrasz","Katja Arrasz-Schepanski",{"slug":565,"name":566},"kaufmann","Florian Kaufmann",{"slug":568,"name":569},"kesler","Mike Kesler",{"slug":571,"name":572},"kirchgaessner","Bettina Kirchgäßner",{"slug":574,"name":575},"klem","Yannic Klem",{"slug":577,"name":578},"klenk","Timo Klenk",{"slug":580,"name":581},"knell","Tobias Knell",{"slug":583,"name":584},"knoll","Anna-Lena Knoll",{"slug":586,"name":587},"knorre","Matthias Knorre",{"slug":589,"name":590},"koenig","Melanie König",{"slug":592,"name":593},"kraft","Thomas Kraft",{"slug":595,"name":596},"krupicka","Florian Krupicka",{"slug":598,"name":599},"kuehn","Christian Kühn",{"slug":601,"name":602},"lange","Christian Lange",{"slug":604,"name":605},"larrasz","Luca Arrasz",{"slug":607,"name":608},"leist","Sascha Leist",{"slug":610,"name":611},"lihs","Michael Lihs",{"slug":613,"name":614},"linsin","David Linsin",{"slug":616,"name":617},"maniyar","Christian Maniyar",{"slug":619,"name":620},"martin","Björnie",{"slug":622,"name":623},"martin-koch","Martin Koch",{"slug":625,"name":626},"matt","Tobias Matt",{"slug":628,"name":629},"mennerich","Christian Mennerich",{"slug":631,"name":632},"menz","Alexander Menz",{"slug":634,"name":635},"meseck","Frederick Meseck",{"slug":637,"name":638},"messner","Oliver Messner",{"slug":640,"name":641},"michael-ploed","Michael Plöd",{"slug":643,"name":644},"mies","Marius Mies",{"slug":646,"name":647},"mihai","Alina Mihai",{"slug":649,"name":650},"moeller","Jörg Möller",{"slug":652,"name":653},"mohr","Rebecca Mohr",{"slug":655,"name":656},"moretti","David Moretti",{"slug":658,"name":659},"mueller","Sven Müller",{"slug":661,"name":662},"muessig","Alexander Müssig",{"slug":664,"name":665},"neupokoev","Grigory Neupokoev",{"slug":667,"name":668},"nussbaecher","Carmen Nussbächer",{"slug":670,"name":671},"ochs","Pascal Ochs",{"slug":673,"name":674},"oelhoff","Jan Oelhoff",{"slug":676,"name":677},"oengel","Yasin Öngel",{"slug":679,"name":680},"oezsoy","Enis Özsoy",{"slug":682,"name":683},"posch","Maya Posch",{"slug":685,"name":686},"ralfmueller","Ralf Müller",{"slug":688,"name":688},"redakteur",{"slug":690,"name":691},"reich","Michael Reich",{"slug":693,"name":694},"reinhard","Karl-Ludwig Reinhard",{"slug":696,"name":697},"rmueller","Rebecca Müller",{"slug":699,"name":700},"rosum","Jan Rosum",{"slug":702,"name":702},"rueckert",{"slug":704,"name":705},"ruessel","Sascha Rüssel",{"slug":707,"name":708},"sauter","Moritz Sauter",{"slug":710,"name":711},"schaefer","Julian Schäfer",{"slug":713,"name":714},"scherer","Petra Scherer",{"slug":716,"name":717},"schlicht","Anne Schlicht",{"slug":719,"name":720},"schmidt","Jürgen Schmidt",{"slug":722,"name":723},"schneider","Tobias Schneider",{"slug":725,"name":726},"seber","Benjamin Seber",{"slug":728,"name":729},"sommer","Marc Sommer",{"slug":731,"name":732},"speaker-fels","Jakob Fels",{"slug":734,"name":735},"speaker-gierke","Oliver Gierke",{"slug":737,"name":738},"speaker-krupa","Malte Krupa",{"slug":740,"name":741},"speaker-mader","Jochen Mader",{"slug":743,"name":744},"speaker-meusel","Tim Meusel",{"slug":746,"name":747},"speaker-milke","Oliver Milke",{"slug":749,"name":750},"speaker-paluch","Mark Paluch",{"slug":752,"name":753},"speaker-schad","Jörg Schad",{"slug":755,"name":756},"speaker-schalanda","Jochen Schalanda",{"slug":758,"name":759},"speaker-schauder","Jens Schauder",{"slug":761,"name":762},"speaker-unterstein","Johannes Unterstein",{"slug":764,"name":765},"speaker-wolff","Eberhard Wolff",{"slug":767,"name":768},"speaker-zoerner","Stefan Zörner",{"slug":770,"name":771},"stefan-belger","Stefan Belger",{"slug":9,"name":773},"Roland Steinegger",{"slug":775,"name":776},"stern","sternchen synyx",{"slug":778,"name":778},"synyx",{"slug":780,"name":781},"szulc","Mateusz Szulc",{"slug":783,"name":784},"tamara","Tamara Tunczinger",{"slug":786,"name":787},"theuer","Tobias Theuer",{"slug":789,"name":790},"thieme","Sandra Thieme",{"slug":792,"name":793},"thies-clasen","Marudor",{"slug":795,"name":796},"toernstroem","Olle Törnström",{"slug":798,"name":799},"ullinger","Max Ullinger",{"slug":801,"name":802},"ulrich","Stephan Ulrich",{"slug":804,"name":805},"wagner","Stefan Wagner",{"slug":807,"name":808},"weigel","Andreas Weigel",{"slug":810,"name":811},"werner","Fabian Werner",{"slug":813,"name":814},"wolke","Sören Wolke",["Reactive",816],{"$scookieConsent":817,"$ssite-config":819},{"functional":818,"analytics":818},false,{"_priority":820,"env":824,"name":825,"url":826},{"name":821,"env":822,"url":823},-10,-15,0,"production","nuxt-app","https://synyx.de",["Set"],["ShallowReactive",829],{"category-jasper-reports":-1,"authors":-1},"/blog/tags/jasper-reports"]