/*
 * Copyright (c) 2001-2004 Caucho Technology, Inc.  All rights reserved.
 *
 * The Apache Software License, Version 1.1
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:
 *       "This product includes software developed by the
 *        Caucho Technology (http://www.caucho.com/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
 *    endorse or promote products derived from this software without prior
 *    written permission. For written permission, please contact
 *    info@caucho.com.
 *
 * 5. Products derived from this software may not be called "Resin"
 *    nor may "Resin" appear in their names without prior written
 *    permission of Caucho Technology.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @author Scott Ferguson
 */

package com.alibaba.com.caucho.hessian.io;

import java.io.IOException;
import java.util.Date;

/**
 * Serializing an object for known object types.
 */
public class BasicSerializer extends AbstractSerializer {
    public static final int NULL = 0;
    public static final int BOOLEAN = NULL + 1;
    public static final int BYTE = BOOLEAN + 1;
    public static final int SHORT = BYTE + 1;
    public static final int INTEGER = SHORT + 1;
    public static final int LONG = INTEGER + 1;
    public static final int FLOAT = LONG + 1;
    public static final int DOUBLE = FLOAT + 1;
    public static final int CHARACTER = DOUBLE + 1;
    public static final int CHARACTER_OBJECT = CHARACTER + 1;
    public static final int STRING = CHARACTER_OBJECT + 1;
    public static final int DATE = STRING + 1;
    public static final int NUMBER = DATE + 1;
    public static final int OBJECT = NUMBER + 1;

    public static final int BOOLEAN_ARRAY = OBJECT + 1;
    public static final int BYTE_ARRAY = BOOLEAN_ARRAY + 1;
    public static final int SHORT_ARRAY = BYTE_ARRAY + 1;
    public static final int INTEGER_ARRAY = SHORT_ARRAY + 1;
    public static final int LONG_ARRAY = INTEGER_ARRAY + 1;
    public static final int FLOAT_ARRAY = LONG_ARRAY + 1;
    public static final int DOUBLE_ARRAY = FLOAT_ARRAY + 1;
    public static final int CHARACTER_ARRAY = DOUBLE_ARRAY + 1;
    public static final int STRING_ARRAY = CHARACTER_ARRAY + 1;
    public static final int OBJECT_ARRAY = STRING_ARRAY + 1;

    private int code;

    public BasicSerializer(int code) {
        this.code = code;
    }

    @Override
    public void writeObject(Object obj, AbstractHessianOutput out)
            throws IOException {
        switch (code) {
            case BOOLEAN:
                out.writeBoolean(((Boolean) obj).booleanValue());
                break;

            case BYTE:
            case SHORT:
            case INTEGER:
                out.writeInt(((Number) obj).intValue());
                break;

            case LONG:
                out.writeLong(((Number) obj).longValue());
                break;

            case FLOAT:
                out.writeDouble(Double.parseDouble(String.valueOf(((Number) obj).floatValue())));
                break;
            case DOUBLE:
                out.writeDouble(((Number) obj).doubleValue());
                break;

            case CHARACTER:
            case CHARACTER_OBJECT:
                out.writeString(String.valueOf(obj));
                break;

            case STRING:
                out.writeString((String) obj);
                break;

            case DATE:
                out.writeUTCDate(((Date) obj).getTime());
                break;

            case BOOLEAN_ARRAY: {
                if (out.addRef(obj))
                    return;

                boolean[] data = (boolean[]) obj;
                boolean hasEnd = out.writeListBegin(data.length, "[boolean");
                for (int i = 0; i < data.length; i++)
                    out.writeBoolean(data[i]);

                if (hasEnd)
                    out.writeListEnd();

                break;
            }

            case BYTE_ARRAY: {
                byte[] data = (byte[]) obj;
                out.writeBytes(data, 0, data.length);
                break;
            }

            case SHORT_ARRAY: {
                if (out.addRef(obj))
                    return;

                short[] data = (short[]) obj;
                boolean hasEnd = out.writeListBegin(data.length, "[short");

                for (int i = 0; i < data.length; i++)
                    out.writeInt(data[i]);

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case INTEGER_ARRAY: {
                if (out.addRef(obj))
                    return;

                int[] data = (int[]) obj;

                boolean hasEnd = out.writeListBegin(data.length, "[int");

                for (int i = 0; i < data.length; i++)
                    out.writeInt(data[i]);

                if (hasEnd)
                    out.writeListEnd();

                break;
            }

            case LONG_ARRAY: {
                if (out.addRef(obj))
                    return;

                long[] data = (long[]) obj;

                boolean hasEnd = out.writeListBegin(data.length, "[long");

                for (int i = 0; i < data.length; i++)
                    out.writeLong(data[i]);

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case FLOAT_ARRAY: {
                if (out.addRef(obj))
                    return;

                float[] data = (float[]) obj;

                boolean hasEnd = out.writeListBegin(data.length, "[float");

                for (int i = 0; i < data.length; i++)
                    out.writeDouble(data[i]);

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case DOUBLE_ARRAY: {
                if (out.addRef(obj))
                    return;

                double[] data = (double[]) obj;
                boolean hasEnd = out.writeListBegin(data.length, "[double");

                for (int i = 0; i < data.length; i++)
                    out.writeDouble(data[i]);

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case STRING_ARRAY: {
                if (out.addRef(obj))
                    return;

                String[] data = (String[]) obj;

                boolean hasEnd = out.writeListBegin(data.length, "[string");

                for (int i = 0; i < data.length; i++) {
                    out.writeString(data[i]);
                }

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case CHARACTER_ARRAY: {
                char[] data = (char[]) obj;
                out.writeString(data, 0, data.length);
                break;
            }

            case OBJECT_ARRAY: {
                if (out.addRef(obj))
                    return;

                Object[] data = (Object[]) obj;

                boolean hasEnd = out.writeListBegin(data.length, "[object");

                for (int i = 0; i < data.length; i++) {
                    out.writeObject(data[i]);
                }

                if (hasEnd)
                    out.writeListEnd();
                break;
            }

            case NULL:
                out.writeNull();
                break;

            default:
                throw new RuntimeException(code + " " + String.valueOf(obj.getClass()));
        }
    }
}
