Dessiner simplement des graphiques avec Oracle BI Graph

Avec les BI*Beans, Oracle offre un ensemble de graphiques utilisables très simplement : Il s’agit d’Oracle BI Graph. Avec Jdeveloper 10.1.3 et la classe oracle.dss.graph.Graph on peut générer simplement un fichier PNG depuis une servlet « getGraph » mappée à « getgraph ». Le code de la servlet est disponible ci-dessous…

package demo.bibeans;

import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.dss.graph.Graph;

public class getGraph extends HttpServlet {
private static final String CONTENT_TYPE = "image/png";

public void init(ServletConfig config) throws ServletException {
super.init(config);
}

public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
OutputStream os = response.getOutputStream();
Graph mg = new Graph();
try {
mg.setXML(" n" +
" n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
" n" +
" n" +
" 100 n" +
" 500 n" +
" 300 n" +
"
n" +
" n" +
" 300 n" +
" 280 n" +
" 380 n" +
"
n" +
"
n" +
"
n" +
"
", 0);
mg.setXML("n" +
" n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
"
",0);
} catch (Exception e) {
// TODO
}
mg.exportToPNG(os);
os.close();
}
}


Pour permettre d’effectuer des drill-down depuis le graphique vers des URL, il suffit de générer une « imagemap » grâce au Graph qui permet de récupérer les polygones correspondant aux données. La servlet « showGraph » mappée sur « showgraph »; cette servlet fait appel à l’image générée dans la servlet précédente « getgraph » :

package demo.bibeans;

import java.awt.Polygon;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.dss.dataView.ComponentHandle;
import oracle.dss.dataView.DataComponentHandle;
import oracle.dss.graph.Graph;
import oracle.dss.graph.ImagemapComponent;

public class showGraph extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=windows-1252";

public void init(ServletConfig config) throws ServletException {
super.init(config);
}

public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<"+"html>");
out.println("<"+"head><"+"title>showGraph");
out.println("<"+"body>");
out.println("

The servlet has received a GET. This is the reply.

");

Graph mg = new Graph();
try {
mg.setXML(" n" +
" n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
" n" +
" n" +
" 100 n" +
" 500 n" +
" 300 n" +
"
n" +
" n" +
" 300 n" +
" 280 n" +
" 380 n" +
"
n" +
"
n" +
"
n" +
"
", 0);
mg.setXML("n" +
" n" +
" n" +
" n" +
" n" +
" n" +
"
n" +
"
",0);
} catch (Exception e) {
// TODO
}

out.println( "<"+"IMG SRC="getgraph" USEMAP="#ELEMENTS" BORDER=NONE>" );
out.println( "<"+"MAP NAME="ELEMENTS" >" );
//get ImagemapComponents for data components and for the legend
Enumeration map = mg.getImagemapEnumeration( Graph.MAP_DATA );
while( map.hasMoreElements() ){
ImagemapComponent comp = (ImagemapComponent)map.nextElement();
Polygon poly = comp.getPlacement();
ComponentHandle handle = comp.getComponentHandle();
String tooltips[] = comp.getTooltips();
int rowSlice = -1;
int colSlice = -1;
if (handle instanceof DataComponentHandle){
rowSlice = ((DataComponentHandle)handle).getRow();
colSlice = ((DataComponentHandle)handle).getColumn();
}
//Status line will display a component name on click
out.print( "<"+"AREA onclick="window.status='" ); out.print( handle.getName() ); out.print( "';return false;" SHAPE="POLY" COORDS="" ); for( int i=0; i < href="" row=" + Integer.toString(rowSlice) +" col="+ Integer.toString(colSlice) +" alt= " " i="0;" if="" print="" i="" println="">" );
}
out.println( "" );

out.println("");
out.close();
}
}


Le résultat de la servlet lancé depuis JDeveloper est celui-ci :

Quelques remarques

  • Les bibliothèques utilisées sont Oracle BI Graph, Oracle JEWT et Oracle XML Parser v2
  • Il est possible avec un Javascript de recharger les graphiques toutes les n secondes afin permettre le rafraîchissement. Ci-joint un exemple qui illustre le fait de rafraîchir automatiquement les images d’une page HTML