public Object readList()

in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java [273:515]


    public Object readList(AbstractHessianInput in, int length)
            throws IOException {
        switch (_code) {
            case BOOLEAN_ARRAY: {
                if (length >= 0) {
                    boolean[] data = new boolean[length];

                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readBoolean();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(Boolean.valueOf(in.readBoolean()));

                    in.readEnd();

                    boolean[] data = new boolean[list.size()];

                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Boolean) list.get(i)).booleanValue();

                    return data;
                }
            }

            case SHORT_ARRAY: {
                if (length >= 0) {
                    short[] data = new short[length];

                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = (short) in.readInt();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(Short.valueOf((short) in.readInt()));

                    in.readEnd();

                    short[] data = new short[list.size()];
                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Short) list.get(i)).shortValue();

                    in.addRef(data);

                    return data;
                }
            }

            case INTEGER_ARRAY: {
                if (length >= 0) {
                    int[] data = new int[length];

                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readInt();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(Integer.valueOf(in.readInt()));


                    in.readEnd();

                    int[] data = new int[list.size()];
                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Integer) list.get(i)).intValue();

                    in.addRef(data);

                    return data;
                }
            }

            case LONG_ARRAY: {
                if (length >= 0) {
                    long[] data = new long[length];

                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readLong();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(Long.valueOf(in.readLong()));

                    in.readEnd();

                    long[] data = new long[list.size()];
                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Long) list.get(i)).longValue();

                    in.addRef(data);

                    return data;
                }
            }

            case FLOAT_ARRAY: {
                if (length >= 0) {
                    float[] data = new float[length];
                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = (float) in.readDouble();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(new Float(in.readDouble()));

                    in.readEnd();

                    float[] data = new float[list.size()];
                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Float) list.get(i)).floatValue();

                    in.addRef(data);

                    return data;
                }
            }

            case DOUBLE_ARRAY: {
                if (length >= 0) {
                    double[] data = new double[length];
                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readDouble();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(new Double(in.readDouble()));

                    in.readEnd();

                    double[] data = new double[list.size()];
                    in.addRef(data);
                    for (int i = 0; i < data.length; i++)
                        data[i] = ((Double) list.get(i)).doubleValue();

                    return data;
                }
            }

            case STRING_ARRAY: {
                if (length >= 0) {
                    String[] data = new String[length];
                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readString();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    while (!in.isEnd())
                        list.add(in.readString());

                    in.readEnd();

                    String[] data = new String[list.size()];
                    in.addRef(data);
                    for (int i = 0; i < data.length; i++)
                        data[i] = (String) list.get(i);

                    return data;
                }
            }

            case OBJECT_ARRAY: {
                if (length >= 0) {
                    Object[] data = new Object[length];
                    in.addRef(data);

                    for (int i = 0; i < data.length; i++)
                        data[i] = in.readObject();

                    in.readEnd();

                    return data;
                } else {
                    ArrayList list = new ArrayList();

                    in.addRef(list); // XXX: potential issues here

                    while (!in.isEnd())
                        list.add(in.readObject());

                    in.readEnd();

                    Object[] data = new Object[list.size()];
                    for (int i = 0; i < data.length; i++)
                        data[i] = (Object) list.get(i);

                    return data;
                }
            }

            default:
                throw new UnsupportedOperationException(String.valueOf(this));
        }
    }