/** Two objects that are equal are required to return the same hashCode. */
 public void testHashcode() {
   XYLine3DRenderer r1 = new XYLine3DRenderer();
   XYLine3DRenderer r2 = new XYLine3DRenderer();
   assertTrue(r1.equals(r2));
   int h1 = r1.hashCode();
   int h2 = r2.hashCode();
   assertEquals(h1, h2);
 }
  /** Serialize an instance, restore it, and check for equality. */
  public void testSerialization() {

    XYLine3DRenderer r1 = new XYLine3DRenderer();
    r1.setWallPaint(new GradientPaint(1.0f, 2.0f, Color.red, 3.0f, 4.0f, Color.blue));
    XYLine3DRenderer r2 = null;

    try {
      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
      ObjectOutput out = new ObjectOutputStream(buffer);
      out.writeObject(r1);
      out.close();

      ObjectInput in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray()));
      r2 = (XYLine3DRenderer) in.readObject();
      in.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
    assertEquals(r1, r2);
  }
 /** Confirm that cloning works. */
 public void testCloning() {
   XYLine3DRenderer r1 = new XYLine3DRenderer();
   r1.setWallPaint(new GradientPaint(1.0f, 2.0f, Color.red, 3.0f, 4.0f, Color.blue));
   XYLine3DRenderer r2 = null;
   try {
     r2 = (XYLine3DRenderer) r1.clone();
   } catch (CloneNotSupportedException e) {
     e.printStackTrace();
   }
   assertTrue(r1 != r2);
   assertTrue(r1.getClass() == r2.getClass());
   assertTrue(r1.equals(r2));
 }
  @Override
  protected ModelAndView handleRequestInternal(
      HttpServletRequest request, HttpServletResponse response) throws Exception {

    final int seriesMaxCount = 9; // the max number of series

    // get Series Color from the request
    int[] seriesColor = new int[seriesMaxCount];
    seriesColor[0] = Utils.toIntHex(request.getParameter("s1c"), 0x9bd2fb);
    seriesColor[1] = Utils.toIntHex(request.getParameter("s2c"), 0xFF0606);
    for (int i = 2; i < seriesMaxCount; i++) {
      seriesColor[i] = Utils.toIntHex(request.getParameter("s" + (i + 1) + "c"), -1);
    }

    // get Series Outline Color from the request
    int[] seriesOutlineColor = new int[seriesMaxCount];
    seriesOutlineColor[0] = Utils.toIntHex(request.getParameter("s1o"), 0x0665aa);
    seriesOutlineColor[1] = Utils.toIntHex(request.getParameter("s2o"), 0x9d0000);
    for (int i = 2; i < seriesMaxCount; i++) {
      seriesOutlineColor[i] = Utils.toIntHex(request.getParameter("s" + (i + 1) + "o"), -1);
    }

    // background color
    int backgroundColor = Utils.toIntHex(request.getParameter("bc"), 0xFFFFFF);

    // grid color
    int gridColor = Utils.toIntHex(request.getParameter("gc"), 0);

    // X axis title
    String labelX = ServletRequestUtils.getStringParameter(request, "xl", "");

    // Y axis title
    String labelY = ServletRequestUtils.getStringParameter(request, "yl", "");

    // image width
    int width = ServletRequestUtils.getIntParameter(request, "xz", 800);

    // image height
    int height = ServletRequestUtils.getIntParameter(request, "yz", 400);

    // show legend?
    boolean showLegend = ServletRequestUtils.getBooleanParameter(request, "l", true);

    // Series provider
    String provider = ServletRequestUtils.getStringParameter(request, "p", null);

    // Chart type
    String chartType = ServletRequestUtils.getStringParameter(request, "ct", "area");

    DefaultTableXYDataset ds = new DefaultTableXYDataset();

    if (provider != null) {
      Object series = getApplicationContext().getBean(provider);
      if (series instanceof SeriesProvider) {
        ((SeriesProvider) series).populate(ds, statsCollection, request);
      } else {
        logger.error(
            "SeriesProvider \"" + provider + "\" does not implement " + SeriesProvider.class);
      }
    }

    // Build series data from the give statistic
    JFreeChart chart = null;
    if ("area".equals(chartType)) {
      chart =
          ChartFactory.createXYAreaChart(
              "", labelX, labelY, ds, PlotOrientation.VERTICAL, showLegend, false, false);

      ((XYAreaRenderer) chart.getXYPlot().getRenderer()).setOutline(true);

    } else if ("stacked".equals(chartType)) {
      chart =
          ChartFactory.createStackedXYAreaChart(
              "", labelX, labelY, ds, PlotOrientation.VERTICAL, showLegend, false, false);

    } else if ("line".equals(chartType)) {
      chart =
          ChartFactory.createXYLineChart(
              "", labelX, labelY, ds, PlotOrientation.VERTICAL, showLegend, false, false);

      final XYLine3DRenderer renderer = new XYLine3DRenderer();
      renderer.setDrawOutlines(true);
      renderer.setLinesVisible(true);
      renderer.setShapesVisible(true);
      renderer.setStroke(new BasicStroke(2));
      renderer.setXOffset(1);
      renderer.setYOffset(1);
      chart.getXYPlot().setRenderer(renderer);
    }

    if (chart != null) {
      chart.setAntiAlias(true);
      chart.setBackgroundPaint(new Color(backgroundColor));
      for (int i = 0; i < seriesMaxCount; i++) {
        if (seriesColor[i] >= 0) {
          chart.getXYPlot().getRenderer().setSeriesPaint(i, new Color(seriesColor[i]));
        }
        if (seriesOutlineColor[i] >= 0) {
          chart
              .getXYPlot()
              .getRenderer()
              .setSeriesOutlinePaint(i, new Color(seriesOutlineColor[i]));
        }
      }
      chart.getXYPlot().setDomainGridlinePaint(new Color(gridColor));
      chart.getXYPlot().setRangeGridlinePaint(new Color(gridColor));
      chart.getXYPlot().setDomainAxis(0, new DateAxis());
      chart.getXYPlot().setDomainAxis(1, new DateAxis());
      chart.getXYPlot().setInsets(new RectangleInsets(-15, 0, 0, 10));

      response.setHeader("Content-type", "image/png");
      response
          .getOutputStream()
          .write(ChartUtilities.encodeAsPNG(chart.createBufferedImage(width, height)));
    }

    return null;
  }
  /** Check that the equals() method distinguishes all fields. */
  public void testEquals() {
    XYLine3DRenderer r1 = new XYLine3DRenderer();
    XYLine3DRenderer r2 = new XYLine3DRenderer();
    assertEquals(r1, r2);

    r1.setXOffset(11.1);
    assertFalse(r1.equals(r2));
    r2.setXOffset(11.1);
    assertTrue(r1.equals(r2));

    r1.setYOffset(11.1);
    assertFalse(r1.equals(r2));
    r2.setYOffset(11.1);
    assertTrue(r1.equals(r2));

    r1.setWallPaint(new GradientPaint(1.0f, 2.0f, Color.red, 3.0f, 4.0f, Color.blue));
    assertFalse(r1.equals(r2));
    r2.setWallPaint(new GradientPaint(1.0f, 2.0f, Color.red, 3.0f, 4.0f, Color.blue));
    assertTrue(r1.equals(r2));
  }