<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"><id>tag:blogger.com,1999:blog-16506996</id><updated>2008-07-19T10:27:27.996-06:00</updated><title type="text">The Digital Voice</title><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default?start-index=26&amp;max-results=25" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>255</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/TheDigitalVoice" type="application/atom+xml" /><entry><id>tag:blogger.com,1999:blog-16506996.post-5004898497480067256</id><published>2008-07-12T00:11:00.000-06:00</published><updated>2008-07-12T00:12:03.803-06:00</updated><title type="text">BIRT: Reading Chart From Library and Adding to Report Design</title><content type="html">I recently came back from a client engagement that was pretty exciting. They are integrating BIRT into their product using a “report wizard” to dynamically build reports. I was pretty stoked by this. There are different ways to accomplish what they wanted internal to the BIRT report scripting and Report Engine environment, and the way they are utilizing it is pretty darn cool. &lt;br /&gt;&lt;br /&gt;One of the ideas we came up with was to read chart prototypes from a library and to add them using the Report Engine API to their final report design. There are several advantages to this. First on, of course, is that this gives them the ability to graphically build the visual attributes of their charts using the BIRT Report Designer, and the ability to rapidly change elements and have them propagate to any report consuming them. This will keep chart look and feel consistent throughout their site. But with any approach, pros and cons need to be taken into consideration. In this case, there were a few hurdles to overcome. First being that since their data is build dynamically through their report wizard, data binding to the chart cannot be done in the report library and would need to be done at run-time, as would any chart series formatting. This differs from my previous example in that it actually adds to a report, not just rendering a stand-alone chart.&lt;br /&gt;&lt;br /&gt;The following example of how to read a chart from a Library design, and add the data binding to it. There are a few things to notate about this example. First, if you look at my previous Chart Engine API example, you will notice that data is bound differently. When you work with the Chart Engine API in a standalone fashion, you have to manually create what is called a Data Set (not to be confused with a BIRT Report Data Set). A Data Set in the Chart Engine API is basically an array of values bound to an axis, there are no report binding elements involved. When adding to a report, you have to create a dataset binding to the ExtendedReportItem, not the chart itself. &lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package com.digiassn.blogspot.birt.chartBuilder;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Locale;&lt;br /&gt;&lt;br /&gt;import org.eclipse.birt.chart.model.ChartWithoutAxes;&lt;br /&gt;import org.eclipse.birt.chart.model.component.Series;&lt;br /&gt;import org.eclipse.birt.chart.model.component.impl.SeriesImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.data.Query;&lt;br /&gt;import org.eclipse.birt.chart.model.data.SeriesDefinition;&lt;br /&gt;import org.eclipse.birt.chart.model.data.impl.QueryImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.type.PieSeries;&lt;br /&gt;import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl;&lt;br /&gt;import org.eclipse.birt.core.exception.BirtException;&lt;br /&gt;import org.eclipse.birt.core.framework.Platform;&lt;br /&gt;import org.eclipse.birt.core.framework.PlatformConfig;&lt;br /&gt;import org.eclipse.birt.report.engine.api.EngineConfig;&lt;br /&gt;import org.eclipse.birt.report.engine.api.EngineConstants;&lt;br /&gt;import org.eclipse.birt.report.engine.api.EngineException;&lt;br /&gt;import org.eclipse.birt.report.engine.api.HTMLRenderContext;&lt;br /&gt;import org.eclipse.birt.report.engine.api.HTMLRenderOption;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IRenderTask;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportDocument;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportEngine;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportEngineFactory;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportRunnable;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IRunTask;&lt;br /&gt;import org.eclipse.birt.report.model.api.DataSetHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.DataSourceHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.DesignConfig;&lt;br /&gt;import org.eclipse.birt.report.model.api.DesignElementHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.DesignFileException;&lt;br /&gt;import org.eclipse.birt.report.model.api.ElementFactory;&lt;br /&gt;import org.eclipse.birt.report.model.api.ExtendedItemHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.IDesignEngine;&lt;br /&gt;import org.eclipse.birt.report.model.api.IDesignEngineFactory;&lt;br /&gt;import org.eclipse.birt.report.model.api.LabelHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.LibraryHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.PropertyHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.ReportDesignHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.SessionHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.activity.SemanticException;&lt;br /&gt;import org.eclipse.birt.report.model.api.command.ContentException;&lt;br /&gt;import org.eclipse.birt.report.model.api.command.NameException;&lt;br /&gt;import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;&lt;br /&gt;&lt;br /&gt;import com.ibm.icu.util.ULocale;&lt;br /&gt;&lt;br /&gt;public class ChartBuilder7 {&lt;br /&gt;    private static String BIRT_HOME = &amp;quot;C:/birt-runtime-2_2_1_1/ReportEngine&amp;quot;;&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        try {&lt;br /&gt;            final ChartBuilder7 cb = new ChartBuilder7();&lt;br /&gt;&lt;br /&gt;            cb.buildReport();&lt;br /&gt;            cb.runReport();&lt;br /&gt;            cb.renderReport();&lt;br /&gt;            //cb.renderReportlet();&lt;br /&gt;&lt;br /&gt;            cb.shutdown();&lt;br /&gt;        } catch (final ContentException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (final NameException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (final SemanticException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (final DesignFileException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (final BirtException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (final IOException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //factories and engines used in program&lt;br /&gt;    IDesignEngine dengine;&lt;br /&gt;    IDesignEngineFactory designFactory;&lt;br /&gt;    IReportEngine rengine; // stores the single instance of the report engine&lt;br /&gt;&lt;br /&gt;    SessionHandle session;&lt;br /&gt;&lt;br /&gt;    public ChartBuilder7() throws BirtException {&lt;br /&gt;        final PlatformConfig platformConfig = new PlatformConfig();&lt;br /&gt;        platformConfig.setBIRTHome(BIRT_HOME);&lt;br /&gt;        Platform.startup(platformConfig);&lt;br /&gt;&lt;br /&gt;        // create a new report engine factory&lt;br /&gt;        final IReportEngineFactory reportFactory = (IReportEngineFactory) Platform&lt;br /&gt;                .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);&lt;br /&gt;&lt;br /&gt;        // create a new report engine&lt;br /&gt;        final EngineConfig engineConfig = new EngineConfig();&lt;br /&gt;        engineConfig.setBIRTHome(BIRT_HOME); // will replace with&lt;br /&gt;        // configuration file&lt;br /&gt;        rengine = reportFactory.createReportEngine(engineConfig);&lt;br /&gt;&lt;br /&gt;        final DesignConfig dconfig = new DesignConfig();&lt;br /&gt;        dconfig.setBIRTHome(BIRT_HOME);&lt;br /&gt;&lt;br /&gt;        // try to start up the eclipse platform&lt;br /&gt;        designFactory = (IDesignEngineFactory) Platform&lt;br /&gt;                .createFactoryObject(IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY);&lt;br /&gt;        dengine = designFactory.createDesignEngine(dconfig);&lt;br /&gt;&lt;br /&gt;        // create a new session, open the library, and retrieve the first data&lt;br /&gt;        // source since it is uniform in our library&lt;br /&gt;        session = dengine.newSessionHandle(ULocale.ENGLISH);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Adds data binding information to chart retrieved from library&lt;br /&gt;     * &lt;br /&gt;     * @param eih&lt;br /&gt;     */&lt;br /&gt;    &lt;br /&gt;    public void addPieChartFromLibrary(ExtendedItemHandle eih) {&lt;br /&gt;        try {&lt;br /&gt;            // create chart and set standard options&lt;br /&gt;            ChartWithoutAxes cwaPie = (ChartWithoutAxes)eih.getReportItem().getProperty(&amp;quot;chart.instance&amp;quot;);&lt;br /&gt;        &lt;br /&gt;            //clear any existing definitions from the chart&lt;br /&gt;            cwaPie.getSeriesDefinitions().clear();&lt;br /&gt;            &lt;br /&gt;            //create actual series data. This will not be in the library chart&lt;br /&gt;            Series seCategory = SeriesImpl.create( );&lt;br /&gt;            &lt;br /&gt;        //This is where things differ from standalone charts. A Query is an EList&lt;br /&gt;            //that contains an expression for data. Keep in mind we need to set out&lt;br /&gt;            //data set below, otherwise setting these expressions are pointless&lt;br /&gt;        Query query = QueryImpl.create( &amp;quot;row[\&amp;quot;OrganizationName\&amp;quot;]&amp;quot;);//$NON-NLS-1$&lt;br /&gt;            // When creating a series, getDataDefinition() is expecting the EList, &lt;br /&gt;            // and the Query is an instance of that&lt;br /&gt;            seCategory.getDataDefinition( ).add( query );&lt;br /&gt;&lt;br /&gt;            SeriesDefinition series = SeriesDefinitionImpl.create( );&lt;br /&gt;            series.getSeries( ).add( seCategory );&lt;br /&gt;            cwaPie.getSeriesDefinitions( ).add( series );&lt;br /&gt;            series.getSeriesPalette().shift(1); // to change the color of the next slice&lt;br /&gt;&lt;br /&gt;            // Orthogonal Series&lt;br /&gt;            PieSeries sePie = (PieSeries) PieSeriesImpl.create( );&lt;br /&gt;            &lt;br /&gt;            Query query2 = QueryImpl.create( &amp;quot;row[\&amp;quot;CandidatesImage\&amp;quot;]&amp;quot;);//$NON-NLS-1$&lt;br /&gt;            sePie.getDataDefinition().add(query2);&lt;br /&gt;            sePie.setExplosion( 5 );&lt;br /&gt;            &lt;br /&gt;            SeriesDefinition sdEmpCount = SeriesDefinitionImpl.create( );&lt;br /&gt;            sdEmpCount.getSeriesPalette().shift(2);&lt;br /&gt;            series.getSeriesDefinitions( ).add( sdEmpCount );&lt;br /&gt;            sdEmpCount.getSeries( ).add( sePie );&lt;br /&gt;&lt;br /&gt;            //add to report&lt;br /&gt;//            eih.loadExtendedElement(); // this may or may not need to&lt;br /&gt;//be called - it's typically used for reading (if already in the rpt design file) &lt;br /&gt;//            eih.getReportItem().setProperty(&amp;quot;chart.instance&amp;quot;, cwaPie);&lt;br /&gt;            eih.setProperty(&amp;quot;outputFormat&amp;quot;, &amp;quot;PNG&amp;quot;);&lt;br /&gt;            eih.setProperty(&amp;quot;dataSet&amp;quot;, &amp;quot;GridXMLDataSet&amp;quot;); // tell the chart which dataset to use to bind the chart to the report&lt;br /&gt;            &lt;br /&gt;            //do the bindings to the extended element handle&lt;br /&gt;            PropertyHandle computedSet = eih.getColumnBindings( );&lt;br /&gt;            ComputedColumn cs1 = new ComputedColumn();&lt;br /&gt;            cs1.setExpression( &amp;quot;dataSetRow[\&amp;quot;OrganizationName\&amp;quot;]&amp;quot;);//$NON-NLS-1$&lt;br /&gt;            cs1.setName( &amp;quot;OrgName&amp;quot; );&lt;br /&gt;            cs1.setDataType( &amp;quot;string&amp;quot; );&lt;br /&gt;            computedSet.addItem( cs1 );&lt;br /&gt;            &lt;br /&gt;            ComputedColumn cs2 = new ComputedColumn();&lt;br /&gt;            cs2.setExpression( &amp;quot;dataSetRow[\&amp;quot;CandidatesImage\&amp;quot;]&amp;quot;);//$NON-NLS-1$&lt;br /&gt;            cs2.setName( &amp;quot;Candidates&amp;quot; );&lt;br /&gt;            cs2.setDataType( &amp;quot;float&amp;quot; );&lt;br /&gt;            computedSet.addItem( cs2 );&lt;br /&gt;        }&lt;br /&gt;        catch ( Exception E ) {&lt;br /&gt;            E.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Build report&lt;br /&gt;     * @throws ContentException&lt;br /&gt;     * @throws NameException&lt;br /&gt;     * @throws SemanticException&lt;br /&gt;     * @throws DesignFileException&lt;br /&gt;     * @throws IOException&lt;br /&gt;     */&lt;br /&gt;    public void buildReport() throws ContentException, NameException,&lt;br /&gt;            SemanticException, DesignFileException, IOException {&lt;br /&gt;        // create a new report&lt;br /&gt;        final ReportDesignHandle reportDesign = session.createDesign();&lt;br /&gt;&lt;br /&gt;        final ElementFactory ef = reportDesign.getElementFactory();&lt;br /&gt;&lt;br /&gt;        // add new master page element&lt;br /&gt;        final DesignElementHandle element = ef&lt;br /&gt;                .newSimpleMasterPage(&amp;quot;Page Master&amp;quot;);&lt;br /&gt;        reportDesign.getMasterPages().add(element);&lt;br /&gt;&lt;br /&gt;        // get the session, open the library&lt;br /&gt;        final SessionHandle session = dengine.newSessionHandle(ULocale.ENGLISH);&lt;br /&gt;        final LibraryHandle library = session&lt;br /&gt;                .openLibrary(&amp;quot;C:\\contracts\\CompanyA\\ChartBuild\\chart_library.rptlibrary&amp;quot;);&lt;br /&gt;&lt;br /&gt;        // get the data source and date set from library&lt;br /&gt;        final DataSourceHandle dataSourceHandle = (DataSourceHandle) library&lt;br /&gt;                .getDataSources().get(0);&lt;br /&gt;        final DataSetHandle dataSetHandle = (DataSetHandle) library&lt;br /&gt;                .getDataSets().get(0);&lt;br /&gt;&lt;br /&gt;        // add the data sources and data sets to report&lt;br /&gt;        reportDesign.getDataSources().add(dataSourceHandle);&lt;br /&gt;        reportDesign.getDataSets().add(dataSetHandle);&lt;br /&gt;&lt;br /&gt;        // create a new extended item handle and add. This is read in the library&lt;br /&gt;        //so we do not need to manually create visual elements. Then add to the body of our&lt;br /&gt;        //new report design&lt;br /&gt;        final ExtendedItemHandle eih = (ExtendedItemHandle)library.findElement(&amp;quot;PieChart&amp;quot;);&lt;br /&gt;        reportDesign.getBody().add(eih);&lt;br /&gt;&lt;br /&gt;        //modify the chart with data bindings so that it is bound to our new report design&lt;br /&gt;        this.addPieChartFromLibrary(eih);&lt;br /&gt;&lt;br /&gt;        // add some sample labels&lt;br /&gt;        final LabelHandle lh = ef.newLabel(&amp;quot;New Label&amp;quot;);&lt;br /&gt;        lh.setText(&amp;quot;Can you see me?&amp;quot;);&lt;br /&gt;        reportDesign.getBody().add(lh);&lt;br /&gt;&lt;br /&gt;        // set my initial properties for the new report&lt;br /&gt;        final String reportName = &amp;quot;Example Chart&amp;quot;;&lt;br /&gt;        reportDesign.setDisplayName(reportName);&lt;br /&gt;        reportDesign.setDescription(reportName);&lt;br /&gt;        reportDesign.setIconFile(&amp;quot;/templates/blank_report.gif&amp;quot;);&lt;br /&gt;        reportDesign.setFileName(&amp;quot;C:/Temp/&amp;quot; + reportName + &amp;quot;.rptdesign&amp;quot;);&lt;br /&gt;        reportDesign.setDefaultUnits(&amp;quot;in&amp;quot;);&lt;br /&gt;        reportDesign.setProperty(&amp;quot;comments&amp;quot;, reportName);&lt;br /&gt;        reportDesign.setProperty(IReportRunnable.TITLE, reportName);&lt;br /&gt;&lt;br /&gt;        // save report design&lt;br /&gt;        reportDesign.saveAs(&amp;quot;C:/Temp/&amp;quot; + reportName + &amp;quot;.rptdesign&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Render full report&lt;br /&gt;     */&lt;br /&gt;    public void renderReport() {&lt;br /&gt;        try {&lt;br /&gt;            final IReportDocument rptdoc = rengine&lt;br /&gt;                    .openReportDocument(&amp;quot;C:/temp/tempDoc.rptDocument&amp;quot;);&lt;br /&gt;&lt;br /&gt;            // Create Render Task&lt;br /&gt;            final IRenderTask rtask = rengine.createRenderTask(rptdoc);&lt;br /&gt;&lt;br /&gt;            // Set Render context to handle url and image locataions&lt;br /&gt;            final HTMLRenderContext renderContext = new HTMLRenderContext();&lt;br /&gt;            // Set the Base URL for all actions&lt;br /&gt;            renderContext.setBaseURL(&amp;quot;http://localhost/&amp;quot;);&lt;br /&gt;            // Tell the Engine to prepend all images with this URL - Note this&lt;br /&gt;            // requires using the HTMLServerImageHandler&lt;br /&gt;            renderContext.setBaseImageURL(&amp;quot;http://localhost/myimages&amp;quot;);&lt;br /&gt;            // Tell the Engine where to write the images to&lt;br /&gt;            renderContext.setImageDirectory(&amp;quot;C:/xampplite/htdocs/myimages&amp;quot;);&lt;br /&gt;            // Tell the Engine what image formats are supported. Note you must&lt;br /&gt;            // have SVG in the string&lt;br /&gt;            // to render charts in SVG.&lt;br /&gt;            renderContext.setSupportedImageFormats(&amp;quot;JPG;PNG;BMP;SVG&amp;quot;);&lt;br /&gt;            final HashMap&amp;lt;String, HTMLRenderContext&amp;gt; contextMap = new HashMap&amp;lt;String, HTMLRenderContext&amp;gt;();&lt;br /&gt;            contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT,&lt;br /&gt;                    renderContext);&lt;br /&gt;            rtask.setAppContext(contextMap);&lt;br /&gt;&lt;br /&gt;            // Set rendering options - such as file or stream output,&lt;br /&gt;            // output format, whether it is embeddable, etc&lt;br /&gt;            final HTMLRenderOption options = new HTMLRenderOption();&lt;br /&gt;&lt;br /&gt;            // Remove HTML and Body tags&lt;br /&gt;            // options.setEmbeddable(true);&lt;br /&gt;&lt;br /&gt;            // Set ouptut location&lt;br /&gt;            options.setOutputFileName(&amp;quot;C:/temp/outputReport.html&amp;quot;);&lt;br /&gt;&lt;br /&gt;            // Set output format&lt;br /&gt;            options.setOutputFormat(&amp;quot;html&amp;quot;);&lt;br /&gt;            rtask.setRenderOption(options);&lt;br /&gt;&lt;br /&gt;            rtask.render();&lt;br /&gt;&lt;br /&gt;            // render the report and destroy the engine&lt;br /&gt;            // Note - If the program stays resident do not shutdown the Platform&lt;br /&gt;            // or the Engine&lt;br /&gt;            rtask.close();&lt;br /&gt;        } catch (final EngineException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * render just a reportlet&lt;br /&gt;     */&lt;br /&gt;    public void renderReportlet() {&lt;br /&gt;        try {&lt;br /&gt;            final IReportDocument rptdoc = rengine&lt;br /&gt;                    .openReportDocument(&amp;quot;C:/temp/tempDoc.rptDocument&amp;quot;);&lt;br /&gt;&lt;br /&gt;            // Create Render Task&lt;br /&gt;            final IRenderTask rtask = rengine.createRenderTask(rptdoc);&lt;br /&gt;&lt;br /&gt;            // Set Render context to handle url and image locataions&lt;br /&gt;            final HTMLRenderContext renderContext = new HTMLRenderContext();&lt;br /&gt;            // Set the Base URL for all actions&lt;br /&gt;            renderContext.setBaseURL(&amp;quot;http://localhost/&amp;quot;);&lt;br /&gt;            // Tell the Engine to prepend all images with this URL - Note this&lt;br /&gt;            // requires using the HTMLServerImageHandler&lt;br /&gt;            renderContext.setBaseImageURL(&amp;quot;http://localhost/myimages&amp;quot;);&lt;br /&gt;            // Tell the Engine where to write the images to&lt;br /&gt;            renderContext.setImageDirectory(&amp;quot;C:/xampplite/htdocs/myimages&amp;quot;);&lt;br /&gt;            // Tell the Engine what image formats are supported. Note you must&lt;br /&gt;            // have SVG in the string&lt;br /&gt;            // to render charts in SVG.&lt;br /&gt;            renderContext.setSupportedImageFormats(&amp;quot;JPG;PNG;BMP;SVG&amp;quot;);&lt;br /&gt;            final HashMap&amp;lt;String, HTMLRenderContext&amp;gt; contextMap = new HashMap&amp;lt;String, HTMLRenderContext&amp;gt;();&lt;br /&gt;            contextMap.put(EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT,&lt;br /&gt;                    renderContext);&lt;br /&gt;            rtask.setAppContext(contextMap);&lt;br /&gt;&lt;br /&gt;            // Set rendering options - such as file or stream output,&lt;br /&gt;            // output format, whether it is embeddable, etc&lt;br /&gt;            final HTMLRenderOption options = new HTMLRenderOption();&lt;br /&gt;&lt;br /&gt;            // Remove HTML and Body tags&lt;br /&gt;            // options.setEmbeddable(true);&lt;br /&gt;&lt;br /&gt;            // Set ouptut location&lt;br /&gt;            options.setOutputFileName(&amp;quot;C:/temp/outputReportlet.html&amp;quot;);&lt;br /&gt;&lt;br /&gt;            // Set output format&lt;br /&gt;            options.setOutputFormat(&amp;quot;html&amp;quot;);&lt;br /&gt;            rtask.setRenderOption(options);&lt;br /&gt;&lt;br /&gt;            rtask.setReportlet(&amp;quot;ChartToRender&amp;quot;);&lt;br /&gt;            rtask.render();&lt;br /&gt;&lt;br /&gt;            // render the report and destroy the engine&lt;br /&gt;            // Note - If the program stays resident do not shutdown the Platform&lt;br /&gt;            // or the Engine&lt;br /&gt;            rtask.close();&lt;br /&gt;        } catch (final EngineException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Run report&lt;br /&gt;     */&lt;br /&gt;    public void runReport() {&lt;br /&gt;        try {&lt;br /&gt;            final IReportRunnable design = rengine.openReportDesign(&amp;quot;C:/Temp/&amp;quot;&lt;br /&gt;                    + &amp;quot;Example Chart&amp;quot; + &amp;quot;.rptdesign&amp;quot;);&lt;br /&gt;            final IRunTask runTask = rengine.createRunTask(design);&lt;br /&gt;&lt;br /&gt;            // use the default locale&lt;br /&gt;            runTask.setLocale(Locale.getDefault());&lt;br /&gt;&lt;br /&gt;            runTask.run(&amp;quot;C:/temp/tempDoc.rptDocument&amp;quot;);&lt;br /&gt;            runTask.close();&lt;br /&gt;        } catch (final EngineException e) {&lt;br /&gt;            // TODO Auto-generated catch block&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void shutdown() {&lt;br /&gt;        Platform.shutdown();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=2kCl4J"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=2kCl4J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=NN26AJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=NN26AJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=8DvLuJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=8DvLuJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/07/birt-reading-chart-from-library-and.html" title="BIRT: Reading Chart From Library and Adding to Report Design" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=5004898497480067256&amp;isPopup=true" title="1 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/5004898497480067256/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/5004898497480067256" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/5004898497480067256" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-6597829218821315457</id><published>2008-06-29T05:00:00.000-06:00</published><updated>2008-06-29T05:01:09.316-06:00</updated><title type="text">BIRT: BIRT 2.3 is out</title><content type="html">The next release of BIRT, 2.3, is out. Check it out: http://www.eclipse.org/birt/phoenix/&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=ghrEKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=ghrEKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=hrkPFI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=hrkPFI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=b0yXdI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=b0yXdI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/06/birt-birt-23-is-out.html" title="BIRT: BIRT 2.3 is out" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=6597829218821315457&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/6597829218821315457/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/6597829218821315457" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/6597829218821315457" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-2042740023076491540</id><published>2008-06-26T18:28:00.000-06:00</published><updated>2008-06-26T18:36:59.231-06:00</updated><title type="text">Phone: Verizon XV6900</title><content type="html">&lt;p class="MsoNormal"&gt;So, I had an unfortunate situation with my old Motorola Razr, where the speaker stopped working and I couldn’t hear anything, so it was time for a new phone. My requirements were simple, I needed to be able to tether, sync with Outlook to retire my existing PDA, and something that I could play Chess on.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;What I ended up with was the &lt;a href="http://www.xv6900.com/"&gt;HTC XV8900 from Verizon&lt;/a&gt;. I refused to leave Verizon, although I am still tempted to get an iPhone, I just can’t stomach AT&amp;amp;T’s coverage. So far it is a decision I have been very happy with. I won’t review it since there are plenty off reviews about this phone out there, so I’ll just share my thoughts on it. First off, it uses a touch interface for everything, so no slideout QWERTY keyboard or anything of that nature for quick texting, which is fine because I seem to be of a generation before texting became popular. Besides, that’s one of the things that makes the iPhone so stylish, and I agree with the “no buttons” philosophy to an extent. I have a portable Bluetooth foldout keyboard, so I’d rather have a fullsize keyboard for any serious typing than the crappy keyboards they have on phones. I did have to hack the keyboard a little since it was a HP Foldout Bluetooth keyboard and used some sort of proprietary driver, but thanks to a nice fellow from Africa, &lt;a href="http://esl.sun.ac.za/keyboard/"&gt;I have a workable solution&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;After a few modifications, I have a really nice “Slide to Unlock” option that mimics the iPhones, with the Caller ID mimicking it as well. Outside of that, the other features, such as web browsing, media, camera, are pretty much there, so anything an iPhone can do, I can do on this thing since Windows Mobile devices have been doing these things since before I got my WM 2003 device. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Outlook syncing hasn’t changes since my WM2003 device, except now I have it on my phone, and I can check my email when I am out and about. The only issue is Activesync considers my “Outlook Email” separate from my two email accounts, so when I sync up, it wont sync mail that is checked already on the phone. A little annoying, so I have it configured not to delete messages on the phone when checked. If I ran an Exchange server, I could use the Push option, which I’m sure Blackberry users are all too familiar with, but I’m lazy and don’t want to configure an Exchange server just for this purpose.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;While stylish, and features that do just about everything I need, there are a few gripes about this device. 1&lt;sup&gt;st&lt;/sup&gt;, since it is a Windows Mobile device, the ever present X does not close applications annoyance is there. While HTC includes a quick link in the top right corner to kill all applications, its still annoying. Also annoying is the fact that TouchFlo is always present. I wanted to give Spb mobile shell a try, but I don’t want to run that AND touchflo at the same time. Even after I kill all the TouchFlo apps, it still manages to start itself if I do a finger gesture or pen swipe from the bottom to the top of the screen. Also, the paltry 512 flashram is laughable compared to the 16 Gb you can get on other phones. I had to purchase a separate MicroSD card to compensate. Also annoying is the fact that the memory usage is not configurable. On my older WM2003 device, I could allocate memory for storage or applications running, on this device that doesn’t seem to e an option. With the MicroSD card, why would I want to use the precious flashram to store apps when I don’t have to? Also, I had a hard time finding a case to fit the device. Verizon only offered a silicone slip cover for the phone, so I had to put on a screen protector, and find a 3&lt;sup&gt;rd&lt;/sup&gt; part case. So the case I have is slightly larger than the phone itself, and it’s a little gangly. I’ll have to keep my eye out for a more easily accessible case for this phone.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Overall, I am happy with the phone though. It does everything my old hacked Razr did, plus more. No more crappy, hard to read, mobile web, I have the same games, tethering capability, plus a suite of mobile office applications to use with my Bluetooth keyboard, a media device, movies, and games. &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=f7U9DI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=f7U9DI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=ICstqI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=ICstqI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=Fdr7VI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=Fdr7VI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/06/phone-verizon-xv6900.html" title="Phone: Verizon XV6900" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=2042740023076491540&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/2042740023076491540/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/2042740023076491540" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/2042740023076491540" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-7649932257791845379</id><published>2008-04-22T22:26:00.000-06:00</published><updated>2008-04-22T22:29:59.143-06:00</updated><title type="text">BIRT: Another BIRT Book</title><content type="html">I was surprised to find this when looking around on Amazon earlier. To join the ranks of my book and the books from AW about BIRT, an author out of Germany is publishing a book called "&lt;a href="http://www.amazon.de/Eclipse-Business-Intelligence-Reporting-Xpert-press/dp/3540772170"&gt;Eclipse BIRT&lt;/a&gt;" from XPert Press. I would like to have an opinion about it, unfortunately the language barrier is a bit of an issue for me since I don't speak German. Regardless, it is good to see another book about BIRT out there, showing the project is growing and demand is out there.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=Eh5SbI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=Eh5SbI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=VtP2pI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=VtP2pI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=aEZqpI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=aEZqpI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/04/birt-another-birt-book.html" title="BIRT: Another BIRT Book" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=7649932257791845379&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/7649932257791845379/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/7649932257791845379" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/7649932257791845379" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-2288120147702558193</id><published>2008-03-28T16:26:00.000-06:00</published><updated>2008-03-28T16:41:39.030-06:00</updated><title type="text">Games: Ninja Gaiden Dragon Sword</title><content type="html">I was really skeptical about this game at first. I had read plenty of pre-reviews about this game and using the stylus to "slash" the opponents on the screen. I just imagined some geeky kid on an airplane waving his hands widley, shopping at the tiny DS screen with a katana shapped stylus, poking the passengers around him in the eyes. And given the fact that Ninja Gaiden on the XBox is second only the GTA in the need for an ESRB rating, I was a little worried about the delivery on family friendly Nintendos consoles.&lt;br /&gt;&lt;br /&gt;Now that I've gotten a hands on with it, I can say those fears are completely unfounded. NG:DS is a completely engrossing handheld experience right from the get go. Gone are the days and stories of Ryu chasing Jaquio around looking for statues and saving Irine from the clutches of certain death. NG:DS takes up from the original Xbox story line, some 6 months after the "Dark Dragon Blade" incident. While I haven't gotten enough into the story, I did run around quite a bit to make sure the control scheme wasn't nearly as wonky as I had feared. Holding the DS at 90 degrees, book style, is a bit awkward, but only because I've spent the past 20 years of my life holding controllers ALA the original NES control scheme. Moving the character around is done via the stylus, as is the attacks. How is this done? Why, by pointing where you want to move to, writing/slashing the stylus over the opponent to attack, tapping the opponent to throw ninja stars, and slashing up to jump. So the attacks are actually pretty intuitive, despite my original fears.&lt;br /&gt;&lt;br /&gt;There are a few hiccups however. There re times where to want to jump, and the chacter runs right into the coming onslaught of enemies instead. Thats kind of annoying, but I can chalk that up to my own ineptness with the control scheme. Blocking is a bit of a pain. Any button will cause you to block. But since I am a righty, I hold the stylus with my right-hand, the DS is in a right-hand orientation, which puts the buttons on the right-screen. So, as you can imagine, having to use my left hand to push a button in a right-handed orientation leaves me a little short-circuited due to my lack of ambidextrous abilities. Fortunately, what I lack in coordination I more than make up for in hand size, so reaching over to push buttons to block isn't as bad as I make it seem.&lt;br /&gt;&lt;br /&gt;While I haven't done enough story line to really pass judgment on it, I did find the game bordering on "not able to put down" fun from running around and slashing. While this game isn't quite suitable for my game time during meals while traveling due to it's more interactive nature, it is definitely suitable for the evenings at the hotel while traveling and on long plane rides so that I can be the uncoordinated geeky kid poking peoples eyes out.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=zrstaI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=zrstaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=TC3QwI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=TC3QwI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=s7fTQI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=s7fTQI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/games-ninja-gaiden-dragon-sword.html" title="Games: Ninja Gaiden Dragon Sword" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=2288120147702558193&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/2288120147702558193/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/2288120147702558193" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/2288120147702558193" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-2029579374391061810</id><published>2008-03-28T16:20:00.000-06:00</published><updated>2008-03-28T16:25:12.792-06:00</updated><title type="text">Sguil: Sguil 0.7 is out</title><content type="html">It's been a while since we've seen an update with &lt;a href="http://sguil.sourceforge.net/"&gt;Sguil&lt;/a&gt;. And although with most Open source projects, that usually an indication that a project is dead. However, frequenters of the Sguil IRC channel #snort-gui on irc.freenode.net know that Sguil is far from being dead. In fact, they just released version 0.7, even though I am about 3 days late in noting it. To be perfectly honest, I haven't messes with Sguil since versions 0.5 - 0.6, however necessity breeds use, and I have need of this awesome tool. And a new release version plus a need REALLY gives me a good excuse to revisit the tool the brought me to working with BIRT.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=fIeeTI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=fIeeTI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=7XCHmI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=7XCHmI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=dhHEDI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=dhHEDI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/sguil-sguil-07-is-out.html" title="Sguil: Sguil 0.7 is out" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=2029579374391061810&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/2029579374391061810/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/2029579374391061810" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/2029579374391061810" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-2630907462940186607</id><published>2008-03-22T01:30:00.000-06:00</published><updated>2008-03-22T01:37:46.762-06:00</updated><title type="text">BIRT: Building Chart with Chart Engine API based off Report Document</title><content type="html">&lt;p class="MsoNormal"&gt;I have been sitting on this example for a few weeks now, and have been waiting to put it out until after EclipseCon so I can absorb any ideas from the Charting API presentation that Jason Weathersby over at BirtWorld did. Now that is done and gone, I have decided to put this one out into the wild.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The original purpose of this was to be able to extract a chart design out of a BIRT report, and render it using the BIRT Chart Engine API’s. What I found out the hard way is that data set and data are not linked to Charts in BIRT outside of the BIRT render engine. The Chart Engine API, as it turns out, is completely decoupled from the BIRT Report Engine API, so axis to data mappings are not accessible in the Chart Engine API and the actual data binding is done through some Java-Fu wizardry at runtime. So, I salvaged what I could of the idea.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The following example will demonstrate a couple of different things. First, it will open a BIRT Report, and pull the Chart definition out of the report. It will then read the XML Representation of the chart to determine what columns in the report are mapped to which Axis. It then runs the report, and uses a Data Extraction task to pull the data and create an appropriate Chart Engine API Series definition. It then renders a chart to a PNG file.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;There are a few things to keep in mind in this example. First, it assumes that there is a 2 column data set defined in the report, with column 1 containing what is the X axis definitions, and column 2 containing the values. It then calculates the aggregates based on those. Second, it assumes a chart definition is defined in the report. In a real world scenario, you would NEVER render a chart like this, but I am a glutton for punishment and needed a good way to learn how the Chart Engine API works. You will notice that I commented out a good chunk of code that defines the look and feel of the chart. I kept these commented out as a reference, but they aren’t necessary in this example since the visual attributes for the chart were defined in the source report design. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I did learn one really cool thing about Chart Engine API. There is a whole slew of example Chart Engine API code available in a BIRT install by default, by going to Window/Show View/Other/Report and Chart Design/Chart Examples. This will open a new view, just select any the examples listed and click on the Open button on the right hand side to see example code on how to build those charts. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Anyway, here is my example:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;package com.test;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.StringBufferInputStream;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.Locale;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import javax.xml.xpath.XPath;&lt;br /&gt;import javax.xml.xpath.XPathConstants;&lt;br /&gt;import javax.xml.xpath.XPathExpressionException;&lt;br /&gt;import javax.xml.xpath.XPathFactory;&lt;br /&gt;&lt;br /&gt;import org.eclipse.birt.chart.api.ChartEngine;&lt;br /&gt;import org.eclipse.birt.chart.device.IDeviceRenderer;&lt;br /&gt;import org.eclipse.birt.chart.device.image.PngRendererImpl;&lt;br /&gt;import org.eclipse.birt.chart.exception.ChartException;&lt;br /&gt;import org.eclipse.birt.chart.factory.GeneratedChartState;&lt;br /&gt;import org.eclipse.birt.chart.factory.Generator;&lt;br /&gt;import org.eclipse.birt.chart.factory.RunTimeContext;&lt;br /&gt;import org.eclipse.birt.chart.model.Chart;&lt;br /&gt;import org.eclipse.birt.chart.model.ChartWithoutAxes;&lt;br /&gt;import org.eclipse.birt.chart.model.attribute.Bounds;&lt;br /&gt;import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.component.Series;&lt;br /&gt;import org.eclipse.birt.chart.model.component.impl.SeriesImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.data.NumberDataSet;&lt;br /&gt;import org.eclipse.birt.chart.model.data.SeriesDefinition;&lt;br /&gt;import org.eclipse.birt.chart.model.data.TextDataSet;&lt;br /&gt;import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl;&lt;br /&gt;import org.eclipse.birt.chart.model.type.PieSeries;&lt;br /&gt;import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl;&lt;br /&gt;import org.eclipse.birt.core.exception.BirtException;&lt;br /&gt;import org.eclipse.birt.core.framework.Platform;&lt;br /&gt;import org.eclipse.birt.core.framework.PlatformConfig;&lt;br /&gt;import org.eclipse.birt.data.engine.core.DataException;&lt;br /&gt;import org.eclipse.birt.report.engine.api.EngineConfig;&lt;br /&gt;import org.eclipse.birt.report.engine.api.EngineException;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IDataExtractionTask;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IDataIterator;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IExtractionResults;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportDocument;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportEngine;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportEngineFactory;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IReportRunnable;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IResultSetItem;&lt;br /&gt;import org.eclipse.birt.report.engine.api.IRunTask;&lt;br /&gt;import org.eclipse.birt.report.model.api.ExtendedItemHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.ReportDesignHandle;&lt;br /&gt;import org.eclipse.birt.report.model.api.extension.ExtendedElementException;&lt;br /&gt;import org.w3c.dom.DOMException;&lt;br /&gt;import org.xml.sax.InputSource;&lt;br /&gt;&lt;br /&gt;import com.ibm.icu.util.ULocale;&lt;br /&gt;import com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList;&lt;br /&gt;&lt;br /&gt;public class RenderChart {&lt;br /&gt;    private static String BIRT_HOME = &amp;quot;C:/birt-runtime-2_2_1_1/ReportEngine&amp;quot;;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Creates the X series for the Chart&lt;br /&gt;     * @param uniqueMap&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static TextDataSet createCategoriesDataSet(Map uniqueMap)&lt;br /&gt;    {&lt;br /&gt;        String[] categories = new String[uniqueMap.keySet().size()];&lt;br /&gt;        int x = 0;&lt;br /&gt;        for (Iterator keyIt = uniqueMap.keySet().iterator(); keyIt.hasNext();)&lt;br /&gt;        {&lt;br /&gt;            categories[x] = (String)keyIt.next();&lt;br /&gt;            x++;&lt;br /&gt;        }&lt;br /&gt;        return TextDataSetImpl.create(categories);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Creates the Y Series for a chart&lt;br /&gt;     * @param uniqueMap&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static NumberDataSet createValueDataSet(Map uniqueMap)&lt;br /&gt;    {&lt;br /&gt;        double[] values = new double[uniqueMap.values().size()];&lt;br /&gt;        int x = 0;&lt;br /&gt;        for (Iterator valIt = uniqueMap.values().iterator(); valIt.hasNext();)&lt;br /&gt;        {&lt;br /&gt;            values[x] = Math.round(((Double)valIt.next()).doubleValue());&lt;br /&gt;            x++;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return NumberDataSetImpl.create(values);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Will open a report design and return the Document instance&lt;br /&gt;     * @param reportName&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static IReportDocument executeReport(String reportName) throws EngineException {&lt;br /&gt;        // create a new report engine factory&lt;br /&gt;        IReportEngineFactory factory = (IReportEngineFactory) Platform&lt;br /&gt;                .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);&lt;br /&gt;&lt;br /&gt;        // create a new report engine&lt;br /&gt;        EngineConfig engineConfig = new EngineConfig();&lt;br /&gt;        engineConfig.setBIRTHome(BIRT_HOME); // will replace with&lt;br /&gt;                                                // configuration file&lt;br /&gt;        IReportEngine engine = factory.createReportEngine(engineConfig);&lt;br /&gt;&lt;br /&gt;        // create the report task and open the report design file&lt;br /&gt;        IReportRunnable design = engine.openReportDesign(reportName);&lt;br /&gt;        IRunTask runTask = engine.createRunTask(design);&lt;br /&gt;&lt;br /&gt;        // use the default locale&lt;br /&gt;        runTask.setLocale(Locale.getDefault());&lt;br /&gt;&lt;br /&gt;        // run and close the report run task&lt;br /&gt;        File newTempFile = new File(&amp;quot;C:/TEMP/birtRenderTemp&amp;quot;,&lt;br /&gt;                &amp;quot;test.rptDocument&amp;quot;);&lt;br /&gt;        String tempFileLocation = newTempFile.getAbsolutePath();&lt;br /&gt;&lt;br /&gt;        // delete the temp file, we just needed the name and path&lt;br /&gt;        newTempFile.delete();&lt;br /&gt;&lt;br /&gt;        runTask.run(tempFileLocation);&lt;br /&gt;        runTask.close();&lt;br /&gt;&lt;br /&gt;        IReportDocument ird = engine&lt;br /&gt;                .openReportDocument(&amp;quot;C:/TEMP/birtRenderTemp/test.rptDocument&amp;quot;);&lt;br /&gt;&lt;br /&gt;        return ird;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Creates an input source from the XMLProperties string&lt;br /&gt;     * @param xmlProperties&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static InputSource getInputSourceFromString(String xmlProperties)&lt;br /&gt;    {&lt;br /&gt;        StringBufferInputStream is = new StringBufferInputStream(&lt;br /&gt;                xmlProperties);&lt;br /&gt;        &lt;br /&gt;        return new InputSource(is);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Using a data extraction task, this will build a simple Map of columns and rows&lt;br /&gt;     * This method assumes a 1-1 relation between what will be the x value and y value&lt;br /&gt;     * @param det&lt;br /&gt;     * @param ySeries&lt;br /&gt;     * @param xSeries&lt;br /&gt;     * @return&lt;br /&gt;     * @throws BirtException&lt;br /&gt;     */&lt;br /&gt;    public static Map getValueMap(IDataExtractionTask det, String ySeries, String xSeries) throws BirtException&lt;br /&gt;    {&lt;br /&gt;        //extract the results from the task&lt;br /&gt;        IExtractionResults iExtractResults = det.extract();&lt;br /&gt;        IDataIterator iData = null;&lt;br /&gt;&lt;br /&gt;        //hashmap to return&lt;br /&gt;        Map uniqueMap = new HashMap();&lt;br /&gt;&lt;br /&gt;        //if we have results, process them, otherwise, don't&lt;br /&gt;        if (iExtractResults != null) {&lt;br /&gt;            iData = iExtractResults.nextResultIterator();&lt;br /&gt;&lt;br /&gt;            // iterate through the results&lt;br /&gt;            if (iData != null) {&lt;br /&gt;                //loop while there is still data in out iterator&lt;br /&gt;                while (iData.next()) {&lt;br /&gt;                    Object objColumn1;&lt;br /&gt;                    Object objColumn2;&lt;br /&gt;                    try {&lt;br /&gt;                        objColumn1 = iData.getValue(ySeries);&lt;br /&gt;                    } catch (DataException e) {&lt;br /&gt;                        objColumn1 = new String(&amp;quot;&amp;quot;);&lt;br /&gt;                    }&lt;br /&gt;                    try {&lt;br /&gt;                        objColumn2 = iData.getValue(xSeries);&lt;br /&gt;                    } catch (DataException e) {&lt;br /&gt;                        objColumn2 = new String(&amp;quot;&amp;quot;);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    Double newNumber = (Double) objColumn1;&lt;br /&gt;                    if (uniqueMap.keySet().contains(objColumn2)) {&lt;br /&gt;                        newNumber += (Double) uniqueMap&lt;br /&gt;                                .get(objColumn2);&lt;br /&gt;                    }&lt;br /&gt;                    uniqueMap.put(objColumn2, newNumber);&lt;br /&gt;                }&lt;br /&gt;                iData.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        //close the data extraction task and return our value map&lt;br /&gt;        det.close();&lt;br /&gt;        return uniqueMap;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Extract the XML resources from the extended item handle, used to get the XML&lt;br /&gt;     * representation of the chart from a report&lt;br /&gt;     * &lt;br /&gt;     * @param eih&lt;br /&gt;     * @return&lt;br /&gt;     */&lt;br /&gt;    public static String getXMLResources(ExtendedItemHandle eih)&lt;br /&gt;    {&lt;br /&gt;        return (String) eih.getProperty(&amp;quot;xmlRepresentation&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Retrieves the name of the X Series column from a chart XMLRepresentation&lt;br /&gt;     * &lt;br /&gt;     * @param xmlProperties&lt;br /&gt;     * @return&lt;br /&gt;     * @throws XPathExpressionException&lt;br /&gt;     * @throws DOMException&lt;br /&gt;     */&lt;br /&gt;    public static String getXSeries(String xmlProperties) throws XPathExpressionException, DOMException&lt;br /&gt;    {&lt;br /&gt;        InputSource inputSource = getInputSourceFromString(xmlProperties);&lt;br /&gt;        XPath xpath = XPathFactory.newInstance().newXPath();&lt;br /&gt;&lt;br /&gt;        DTMNodeList nodeList = (DTMNodeList) xpath&lt;br /&gt;                .evaluate(&lt;br /&gt;                        &amp;quot;//SeriesDefinitions/Series/DataDefinition/Definition&amp;quot;,&lt;br /&gt;                        inputSource, XPathConstants.NODESET);&lt;br /&gt;&lt;br /&gt;        String xSeries = nodeList.item(1).getTextContent();&lt;br /&gt;&lt;br /&gt;        //we found the series definitions, now remove the expression and just return&lt;br /&gt;        //the key &lt;br /&gt;        return xSeries.replace(&amp;quot;row[\&amp;quot;&amp;quot;, &amp;quot;&amp;quot;).replace(&amp;quot;\&amp;quot;]&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**    &lt;br /&gt;     * Retrieves the name of the Y Series column from a chart XMLRepresentation&lt;br /&gt;     * @param xmlProperties&lt;br /&gt;     * @return&lt;br /&gt;     * @throws XPathExpressionException&lt;br /&gt;     * @throws DOMException&lt;br /&gt;     */&lt;br /&gt;    public static String getYSeries(String xmlProperties) throws XPathExpressionException, DOMException&lt;br /&gt;    {    &lt;br /&gt;        InputSource inputSource = getInputSourceFromString(xmlProperties);&lt;br /&gt;        XPath xpath = XPathFactory.newInstance().newXPath();&lt;br /&gt;&lt;br /&gt;        DTMNodeList nodeList = (DTMNodeList) xpath&lt;br /&gt;                .evaluate(&lt;br /&gt;                        &amp;quot;//SeriesDefinitions/Series/DataDefinition/Definition&amp;quot;,&lt;br /&gt;                        inputSource, XPathConstants.NODESET);&lt;br /&gt;&lt;br /&gt;        String ySeries = nodeList.item(0).getTextContent();&lt;br /&gt;        &lt;br /&gt;        return ySeries.replace(&amp;quot;row[\&amp;quot;&amp;quot;, &amp;quot;&amp;quot;).replace(&amp;quot;\&amp;quot;]&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;        &lt;br /&gt;    /**&lt;br /&gt;     * Will render a Pie chart with given categories and values. Chart needs to be created beforehand, so pull from document first.&lt;br /&gt;     * @param cwa&lt;br /&gt;     * @param categories&lt;br /&gt;     * @param values&lt;br /&gt;     * @throws ChartException&lt;br /&gt;     */&lt;br /&gt;    public static void renderPieChart(ChartWithoutAxes cwa, TextDataSet categories, NumberDataSet values) throws ChartException&lt;br /&gt;    {&lt;br /&gt;        // Create the png renderer&lt;br /&gt;        IDeviceRenderer idr = new PngRendererImpl();&lt;br /&gt;&lt;br /&gt;        //create new run time context&lt;br /&gt;        RunTimeContext rtc = new RunTimeContext();&lt;br /&gt;        rtc.setULocale(ULocale.getDefault());&lt;br /&gt;&lt;br /&gt;        //create a new generator&lt;br /&gt;        final Generator gr = Generator.instance();&lt;br /&gt;        GeneratedChartState gcs = null;&lt;br /&gt;        &lt;br /&gt;        //clear any existing series definitions since we created out own&lt;br /&gt;        cwa.getSeriesDefinitions().clear();&lt;br /&gt;        &lt;br /&gt;        // Plot the chart...&lt;br /&gt;        /* &lt;br /&gt;         * Note: I commented this stuff out since I already designed my chart&lt;br /&gt;         * look and feel in the BIRT report designer, and all of that will&lt;br /&gt;         * already be set in my chart opened from a BIRT Report&lt;br /&gt;        cwa.setSeriesThickness(25);&lt;br /&gt;        cwa.getBlock().setBackground(ColorDefinitionImpl.WHITE());&lt;br /&gt;        Plot p = cwa.getPlot();&lt;br /&gt;        cwa.setDimension(ChartDimension.TWO_DIMENSIONAL_LITERAL);&lt;br /&gt;        &lt;br /&gt;        p.getClientArea().setBackground(null);&lt;br /&gt;        p.getClientArea().getOutline().setVisible(true);&lt;br /&gt;        p.getOutline().setVisible(true);&lt;br /&gt;&lt;br /&gt;        Legend lg = cwa.getLegend();&lt;br /&gt;        lg.getText().getFont().setSize(16);&lt;br /&gt;        lg.setBackground(null);&lt;br /&gt;        lg.getOutline().setVisible(true);&lt;br /&gt;        &lt;br /&gt;        // Title&lt;br /&gt;        //cwa.getTitle( ).getLabel( ).getCaption( ).setValue( &amp;quot;Pie Chart&amp;quot; );//$NON-NLS-1$&lt;br /&gt;        cwa.getTitle( ).getOutline( ).setVisible( true );&lt;br /&gt;        */&lt;br /&gt;        &lt;br /&gt;        //define base series&lt;br /&gt;        Series seCategory = SeriesImpl.create();&lt;br /&gt;        seCategory.setDataSet(categories);&lt;br /&gt;&lt;br /&gt;        SeriesDefinition sd = SeriesDefinitionImpl.create();&lt;br /&gt;        sd.getSeriesPalette().shift(0);&lt;br /&gt;        sd.getSeries().add(seCategory);&lt;br /&gt;        cwa.getSeriesDefinitions().add(sd);&lt;br /&gt;        &lt;br /&gt;        //define pie seies&lt;br /&gt;        PieSeries categorySeries = (PieSeries) PieSeriesImpl&lt;br /&gt;                .create();&lt;br /&gt;        categorySeries.setDataSet(values);&lt;br /&gt;        categorySeries.setSeriesIdentifier(&amp;quot;Territories&amp;quot;);&lt;br /&gt;&lt;br /&gt;        SeriesDefinition sdValues = SeriesDefinitionImpl.create();&lt;br /&gt;        sdValues.getQuery().setDefinition(&amp;quot;Census.Territories&amp;quot;);//$NON-NLS-1$&lt;br /&gt;        sdValues.getSeries().add(categorySeries);&lt;br /&gt;        sdValues.getSeries().add(categorySeries);&lt;br /&gt;        sd.getSeriesDefinitions().add(sdValues);&lt;br /&gt;                &lt;br /&gt;        // Set the chart size&lt;br /&gt;        Bounds bo = BoundsImpl.create(0, 0, 350, 275);&lt;br /&gt;        &lt;br /&gt;        //Now build the chart&lt;br /&gt;        gcs = gr.build(idr.getDisplayServer(), (Chart)cwa, bo, null, rtc,&lt;br /&gt;                null);&lt;br /&gt;&lt;br /&gt;        // Specify the file to write to.&lt;br /&gt;        idr.setProperty(IDeviceRenderer.FILE_IDENTIFIER,&lt;br /&gt;                        &amp;quot;test.png&amp;quot;); //$NON-NLS-1$&lt;br /&gt;&lt;br /&gt;        // generate the chart&lt;br /&gt;        gr.render(idr, gcs);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Main: The delegator of out program. Starts the BIRT Platform, gets chart, extracts values, and renders chart&lt;br /&gt;     * @param args&lt;br /&gt;     */&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        try {&lt;br /&gt;            //start up the platform&lt;br /&gt;            //note: needed to add STANDALONE = true, otherwise the chart engine&lt;br /&gt;            //would not work. &lt;br /&gt;            PlatformConfig platformConfig = new PlatformConfig();&lt;br /&gt;            platformConfig.setBIRTHome(BIRT_HOME);&lt;br /&gt;            //standalone platform&lt;br /&gt;            platformConfig.setProperty(&amp;quot;STANDALONE&amp;quot;, &amp;quot;true&amp;quot;);&lt;br /&gt;            ChartEngine.instance(platformConfig);&lt;br /&gt;            Platform.startup(platformConfig);&lt;br /&gt;&lt;br /&gt;            // create a new report engine factory&lt;br /&gt;            IReportEngineFactory factory = (IReportEngineFactory) Platform&lt;br /&gt;                    .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);&lt;br /&gt;&lt;br /&gt;            // create a new report engine&lt;br /&gt;            EngineConfig engineConfig = new EngineConfig();&lt;br /&gt;            engineConfig.setBIRTHome(BIRT_HOME);&lt;br /&gt;            IReportEngine engine = factory.createReportEngine(engineConfig);&lt;br /&gt;&lt;br /&gt;            //open the given report and create a new Data Extraction task to get data from run report&lt;br /&gt;            IReportDocument ird = executeReport(&amp;quot;C:/contracts/GWTBirt/BIRTGwt/src/reports/Charts/TerritorySalesPieChart.rptdesign&amp;quot;);&lt;br /&gt;            IDataExtractionTask det = engine.createDataExtractionTask(ird);&lt;br /&gt;&lt;br /&gt;            //get the report runnable from the document so we can grab the chart information from the report&lt;br /&gt;            IReportRunnable r = ird.getReportRunnable();&lt;br /&gt;            ReportDesignHandle rh = (ReportDesignHandle) r.getDesignHandle();&lt;br /&gt;            &lt;br /&gt;            //for each element in the report (assuming only charts), go through and grab info, then render to PNG&lt;br /&gt;            for (Iterator i = rh.getBody().getContents().iterator(); i&lt;br /&gt;                    .hasNext();) {&lt;br /&gt;                Object o = i.next();&lt;br /&gt;&lt;br /&gt;                //make sure this is an extended item handle&lt;br /&gt;                if (o instanceof ExtendedItemHandle) {&lt;br /&gt;                    ExtendedItemHandle eih = (ExtendedItemHandle) o;&lt;br /&gt;&lt;br /&gt;                    // read in the XML Representation for getting the data&lt;br /&gt;                    // definitions from the chart, get the values of the X and Y&lt;br /&gt;                    // axis&lt;br /&gt;                    String xSeries = getXSeries(getXMLResources(eih));&lt;br /&gt;                    String ySeries = getYSeries(getXMLResources(eih));&lt;br /&gt;&lt;br /&gt;                    //Look into using serializer to grab from a report design.&lt;br /&gt;                    //alternative of doing this, although a little uglier&lt;br /&gt;                    //ChartEngine.instance().getSerializer().fromXml(arg0, arg1)&lt;br /&gt;                    &lt;br /&gt;                    ChartWithoutAxes cwa = (ChartWithoutAxes) eih&lt;br /&gt;                            .getReportItem().getProperty(&amp;quot;chart.instance&amp;quot;);&lt;br /&gt;                    &lt;br /&gt;                    // Get list of result sets&lt;br /&gt;                    ArrayList resultSetList = (ArrayList) det&lt;br /&gt;                            .getResultSetList();&lt;br /&gt;                    &lt;br /&gt;                    //we know out data is in the first result set&lt;br /&gt;                    IResultSetItem resultItem = (IResultSetItem) resultSetList&lt;br /&gt;                            .get(0);&lt;br /&gt;                    String dispName = resultItem.getResultSetName();&lt;br /&gt;                    &lt;br /&gt;                    //tell the data extraction task to use the first result set&lt;br /&gt;                    det.selectResultSet(dispName);&lt;br /&gt;&lt;br /&gt;                    // retrieves the dataset with column/values as unique to map&lt;br /&gt;                    // to Pie Chart&lt;br /&gt;                    Map uniqueMap = getValueMap(det, ySeries, xSeries);&lt;br /&gt;&lt;br /&gt;                    //crete the category, or X series, and values, or y series&lt;br /&gt;                    TextDataSet categoryValues = createCategoriesDataSet(uniqueMap);&lt;br /&gt;                    NumberDataSet seriesOneValues = createValueDataSet(uniqueMap);&lt;br /&gt;&lt;br /&gt;                    //now that we have data and our chart, render to image&lt;br /&gt;                    renderPieChart(cwa, categoryValues, seriesOneValues);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        } catch (ExtendedElementException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (XPathExpressionException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (DOMException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (EngineException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (ChartException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        } catch (BirtException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    &lt;br /&gt;        //shutdown the platform, we are done&lt;br /&gt;        Platform.shutdown();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=rz4pKI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=rz4pKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=Dv9EzI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=Dv9EzI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=X2xigI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=X2xigI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/birt-building-chart-with-chart-engine.html" title="BIRT: Building Chart with Chart Engine API based off Report Document" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=2630907462940186607&amp;isPopup=true" title="2 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/2630907462940186607/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/2630907462940186607" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/2630907462940186607" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-9034214053667815802</id><published>2008-03-20T12:41:00.000-06:00</published><updated>2008-03-20T12:43:00.431-06:00</updated><title type="text">Book: Excerpt Available Online</title><content type="html">My Publisher has posted an article with an excerpt from my book on building a simple report. Check it out here: &lt;a href="http://www.packtpub.com/article/creating-a-simple-report-using-birt"&gt;http://www.packtpub.com/article/creating-a-simple-report-using-birt&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=okj3qI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=okj3qI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=8EjhoI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=8EjhoI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=89kceI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=89kceI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/book-excerpt-available-online.html" title="Book: Excerpt Available Online" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=9034214053667815802&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/9034214053667815802/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/9034214053667815802" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/9034214053667815802" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-8315505154579777130</id><published>2008-03-18T20:39:00.000-06:00</published><updated>2008-03-18T20:40:54.368-06:00</updated><title type="text">EclipseCon: The BIRT Theme Song</title><content type="html">Scott Rosenbaum was nice enough to post Pierre Tessier singing the BIRT theme song and molesting my rubber duck... SFW&lt;br /&gt;&lt;br /&gt;http://birtworld.blogspot.com/2008/03/fun-at-eclipsecon.html&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=MGeGlI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=MGeGlI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=zJtOsI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=zJtOsI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=1xjulI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=1xjulI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/eclipsecon-birt-theme-song.html" title="EclipseCon: The BIRT Theme Song" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=8315505154579777130&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/8315505154579777130/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/8315505154579777130" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/8315505154579777130" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-5427374639389103839</id><published>2008-03-09T03:57:00.001-06:00</published><updated>2008-03-09T04:18:09.703-06:00</updated><title type="text">Games: Super Smash Bros. Brawl</title><content type="html">One of the great things about having free time again is that I have time to do thing I want to do, not things I have to do. So I spent the better part of this evening and early morning playing the new Super Smash Bros. for the Wii. After an annoying 2 hour wait in line with smelly gamers, I managed to score a shelf copy after one of the local gaming stores lost my reservation. I'm not bitter, I'm just glad I scored it.&lt;br /&gt;&lt;br /&gt;So what do I think? The game is great. The control schema is simple and flexible, allowing you to use either the Wii controller and Nunchuck, the Sidways Wii Controller, the Classic Controller Add-on or the Gamecube controller. I must admit to being a little disappointed by the control schema using the wii controller, I was expecting some really cool motions and such for controls, but no such luck. The game instead uses the joystick part of the nunchuck and the various buttons for the incredibly simple punch, special moves, and block control schema. The simplistic scheme is what allows it to use any of the controller types, saving would be party hosts the expense of having to shell out 30 bucks for 4 Wii controllers.&lt;br /&gt;&lt;br /&gt;So I had a group over and we spent the better part of 6 hours playing. The end result, we didn't jump over to Mario Party at all the whole night, staying engrossed in the combative competition, with my main character Donkey Kong taking the cake for the most wins, with my wifes character of Peach coming in second. The returning characters have all the same moves that they had in previous games, with DK returning with his Monkey Temper Tantrum ground slap, his "Donkey Punch", and the windmill spin. Mario has his ever annoying coin punch, spin, and stupid fireballs. Pikachu of course remains a pain with cheap lightning moves and such. Pretty much what you would expect in terms of a Smash Bros game.&lt;br /&gt;&lt;br /&gt;The levels are a nice change. Unlike in Melee, Brawl has its own new levels, plus the addition of the levels in Melee. Noticeably absent, at least where we are at with only a few unlockables, are the original Smash Bros levels.  Which brings up one of the only gripes I do have with the game. When I sit down with a party type game like Smash Bros or Mario Party, the last thing I really want is to have to unlock secret characters and levels. One of the big things we were looking forward to was Snake from Metal Gear, only to find out he was an unlockable. So, we will bare through it and try to unlock him. Also notably absent was the rumored original Smash Bros virtual console release. Although I am not disappointed by that, because this version has so much replay value.&lt;br /&gt;&lt;br /&gt;So much to take in, and all we have done so far is play the multiplayer mode. I have yet to try and online gaming since I am selective as to who I will play with, and I have not tried solo play yet. The end result is the wait was worth it, and the game is incredibly addicting. I am sure there have been some nayser game reviews, part of the reason I quit reading game reviews by professional reviews is due to some ridiculous, quasi notion of "artistic quality" that they seem to judge games by, totally ignoring important aspects such as fun and entertainment, so to hell with those reviews. This game was worth putting up with smelly gamers and lame Star Trek jokes for two hours.&lt;br /&gt;&lt;br /&gt;Update: I missed one important thing, you can create your own stages.... nuff said&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=SKZyOI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=SKZyOI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=CckWWI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=CckWWI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=3BiCuI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=3BiCuI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/games-super-smash-bros-brawl.html" title="Games: Super Smash Bros. Brawl" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=5427374639389103839&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/5427374639389103839/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/5427374639389103839" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/5427374639389103839" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-8689716263071603224</id><published>2008-03-07T19:53:00.000-07:00</published><updated>2008-03-07T20:03:18.459-07:00</updated><title type="text">ETL: Practical Example of Data Transformation Using Kettle</title><content type="html">I’ve written about Kettle before. I personally think it is a great tool, and its easy to tell that this was written by someone who works with annoying data formats on a consistent basis. Well, Kettle is now known as the &lt;a href="http://kettle.pentaho.org/"&gt;Pentaho Data Integration Project&lt;/a&gt;, and its now up to version 3. For brevity’s sake, I will just refer to it as Kettle going forward. Of course, none of this changes the functionality of the tool. In this article I am going to show a practical application of how I have been using Kettle to assist in the generation and transformation of annoying data formats.  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I recently had to work with a feed from an entertainment vendor who distributes DVD, music CDs, and such. To the stores that use these files, they provide a rather confusing set of flat, tab delimited files, in a very un-userfriendly format. Since the store I was working for has a predefined format they want vendor files in to work with their search and navigation backend, we needed to transform these files to that format. This is where Kettle comes in. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The first file I need to deal with from them is their Products file. The file contains roughly 28 fields with various numbers that make no sense to me what so ever. The only fields I need to concern myself with are the Product ID, Product Name, Internal ID (used for mapping with the other files), a Category ID, the Artist, Price, and Availability Date. The other fields I can ignore. Since I am dealing with Categories I also need their Category file. Categories are going to be handled in a special way. I don’t need this in my actual file, but in a separate file, or files rather, that will be appended to a separate set of files only once. And the final file I need out of their set is their Attributes file, which will contain information about products such as if the product is Widescreen, Dubbed, Subtitled, etc. These are handled in a special way in the search backend, so I just need to provide them.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;  &lt;v:stroke joinstyle="miter"&gt;  &lt;v:formulas&gt;   &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;   &lt;v:f eqn="sum @0 1 0"&gt;   &lt;v:f eqn="sum 0 0 @1"&gt;   &lt;v:f eqn="prod @2 1 2"&gt;   &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;   &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @0 0 1"&gt;   &lt;v:f eqn="prod @6 1 2"&gt;   &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;   &lt;v:f eqn="sum @8 21600 0"&gt;   &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @10 21600 0"&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt;  &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:270.75pt;"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image001.gif" title="conceptualDataModel"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAMElcNcI/AAAAAAAAAJs/u4CExwwy528/s1600-h/conceptualDataModel.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAMElcNcI/AAAAAAAAAJs/u4CExwwy528/s320/conceptualDataModel.png" alt="" id="BLOGGER_PHOTO_ID_5175199129191331266" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 1.&lt;/b&gt; Conceptual Model of Data&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;What I need to do is transform this data into the format in Figure 2.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1026" type="#_x0000_t75" style="'width:102pt;height:185.25pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" title="dataFeedFormat"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAMUlcNdI/AAAAAAAAAJ0/4RJkjBAde8c/s1600-h/dataFeedFormat.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAMUlcNdI/AAAAAAAAAJ0/4RJkjBAde8c/s320/dataFeedFormat.png" alt="" id="BLOGGER_PHOTO_ID_5175199133486298578" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 2.&lt;/b&gt; The Data Feed Format&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The Artist field will go into Search Field 1, and the first two attributes I come across will go into search fields 2 and 3. Everything else will be a simple 1 to 1 mapping.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;To get started, the first thing I need to do is start Kettle.exe, and create a new transformation. If you are using a repository, great, otherwise, choose No Repository at the startup screen. When you are in Kettle, go to File/New/Transformation. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1027" type="#_x0000_t75" style="'width:6in;height:279.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image003.png" title="newFile"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAfUlcNkI/AAAAAAAAAKs/GzvOcMpg7Rs/s1600-h/newFile.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAfUlcNkI/AAAAAAAAAKs/GzvOcMpg7Rs/s320/newFile.png" alt="" id="BLOGGER_PHOTO_ID_5175199459903813186" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 3.&lt;/b&gt; New Transform&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;With the new file created, drag over 3 new Text File Inputs, located under the Core Objects/Input section, to the transformation area.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1028" type="#_x0000_t75" style="'width:177.75pt;height:279.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image005.png" title="newTextInput"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IAfklcNlI/AAAAAAAAAK0/KeqoRydNB98/s1600-h/newTextInput.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IAfklcNlI/AAAAAAAAAK0/KeqoRydNB98/s320/newTextInput.png" alt="" id="BLOGGER_PHOTO_ID_5175199464198780498" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 4.&lt;/b&gt; New Text Inputs&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;With the three text file inputs in the transformation, I need to set them up to read my data files. The first thing is to add the file to the input file list. Do this by clicking on Browse, then when you select your file, click on add. With the file selected, I now need to set up the delimiting information. These files are all tab delimited, with no text qualifiers (meaning no quotes around Strings), and no header row. So I click on the content and set the appropriate options. Since this is a tab delimited file, I need to click on the Insert Tab button to add in the tab.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1029" type="#_x0000_t75" style="'width:6in;height:351.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image007.png" title="delimeter"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAMUlcNeI/AAAAAAAAAJ8/WzwvbS7NjdA/s1600-h/delimeter.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IAMUlcNeI/AAAAAAAAAJ8/WzwvbS7NjdA/s320/delimeter.png" alt="" id="BLOGGER_PHOTO_ID_5175199133486298594" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 5.&lt;/b&gt; Delimeter Options&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now I need to select the fields. To do that, since I have my file, all I need to do is click on the Get Fields button under the Fields tab. For developments sake, I will just name the fields that I need, and leave the field names alone for the remaining fields. Also, since I am just using these fields as description fields, I change the Date fields back to Strings.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1030" type="#_x0000_t75" style="'width:6in;height:358.5pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image009.png" title="fieldNames"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAM0lcNgI/AAAAAAAAAKM/utMhNC7POg4/s1600-h/fieldNames.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAM0lcNgI/AAAAAAAAAKM/utMhNC7POg4/s320/fieldNames.png" alt="" id="BLOGGER_PHOTO_ID_5175199142076233218" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 6.&lt;/b&gt; Field selection&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;That’s it for Products, I do the same for the Categories and Attributes Tables. Now that the text inputs are set up, I need to do the transformations. The hardest part will be to denormalize and join the attributes into my input stream to feed into my output text file. The first step I need to take care of is sorting my data for the field row delimeter. So, I drag over a Sort Rows object from under the Transformation section. I need to connect the Attribute text data source to the Sort Rows object in order to edit it correctly. In order to do the connection, I need to hold down the Shift key on my keyboard, and drag my mouse from the Attibutes object to the Sort Rows object. This will indicate to the transformation that a “hop” in steps needs to occur between these two objects. Now, I edit my sort to sort based on the Product ID.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1031" type="#_x0000_t75" style="'width:6in;height:312.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image011.png" title="sortRows"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IApUlcNpI/AAAAAAAAALU/FzVmZTuuSso/s1600-h/sortRows.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R9IApUlcNpI/AAAAAAAAALU/FzVmZTuuSso/s320/sortRows.png" alt="" id="BLOGGER_PHOTO_ID_5175199631702505106" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 7&lt;/b&gt;. Sort Row Options&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Next, I drag over a Select Values object and connect the Sort Rows object to it. In the Select/Alter tab, I click on Get Fields and leave everything default. Since I wont be using the non-named fields, I go over to the Remove tab, and select those fields.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1032" type="#_x0000_t75" style="'width:431.25pt;height:315pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image013.png" title="removeFields"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IApElcNoI/AAAAAAAAALM/3CWUBS19UJc/s1600-h/removeFields.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IApElcNoI/AAAAAAAAALM/3CWUBS19UJc/s320/removeFields.png" alt="" id="BLOGGER_PHOTO_ID_5175199627407537794" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 8&lt;/b&gt;. Remove Fields&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;That was the easy part. Now I need to denormalize the data. What I want to do is have the first 3 attributes for each product to show up in consecutive columns. I tried using the Denormlizer here, with no success. So I ended up using the row flattener. The way the row flattener works is you define a single field that will contain the consecutive data. You then define additional columns. The flattener will then copy to each column in the order it receives data. So for example, lets say you have the following data defined in a field in your incoming data stream:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Wide Screen&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Sub Titled&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Spanish&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;And in your row flattener, you defined the following target fields:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldOne&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldTwo&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldThree&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The flattener would assign the values like so:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldOne = Wide screen&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldTwo = Sub Titles&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-FieldThree = Spanish&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;It also seems that once unique values have been exhausted, it will just finish filling out the columns with the last unique value it encountered. For my purposes this is just fine. I define my field flattener with my values for Attribute Name in the following figure.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1033" type="#_x0000_t75" style="'width:6in;height:274.5pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image015.png" title="fieldFlattener"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IAMklcNfI/AAAAAAAAAKE/-YZqFfTuwMo/s1600-h/fieldFlattener.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IAMklcNfI/AAAAAAAAAKE/-YZqFfTuwMo/s320/fieldFlattener.png" alt="" id="BLOGGER_PHOTO_ID_5175199137781265906" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 9.&lt;/b&gt; Field Flattener&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;So, with this final step in my transformation, my data stream for attribute will look something like:&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-ProductID&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-InternalID&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-AttributeName&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Search_Field_1&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Search_Field_2&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Search_Field_3&lt;/p&gt;  &lt;p class="MsoNormal"&gt;-Search_Field_4&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now, I need to join it to my Products data stream. To do this I pull over a Join object. I need to join on my Internal ID or my Product ID since they both uniquely identify my product. So I will set that as the join. I also need to set this join type to Left Outer Join, since I need Products to show up even if there are no Attributes to join with. I also will set Products as my Primary feed with Attributes as my secondary feed. It is important that when you do the connections in the Transformation editor that you connect both the Products Text Input and the Row Flattener object.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1034" type="#_x0000_t75" style="'width:6in;height:330.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image017.png" title="join"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAfElcNjI/AAAAAAAAAKk/DRXe7Tm1WlQ/s1600-h/join.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAfElcNjI/AAAAAAAAAKk/DRXe7Tm1WlQ/s320/join.png" alt="" id="BLOGGER_PHOTO_ID_5175199455608845874" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 10&lt;/b&gt;. Join&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The final thing I need to do to my transformation is modify the Product ID. Since this is for a test feed, I need the product ID to be unique. I will do this with Java Script. I also need to modify the attribute field to remove any pipes in the data field, since my output file needs to be a pipe delimted text file. So, I will drag over a Java Script component, and in Javascript I will write the appropriate code to add in increments of 10 million to the product ID (which I will modify in sequential runs), and use the string replace method to replace any pipes. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1035" type="#_x0000_t75" style="'width:6in;height:316.5pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image019.png" title="javaScript"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAfElcNiI/AAAAAAAAAKc/K-D_FhfuYwo/s1600-h/javaScript.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IAfElcNiI/AAAAAAAAAKc/K-D_FhfuYwo/s320/javaScript.png" alt="" id="BLOGGER_PHOTO_ID_5175199455608845858" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 11.&lt;/b&gt; Javascript Code. &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;The final part of this is to output my text file. I need to set my file name for output, delimiting options, and fields I will use in my Output File object.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1036" type="#_x0000_t75" style="'width:431.25pt;height:315.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image021.png" title="vendorOutputName"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IApklcNqI/AAAAAAAAALc/JRs7rQkBW08/s1600-h/vendorOutputName.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_vWcPU_Sx6fE/R9IApklcNqI/AAAAAAAAALc/JRs7rQkBW08/s320/vendorOutputName.png" alt="" id="BLOGGER_PHOTO_ID_5175199635997472418" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 12&lt;/b&gt;. Output Text Filename&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1037" type="#_x0000_t75" style="'width:6in;height:315.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image023.png" title="outputDelimeter"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAo0lcNmI/AAAAAAAAAK8/ZarKxYBe4Jw/s1600-h/outputDelimeter.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAo0lcNmI/AAAAAAAAAK8/ZarKxYBe4Jw/s320/outputDelimeter.png" alt="" id="BLOGGER_PHOTO_ID_5175199623112570466" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 13&lt;/b&gt;. Output Text Delimeter&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1038" type="#_x0000_t75" style="'width:431.25pt;height:316.5pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image025.png" title="outputTextFields"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IApElcNnI/AAAAAAAAALE/zSjNFBrsGhA/s1600-h/outputTextFields.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R9IApElcNnI/AAAAAAAAALE/zSjNFBrsGhA/s320/outputTextFields.png" alt="" id="BLOGGER_PHOTO_ID_5175199627407537778" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 14&lt;/b&gt;. Output text fields&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;You will notice in Figure 13 I have Append set. This will append every run of the transformation to the end of the output text file. I also have Price in twice since the Display Price and Actual Price are the same.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now, the final part of this transformation is the Categories. The only thing I need special for Categories is a hard coded entry for my Super Category mapping in the internal search appliance for my categories in the vendor data feed. I accomplish this through a JavaScript component between the Categories Text Input and the Output files. I won’t show the Output files for Categories since it isn’t relevant to my main transformation with the Attributes and Products. The final figure shows my finished Transformation.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1039" type="#_x0000_t75" style="'width:431.25pt;height:446.25pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image027.png" title="finished"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAe0lcNhI/AAAAAAAAAKU/dAUyZ_RORbQ/s1600-h/finished.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vWcPU_Sx6fE/R9IAe0lcNhI/AAAAAAAAAKU/dAUyZ_RORbQ/s320/finished.png" alt="" id="BLOGGER_PHOTO_ID_5175199451313878546" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Figure 15.&lt;/b&gt; Finished Transformation&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now, I can create my dummy feed and add to it at the click of a button. Of course, this is applicable to actual production data transformations as well. Kettle does run a little slower than a hand coded solution, but not enough to rule it out due to the amount off time it saves in development and the amount of time saved in modifying it when necessary.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=12A7bI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=12A7bI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=NVzXtI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=NVzXtI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=p258CI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=p258CI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/etl-practical-example-of-data.html" title="ETL: Practical Example of Data Transformation Using Kettle" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=8689716263071603224&amp;isPopup=true" title="1 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/8689716263071603224/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/8689716263071603224" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/8689716263071603224" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-4655766488884196600</id><published>2008-03-04T22:26:00.000-07:00</published><updated>2008-03-04T22:30:03.652-07:00</updated><title type="text">Wii: Error Code 209552 After System Update</title><content type="html">So I got my Wii back online after a long period of neglect in that area. Since the wife and I have been playing a lot more, I decided it was time to get it back online. I'm also waiting to see if they ever release the original Super Smash Bros on the Virtual Console (no luck so far).&lt;br /&gt;&lt;br /&gt;So, I get my Wii online, do the system update, and lo and behold, I can't connect to the Wii Store Channel. I kept getting an error 209552. I am not sure what caused this, since I have also recently changed wireless routers, but the dang thing wouldn't connect after the system update (had enough connectivity beforehand to at least get a system update).&lt;br /&gt;&lt;br /&gt;To fix this, I ended up having to change the broadcast channel on my wireless router from 6 to 1. Once I changed that, everything worked like a charm again.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=lJks7I"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=lJks7I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=4yjk6I"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=4yjk6I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=BIIUzI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=BIIUzI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/wii-error-code-209552-after-system.html" title="Wii: Error Code 209552 After System Update" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=4655766488884196600&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/4655766488884196600/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/4655766488884196600" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/4655766488884196600" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-2608650663378467376</id><published>2008-03-01T13:24:00.001-07:00</published><updated>2008-03-03T11:30:33.482-07:00</updated><title type="text">Book: Press Release</title><content type="html">&lt;b&gt;Design and create reports quickly with the Eclipse-based Business Intelligence and Reporting Tools system using new book&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Packt is pleased to announce a new book on &lt;a target="_blank" href="http://www.packtpub.com/practical-data-analysis-reporting-with-birt/book"&gt;Business Intelligence and Reporting Tools&lt;/a&gt; (BIRT) that provides understanding and structure in a fast paced, task driven and tutorial style. Practical Data Analysis and Reporting with BIRT focuses on the most visible and familiar product built with the BIRT framework, which is the BIRT Report Designer.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;BIRT, which stands for Business Intelligence and Reporting Tools, is an Eclipse-based open source software project that provides reporting and business intelligence capabilities for rich client and web applications, especially those based on Java and J2EE. BIRT is in fact a collection of development tools and technologies used for developing reports utilizing the BIRT runtime framework component on an application server. BIRT has two main components: a visual report designer within the Eclipse IDE for creating BIRT Reports, and a runtime component for generating reports that can be deployed to any Java environment.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;This book has a fast-paced, task-driven, tutorial style, which provides understanding and structure, not just lists of steps to follow. The focus is on the most visible and familiar product built with the BIRT framework, which is the BIRT Report Designer. The BIRT Report Designer is an Eclipse plug-in that utilizes BIRT technologies to allow users to design reports in the BIRT document format. Also covered is the BIRT charting engine, which lets you add charts to your application.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Java developers who want to get reporting as quickly as possible will find this book useful. The book is published by Packt and is available now. For more information, please visit: &lt;a target="_blank" href="http://www.packtpub.com/practical-data-analysis-reporting-with-birt/book"&gt;http://www.packtpub.com/practical-data-analysis-reporting-with-birt/book&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=V4r8aI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=V4r8aI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=f807pI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=f807pI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=efILGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=efILGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/03/book-press-release.html" title="Book: Press Release" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=2608650663378467376&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/2608650663378467376/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/2608650663378467376" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/2608650663378467376" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-8630020767885394085</id><published>2008-02-28T22:48:00.001-07:00</published><updated>2008-02-28T22:57:41.572-07:00</updated><title type="text">DB2: Remote Client Connection</title><content type="html">I had a hard time connecting to a DB2 server after the remote client was installed. I'm not an expert on DB2, so I decided to notate this for others.&lt;br /&gt;&lt;br /&gt;-From a command prompt, export a environment variables needed to run:&lt;br /&gt;&lt;br /&gt;export DB2INSTANCE=db2inst1&lt;br /&gt;export INSTHOME=/export/home/db2inst1&lt;br /&gt;&lt;br /&gt;-Run DB2 and set the database catalog to the remove connection:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;db2 =&gt; CATALOG TCPIP NODE UNIQUENODENAME REMOTE 192.168.1.10 SERVER 50000;&lt;br /&gt;&lt;br /&gt;-Now, set database name to connect through the new node:&lt;br /&gt;&lt;br /&gt;db2 =&gt; catalog database mydatabase as mydatabase at node UNIQUENODENAME&lt;br /&gt;&lt;br /&gt;-And finally, connect to the database:&lt;br /&gt;&lt;br /&gt;db2 =&gt; connect to mydatabase user username using password&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=hFNkGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=hFNkGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=oqjLRI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=oqjLRI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=NguiqI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=NguiqI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/02/db2-remote-client-connection.html" title="DB2: Remote Client Connection" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=8630020767885394085&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/8630020767885394085/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/8630020767885394085" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/8630020767885394085" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-8033990711802715358</id><published>2008-02-25T13:35:00.000-07:00</published><updated>2008-02-25T13:39:52.608-07:00</updated><title type="text">Announcement: Release of "Practical Data Analysis and Reporting with BIRT"</title><content type="html">I am pleased to announce the release of my first book "&lt;a href="http://www.packtpub.com/practical-data-analysis-reporting-with-birt/book"&gt;Practical Data Analysis and Reporting with BIRT&lt;/a&gt;". Also available from &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1847191096"&gt;Amazon&lt;/a&gt;. After a long an grueling process, I am glad that it is finally complete and out. It is definitely a learning experience to write a book, so I hope you enjoy it.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=t9CtUI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=t9CtUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=c87pWI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=c87pWI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/TheDigitalVoice?a=RaOSUI"&gt;&lt;img src="http://feeds.feedburner.com/~f/TheDigitalVoice?i=RaOSUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="alternate" type="text/html" href="http://digiassn.blogspot.com/2008/02/announcement-release-of-practical-data.html" title="Announcement: Release of &quot;Practical Data Analysis and Reporting with BIRT&quot;" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16506996&amp;postID=8033990711802715358&amp;isPopup=true" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/8033990711802715358/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://digiassn.blogspot.com/feeds/posts/default/8033990711802715358" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16506996/posts/default/8033990711802715358" /><author><name>John Ward</name><uri>http://www.blogger.com/profile/10741149622435353727</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-16506996.post-7982383282980735824</id><published>2008-02-20T14:43:00.000-07:00</published><updated>2008-02-20T14:54:18.544-07:00</updated><title type="text">BIRT: BIRT Reporting for Microsoft Access Using JDBC-ODBC Bridge</title><content type="html">&lt;a href="http://www.eclipsecon.org/2008/"&gt;&lt;img src="http://www.eclipsecon.org/2008/image/130x100_speaking.gif" alt="I'm speaking at EclipseCon 2008" border="0" height="100" width="130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Occasionally the question comes up asking how can one access a Microsoft Access database within BIRT. There are a number of different ways of doing this. The easiest is to use the Java JDBC-ODBC bridge, set up a ODBC connection on your system, and access it this way. This is the way that we will illustrate in this article. Additionally, you can also use a third part JDBC Access driver, and set it up as you would any other JDBC driver in BIRT. I have yet to find a good, free driver for this, although I haven’t looked either. If you were really looking for punishment, you could write your own driver, but that is a road I have no desire to go down since the simpler solution exists. Keep in mind, the limitation is that the Access database in question needs to be in a path that is accessible for the ODBC hosting system.  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;For this example, I am using the Northwind Sample Database located at &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=C6661372-8DBE-422B-8676-C632D66C529C&amp;amp;displaylang=EN.s"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=C6661372-8DBE-422B-8676-C632D66C529C&amp;amp;displaylang=EN.s&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I installed the database to C:\TEMP\&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Setting Up ODBC&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now I need to set up an ODBC connection to the Access database. I am using Windows XP Pro, so my instruction will reflect that, using the Classic theme. First, I go to the Start menu, under Control Panel. Under Control Panel, I click on the Administrative Tools icon. Then I click on the Data Sources (ODBC) Icon.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;  &lt;v:stroke joinstyle="miter"&gt;  &lt;v:formulas&gt;   &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;   &lt;v:f eqn="sum @0 1 0"&gt;   &lt;v:f eqn="sum 0 0 @1"&gt;   &lt;v:f eqn="prod @2 1 2"&gt;   &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;   &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @0 0 1"&gt;   &lt;v:f eqn="prod @6 1 2"&gt;   &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;   &lt;v:f eqn="sum @8 21600 0"&gt;   &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @10 21600 0"&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt;  &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:392.25pt;"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image001.gif" title="dataSources"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R7yfOBbelLI/AAAAAAAAAIM/GXEHKNSduWg/s1600-h/dataSources.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R7yfOBbelLI/AAAAAAAAAIM/GXEHKNSduWg/s320/dataSources.png" alt="" id="BLOGGER_PHOTO_ID_5169181535565157554" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now, because I want this to be accessible through to the System, I click on the System DSN Tab.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1026" type="#_x0000_t75" style="'width:345.75pt;height:282.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" title="systemDSN"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R7yflRbelVI/AAAAAAAAAJc/qDIh_QMWlso/s1600-h/systemDSN.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R7yflRbelVI/AAAAAAAAAJc/qDIh_QMWlso/s320/systemDSN.png" alt="" id="BLOGGER_PHOTO_ID_5169181934997116242" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Next, I click on the Add button. In the dialog that pops up, I click on Microsoft Access Driver (*.mdb). &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1027" type="#_x0000_t75" style="'width:351pt;height:258.75pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image003.gif" title="createNewDataSource"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vWcPU_Sx6fE/R7yfMxbelJI/AAAAAAAAAH8/lOVXcjGnn0s/s1600-h/createNewDataSource.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vWcPU_Sx6fE/R7yfMxbelJI/AAAAAAAAAH8/lOVXcjGnn0s/s320/createNewDataSource.png" alt="" id="BLOGGER_PHOTO_ID_5169181514090321042" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;In the following dialog, I fill out the information. I name my database NorthWind, and put in a simple description.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1028" type="#_x0000_t75" style="'width:353.25pt;height:234pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image004.gif" title="ODBCAccessSetup"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vWcPU_Sx6fE/R7yfiBbelSI/AAAAAAAAAJE/qXdpQL0WFT4/s1600-h/ODBCAccessSetup.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vWcPU_Sx6fE/R7yfiBbelSI/AAAAAAAAAJE/qXdpQL0WFT4/s320/ODBCAccessSetup.png" alt="" id="BLOGGER_PHOTO_ID_5169181879162541346" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Next, I click on the select button. This will bring up an older Windows 3.1 style file browser. I navigate to the C:\Temp folder, and choose the Northwind Sample Database.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1029" type="#_x0000_t75" style="'width:301.5pt;height:182.25pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image005.gif" title="oldSchool"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vWcPU_Sx6fE/R7yfihbelTI/AAAAAAAAAJM/75mMHTipJRI/s1600-h/oldSchool.png"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_vWcPU_Sx6fE/R7yfihbelTI/AAAAAAAAAJM/75mMHTipJRI/s320/oldSchool.png" alt="" id="BLOGGER_PHOTO_ID_5169181887752475954" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;From that point I am done, and hit OK and save this configuration. I test that this setup is valid by creating a dummy .UDL file on my desktop, and using the wizard to do a test connection.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;Configuring BIRT&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Now that I have an ODBC entry made, I need to configure BIRT to use the JDBC-ODBC bridge and connect it to this database. I create a new BIRT Report Project called JDBC-ODBC Access. Under this project, I create a new report called northwindEmployees.rptdesign. &lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;In the report, I create a new Data Source by opening the Data Explorer tab, and right-mouse clicking on Data Sources and choosing New Data Source.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1030" type="#_x0000_t75" style="'width:282.75pt;height:356.25pt'"&gt;  &lt;v:imagedata src="file:///C:\DOCUME~1\JOHNWA~1\LOCALS~1\Temp\msohtml1\01\clip_image006.gif" title="newDataSource"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vWcPU_Sx6fE/R7yfZRbelQI/AAAAAAAAAI0/bnu_v_VeYbQ/s1600-h/newDataSource.png"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vWcPU_Sx6fE/R7yfZRbelQI/AAAAAAAAAI0/bnu_v_VeYbQ/s320/newDataSource.png" alt="" id="BLOGGER_PHOTO_ID_5169181728838685954" border="0" /&gt;&lt;/a&gt;&lt;!--[endif]--&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;I name the Data Source NorthWind and specify that I want to use JDBC.&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id="_x0000_i1031" type="#_x0000_t75" style="'width:395.25pt;heig