Sunday, December 31, 2017

Reporting Tool for Spring Projects (Getting data from different databases in one report)

In spring projects , we use different databases for  different services .
There will be requirement to get  data from different databases in  to one report . It is practically not an easy task .

But  in  BIRT (an open source technology platform used to create data visualizations and reports that can be embedded into rich client and web applications) reporting tool can address this  issue easily .

First you have to create new separate Data Source connections for all  databases that you want to use .
Second step is  create separate Data Sets (Query to get data from particular database)  for  each  database that you want to use .

Third step is  create new  Join Data Set  using already created data sets in second step . Through this join data sets , you  can easily get data  from different databases to your report without much effort(you can create many Join Data Sets  as you wish) .

We allso have to do something for Open Source community back .


Saturday, December 30, 2017

Tip to Avoid Procastination (5 Seconds Rule)

In Our life ,
  1. Knowing what to do will never be enough.
  2. Knowing why you need to do it will never be enough.
So what we need is something that’s going to launch us into a state of action. Because if you’re sitting around waiting for motivation, I’m here to tell you it’s not coming.
If you don’t start doing the things you don’t feel like doing, you will wake up one year from today and be in exactly the same place.

So here’s the one-liner definition of the 5 second rule:

If you have an impulse to act on a goal, you must physically move within 5 seconds or your brain will kill the idea.



Saturday, December 16, 2017

Birt - Business Intelligence Reporting Tool

BIRT stands for “business intelligence and reporting tools”.It’s a completely open-source project.  Can be use with java projects.

BIRT uses 3 engines: a design engine, a chart engine, and a reporting engine. Its user interface is easy to use, and it will handle everything in the data analytics sphere you’ll need. One of main advantage of Birt reporting tool as I see is  , you can have  multiple  main data sources in same report . Through that you  get   data from multiple  databases in single report  without much development effort and you can join those  two data sources also  . It is  very important and  useful when you  developing report  with Spring architecture .



Configuring BIRT  (Extracted from :- wiki.eclipse.org/Servlet_Example_(BIRT)2.1)
  

(Servlet Example)

This example demonstrates using the RE API within a servlet. Note if possible it is better to use the BIRT Web Viewer Example. An example for BIRT 2.2 and 2.5 is listed in the comments. Add comments at the bottom of the example.


BIRT Report Engine API Return to the BIRT Report Engine API examples

Setup

1. Create a WebReport/WEB-INF/lib directory underneath the Tomcat webapps directory.
2. Copy all the jars in the birt-runtime-2_1_1/ReportEngine/lib directory from the Report Engine download into your WebReport/WEB-INF/lib directory.
Steps 3 and 4 are not needed if you are using the BIRT 3.7 POJO Runtime. The POJO Runtime does not have a platform directory.
3. Create a directory named platform in your WEB-INF folder.
4. Copy the birt-runtime-2_1_1/Report Engine/plugins and birt-runtime-2_1_1/ReportEngine/configuration directories to the platform directory you just created.

Document1 01.png
This example application consist of three files that are archived into webreport.jar. If you are using Eclipse to build the servlet make sure to add all the jars, from the birt-runtime-2_1_1/ReportEngine/lib directory to your build path. You will also need servlet.jar, from the Tomcat Eclipse plug-in in your build path. Either build or copy webreport.jar from the example and place it in your WEB-INF/lib directory.

  • BirtConfig.properties - Configuration properties for the Engine.
  • BirtEngine.java - Class used to initialize the Report Engine.
  • WebReport.java - The servlet that handles report generation on a GET command.
Note that if your report references classes from your application, the following code is required in order for the RunAndRenderTask/RunTask to use your application's classloader:
config.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, Thread.currentThread().getContextClassLoader());
You can also add to your classpath using the following appcontext setting; This can be used to setup jars that implement event handlers.
config.getAppContext().put(EngineConstants.WEBAPP_CLASSPATH_KEY, "c:/jars/mjo.jar");
Modify the appcontext before starting up the Platform.
Platform.startup( config );
This behaviour has changed from earlier versions of BIRT. See example version for 2.2 at the bottom of page.

Source

BirtConfig.properties
logDirectory=c:/temp
logLevel=FINEST
BirtEngine.java
import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;

import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.IReportEngine;
import javax.servlet.*;
import org.eclipse.birt.core.framework.PlatformServletContext;
import org.eclipse.birt.core.framework.IPlatformContext;
import  org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;

public class BirtEngine {

private static IReportEngine birtEngine = null;

private static Properties configProps = new Properties();

private final static String configFile = "BirtConfig.properties";

public static synchronized void initBirtConfig() {
 loadEngineProps();
}

public static synchronized IReportEngine getBirtEngine(ServletContext sc) {
 if (birtEngine == null) 
 {
  EngineConfig config = new EngineConfig();
  if( configProps != null){
   String logLevel = configProps.getProperty("logLevel");
   Level level = Level.OFF;
   if ("SEVERE".equalsIgnoreCase(logLevel)) 
   {
    level = Level.SEVERE;
   } else if ("WARNING".equalsIgnoreCase(logLevel))
   {
    level = Level.WARNING;
   } else if ("INFO".equalsIgnoreCase(logLevel)) 
   {
    level = Level.INFO;
   } else if ("CONFIG".equalsIgnoreCase(logLevel))
   {
    level = Level.CONFIG;
   } else if ("FINE".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINE;
   } else if ("FINER".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINER;
   } else if ("FINEST".equalsIgnoreCase(logLevel)) 
   {
    level = Level.FINEST;
   } else if ("OFF".equalsIgnoreCase(logLevel)) 
   {
    level = Level.OFF;
   }

   config.setLogConfig(configProps.getProperty("logDirectory"), level);
  }

  config.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, Thread.currentThread().getContextClassLoader()); 
  //if you are using 3.7 POJO Runtime no need to setEngineHome
  config.setEngineHome("");
  IPlatformContext context = new PlatformServletContext( sc );
  config.setPlatformContext( context );


  try
  {
   Platform.startup( config );
  }
  catch ( BirtException e )
  {
   e.printStackTrace( );
  }

  IReportEngineFactory factory = (IReportEngineFactory) Platform
  .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
  birtEngine = factory.createReportEngine( config );


 }
 return birtEngine;
}

public static synchronized void destroyBirtEngine() {
 if (birtEngine == null) {
  return;
 }  
 birtEngine.shutdown();
 Platform.shutdown();
 birtEngine = null;
}

public Object clone() throws CloneNotSupportedException {
 throw new CloneNotSupportedException();
}

private static void loadEngineProps() {
 try {
  //Config File must be in classpath
  ClassLoader cl = Thread.currentThread ().getContextClassLoader();
  InputStream in = null;
  in = cl.getResourceAsStream (configFile);
  configProps.load(in);
  in.close();


 } catch (IOException e) {
  e.printStackTrace();
 }

}

}
WebReport.java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderContext;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IReportEngine;


public class WebReport extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;
/**
 * Constructor of the object.
 */
private IReportEngine birtReportEngine = null;
protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );

public WebReport() {
 super();
}

/**
 * Destruction of the servlet. 

 */
public void destroy() {
 super.destroy(); 
 BirtEngine.destroyBirtEngine();
}


/**
 * The doGet method of the servlet. 

 *
 */
public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {

 //get report name and launch the engine
 resp.setContentType("text/html");
 //resp.setContentType( "application/pdf" ); 
 //resp.setHeader ("Content-Disposition","inline; filename=test.pdf");  
 String reportName = req.getParameter("ReportName");
 ServletContext sc = req.getSession().getServletContext();
 this.birtReportEngine = BirtEngine.getBirtEngine(sc);
 
 //setup image directory
 HTMLRenderContext renderContext = new HTMLRenderContext();
 renderContext.setBaseImageURL(req.getContextPath()+"/images");
 renderContext.setImageDirectory(sc.getRealPath("/images"));
 
 logger.log( Level.FINE, "image directory " + sc.getRealPath("/images"));  
 System.out.println("stdout image directory " + sc.getRealPath("/images"));
 
 HashMap<String, HTMLRenderContext> contextMap = new HashMap<String, HTMLRenderContext>();
 contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext );
 
 IReportRunnable design;
 try
 {
  //Open report design
  design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );
  //create task to run and render report
  IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );  
  task.setAppContext( contextMap );
  
  //set output options
  HTMLRenderOption options = new HTMLRenderOption();
  options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
  //options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
  options.setOutputStream(resp.getOutputStream());
  task.setRenderOption(options);
  
  //run report
  task.run();
  task.close();
 }catch (Exception e){
  
  e.printStackTrace();
  throw new ServletException( e );
 }
}

/**
 * The doPost method of the servlet. 

 *
 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

 response.setContentType("text/html");
 PrintWriter out = response.getWriter();
 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
 out.println("<HTML>");
 out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
 out.println("  <BODY>");
 out.println(" Post does nothing");
 out.println("  </BODY>");
 out.println("</HTML>");
 out.flush();
 out.close();
}

/**
 * Initialization of the servlet. 

 *
 * @throws ServletException if an error occure
 */
public void init() throws ServletException {
 BirtEngine.initBirtConfig();
 
}

}

Comments

Please enter comments below by selecting the edit icon to the right. You will need a Bugzilla account to add comments.

BIRT 2.5 example project Media:WebReport2.5.zip
BIRT 2.2 Example. Listed below is the WebReport.java class with changes for BIRT 2.2 WebReport.java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.HTMLRenderContext;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.IReportEngine;


public class WebReport extends HttpServlet {

 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 /**
  * Constructor of the object.
  */
 private IReportEngine birtReportEngine = null;
 protected static Logger logger = Logger.getLogger( "org.eclipse.birt" );
 
 public WebReport() {
  super();
 }

 /**
  * Destruction of the servlet. 

  */ 
 public void destroy() { 
  super.destroy(); 
  BirtEngine.destroyBirtEngine();
 }
 

 /**
  * The doGet method of the servlet. 

  *
  */
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {

  //get report name and launch the engine
  resp.setContentType("text/html");
  //resp.setContentType( "application/pdf" ); 
  //resp.setHeader ("Content-Disposition","inline; filename=test.pdf");  
  String reportName = req.getParameter("ReportName");
  ServletContext sc = req.getSession().getServletContext();
  this.birtReportEngine = BirtEngine.getBirtEngine(sc);
  
  
  IReportRunnable design;
  try
  {
   //Open report design
   design = birtReportEngine.openReportDesign( sc.getRealPath("/Reports")+"/"+reportName );
   //create task to run and render report
   IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design );  
   //set output options
   HTMLRenderOption options = new HTMLRenderOption();
                       //set the image handler to a HTMLServerImageHandler if you plan on using the base image url.
                       options.setImageHandler(new HTMLServerImageHandler());
   options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
   //options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
   options.setOutputStream(resp.getOutputStream());
   options.setBaseImageURL(req.getContextPath()+"/images");
   options.setImageDirectory(sc.getRealPath("/images"));
   task.setRenderOption(options);
   
   //run report
   task.run();
   task.close();
  }catch (Exception e){
   
   e.printStackTrace();
   throw new ServletException( e );
  }
 }

 /**
  * The doPost method of the servlet. 

  *
  */
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  out.println("<HTML>");
  out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  out.println("  <BODY>");
  out.println(" Post Not Supported");
  out.println("  </BODY>");
  out.println("</HTML>");
  out.flush();
  out.close();
 }

 /**
  * Initialization of the servlet. 

  *
  * @throws ServletException if an error occure
  */
 public void init() throws ServletException {
  BirtEngine.initBirtConfig();
  
 }

}






Useful Resources
  • http://www.eclipse.org/birt/documentation/reference.php
  • https://www.youtube.com/channel/UCcqqPlXBTUcA8Hw1QmT2WMw 
  • https://www.youtube.com/playlist?list=PLXBve0kMIQOMqk1gI71jKZUEKK0zjl207 
  • https://wiki.eclipse.org/Category:BIRT
  •  BIRT Developer Youtube Channel

What is Business Inteligence ?

 Decision support
# Increased  data  collection  and greater storage capacity
# dats strucuters - sturectured , unstructred  and semi sturectured
#1 st step >>BI >> taking inventory of the data your  company produces
#data  marts
#finally data is  transferred into the central warehouse or datamart
#hadoop
#hadoop is an an storing and processing large amt of  data  across multiple  servers  - uses cluster system
    # ad- hoc queries
    #map reduce
#analyzing big data
#data mining  - analysis of large sets of data in order to find patterns and correlations , connections.
#analyzing big data

#INSIGHTS FROM ANALYTICS  REPORTS INFLUENCE COMPANY DIRECTION , PRODUCT LINEUPS ,AND EVEN HIRING DECISIONS

#Text analytics
#Business analytics - analyzing and  drawing connections between data
      Through that     #Predict future trends
                               #Gain compettive advantages
                                #Reveal unknown innefficencies .
#There  are 3 main forms of business analytics
        #Descriptive - programs analyze past data and identify trends and relationships.
        #Predictive  - companies to infer future patterns from past trends.
        #Decision - looks at a company's internal data , then analyzes external conditions
                            (such as manufacturing trends, or predict supply shortages)
                           to recommend the best course of action for a company.

#Data Visualization - Graphic display of the results  of data mining or analytics, often in real time
         #Dashboards - the interfaces that represent specific analyses .

#Problems - getting access to clean,high quality data remains difficult for some companies.

#Current Trends
    #In memory Processing - those systems utilize RAM memory - instead of hard drives to execute
     queries.This increases application performance
    #Usability and Visualization


Resources - https://www.youtube.com/watch?v=jkCCnwvO_fg

The AI Driven Software Developer, Optimize Innovate Transform

  The AI-Driven Software Developer: Optimize, Innovate, Transform": AI Transformation in Software Development : Understand how AI is re...