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" + ", 0);
"n" + 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" +
"
"
"
"
mg.setXML("n" +
"n" +
"n" +
"n" +
"n" + ",0);
"n" + n" +
"
"
} 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" + ", 0);
"n" + 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" +
"
"
"
"
mg.setXML("n" +
"n" +
"n" +
"n" +
"n" + ",0);
"n" + n" +
"
"
} 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