protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // From AxisChartServlet.java:init() LegendProperties legendProperties = new LegendProperties(); ChartProperties chartProperties = new ChartProperties(); AxisProperties axisProperties = new AxisProperties(false); ChartFont axisScaleFont = new ChartFont(new Font("Georgia Negreta cursiva", Font.PLAIN, 13), Color.black); axisProperties.getXAxisProperties().setScaleChartFont(axisScaleFont); axisProperties.getYAxisProperties().setScaleChartFont(axisScaleFont); ChartFont axisTitleFont = new ChartFont(new Font("Arial Narrow", Font.PLAIN, 14), Color.black); axisProperties.getXAxisProperties().setTitleChartFont(axisTitleFont); axisProperties.getYAxisProperties().setTitleChartFont(axisTitleFont); Stroke[] strokes = { LineChartProperties.DEFAULT_LINE_STROKE, LineChartProperties.DEFAULT_LINE_STROKE, LineChartProperties.DEFAULT_LINE_STROKE }; Shape[] shapes = { PointChartProperties.SHAPE_TRIANGLE, PointChartProperties.SHAPE_DIAMOND, PointChartProperties.SHAPE_CIRCLE }; LineChartProperties lineChartProperties = new LineChartProperties(strokes, shapes); String[] xAxisLabels = {"1998", "1999", "2000", "2001", "2002", "2003", "2004"}; String xAxisTitle = "Years"; String yAxisTitle = "Problems"; String title = "Micro$oft At Work"; DataSeries dataSeries = new DataSeries(xAxisLabels, xAxisTitle, yAxisTitle, title); // From AxisChartServlet.java:createAxisChartDataSet double[][] data = TestDataGenerator.getRandomNumbers(3, 7, 200, 500); String[] legendLabels = {"Bugs", "Security Holes", "Backdoors"}; Paint[] paints = TestDataGenerator.getRandomPaints(3); AxisChartDataSet acds = new AxisChartDataSet(data, legendLabels, paints, ChartType.LINE, lineChartProperties); dataSeries.addIAxisPlotDataSet(acds); AxisChart axisChart = new AxisChart(dataSeries, chartProperties, axisProperties, legendProperties, 550, 360); ServletEncoderHelper.encodeJPEG13(axisChart, 1.0f, response); } catch (Exception e) { System.out.println(e); } }
private String generateAreaChart(HttpServletRequest request, Statement s) throws ChartDataException { boolean restrictTime = false; boolean minScale = false; boolean halfHourScale = false; boolean dayScale = false; short startYear = 0; short startMonth = 0; short startDay = 0; short startHour = 0; short startMin = 0; short endYear = 0; short endMonth = 0; short endDay = 0; short endHour = 0; short endMin = 0; short numDataPoints = 0; int bytesDivisor = 1; int port = 0; long start = 0, end = 0; long unit = 0; double[][] data; String title; String output = ""; String[] legendLabels; Paint[] paints = null; ResultSet result = null; NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMinimumIntegerDigits(2); // ****************set some chart attributes***************** AreaChartProperties areaChartProperties = new AreaChartProperties(); LegendProperties legendProperties = new LegendProperties(); AxisProperties axisProperties = new AxisProperties(false); axisProperties.setXAxisLabelsAreVertical(true); ChartFont axisScaleFont = new ChartFont(new Font("Georgia Negreta cursiva", Font.PLAIN, 13), Color.black); LabelAxisProperties xAxisProperties = (LabelAxisProperties) axisProperties.getXAxisProperties(); xAxisProperties.setScaleChartFont(axisScaleFont); LabelAxisProperties yAxisProperties = (LabelAxisProperties) axisProperties.getYAxisProperties(); yAxisProperties.setScaleChartFont(axisScaleFont); ChartFont axisTitleFont = new ChartFont(new Font("Arial Narrow", Font.PLAIN, 14), Color.black); xAxisProperties.setTitleChartFont(axisTitleFont); yAxisProperties.setTitleChartFont(axisTitleFont); DataAxisProperties dataAxisProperties = (DataAxisProperties) yAxisProperties; dataAxisProperties.setNumItems(10); ChartFont titleFont = new ChartFont(new Font("Georgia Negreta cursiva", Font.PLAIN, 14), Color.black); ChartProperties chartProperties = new ChartProperties(); ; chartProperties.setTitleFont(titleFont); String xAxisTitle = "Time"; String yAxisTitle = ""; String outputUnit = request.getParameter("unit"); if (outputUnit.equalsIgnoreCase("bytes")) { yAxisTitle = "Bytes"; } else if (outputUnit.equalsIgnoreCase("kilo")) { yAxisTitle = "Kilobytes"; bytesDivisor = 1024; } else if (outputUnit.equalsIgnoreCase("mega")) { yAxisTitle = "Megabytes"; bytesDivisor = 1024 * 1024; } // ************************************************************ // check if time was restricted String[] checkValues = request.getParameterValues("checks"); for (int i = 0; i < checkValues.length; i++) { if (checkValues[i].equalsIgnoreCase("restrictTime")) { restrictTime = true; break; } } if (!restrictTime) { // generate a 24h chart Calendar cal = GregorianCalendar.getInstance(); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); end = cal.getTimeInMillis(); cal.add(Calendar.HOUR, -23); start = cal.getTimeInMillis(); title = "Traffic over the last 24 hours"; } else { startYear = Short.parseShort(request.getParameter("startYear")); startMonth = (short) (Short.parseShort(request.getParameter("startMonth")) - 1); startDay = Short.parseShort(request.getParameter("startDay")); startHour = Short.parseShort(request.getParameter("startHour")); startMin = Short.parseShort(request.getParameter("startMin")); endYear = Short.parseShort(request.getParameter("endYear")); endMonth = (short) (Short.parseShort(request.getParameter("endMonth")) - 1); endDay = Short.parseShort(request.getParameter("endDay")); endHour = Short.parseShort(request.getParameter("endHour")); endMin = Short.parseShort(request.getParameter("endMin")); Calendar startTime = new GregorianCalendar(); startTime.set(startYear, startMonth, startDay, startHour, startMin); startTime.set(Calendar.SECOND, 0); startTime.set(Calendar.MILLISECOND, 0); start = startTime.getTimeInMillis(); Calendar endTime = new GregorianCalendar(); endTime.set(endYear, endMonth, endDay, endHour, endMin); endTime.set(Calendar.SECOND, 0); endTime.set(Calendar.MILLISECOND, 0); end = endTime.getTimeInMillis(); title = "Traffic from " + startTime.getTime() + " to " + endTime.getTime(); } if (start > end) { return "End time is before start time."; } long duration = end - start; if (duration <= 12 * 60 * 60 * 1000l) { minScale = true; numDataPoints = (short) (duration / (60 * 1000l)); unit = 60 * 1000; // draw data every minute } else if (duration <= 2 * 24 * 60 * 60 * 1000l) { halfHourScale = true; numDataPoints = (short) (duration / (30 * 60 * 1000l)); unit = 30 * 60 * 1000; } else { dayScale = true; numDataPoints = (short) (duration / (24 * 60 * 60 * 1000l)); unit = 24 * 60 * 60 * 1000l; xAxisTitle = "Date"; } String[] xAxisLabels = new String[numDataPoints]; if (traffic) { data = new double[1][numDataPoints]; legendLabels = new String[] {"Overall Traffic"}; } else if (trafficSrc || trafficDst) { data = new double[6][numDataPoints]; legendLabels = new String[6]; } else { // at the moment just to have the variables initialized in any case data = new double[1][numDataPoints]; legendLabels = new String[] {"Overall Traffic"}; } long currXValue = start; Calendar tmpTime = new GregorianCalendar(); for (int i = 0; i < numDataPoints; i++) { try { if (traffic) { paints = new Paint[] {Color.blue}; String statement = "SELECT SUM(bytes) FROM trafficTmp WHERE firstSwitched BETWEEN " + currXValue / 1000 + " AND " + ((currXValue + unit) / 1000 - 1); result = s.executeQuery(statement); result.first(); data[0][i] = (double) result.getLong(1) / bytesDivisor; } else if (trafficSrc || trafficDst) { int[] favouriteServices = new int[5]; paints = new Paint[] { Color.blue, Color.red, Color.green, Color.yellow, Color.cyan, Color.gray }; // first find out which services were seen most often String statement = "SELECT port, SUM(bytes) as amount FROM trafficTmp WHERE port<1024" + " GROUP BY port ORDER BY amount DESC LIMIT 0,5"; result = s.executeQuery(statement); int position = 0; while (result.next()) { favouriteServices[position] = result.getInt(1); if (favouriteServices[position] == 0) legendLabels[position] = "Layer3-Traffic"; else legendLabels[position] = createPortOutput(favouriteServices[position], true); position++; } legendLabels[5] = "Other"; // now get all the traffic and sort amount of bytes into categories statement = "SELECT port, SUM(bytes) as amount FROM trafficTmp WHERE firstSwitched BETWEEN " + currXValue / 1000 + " AND " + ((currXValue + unit) / 1000 - 1) + " GROUP BY port"; result = s.executeQuery(statement); while (result.next()) { port = result.getInt(1); if (port == favouriteServices[0]) data[0][i] = (double) result.getLong(2) / bytesDivisor; else if (port == favouriteServices[1]) data[1][i] = (double) result.getLong(2) / bytesDivisor; else if (port == favouriteServices[2]) data[2][i] = (double) result.getLong(2) / bytesDivisor; else if (port == favouriteServices[3]) data[3][i] = (double) result.getLong(2) / bytesDivisor; else if (port == favouriteServices[4]) data[4][i] = (double) result.getLong(2) / bytesDivisor; else data[5][i] += (double) result.getLong(2) / bytesDivisor; } } else { // normally never reached paints = new Paint[] { Color.blue, Color.red, Color.green, Color.yellow, Color.cyan, Color.black }; } if (minScale) { // if((currXValue%(5*60*1000))==0) { tmpTime.setTimeInMillis(currXValue); xAxisLabels[i] = nf.format(tmpTime.get(Calendar.HOUR_OF_DAY)) + ":" + nf.format(tmpTime.get(Calendar.MINUTE)); // } else // xAxisLabels[i]= " "; } else if (halfHourScale) { // if((currXValue%(2*60*60*1000))==0) { tmpTime.setTimeInMillis(currXValue); xAxisLabels[i] = nf.format(tmpTime.get(Calendar.HOUR_OF_DAY)) + ":" + nf.format(tmpTime.get(Calendar.MINUTE)); // } else // xAxisLabels[i]= " "; } else if (dayScale) { // if((currXValue%(5*24*60*60*1000))==0) { tmpTime.setTimeInMillis(currXValue); xAxisLabels[i] = nf.format(tmpTime.get(Calendar.DATE)) + "." + nf.format(tmpTime.get(Calendar.MONTH) + 1); // } else // xAxisLabels[i]= " "; } currXValue += unit; } catch (SQLException e) { return "Error getting values from database:" + e.getMessage(); } } if (paints == null) { return "Paint array not initialized."; } IAxisDataSeries dataSeries = new DataSeries(xAxisLabels, xAxisTitle, yAxisTitle, title); try { if (traffic) dataSeries.addIAxisPlotDataSet( new AxisChartDataSet(data, legendLabels, paints, ChartType.AREA, areaChartProperties)); else if (trafficSrc || trafficDst) dataSeries.addIAxisPlotDataSet( new AxisChartDataSet( data, legendLabels, paints, ChartType.AREA_STACKED, areaChartProperties)); } catch (ChartDataException e) { output += e.getMessage(); throw new ChartDataException("Error generating pie."); } AxisChart axisChart = new AxisChart(dataSeries, chartProperties, axisProperties, legendProperties, width, height); request.getSession().getServletContext().setAttribute("chart", axisChart); return output; }