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

Tuesday, October 24, 2017

Tech Meaning - Words

  • Cohesion -  the action or fact of forming a united whole.
  • Facade -  is a collection of helper methods whose purpose is to hide a library or group of libraries from the application (a facade to a building hides the ugly bits behind it)
  • PAAS - Platform as a service 
  • POJOs -Plain Old Java Objects 
  • REST  - Representational state transfer 
  • SSL (Secure Sockets Layer) -  the standard security technology for establishing an encrypted link between a web server and a browser. This link ensures that all data passed between the web server and browsers remain private and integral. 
  • .m2  Folder
    The maven local repository is a local folder that is used to store all your project’s dependencies (plugin jars and other files which are downloaded by Maven). In simple, when you build a Maven project, all dependency files will be stored in your Maven local repository.
    By default, Maven local repository is default to .m2 folder :
  • Unix/Mac OS X – ~/.m2
  • Windows – C:\Documents and Settings\{your-username}\.m2
  •  TDD - Test Driven Development 
               is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case   that     defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards.
The following sequence of steps is generally followed:                                                               1. Add a test             2. Run all tests and see if the new one fails                    
                    3.Write some code   4. Run tests                   
                    5.Refactor code        6. Repeat
  • Stand-alone program -  is a computer program that does not load any external module, library function or program and that is designed to boot with the bootstrap procedure of the target processor – it runs on bare metal.
  • Bootstrapping - In general,  usually refers to a self-starting process that is supposed to proceed without external input. 
  • JAR  -   (Java Archive) is a package file format typically used to aggregate many Java class files and associated metadata and resources (text, images, etc.) into one file for distribution 
  • Stateless Applications
    A stateless app is an application program that does not save client data generated in one session for use in the next session with that client. ... In contrast, a stateful application saves data about each client session and uses that data the next time the client makes a request.
     

Wednesday, October 11, 2017

Command Line -Commands

  • The "cd" command changes the directory, but not what drive you are working with. So when you go "cd d:\temp", you are changing the D drive's directory to temp, but staying in the C drive.
      Execute these two commands:
   D:
   cd temp
     That will get you the results you want.
  • To terminate any running process , type  Ctrl + C

Some interesting things to explore more

 Here  some  some  things  to  study  more ,     How Google Search works               https://developers.google.com/search/docs/fundamental...