import javax.servlet.*;
import javax.servlet.http.*;
import javax.swing.*;
import jas.hist.*;
import java.io.*;
import java.util.StringTokenizer;

/**
 * Builds a histogram that takes its data from a Query String
 * The query string should be of the form:
 *     ?title=Title&min=0&max=10&data=1,2,3,4,5,6,7,8,9,10
 */
public class QueryHistogram extends SwingServlet
{
	protected JComponent createComponent(HttpServletRequest req)
	{
		JASHist plot = new JASHist();
		String title = req.getParameter("title");
		plot.setTitle(title!=null ? title : "Query Histogram");
		plot.addData(new QueryDataSource(req)).show(true);
		return plot;
	}
	private class QueryDataSource implements Rebinnable1DHistogramData, HasStyle
	{
		QueryDataSource(HttpServletRequest req)
		{
			title = req.getParameter("title");
			if (title == null) title = "Query Histogram";
			min = Double.valueOf(req.getParameter("min")).doubleValue();
			max = Double.valueOf(req.getParameter("max")).doubleValue();
			StringTokenizer tokens = new StringTokenizer(req.getParameter("data"),",");
			data = new double[tokens.countTokens()];
			for (int i=0; i<data.length; i++) 
				data[i] = Double.valueOf(tokens.nextToken()).doubleValue();

			myStyle = new JASHist1DHistogramStyle();
			myStyle.setShowErrorBars(false);
		}		
		public double getMin() { return min; }
		public double getMax() { return max; }
		public double[][] rebin(int p1, double p2, double p3, boolean p4, boolean p5)
		{
			double[][] result = { data };
			return result;
		}

		public String[] getAxisLabels() { return null; }
		public boolean isRebinnable() { return false; }
		public int getBins() { return data.length; }
		public int getAxisType() { return DOUBLE; }
		public String getTitle() { return title; }
		public JASHistStyle getStyle()	{ return myStyle; }
		
		private String title;
		private double min, max;
		private double[] data;
		private JASHist1DHistogramStyle myStyle;
	}
}
