package test;

import java.io.*;
import java.util.Random;

import org.codehaus.jackson.*;

public class GenerateDoubleDoc
{
    final static int AVG_ARRAY_LEN = 32;

    private GenerateDoubleDoc() { }

    private void generate(OutputStream out, int kbSize)
        throws IOException
    {
        int bsize = kbSize * 1000;

        // Let's first buffer in memory, to know exact length
        ByteArrayOutputStream bos = new ByteArrayOutputStream(bsize + 500);
        Random r = new Random(kbSize);
        JsonGenerator gen = new JsonFactory().createJsonGenerator(bos, JsonFactory.Encoding.UTF8);
        gen.writeStartArray(); // outermost array
        gen.writeStartArray(); // inner array

        do {
            // First, do we close current, start new array?
            if (r.nextInt(AVG_ARRAY_LEN) == 3) { // to get average array length of 16
                gen.writeEndArray();
                if (r.nextBoolean()) {
                    gen.writeRaw("\n");
                }
                gen.writeStartArray();
                gen.flush();
            }
            // Then need to calculate number to output
            float f;

            do {
                f = Float.intBitsToFloat(r.nextInt());
            } while (Double.isNaN(f) || Double.isInfinite(f));
            gen.writeNumber(f);
        } while (bos.size() < bsize);

        gen.writeEndArray();
        gen.writeEndArray();
        gen.writeRaw("\n");
        gen.close();

        bos.writeTo(out);
    }

    public static void main(String[] args)
        throws Exception
    {
        if (args.length != 1) {
            System.err.println("Usage: java test.GenerateDoubleDoc <size-in-kbytes>");
            System.exit(1);
        }
        new GenerateDoubleDoc().generate(System.out, Integer.parseInt(args[0]));
        System.out.flush();
    }
}

