protected void writeListAsTypedVector()

in core/src/main/java/flex/messaging/io/amf/Amf3Output.java [417:514]


    protected void writeListAsTypedVector(List list) throws IOException {
        // Peek at the first three elements of the list to figure out what type
        // of Vector it should be sent as.
        int vecType = -1;
        Class<?> initialElementClass = null;
        int peekSize = Math.min(list.size(), 3);
        for (int i = 0; i < peekSize; i++) {
            Object element = list.get(i);
            if (i == 0) {
                initialElementClass = element != null ? element.getClass() : null;
            } else {
                Class<?> currentElementClass = element != null ? element.getClass() : null;
                if (initialElementClass != currentElementClass) {
                    vecType = kTypedVectorObject;
                    break;
                }
            }
        }

        if (vecType == -1) {
            if (initialElementClass == Integer.class)
                vecType = kTypedVectorInt;
            else if (initialElementClass == Double.class)
                vecType = kTypedVectorDouble;
            else
                vecType = kTypedVectorObject;

        }

        out.write(vecType);

        if (byReference(list))
            return;

        int length = list.size();
        writeUInt29((length << 1) | 1);
        writeBoolean(false /*fixed*/);

        switch (vecType) {
            case kTypedVectorInt:
                if (isDebug)
                    trace.startAMFVector(objectTable.size() - 1, VectorType.INT);

                for (int i = 0; i < length; i++) {
                    if (isDebug)
                        trace.arrayElement(i);

                    Object element = list.get(i);
                    int value = ((Integer) element).intValue();

                    if (isDebug)
                        trace.write(value);

                    writeInt(value);
                }
                break;
            case kTypedVectorDouble:
                if (isDebug)
                    trace.startAMFVector(objectTable.size() - 1, VectorType.DOUBLE);

                for (int i = 0; i < length; i++) {
                    if (isDebug)
                        trace.arrayElement(i);

                    Object element = list.get(i);
                    double value = ((Double) element).doubleValue();

                    if (isDebug)
                        trace.write(value);

                    writeDouble(value);
                }
                break;
            case kTypedVectorObject:
                if (isDebug)
                    trace.startAMFVector(objectTable.size() - 1, VectorType.OBJECT);

                // TODO - I don't think this className is used properly on the client currently.
                String className = initialElementClass != null ? initialElementClass.getName() : "";
                writeStringWithoutType(className);

                for (int i = 0; i < length; i++) {
                    if (isDebug)
                        trace.arrayElement(i);

                    Object element = list.get(i);
                    increaseNestObjectLevel();
                    writeObject(element);
                    decreaseNestObjectLevel();
                }
                break;
            default:
                break;
        }

        if (isDebug)
            trace.endAMFVector();
    }