I broke my code up into three sections, the main method run by the servlet, a method to generate the dataset from results from a database, and a method generate the chart from the dataset. The final image is being generated OK, just not the image map.
EDIT: I forgot to say, my goal is to create a horizontal bar chart, with a single bar for every "track" I have. There are no categories, and I use DefaultKeyedValues because that is the only one I could find that does a sortByValues method. I want a person to be able to click on any of the bars, and to be re-directed to a page with additional details on that "track". The image is being generated fine, just no image map to handle the redirecting.
Code: Select all
public class ThreatAsmnt extends HttpServlet {
private int spacer;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a chart
CategoryDataset dataset = createDatasets();
JFreeChart chart = createChart(dataset);
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
// Stores imagemap html for JSP, and stores chart information for image generation
String imageMap = ImageMapUtilities.getImageMap("imageMap", info);
HttpSession session = request.getSession();
session.setAttribute("chart", chart);
session.setAttribute("chartInfo", info);
session.setAttribute("chartSize", new Integer(120 + spacer));
request.setAttribute("imageMap", imageMap);
RequestDispatcher dispatcher = request.getRequestDispatcher("threatAssess.jsp");
dispatcher.forward(request, response);
}
/** Receives tracks from the TrackInfoBean and generically process them
* to assign some sort of risk analysis for demonstration.
* @returns CategoryDataset
*/
private CategoryDataset createDatasets() {
TrackInfoLocal trackInfoBean = new TrackInfoBean();
StoredResultSet r = trackInfoBean.getTracksAllDetails();
Random generator = new Random();
Long key;
String ident = "";
DefaultKeyedValues data = new DefaultKeyedValues();
spacer = 0;
while(r.next()) {
key = r.getLong("T_IMONUMBER");
if(!r.wasNull()) {
spacer += 13;
ident = r.getString("T_IDENTITY");
if(ident.equals("UNKNOWN")) {
data.addValue(key.toString(), generator.nextInt(349) + 500);
}
else if(ident.equals("NEUTRAL")) {
data.addValue(key.toString(), generator.nextInt(499));
}
else if(ident.equals("FRIEND")) {
data.addValue(key.toString(), generator.nextInt(499));
}
else if(ident.equals("HOSTILE")) {
data.addValue(key.toString(), generator.nextInt(150) + 850);
}
else if(ident.equals("PENDING")) {
data.addValue(key.toString(), generator.nextInt(349) + 500);
}
else if(ident.equals("SUSPECT")) {
data.addValue(key.toString(), generator.nextInt(150) + 850);
}
else {
data.addValue(key.toString(), generator.nextInt(349) + 500);
}
}
}
data.sortByValues(SortOrder.DESCENDING);
CategoryDataset dataset = DatasetUtilities.createCategoryDataset("Tracks", data);
return dataset;
}
/** Creates a horizontal bar chart from a dataset.
* @params dataset CategoryDataset to generate chart from
* @returns JFreeChart
*/
private JFreeChart createChart(CategoryDataset dataset) {
// create the chart...
JFreeChart chart = ChartFactory.createBarChart(
"Risk Assessment", // chart title
"IMO#", // domain axis label
"Risk", // range axis label
dataset, // data
PlotOrientation.HORIZONTAL,
false, // legend?
true, // tooltips?
false // url's?
);
CustomBarRenderer renderer = new CustomBarRenderer();
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());
renderer.setItemURLGenerator(new StandardCategoryURLGenerator("TrackDetails"));
CategoryPlot plot = chart.getCategoryPlot();
plot.setRenderer(renderer);
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLowerMargin(0.01);
domainAxis.setUpperMargin(0.01);
return chart;
}