/*
 * 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.io.InputStream;
import java.io.Reader;
import java.util.List;

/**
 * Abstract base class for Hessian requests.  Hessian users should only
 * need to use the methods in this class.
 * <p>
 * <pre>
 * AbstractHessianInput in = ...; // get input
 * String value;
 *
 * in.startReply();         // read reply header
 * value = in.readString(); // read string value
 * in.completeReply();      // read reply footer
 * </pre>
 */
abstract public class AbstractHessianInput {
    private HessianRemoteResolver resolver;

    /**
     * Initialize the Hessian stream with the underlying input stream.
     */
    public void init(InputStream is) {
    }

    /**
     * Returns the call's method
     */
    abstract public String getMethod();

    /**
     * Sets the resolver used to lookup remote objects.
     */
    public HessianRemoteResolver getRemoteResolver() {
        return resolver;
    }

    /**
     * Sets the resolver used to lookup remote objects.
     */
    public void setRemoteResolver(HessianRemoteResolver resolver) {
        this.resolver = resolver;
    }

    /**
     * Sets the serializer factory.
     */
    public void setSerializerFactory(SerializerFactory ser) {
    }

    /**
     * Reads the call
     * <p>
     * <pre>
     * c major minor
     * </pre>
     */
    abstract public int readCall()
            throws IOException;

    /**
     * For backward compatibility with HessianSkeleton
     */
    public void skipOptionalCall()
            throws IOException {
    }

    /**
     * Reads a header, returning null if there are no headers.
     * <p>
     * <pre>
     * H b16 b8 value
     * </pre>
     */
    abstract public String readHeader()
            throws IOException;

    /**
     * Starts reading the call
     * <p>
     * <p>A successful completion will have a single value:
     * <p>
     * <pre>
     * m b16 b8 method
     * </pre>
     */
    abstract public String readMethod()
            throws IOException;

    /**
     * Reads the number of method arguments
     *
     * @return -1 for a variable length (hessian 1.0)
     */
    public int readMethodArgLength()
            throws IOException {
        return -1;
    }

    /**
     * Starts reading the call, including the headers.
     * <p>
     * <p>The call expects the following protocol data
     * <p>
     * <pre>
     * c major minor
     * m b16 b8 method
     * </pre>
     */
    abstract public void startCall()
            throws IOException;

    /**
     * Completes reading the call
     * <p>
     * <p>The call expects the following protocol data
     * <p>
     * <pre>
     * Z
     * </pre>
     */
    abstract public void completeCall()
            throws IOException;

    /**
     * Reads a reply as an object.
     * If the reply has a fault, throws the exception.
     */
    abstract public Object readReply(Class expectedClass)
            throws Throwable;

    /**
     * Starts reading the reply
     * <p>
     * <p>A successful completion will have a single value:
     * <p>
     * <pre>
     * r
     * v
     * </pre>
     */
    abstract public void startReply()
            throws Throwable;

    /**
     * Completes reading the call
     * <p>
     * <p>A successful completion will have a single value:
     * <p>
     * <pre>
     * z
     * </pre>
     */
    abstract public void completeReply()
            throws IOException;

    /**
     * Reads a boolean
     * <p>
     * <pre>
     * T
     * F
     * </pre>
     */
    abstract public boolean readBoolean()
            throws IOException;

    /**
     * Reads a null
     * <p>
     * <pre>
     * N
     * </pre>
     */
    abstract public void readNull()
            throws IOException;

    /**
     * Reads an integer
     * <p>
     * <pre>
     * I b32 b24 b16 b8
     * </pre>
     */
    abstract public int readInt()
            throws IOException;

    /**
     * Reads a long
     * <p>
     * <pre>
     * L b64 b56 b48 b40 b32 b24 b16 b8
     * </pre>
     */
    abstract public long readLong()
            throws IOException;

    /**
     * Reads a double.
     * <p>
     * <pre>
     * D b64 b56 b48 b40 b32 b24 b16 b8
     * </pre>
     */
    abstract public double readDouble()
            throws IOException;

    /**
     * Reads a date.
     * <p>
     * <pre>
     * T b64 b56 b48 b40 b32 b24 b16 b8
     * </pre>
     */
    abstract public long readUTCDate()
            throws IOException;

    /**
     * Reads a string encoded in UTF-8
     * <p>
     * <pre>
     * s b16 b8 non-final string chunk
     * S b16 b8 final string chunk
     * </pre>
     */
    abstract public String readString()
            throws IOException;

    /**
     * Reads an XML node encoded in UTF-8
     * <p>
     * <pre>
     * x b16 b8 non-final xml chunk
     * X b16 b8 final xml chunk
     * </pre>
     */
    public org.w3c.dom.Node readNode()
            throws IOException {
        throw new UnsupportedOperationException(getClass().getSimpleName());
    }

    /**
     * Starts reading a string.  All the characters must be read before
     * calling the next method.  The actual characters will be read with
     * the reader's read() or read(char [], int, int).
     * <p>
     * <pre>
     * s b16 b8 non-final string chunk
     * S b16 b8 final string chunk
     * </pre>
     */
    abstract public Reader getReader()
            throws IOException;

    /**
     * Starts reading a byte array using an input stream.  All the bytes
     * must be read before calling the following method.
     * <p>
     * <pre>
     * b b16 b8 non-final binary chunk
     * B b16 b8 final binary chunk
     * </pre>
     */
    abstract public InputStream readInputStream()
            throws IOException;

    /**
     * Reads a byte array.
     * <p>
     * <pre>
     * b b16 b8 non-final binary chunk
     * B b16 b8 final binary chunk
     * </pre>
     */
    abstract public byte[] readBytes()
            throws IOException;

    /**
     * Reads an arbitrary object from the input stream.
     *
     * @param expectedClass the expected class if the protocol doesn't supply it.
     */
    abstract public Object readObject(Class expectedClass)
            throws IOException;

    /**
     * Reads an arbitrary object from the input stream.
     *
     * @param expectedClass the expected class if the protocol doesn't supply it.
     * @param expectedTypes the runtime type hints, eg: expectedClass equals Map, expectedTypes can
     * equals String.class, Short.class
     */
    public Object readObject(Class expectedClass, Class<?>... expectedTypes)
        throws IOException{
        throw new UnsupportedOperationException(String.valueOf(this));
    }

    /**
     * Reads an arbitrary object from the input stream.
     */
    abstract public Object readObject()
            throws IOException;

    /**
     * Reads an arbitrary object from the input stream.
     * @param expectedTypes the runtime type hints, eg: expectedTypes can
     * equals String.class, Short.class for HashMap
     */
    public Object readObject(List<Class<?>> expectedTypes)
        throws IOException{
        throw new UnsupportedOperationException(String.valueOf(this));
    }

    /**
     * Reads a remote object reference to the stream.  The type is the
     * type of the remote interface.
     * <p>
     * <code><pre>
     * 'r' 't' b16 b8 type url
     * </pre></code>
     */
    abstract public Object readRemote()
            throws IOException;

    /**
     * Reads a reference
     * <p>
     * <pre>
     * R b32 b24 b16 b8
     * </pre>
     */
    abstract public Object readRef()
            throws IOException;

    /**
     * Adds an object reference.
     */
    abstract public int addRef(Object obj)
            throws IOException;

    /**
     * Sets an object reference.
     */
    abstract public void setRef(int i, Object obj)
            throws IOException;

    /**
     * Resets the references for streaming.
     */
    public void resetReferences() {
    }

    /**
     * Reads the start of a list
     */
    abstract public int readListStart()
            throws IOException;

    /**
     * Reads the length of a list.
     */
    abstract public int readLength()
            throws IOException;

    /**
     * Reads the start of a map
     */
    abstract public int readMapStart()
            throws IOException;

    /**
     * Reads an object type.
     */
    abstract public String readType()
            throws IOException;

    /**
     * Returns true if the data has ended.
     */
    abstract public boolean isEnd()
            throws IOException;

    /**
     * Read the end byte
     */
    abstract public void readEnd()
            throws IOException;

    /**
     * Read the end byte
     */
    abstract public void readMapEnd()
            throws IOException;

    /**
     * Read the end byte
     */
    abstract public void readListEnd()
            throws IOException;

    public void close()
            throws IOException {
    }
}
