- *
- * AbstractHessianInput in = ...; // get input - * String value; - * - * in.startReply(); // read reply header - * value = in.readString(); // read string value - * in.completeReply(); // read reply footer - *- */ -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 - *
- *
- * c major minor - *- */ - 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. - *
- *
- * H b16 b8 value - *- */ - abstract public String readHeader() - throws IOException; - - /** - * Starts reading the call - *
- *
A successful completion will have a single value: - *
- *
- * m b16 b8 method - *- */ - 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. - *
- *
The call expects the following protocol data - *
- *
- * c major minor - * m b16 b8 method - *- */ - abstract public void startCall() - throws IOException; - - /** - * Completes reading the call - *
- *
The call expects the following protocol data - *
- *
- * Z - *- */ - 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 - *
- *
A successful completion will have a single value: - *
- *
- * r - * v - *- */ - abstract public void startReply() - throws Throwable; - - /** - * Completes reading the call - *
- *
A successful completion will have a single value: - *
- *
- * z - *- */ - abstract public void completeReply() - throws IOException; - - /** - * Reads a boolean - *
- *
- * T - * F - *- */ - abstract public boolean readBoolean() - throws IOException; - - /** - * Reads a null - *
- *
- * N - *- */ - abstract public void readNull() - throws IOException; - - /** - * Reads an integer - *
- *
- * I b32 b24 b16 b8 - *- */ - abstract public int readInt() - throws IOException; - - /** - * Reads a long - *
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8 - *- */ - abstract public long readLong() - throws IOException; - - /** - * Reads a double. - *
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8 - *- */ - abstract public double readDouble() - throws IOException; - - /** - * Reads a date. - *
- *
- * T b64 b56 b48 b40 b32 b24 b16 b8 - *- */ - abstract public long readUTCDate() - throws IOException; - - /** - * Reads a string encoded in UTF-8 - *
- *
- * s b16 b8 non-final string chunk - * S b16 b8 final string chunk - *- */ - abstract public String readString() - throws IOException; - - /** - * Reads an XML node encoded in UTF-8 - *
- *
- * x b16 b8 non-final xml chunk - * X b16 b8 final xml chunk - *- */ - 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). - *
- *
- * s b16 b8 non-final string chunk - * S b16 b8 final string chunk - *- */ - 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. - *
- *
- * b b16 b8 non-final binary chunk - * B b16 b8 final binary chunk - *- */ - abstract public InputStream readInputStream() - throws IOException; - - /** - * Reads a byte array. - *
- *
- * b b16 b8 non-final binary chunk - * B b16 b8 final binary chunk - *- */ - 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
- *
- */
- abstract public Object readRemote()
- throws IOException;
-
- /**
- * Reads a reference
- *
- * 'r' 't' b16 b8 type url
- *
- *
- * R b32 b24 b16 b8 - *- */ - 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 { - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianOutput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianOutput.java deleted file mode 100644 index 602140811ae..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianOutput.java +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright (c) 2001-2008 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 "Hessian", "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.OutputStream; - -/** - * Abstract output stream for Hessian requests. - *
- *
- * OutputStream os = ...; // from http connection - * AbstractOutput out = new HessianSerializerOutput(os); - * String value; - * - * out.startCall("hello"); // start hello call - * out.writeString("arg1"); // write a string argument - * out.completeCall(); // complete the call - *- */ -abstract public class AbstractHessianOutput { - // serializer factory - protected SerializerFactory _serializerFactory; - - /** - * Gets the serializer factory. - */ - public SerializerFactory getSerializerFactory() { - return _serializerFactory; - } - - /** - * Sets the serializer factory. - */ - public void setSerializerFactory(SerializerFactory factory) { - _serializerFactory = factory; - } - - /** - * Gets the serializer factory. - */ - public final SerializerFactory findSerializerFactory() { - SerializerFactory factory = _serializerFactory; - - if (factory == null) - _serializerFactory = factory = new SerializerFactory(); - - return factory; - } - - /** - * Initialize the output with a new underlying stream. - */ - public void init(OutputStream os) { - } - - /** - * Writes a complete method call. - */ - public void call(String method, Object[] args) - throws IOException { - int length = args != null ? args.length : 0; - - startCall(method, length); - - for (int i = 0; i < length; i++) - writeObject(args[i]); - - completeCall(); - } - - /** - * Starts the method call: - *
- *
- *
- * @param method the method name to call.
- */
- abstract public void startCall()
- throws IOException;
-
- /**
- * Starts the method call:
- *
- * C
- *
- *
- *
- * @param method the method name to call.
- */
- abstract public void startCall(String method, int length)
- throws IOException;
-
- /**
- * For Hessian 2.0, use the Header envelope instead
- *
- * @deprecated
- */
- public void writeHeader(String name)
- throws IOException {
- throw new UnsupportedOperationException(getClass().getSimpleName());
- }
-
- /**
- * Writes the method tag.
- *
- * C string int
- *
- *
- *
- * @param method the method name to call.
- */
- abstract public void writeMethod(String method)
- throws IOException;
-
- /**
- * Completes the method call:
- *
- * string
- *
- *
- */
- abstract public void completeCall()
- throws IOException;
-
- /**
- * Writes a boolean value to the stream. The boolean will be written
- * with the following syntax:
- *
- *
- *
- *
- * @param value the boolean value to write.
- */
- abstract public void writeBoolean(boolean value)
- throws IOException;
-
- /**
- * Writes an integer value to the stream. The integer will be written
- * with the following syntax:
- *
- * T
- * F
- *
- *
- *
- * @param value the integer value to write.
- */
- abstract public void writeInt(int value)
- throws IOException;
-
- /**
- * Writes a long value to the stream. The long will be written
- * with the following syntax:
- *
- * I b32 b24 b16 b8
- *
- *
- *
- * @param value the long value to write.
- */
- abstract public void writeLong(long value)
- throws IOException;
-
- /**
- * Writes a double value to the stream. The double will be written
- * with the following syntax:
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- *
- * @param value the double value to write.
- */
- abstract public void writeDouble(double value)
- throws IOException;
-
- /**
- * Writes a date to the stream.
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- *
- * @param time the date in milliseconds from the epoch in UTC
- */
- abstract public void writeUTCDate(long time)
- throws IOException;
-
- /**
- * Writes a null value to the stream.
- * The null will be written with the following syntax
- *
- * T b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeNull()
- throws IOException;
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- *
- * S b16 b8 string-value
- *
- * If the value is null, it will be written as - *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeString(String value)
- throws IOException;
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- *
- * S b16 b8 string-value
- *
- * If the value is null, it will be written as - *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeString(char[] buffer, int offset, int length)
- throws IOException;
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- *
- * B b16 b18 bytes
- *
- * If the value is null, it will be written as - *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeBytes(byte[] buffer)
- throws IOException;
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- *
- * B b16 b18 bytes
- *
- * If the value is null, it will be written as - *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeBytes(byte[] buffer, int offset, int length)
- throws IOException;
-
- /**
- * Writes a byte buffer to the stream.
- */
- abstract public void writeByteBufferStart()
- throws IOException;
-
- /**
- * Writes a byte buffer to the stream.
- *
- * N
- *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeByteBufferPart(byte[] buffer,
- int offset,
- int length)
- throws IOException;
-
- /**
- * Writes the last chunk of a byte buffer to the stream.
- *
- * b b16 b18 bytes
- *
- *
- *
- * @param value the string value to write.
- */
- abstract public void writeByteBufferEnd(byte[] buffer,
- int offset,
- int length)
- throws IOException;
-
- /**
- * Writes a reference.
- *
- * b b16 b18 bytes
- *
- *
- *
- * @param value the integer value to write.
- */
- abstract protected void writeRef(int value)
- throws IOException;
-
- /**
- * Removes a reference.
- */
- abstract public boolean removeRef(Object obj)
- throws IOException;
-
- /**
- * Replaces a reference from one object to another.
- */
- abstract public boolean replaceRef(Object oldRef, Object newRef)
- throws IOException;
-
- /**
- * Adds an object to the reference list. If the object already exists,
- * writes the reference, otherwise, the caller is responsible for
- * the serialization.
- *
- * Q int
- *
- *
- *
- * @param object the object to add as a reference.
- * @return true if the object has already been written.
- */
- abstract public boolean addRef(Object object)
- throws IOException;
-
- /**
- * Resets the references for streaming.
- */
- public void resetReferences() {
- }
-
- /**
- * Writes a generic object to the output stream.
- */
- abstract public void writeObject(Object object)
- throws IOException;
-
- /**
- * Writes the list header to the stream. List writers will call
- *
- * R b32 b24 b16 b8
- *
writeListBegin
followed by the list contents and then
- * call writeListEnd
.
- *
- *
- */
- abstract public boolean writeListBegin(int length, String type)
- throws IOException;
-
- /**
- * Writes the tail of the list to the stream.
- */
- abstract public void writeListEnd()
- throws IOException;
-
- /**
- * Writes the map header to the stream. Map writers will call
- *
- * V
- * x13 java.util.ArrayList # type
- * x93 # length=3
- * x91 # 1
- * x92 # 2
- * x93 # 3
- * </list>
- *
writeMapBegin
followed by the map contents and then
- * call writeMapEnd
.
- *
- *
- */
- abstract public void writeMapBegin(String type)
- throws IOException;
-
- /**
- * Writes the tail of the map to the stream.
- */
- abstract public void writeMapEnd()
- throws IOException;
-
- /**
- * Writes the object header to the stream (for Hessian 2.0), or a
- * Map for Hessian 1.0. Object writers will call
- *
- * M type (
writeObjectBegin
followed by the map contents and then
- * call writeObjectEnd
.
- *
- *
- * HessianInput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- * The call expects the following protocol data
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * Since HessianOutput does not depend on any classes other than
- * in the JDK, it can be extracted independently into a smaller package.
- *
- * HessianOutput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A message contains several objects encapsulated by a length
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- * \x07message
- * \x11the fault message
- *
- * \x06detail
- * M\xnnjavax.ejb.FinderException
- * ...
- * Z
- * Z
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- *
- *
- *
- * A streaming message starts with 'P'
- *
- * A streaming message starts with 'P'
- *
- * HessianInput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- * The call expects the following protocol data
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * Since HessianOutput does not depend on any classes other than
- * in the JDK, it can be extracted independently into a smaller package.
- *
- * HessianOutput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- *
- *
- *
- * A successful completion will have a single value:
- *
- *
- * A successful completion will have a single value:
- *
- *
- *
- *
- * <string>message
- * <string>the fault mesage
- *
- * <string>detail
- * mt\x00\xnnjavax.ejb.FinderException
- * ...
- * z
- * z
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- * If the value is null, it will be written as
- *
- *
- *
- *
- *
- *
- *
- * HessianSerializerInput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- *
- *
- * HessianOutput is unbuffered, so any client needs to provide
- * its own buffering.
- *
- *
- *
- *
- *
- * eg: Map
- * The convenience of IntMap is avoiding all the silly wrapping of
- * integers.
- */
-public class IdentityIntMap {
- /**
- * Encoding of a null entry. Since NULL is equal to Integer.MIN_VALUE,
- * it's impossible to distinguish between the two.
- */
- public final static int NULL = 0xdeadbeef; // Integer.MIN_VALUE + 1;
-
- private static final Object DELETED = new Object();
-
- private Object[] _keys;
- private int[] _values;
-
- private int _size;
- private int _mask;
-
- /**
- * Create a new IntMap. Default size is 16.
- */
- public IdentityIntMap() {
- _keys = new Object[256];
- _values = new int[256];
-
- _mask = _keys.length - 1;
- _size = 0;
- }
-
- /**
- * Clear the hashmap.
- */
- public void clear() {
- Object[] keys = _keys;
- int[] values = _values;
-
- for (int i = keys.length - 1; i >= 0; i--) {
- keys[i] = null;
- values[i] = 0;
- }
-
- _size = 0;
- }
-
- /**
- * Returns the current number of entries in the map.
- */
- public int size() {
- return _size;
- }
-
- /**
- * Puts a new value in the property table with the appropriate flags
- */
- public int get(Object key) {
- int mask = _mask;
- int hash = System.identityHashCode(key) % mask & mask;
-
- Object[] keys = _keys;
-
- while (true) {
- Object mapKey = keys[hash];
-
- if (mapKey == null)
- return NULL;
- else if (mapKey == key)
- return _values[hash];
-
- hash = (hash + 1) % mask;
- }
- }
-
- /**
- * Expands the property table
- */
- private void resize(int newSize) {
- Object[] newKeys = new Object[newSize];
- int[] newValues = new int[newSize];
-
- int mask = _mask = newKeys.length - 1;
-
- Object[] keys = _keys;
- int values[] = _values;
-
- for (int i = keys.length - 1; i >= 0; i--) {
- Object key = keys[i];
-
- if (key == null || key == DELETED)
- continue;
-
- int hash = System.identityHashCode(key) % mask & mask;
-
- while (true) {
- if (newKeys[hash] == null) {
- newKeys[hash] = key;
- newValues[hash] = values[i];
- break;
- }
-
- hash = (hash + 1) % mask;
- }
- }
-
- _keys = newKeys;
- _values = newValues;
- }
-
- /**
- * Puts a new value in the property table with the appropriate flags
- */
- public int put(Object key, int value) {
- int mask = _mask;
- int hash = System.identityHashCode(key) % mask & mask;
-
- Object[] keys = _keys;
-
- while (true) {
- Object testKey = keys[hash];
-
- if (testKey == null || testKey == DELETED) {
- keys[hash] = key;
- _values[hash] = value;
-
- _size++;
-
- if (keys.length <= 4 * _size)
- resize(4 * keys.length);
-
- return NULL;
- } else if (key != testKey) {
- hash = (hash + 1) % mask;
-
- continue;
- } else {
- int old = _values[hash];
-
- _values[hash] = value;
-
- return old;
- }
- }
- }
-
- /**
- * Deletes the entry. Returns true if successful.
- */
- public int remove(Object key) {
- int mask = _mask;
- int hash = System.identityHashCode(key) % mask & mask;
-
- while (true) {
- Object mapKey = _keys[hash];
-
- if (mapKey == null)
- return NULL;
- else if (mapKey == key) {
- _keys[hash] = DELETED;
-
- _size--;
-
- return _values[hash];
- }
-
- hash = (hash + 1) % mask;
- }
- }
-
- @Override
- public String toString() {
- StringBuffer sbuf = new StringBuffer();
-
- sbuf.append("IntMap[");
- boolean isFirst = true;
-
- for (int i = 0; i <= _mask; i++) {
- if (_keys[i] != null && _keys[i] != DELETED) {
- if (!isFirst)
- sbuf.append(", ");
-
- isFirst = false;
- sbuf.append(_keys[i]);
- sbuf.append(":");
- sbuf.append(_values[i]);
- }
- }
- sbuf.append("]");
-
- return sbuf.toString();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IntMap.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IntMap.java
deleted file mode 100644
index 8711570f14e..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IntMap.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.util;
-
-/**
- * The IntMap provides a simple hashmap from keys to integers. The API is
- * an abbreviation of the HashMap collection API.
- *
- * The convenience of IntMap is avoiding all the silly wrapping of
- * integers.
- */
-public class IntMap {
- /**
- * Encoding of a null entry. Since NULL is equal to Integer.MIN_VALUE,
- * it's impossible to distinguish between the two.
- */
- public final static int NULL = 0xdeadbeef; // Integer.MIN_VALUE + 1;
-
- private static final Object DELETED = new Object();
-
- private Object[] _keys;
- private int[] _values;
-
- private int _size;
- private int _mask;
-
- /**
- * Create a new IntMap. Default size is 16.
- */
- public IntMap() {
- _keys = new Object[256];
- _values = new int[256];
-
- _mask = _keys.length - 1;
- _size = 0;
- }
-
- /**
- * Clear the hashmap.
- */
- public void clear() {
- Object[] keys = _keys;
- int[] values = _values;
-
- for (int i = keys.length - 1; i >= 0; i--) {
- keys[i] = null;
- values[i] = 0;
- }
-
- _size = 0;
- }
-
- /**
- * Returns the current number of entries in the map.
- */
- public int size() {
- return _size;
- }
-
- /**
- * Puts a new value in the property table with the appropriate flags
- */
- public int get(Object key) {
- int mask = _mask;
- int hash = key.hashCode() % mask & mask;
-
- Object[] keys = _keys;
-
- while (true) {
- Object mapKey = keys[hash];
-
- if (mapKey == null)
- return NULL;
- else if (mapKey == key || mapKey.equals(key))
- return _values[hash];
-
- hash = (hash + 1) % mask;
- }
- }
-
- /**
- * Expands the property table
- */
- private void resize(int newSize) {
- Object[] newKeys = new Object[newSize];
- int[] newValues = new int[newSize];
-
- int mask = _mask = newKeys.length - 1;
-
- Object[] keys = _keys;
- int values[] = _values;
-
- for (int i = keys.length - 1; i >= 0; i--) {
- Object key = keys[i];
-
- if (key == null || key == DELETED)
- continue;
-
- int hash = key.hashCode() % mask & mask;
-
- while (true) {
- if (newKeys[hash] == null) {
- newKeys[hash] = key;
- newValues[hash] = values[i];
- break;
- }
-
- hash = (hash + 1) % mask;
- }
- }
-
- _keys = newKeys;
- _values = newValues;
- }
-
- /**
- * Puts a new value in the property table with the appropriate flags
- */
- public int put(Object key, int value) {
- int mask = _mask;
- int hash = key.hashCode() % mask & mask;
-
- Object[] keys = _keys;
-
- while (true) {
- Object testKey = keys[hash];
-
- if (testKey == null || testKey == DELETED) {
- keys[hash] = key;
- _values[hash] = value;
-
- _size++;
-
- if (keys.length <= 4 * _size)
- resize(4 * keys.length);
-
- return NULL;
- } else if (key != testKey && !key.equals(testKey)) {
- hash = (hash + 1) % mask;
-
- continue;
- } else {
- int old = _values[hash];
-
- _values[hash] = value;
-
- return old;
- }
- }
- }
-
- /**
- * Deletes the entry. Returns true if successful.
- */
- public int remove(Object key) {
- int mask = _mask;
- int hash = key.hashCode() % mask & mask;
-
- while (true) {
- Object mapKey = _keys[hash];
-
- if (mapKey == null)
- return NULL;
- else if (mapKey == key) {
- _keys[hash] = DELETED;
-
- _size--;
-
- return _values[hash];
- }
-
- hash = (hash + 1) % mask;
- }
- }
-
- @Override
- public String toString() {
- StringBuffer sbuf = new StringBuffer();
-
- sbuf.append("IntMap[");
- boolean isFirst = true;
-
- for (int i = 0; i <= _mask; i++) {
- if (_keys[i] != null && _keys[i] != DELETED) {
- if (!isFirst)
- sbuf.append(", ");
-
- isFirst = false;
- sbuf.append(_keys[i]);
- sbuf.append(":");
- sbuf.append(_values[i]);
- }
- }
- sbuf.append("]");
-
- return sbuf.toString();
- }
-}
diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java
deleted file mode 100644
index c3ead159a3d..00000000000
--- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian1StringShortTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.com.caucho.hessian.io;
-
-import com.alibaba.com.caucho.hessian.io.base.SerializeTestBase;
-import com.alibaba.com.caucho.hessian.io.beans.Hessian2StringShortType;
-import com.alibaba.com.caucho.hessian.io.beans.PersonType;
-
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
-
-public class Hessian1StringShortTest extends SerializeTestBase {
-
- @Test
- public void serialize_string_short_map_then_deserialize() throws Exception {
-
- Hessian2StringShortType stringShort = new Hessian2StringShortType();
- Map
- *
- * @return true if the object has already been defined.
- */
- public int writeObjectBegin(String type)
- throws IOException {
- writeMapBegin(type);
-
- return -2;
- }
-
- /**
- * Writes the end of the class.
- */
- public void writeClassFieldLength(int len)
- throws IOException {
- }
-
- /**
- * Writes the tail of the object to the stream.
- */
- public void writeObjectEnd()
- throws IOException {
- }
-
- public void writeReply(Object o)
- throws IOException {
- startReply();
- writeObject(o);
- completeReply();
- }
-
-
- public void startReply()
- throws IOException {
- }
-
- public void completeReply()
- throws IOException {
- }
-
- public void writeFault(String code, String message, Object detail)
- throws IOException {
- }
-
- public void flush()
- throws IOException {
- }
-
- public void close()
- throws IOException {
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianResolver.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianResolver.java
deleted file mode 100644
index 72a9822af6d..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianResolver.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Looks up remote objects. The default just returns a HessianRemote object.
- */
-public class AbstractHessianResolver implements HessianRemoteResolver {
- /**
- * Looks up a proxy object.
- */
- @Override
- public Object lookup(String type, String url)
- throws IOException {
- return new HessianRemote(type, url);
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractListDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractListDeserializer.java
deleted file mode 100644
index f578d290492..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractListDeserializer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Deserializing a JDK 1.2 Collection.
- */
-public class AbstractListDeserializer extends AbstractDeserializer {
- @Override
- public Object readObject(AbstractHessianInput in)
- throws IOException {
- Object obj = in.readObject();
-
- if (obj != null)
- throw error("expected list at " + obj.getClass().getName() + " (" + obj + ")");
- else
- throw error("expected list at null");
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractMapDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractMapDeserializer.java
deleted file mode 100644
index d8543d21fe6..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractMapDeserializer.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.HashMap;
-
-/**
- * Serializing an object for known object types.
- */
-public class AbstractMapDeserializer extends AbstractDeserializer {
-
- @Override
- public Class getType() {
- return HashMap.class;
- }
-
- @Override
- public Object readObject(AbstractHessianInput in)
- throws IOException {
- Object obj = in.readObject();
-
- if (obj != null)
- throw error("expected map/object at " + obj.getClass().getName() + " (" + obj + ")");
- else
- throw error("expected map/object at null");
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
deleted file mode 100644
index 088cf256c00..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.logging.Logger;
-
-/**
- * Serializing an object.
- */
-abstract public class AbstractSerializer implements Serializer {
- protected static final Logger log
- = Logger.getLogger(AbstractSerializer.class.getName());
-
- @Override
- abstract public void writeObject(Object obj, AbstractHessianOutput out)
- throws IOException;
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializerFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializerFactory.java
deleted file mode 100644
index 6621543c9c6..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializerFactory.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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;
-
-/**
- * Factory for returning serialization methods.
- */
-abstract public class AbstractSerializerFactory {
- /**
- * Returns the serializer for a class.
- *
- * @param cl the class of the object that needs to be serialized.
- * @return a serializer object for the serialization.
- */
- abstract public Serializer getSerializer(Class cl)
- throws HessianProtocolException;
-
- /**
- * Returns the deserializer for a class.
- *
- * @param cl the class of the object that needs to be deserialized.
- * @return a deserializer object for the serialization.
- */
- abstract public Deserializer getDeserializer(Class cl)
- throws HessianProtocolException;
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArrayDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArrayDeserializer.java
deleted file mode 100644
index e575411ba8a..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArrayDeserializer.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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 "Hessian", "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.lang.reflect.Array;
-import java.util.ArrayList;
-
-/**
- * Deserializing a Java array
- */
-public class ArrayDeserializer extends AbstractListDeserializer {
- private Class _componentType;
- private Class _type;
-
- public ArrayDeserializer(Class componentType) {
- _componentType = componentType;
-
- if (_componentType != null) {
- try {
- _type = Array.newInstance(_componentType, 0).getClass();
- } catch (Exception e) {
- }
- }
-
- if (_type == null)
- _type = Object[].class;
- }
-
- @Override
- public Class getType() {
- return _type;
- }
-
- /**
- * Reads the array.
- */
- @Override
- public Object readList(AbstractHessianInput in, int length)
- throws IOException {
- if (length >= 0) {
- Object[] data = createArray(length);
-
- in.addRef(data);
-
- if (_componentType != null) {
- for (int i = 0; i < data.length; i++)
- data[i] = in.readObject(_componentType);
- } else {
- for (int i = 0; i < data.length; i++)
- data[i] = in.readObject();
- }
-
- in.readListEnd();
-
- return data;
- } else {
- ArrayList list = new ArrayList();
-
- in.addRef(list);
-
- if (_componentType != null) {
- while (!in.isEnd())
- list.add(in.readObject(_componentType));
- } else {
- while (!in.isEnd())
- list.add(in.readObject());
- }
-
- in.readListEnd();
-
- Object[] data = createArray(list.size());
- for (int i = 0; i < data.length; i++)
- data[i] = list.get(i);
-
- return data;
- }
- }
-
- /**
- * Reads the array.
- */
- @Override
- public Object readLengthList(AbstractHessianInput in, int length)
- throws IOException {
- Object[] data = createArray(length);
-
- in.addRef(data);
-
- if (_componentType != null) {
- for (int i = 0; i < data.length; i++)
- data[i] = in.readObject(_componentType);
- } else {
- for (int i = 0; i < data.length; i++)
- data[i] = in.readObject();
- }
-
- return data;
- }
-
- protected Object[] createArray(int length) {
- if (_componentType != null)
- return (Object[]) Array.newInstance(_componentType, length);
- else
- return new Object[length];
- }
-
- @Override
- public String toString() {
- return "ArrayDeserializer[" + _componentType + "]";
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArraySerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArraySerializer.java
deleted file mode 100644
index d6cfcc5cb4d..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ArraySerializer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Serializing a Java array.
- */
-public class ArraySerializer extends AbstractSerializer {
- @Override
- public void writeObject(Object obj, AbstractHessianOutput out)
- throws IOException {
- if (out.addRef(obj))
- return;
-
- Object[] array = (Object[]) obj;
-
- boolean hasEnd = out.writeListBegin(array.length,
- getArrayType(obj.getClass()));
-
- for (int i = 0; i < array.length; i++)
- out.writeObject(array[i]);
-
- if (hasEnd)
- out.writeListEnd();
- }
-
- /**
- * Returns the <type> name for a <list>.
- */
- private String getArrayType(Class cl) {
- if (cl.isArray())
- return '[' + getArrayType(cl.getComponentType());
-
- String name = cl.getName();
-
- if (name.equals("java.lang.String"))
- return "string";
- else if (name.equals("java.lang.Object"))
- return "object";
- else if (name.equals("java.util.Date"))
- return "date";
- else
- return name;
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java
deleted file mode 100644
index 20c593f38be..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicDeserializer.java
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.ArrayList;
-import java.util.Date;
-
-/**
- * Serializing an object for known object types.
- */
-public class BasicDeserializer extends AbstractDeserializer {
- public static final int NULL = BasicSerializer.NULL;
- public static final int BOOLEAN = BasicSerializer.BOOLEAN;
- public static final int BYTE = BasicSerializer.BYTE;
- public static final int SHORT = BasicSerializer.SHORT;
- public static final int INTEGER = BasicSerializer.INTEGER;
- public static final int LONG = BasicSerializer.LONG;
- public static final int FLOAT = BasicSerializer.FLOAT;
- public static final int DOUBLE = BasicSerializer.DOUBLE;
- public static final int CHARACTER = BasicSerializer.CHARACTER;
- public static final int CHARACTER_OBJECT = BasicSerializer.CHARACTER_OBJECT;
- public static final int STRING = BasicSerializer.STRING;
- public static final int DATE = BasicSerializer.DATE;
- public static final int NUMBER = BasicSerializer.NUMBER;
- public static final int OBJECT = BasicSerializer.OBJECT;
-
- public static final int BOOLEAN_ARRAY = BasicSerializer.BOOLEAN_ARRAY;
- public static final int BYTE_ARRAY = BasicSerializer.BYTE_ARRAY;
- public static final int SHORT_ARRAY = BasicSerializer.SHORT_ARRAY;
- public static final int INTEGER_ARRAY = BasicSerializer.INTEGER_ARRAY;
- public static final int LONG_ARRAY = BasicSerializer.LONG_ARRAY;
- public static final int FLOAT_ARRAY = BasicSerializer.FLOAT_ARRAY;
- public static final int DOUBLE_ARRAY = BasicSerializer.DOUBLE_ARRAY;
- public static final int CHARACTER_ARRAY = BasicSerializer.CHARACTER_ARRAY;
- public static final int STRING_ARRAY = BasicSerializer.STRING_ARRAY;
- public static final int OBJECT_ARRAY = BasicSerializer.OBJECT_ARRAY;
-
- private int _code;
-
- public BasicDeserializer(int code) {
- _code = code;
- }
-
- @Override
- public Class getType() {
- switch (_code) {
- case NULL:
- return void.class;
- case BOOLEAN:
- return Boolean.class;
- case BYTE:
- return Byte.class;
- case SHORT:
- return Short.class;
- case INTEGER:
- return Integer.class;
- case LONG:
- return Long.class;
- case FLOAT:
- return Float.class;
- case DOUBLE:
- return Double.class;
- case CHARACTER:
- return Character.class;
- case CHARACTER_OBJECT:
- return Character.class;
- case STRING:
- return String.class;
- case DATE:
- return Date.class;
- case NUMBER:
- return Number.class;
- case OBJECT:
- return Object.class;
-
- case BOOLEAN_ARRAY:
- return boolean[].class;
- case BYTE_ARRAY:
- return byte[].class;
- case SHORT_ARRAY:
- return short[].class;
- case INTEGER_ARRAY:
- return int[].class;
- case LONG_ARRAY:
- return long[].class;
- case FLOAT_ARRAY:
- return float[].class;
- case DOUBLE_ARRAY:
- return double[].class;
- case CHARACTER_ARRAY:
- return char[].class;
- case STRING_ARRAY:
- return String[].class;
- case OBJECT_ARRAY:
- return Object[].class;
- default:
- throw new UnsupportedOperationException();
- }
- }
-
- @Override
- public Object readObject(AbstractHessianInput in)
- throws IOException {
- switch (_code) {
- case NULL:
- // hessian/3490
- in.readObject();
-
- return null;
-
- case BOOLEAN:
- return Boolean.valueOf(in.readBoolean());
-
- case BYTE:
- return Byte.valueOf((byte) in.readInt());
-
- case SHORT:
- return Short.valueOf((short) in.readInt());
-
- case INTEGER:
- return Integer.valueOf(in.readInt());
-
- case LONG:
- return Long.valueOf(in.readLong());
-
- case FLOAT:
- return Float.valueOf((float) in.readDouble());
-
- case DOUBLE:
- return Double.valueOf(in.readDouble());
-
- case STRING:
- return in.readString();
-
- case OBJECT:
- return in.readObject();
-
- case CHARACTER: {
- String s = in.readString();
- if (s == null || s.equals(""))
- return Character.valueOf((char) 0);
- else
- return Character.valueOf(s.charAt(0));
- }
-
- case CHARACTER_OBJECT: {
- String s = in.readString();
- if (s == null || s.equals(""))
- return null;
- else
- return Character.valueOf(s.charAt(0));
- }
-
- case DATE:
- return new Date(in.readUTCDate());
-
- case NUMBER:
- return in.readObject();
-
- case BYTE_ARRAY:
- return in.readBytes();
-
- case CHARACTER_ARRAY: {
- String s = in.readString();
-
- if (s == null)
- return null;
- else {
- int len = s.length();
- char[] chars = new char[len];
- s.getChars(0, len, chars, 0);
- return chars;
- }
- }
-
- case BOOLEAN_ARRAY:
- case SHORT_ARRAY:
- case INTEGER_ARRAY:
- case LONG_ARRAY:
- case FLOAT_ARRAY:
- case DOUBLE_ARRAY:
- case STRING_ARRAY: {
- int code = in.readListStart();
-
- switch (code) {
- case 'N':
- return null;
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
- int length = code - 0x10;
- in.readInt();
-
- return readLengthList(in, length);
-
- default:
- String type = in.readType();
- length = in.readLength();
-
- return readList(in, length);
- }
- }
-
- default:
- throw new UnsupportedOperationException();
- }
- }
-
- @Override
- 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));
- }
- }
-
- @Override
- public Object readLengthList(AbstractHessianInput in, int length)
- throws IOException {
- switch (_code) {
- case BOOLEAN_ARRAY: {
- boolean[] data = new boolean[length];
-
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readBoolean();
-
- return data;
- }
-
- case SHORT_ARRAY: {
- short[] data = new short[length];
-
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = (short) in.readInt();
-
- return data;
- }
-
- case INTEGER_ARRAY: {
- int[] data = new int[length];
-
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readInt();
-
- return data;
- }
-
- case LONG_ARRAY: {
- long[] data = new long[length];
-
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readLong();
-
- return data;
- }
-
- case FLOAT_ARRAY: {
- float[] data = new float[length];
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = (float) in.readDouble();
-
- return data;
- }
-
- case DOUBLE_ARRAY: {
- double[] data = new double[length];
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readDouble();
-
- return data;
- }
-
- case STRING_ARRAY: {
- String[] data = new String[length];
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readString();
-
- return data;
- }
-
- case OBJECT_ARRAY: {
- Object[] data = new Object[length];
- in.addRef(data);
-
- for (int i = 0; i < data.length; i++)
- data[i] = in.readObject();
-
- return data;
- }
-
- default:
- throw new UnsupportedOperationException(String.valueOf(this));
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java
deleted file mode 100644
index 6d5aee9f30a..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BasicSerializer.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * 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:
- 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()));
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanDeserializer.java
deleted file mode 100644
index a0f16c81ca1..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanDeserializer.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-
-/**
- * Serializing an object for known object types.
- */
-public class BeanDeserializer extends AbstractMapDeserializer {
- private Class _type;
- private HashMap _methodMap;
- private Method _readResolve;
- private Constructor _constructor;
- private Object[] _constructorArgs;
-
- public BeanDeserializer(Class cl) {
- _type = cl;
- _methodMap = getMethodMap(cl);
-
- _readResolve = getReadResolve(cl);
-
- Constructor[] constructors = cl.getConstructors();
- int bestLength = Integer.MAX_VALUE;
-
- for (int i = 0; i < constructors.length; i++) {
- if (constructors[i].getParameterTypes().length < bestLength) {
- _constructor = constructors[i];
- bestLength = _constructor.getParameterTypes().length;
- }
- }
-
- if (_constructor != null) {
- _constructor.setAccessible(true);
- Class[] params = _constructor.getParameterTypes();
- _constructorArgs = new Object[params.length];
- for (int i = 0; i < params.length; i++) {
- _constructorArgs[i] = getParamArg(params[i]);
- }
- }
- }
-
- /**
- * Creates a map of the classes fields.
- */
- protected static Object getParamArg(Class cl) {
- if (!cl.isPrimitive())
- return null;
- else if (boolean.class.equals(cl))
- return Boolean.FALSE;
- else if (byte.class.equals(cl))
- return Byte.valueOf((byte) 0);
- else if (short.class.equals(cl))
- return Short.valueOf((short) 0);
- else if (char.class.equals(cl))
- return Character.valueOf((char) 0);
- else if (int.class.equals(cl))
- return Integer.valueOf(0);
- else if (long.class.equals(cl))
- return Long.valueOf(0);
- else if (float.class.equals(cl))
- return Double.valueOf(0);
- else if (double.class.equals(cl))
- return Double.valueOf(0);
- else
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Class getType() {
- return _type;
- }
-
- @Override
- public Object readMap(AbstractHessianInput in)
- throws IOException {
- try {
- Object obj = instantiate();
-
- return readMap(in, obj);
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(e);
- }
- }
-
- public Object readMap(AbstractHessianInput in, Object obj)
- throws IOException {
- try {
- int ref = in.addRef(obj);
-
- while (!in.isEnd()) {
- Object key = in.readObject();
-
- Method method = (Method) _methodMap.get(key);
-
- if (method != null) {
- Object value = in.readObject(method.getParameterTypes()[0]);
-
- method.invoke(obj, new Object[]{value});
- } else {
- Object value = in.readObject();
- }
- }
-
- in.readMapEnd();
-
- Object resolve = resolve(obj);
-
- if (obj != resolve)
- in.setRef(ref, resolve);
-
- return resolve;
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(e);
- }
- }
-
- private Object resolve(Object obj) {
- // if there's a readResolve method, call it
- try {
- if (_readResolve != null)
- return _readResolve.invoke(obj, new Object[0]);
- } catch (Exception e) {
- }
-
- return obj;
- }
-
- protected Object instantiate()
- throws Exception {
- return _constructor.newInstance(_constructorArgs);
- }
-
- /**
- * Returns the readResolve method
- */
- protected Method getReadResolve(Class cl) {
- for (; cl != null; cl = cl.getSuperclass()) {
- Method[] methods = cl.getDeclaredMethods();
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (method.getName().equals("readResolve") &&
- method.getParameterTypes().length == 0)
- return method;
- }
- }
-
- return null;
- }
-
- /**
- * Creates a map of the classes fields.
- */
- protected HashMap getMethodMap(Class cl) {
- HashMap methodMap = new HashMap();
-
- for (; cl != null; cl = cl.getSuperclass()) {
- Method[] methods = cl.getDeclaredMethods();
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (Modifier.isStatic(method.getModifiers()))
- continue;
-
- String name = method.getName();
-
- if (!name.startsWith("set"))
- continue;
-
- Class[] paramTypes = method.getParameterTypes();
- if (paramTypes.length != 1)
- continue;
-
- if (!method.getReturnType().equals(void.class))
- continue;
-
- if (findGetter(methods, name, paramTypes[0]) == null)
- continue;
-
- // XXX: could parameterize the handler to only deal with public
- try {
- method.setAccessible(true);
- } catch (Throwable e) {
- e.printStackTrace();
- }
-
- name = name.substring(3);
-
- int j = 0;
- for (; j < name.length() && Character.isUpperCase(name.charAt(j)); j++) {
- }
-
- if (j == 1)
- name = name.substring(0, j).toLowerCase() + name.substring(j);
- else if (j > 1)
- name = name.substring(0, j - 1).toLowerCase() + name.substring(j - 1);
-
-
- methodMap.put(name, method);
- }
- }
-
- return methodMap;
- }
-
- /**
- * Finds any matching setter.
- */
- private Method findGetter(Method[] methods, String setterName, Class arg) {
- String getterName = "get" + setterName.substring(3);
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (!method.getName().equals(getterName))
- continue;
-
- if (!method.getReturnType().equals(arg))
- continue;
-
- Class[] params = method.getParameterTypes();
-
- if (params.length == 0)
- return method;
- }
-
- return null;
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializer.java
deleted file mode 100644
index a3a8ba5f226..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializer.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * 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.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Serializing an object for known object types.
- */
-public class BeanSerializer extends AbstractSerializer {
- private static final Logger log
- = Logger.getLogger(BeanSerializer.class.getName());
-
- private static final Object[] NULL_ARGS = new Object[0];
- private Method[] _methods;
- private String[] _names;
-
- private Object _writeReplaceFactory;
- private Method _writeReplace;
-
- public BeanSerializer(Class cl, ClassLoader loader) {
- introspectWriteReplace(cl, loader);
-
- ArrayList primitiveMethods = new ArrayList();
- ArrayList compoundMethods = new ArrayList();
-
- for (; cl != null; cl = cl.getSuperclass()) {
- Method[] methods = cl.getDeclaredMethods();
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (Modifier.isStatic(method.getModifiers()))
- continue;
-
- if (method.getParameterTypes().length != 0)
- continue;
-
- String name = method.getName();
-
- if (!name.startsWith("get"))
- continue;
-
- Class type = method.getReturnType();
-
- if (type.equals(void.class))
- continue;
-
- if (findSetter(methods, name, type) == null)
- continue;
-
- // XXX: could parameterize the handler to only deal with public
- method.setAccessible(true);
-
- if (type.isPrimitive()
- || type.getName().startsWith("java.lang.")
- && !type.equals(Object.class))
- primitiveMethods.add(method);
- else
- compoundMethods.add(method);
- }
- }
-
- ArrayList methodList = new ArrayList();
- methodList.addAll(primitiveMethods);
- methodList.addAll(compoundMethods);
-
- Collections.sort(methodList, new MethodNameCmp());
-
- _methods = new Method[methodList.size()];
- methodList.toArray(_methods);
-
- _names = new String[_methods.length];
-
- for (int i = 0; i < _methods.length; i++) {
- String name = _methods[i].getName();
-
- name = name.substring(3);
-
- int j = 0;
- for (; j < name.length() && Character.isUpperCase(name.charAt(j)); j++) {
- }
-
- if (j == 1)
- name = name.substring(0, j).toLowerCase() + name.substring(j);
- else if (j > 1)
- name = name.substring(0, j - 1).toLowerCase() + name.substring(j - 1);
-
- _names[i] = name;
- }
- }
-
- private void introspectWriteReplace(Class cl, ClassLoader loader) {
- try {
- String className = cl.getName() + "HessianSerializer";
-
- Class serializerClass = Class.forName(className, false, loader);
-
- Object serializerObject = serializerClass.newInstance();
-
- Method writeReplace = getWriteReplace(serializerClass, cl);
-
- if (writeReplace != null) {
- _writeReplaceFactory = serializerObject;
- _writeReplace = writeReplace;
-
- return;
- }
- } catch (ClassNotFoundException e) {
- } catch (Exception e) {
- log.log(Level.FINER, e.toString(), e);
- }
-
- _writeReplace = getWriteReplace(cl);
- }
-
- /**
- * Returns the writeReplace method
- */
- protected Method getWriteReplace(Class cl) {
- for (; cl != null; cl = cl.getSuperclass()) {
- Method[] methods = cl.getDeclaredMethods();
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (method.getName().equals("writeReplace") &&
- method.getParameterTypes().length == 0)
- return method;
- }
- }
-
- return null;
- }
-
- /**
- * Returns the writeReplace method
- */
- protected Method getWriteReplace(Class cl, Class param) {
- for (; cl != null; cl = cl.getSuperclass()) {
- for (Method method : cl.getDeclaredMethods()) {
- if (method.getName().equals("writeReplace")
- && method.getParameterTypes().length == 1
- && param.equals(method.getParameterTypes()[0]))
- return method;
- }
- }
-
- return null;
- }
-
- @Override
- public void writeObject(Object obj, AbstractHessianOutput out)
- throws IOException {
- if (out.addRef(obj))
- return;
-
- Class cl = obj.getClass();
-
- try {
- if (_writeReplace != null) {
- Object repl;
-
- if (_writeReplaceFactory != null)
- repl = _writeReplace.invoke(_writeReplaceFactory, obj);
- else
- repl = _writeReplace.invoke(obj);
-
- out.removeRef(obj);
-
- out.writeObject(repl);
-
- out.replaceRef(repl, obj);
-
- return;
- }
- } catch (Exception e) {
- log.log(Level.FINER, e.toString(), e);
- }
-
- int ref = out.writeObjectBegin(cl.getName());
-
- if (ref < -1) {
- // Hessian 1.1 uses a map
-
- for (int i = 0; i < _methods.length; i++) {
- Method method = _methods[i];
- Object value = null;
-
- try {
- value = _methods[i].invoke(obj, (Object[]) null);
- } catch (Exception e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- out.writeString(_names[i]);
-
- out.writeObject(value);
- }
-
- out.writeMapEnd();
- } else {
- if (ref == -1) {
- out.writeInt(_names.length);
-
- for (int i = 0; i < _names.length; i++)
- out.writeString(_names[i]);
-
- out.writeObjectBegin(cl.getName());
- }
-
- for (int i = 0; i < _methods.length; i++) {
- Method method = _methods[i];
- Object value = null;
-
- try {
- value = _methods[i].invoke(obj, (Object[]) null);
- } catch (Exception e) {
- log.log(Level.FINER, e.toString(), e);
- }
-
- out.writeObject(value);
- }
- }
- }
-
- /**
- * Finds any matching setter.
- */
- private Method findSetter(Method[] methods, String getterName, Class arg) {
- String setterName = "set" + getterName.substring(3);
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (!method.getName().equals(setterName))
- continue;
-
- if (!method.getReturnType().equals(void.class))
- continue;
-
- Class[] params = method.getParameterTypes();
-
- if (params.length == 1 && params[0].equals(arg))
- return method;
- }
-
- return null;
- }
-
- static class MethodNameCmp implements Comparator
- * C type int
- * InputStream is = ...; // from http connection
- * HessianInput in = new HessianInput(is);
- * String value;
- *
- * in.startReply(); // read reply header
- * value = in.readString(); // read string value
- * in.completeReply(); // read reply footer
- *
- */
-public class Hessian2Input
- extends AbstractHessianInput
- implements Hessian2Constants {
- private static final Logger log
- = Logger.getLogger(Hessian2Input.class.getName());
-
- private static final double D_256 = 1.0 / 256.0;
- private static final int END_OF_DATA = -2;
- private static final int SIZE = 256;
- private static final int GAP = 16;
- private static Field _detailMessageField;
- private static boolean _isCloseStreamOnClose;
-
- static {
- try {
- _detailMessageField = Throwable.class.getDeclaredField("detailMessage");
- _detailMessageField.setAccessible(true);
- } catch (Throwable e) {
- }
- }
-
- private final byte[] _buffer = new byte[SIZE];
- // factory for deserializing objects in the input stream
- protected SerializerFactory _serializerFactory;
- protected ArrayList _refs;
- protected ArrayList _classDefs;
- protected ArrayList _types;
- // the underlying input stream
- private InputStream _is;
- // a peek character
- private int _offset;
- private int _length;
- // true for streaming data
- private boolean _isStreaming;
- // the method for a call
- private String _method;
- private int _argLength;
- private Reader _chunkReader;
- private InputStream _chunkInputStream;
- private Throwable _replyFault;
- private StringBuilder _sbuf = new StringBuilder();
- // true if this is the last chunk
- private boolean _isLastChunk;
- // the chunk length
- private int _chunkLength;
-
- /**
- * Creates a new Hessian input stream, initialized with an
- * underlying input stream.
- *
- * @param is the underlying input stream.
- */
- public Hessian2Input(InputStream is) {
- _is = is;
- }
-
- /**
- * Gets the serializer factory.
- */
- public SerializerFactory getSerializerFactory() {
- return _serializerFactory;
- }
-
- /**
- * Sets the serializer factory.
- */
- @Override
- public void setSerializerFactory(SerializerFactory factory) {
- _serializerFactory = factory;
- }
-
- /**
- * Gets the serializer factory, creating a default if necessary.
- */
- public final SerializerFactory findSerializerFactory() {
- SerializerFactory factory = _serializerFactory;
-
- if (factory == null)
- _serializerFactory = factory = new SerializerFactory();
-
- return factory;
- }
-
- public boolean isCloseStreamOnClose() {
- return _isCloseStreamOnClose;
- }
-
- public void setCloseStreamOnClose(boolean isClose) {
- _isCloseStreamOnClose = isClose;
- }
-
- /**
- * Returns the calls method
- */
- @Override
- public String getMethod() {
- return _method;
- }
-
- /**
- * Returns any reply fault.
- */
- public Throwable getReplyFault() {
- return _replyFault;
- }
-
- /**
- * Starts reading the call
- *
- * c major minor
- *
- */
- @Override
- public int readCall()
- throws IOException {
- int tag = read();
-
- if (tag != 'C')
- throw error("expected hessian call ('C') at " + codeName(tag));
-
- return 0;
- }
-
- /**
- * Starts reading the envelope
- *
- * E major minor
- *
- */
- public int readEnvelope()
- throws IOException {
- int tag = read();
- int version = 0;
-
- if (tag == 'H') {
- int major = read();
- int minor = read();
-
- version = (major << 16) + minor;
-
- tag = read();
- }
-
- if (tag != 'E')
- throw error("expected hessian Envelope ('E') at " + codeName(tag));
-
- return version;
- }
-
- /**
- * Completes reading the envelope
- *
- * Z
- *
- */
- public void completeEnvelope()
- throws IOException {
- int tag = read();
-
- if (tag != 'Z')
- error("expected end of envelope at " + codeName(tag));
- }
-
- /**
- * Starts reading the call
- *
- * string
- *
- */
- @Override
- public String readMethod()
- throws IOException {
- _method = readString();
-
- return _method;
- }
-
- /**
- * Returns the number of method arguments
- *
- * int
- *
- */
- @Override
- public int readMethodArgLength()
- throws IOException {
- return readInt();
- }
-
- /**
- * Starts reading the call, including the headers.
- *
- * c major minor
- * m b16 b8 method
- *
- */
- @Override
- public void startCall()
- throws IOException {
- readCall();
-
- readMethod();
- }
-
- /**
- * Completes reading the call
- *
- *
- */
- @Override
- public void completeCall()
- throws IOException {
- }
-
- /**
- * Reads a reply as an object.
- * If the reply has a fault, throws the exception.
- */
- @Override
- public Object readReply(Class expectedClass)
- throws Throwable {
- int tag = read();
-
- if (tag == 'R')
- return readObject(expectedClass);
- else if (tag == 'F') {
- HashMap map = (HashMap) readObject(HashMap.class);
-
- throw prepareFault(map);
- } else {
- StringBuilder sb = new StringBuilder();
- sb.append((char) tag);
-
- try {
- int ch;
-
- while ((ch = read()) >= 0) {
- sb.append((char) ch);
- }
- } catch (IOException e) {
- log.log(Level.FINE, e.toString(), e);
- }
-
- throw error("expected hessian reply at " + codeName(tag) + "\n"
- + sb);
- }
- }
-
- /**
- * Starts reading the reply
- *
- * r
- *
- */
- @Override
- public void startReply()
- throws Throwable {
- // XXX: for variable length (?)
-
- readReply(Object.class);
- }
-
- /**
- * Prepares the fault.
- */
- private Throwable prepareFault(HashMap fault)
- throws IOException {
- Object detail = fault.get("detail");
- String message = (String) fault.get("message");
-
- if (detail instanceof Throwable) {
- _replyFault = (Throwable) detail;
-
- if (message != null && _detailMessageField != null) {
- try {
- _detailMessageField.set(_replyFault, message);
- } catch (Throwable e) {
- }
- }
-
- return _replyFault;
- } else {
- String code = (String) fault.get("code");
-
- _replyFault = new HessianServiceException(message, code, detail);
-
- return _replyFault;
- }
- }
-
- /**
- * Completes reading the call
- *
- * z
- *
- */
- @Override
- public void completeReply()
- throws IOException {
- }
-
- /**
- * Completes reading the call
- *
- * z
- *
- */
- public void completeValueReply()
- throws IOException {
- int tag = read();
-
- if (tag != 'Z')
- error("expected end of reply at " + codeName(tag));
- }
-
- /**
- * Reads a header, returning null if there are no headers.
- *
- * H b16 b8 value
- *
- */
- @Override
- public String readHeader()
- throws IOException {
- return null;
- }
-
- /**
- * Starts reading the message
- *
- * p major minor
- *
- */
- public int startMessage()
- throws IOException {
- int tag = read();
-
- if (tag == 'p')
- _isStreaming = false;
- else if (tag == 'P')
- _isStreaming = true;
- else
- throw error("expected Hessian message ('p') at " + codeName(tag));
-
- int major = read();
- int minor = read();
-
- return (major << 16) + minor;
- }
-
- /**
- * Completes reading the message
- *
- * z
- *
- */
- public void completeMessage()
- throws IOException {
- int tag = read();
-
- if (tag != 'Z')
- error("expected end of message at " + codeName(tag));
- }
-
- /**
- * Reads a null
- *
- * N
- *
- */
- @Override
- public void readNull()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return;
-
- default:
- throw expect("null", tag);
- }
- }
-
- /**
- * Reads a boolean
- *
- * T
- * F
- *
- */
- @Override
- public boolean readBoolean()
- throws IOException {
- int tag = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- switch (tag) {
- case 'T':
- return true;
- case 'F':
- return false;
-
- // direct integer
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8a:
- case 0x8b:
- case 0x8c:
- case 0x8d:
- case 0x8e:
- case 0x8f:
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9a:
- case 0x9b:
- case 0x9c:
- case 0x9d:
- case 0x9e:
- case 0x9f:
-
- case 0xa0:
- case 0xa1:
- case 0xa2:
- case 0xa3:
- case 0xa4:
- case 0xa5:
- case 0xa6:
- case 0xa7:
- case 0xa8:
- case 0xa9:
- case 0xaa:
- case 0xab:
- case 0xac:
- case 0xad:
- case 0xae:
- case 0xaf:
-
- case 0xb0:
- case 0xb1:
- case 0xb2:
- case 0xb3:
- case 0xb4:
- case 0xb5:
- case 0xb6:
- case 0xb7:
- case 0xb8:
- case 0xb9:
- case 0xba:
- case 0xbb:
- case 0xbc:
- case 0xbd:
- case 0xbe:
- case 0xbf:
- return tag != BC_INT_ZERO;
-
- // INT_BYTE = 0
- case 0xc8:
- return read() != 0;
-
- // INT_BYTE != 0
- case 0xc0:
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- case 0xc5:
- case 0xc6:
- case 0xc7:
- case 0xc9:
- case 0xca:
- case 0xcb:
- case 0xcc:
- case 0xcd:
- case 0xce:
- case 0xcf:
- read();
- return true;
-
- // INT_SHORT = 0
- case 0xd4:
- return (256 * read() + read()) != 0;
-
- // INT_SHORT != 0
- case 0xd0:
- case 0xd1:
- case 0xd2:
- case 0xd3:
- case 0xd5:
- case 0xd6:
- case 0xd7:
- read();
- read();
- return true;
-
- case 'I':
- return
- parseInt() != 0;
-
- case 0xd8:
- case 0xd9:
- case 0xda:
- case 0xdb:
- case 0xdc:
- case 0xdd:
- case 0xde:
- case 0xdf:
-
- case 0xe0:
- case 0xe1:
- case 0xe2:
- case 0xe3:
- case 0xe4:
- case 0xe5:
- case 0xe6:
- case 0xe7:
- case 0xe8:
- case 0xe9:
- case 0xea:
- case 0xeb:
- case 0xec:
- case 0xed:
- case 0xee:
- case 0xef:
- return tag != BC_LONG_ZERO;
-
- // LONG_BYTE = 0
- case 0xf8:
- return read() != 0;
-
- // LONG_BYTE != 0
- case 0xf0:
- case 0xf1:
- case 0xf2:
- case 0xf3:
- case 0xf4:
- case 0xf5:
- case 0xf6:
- case 0xf7:
- case 0xf9:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- case 0xfd:
- case 0xfe:
- case 0xff:
- read();
- return true;
-
- // INT_SHORT = 0
- case 0x3c:
- return (256 * read() + read()) != 0;
-
- // INT_SHORT != 0
- case 0x38:
- case 0x39:
- case 0x3a:
- case 0x3b:
- case 0x3d:
- case 0x3e:
- case 0x3f:
- read();
- read();
- return true;
-
- case BC_LONG_INT:
- return (0x1000000L * read()
- + 0x10000L * read()
- + 0x100 * read()
- + read()) != 0;
-
- case 'L':
- return parseLong() != 0;
-
- case BC_DOUBLE_ZERO:
- return false;
-
- case BC_DOUBLE_ONE:
- return true;
-
- case BC_DOUBLE_BYTE:
- return read() != 0;
-
- case BC_DOUBLE_SHORT:
- return (0x100 * read() + read()) != 0;
-
- case BC_DOUBLE_MILL: {
- int mills = parseInt();
-
- return mills != 0;
- }
-
- case 'D':
- return parseDouble() != 0.0;
-
- case 'N':
- return false;
-
- default:
- throw expect("boolean", tag);
- }
- }
-
- /**
- * Reads a short
- *
- * I b32 b24 b16 b8
- *
- */
- public short readShort()
- throws IOException {
- return (short) readInt();
- }
-
- /**
- * Reads an integer
- *
- * I b32 b24 b16 b8
- *
- */
- @Override
- public final int readInt()
- throws IOException {
- //int tag = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
- int tag = read();
-
- switch (tag) {
- case 'N':
- return 0;
-
- case 'F':
- return 0;
-
- case 'T':
- return 1;
-
- // direct integer
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8a:
- case 0x8b:
- case 0x8c:
- case 0x8d:
- case 0x8e:
- case 0x8f:
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9a:
- case 0x9b:
- case 0x9c:
- case 0x9d:
- case 0x9e:
- case 0x9f:
-
- case 0xa0:
- case 0xa1:
- case 0xa2:
- case 0xa3:
- case 0xa4:
- case 0xa5:
- case 0xa6:
- case 0xa7:
- case 0xa8:
- case 0xa9:
- case 0xaa:
- case 0xab:
- case 0xac:
- case 0xad:
- case 0xae:
- case 0xaf:
-
- case 0xb0:
- case 0xb1:
- case 0xb2:
- case 0xb3:
- case 0xb4:
- case 0xb5:
- case 0xb6:
- case 0xb7:
- case 0xb8:
- case 0xb9:
- case 0xba:
- case 0xbb:
- case 0xbc:
- case 0xbd:
- case 0xbe:
- case 0xbf:
- return tag - BC_INT_ZERO;
-
- /* byte int */
- case 0xc0:
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- case 0xc5:
- case 0xc6:
- case 0xc7:
- case 0xc8:
- case 0xc9:
- case 0xca:
- case 0xcb:
- case 0xcc:
- case 0xcd:
- case 0xce:
- case 0xcf:
- return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
-
- /* short int */
- case 0xd0:
- case 0xd1:
- case 0xd2:
- case 0xd3:
- case 0xd4:
- case 0xd5:
- case 0xd6:
- case 0xd7:
- return ((tag - BC_INT_SHORT_ZERO) << 16) + 256 * read() + read();
-
- case 'I':
- case BC_LONG_INT:
- return ((read() << 24)
- + (read() << 16)
- + (read() << 8)
- + read());
-
- // direct long
- case 0xd8:
- case 0xd9:
- case 0xda:
- case 0xdb:
- case 0xdc:
- case 0xdd:
- case 0xde:
- case 0xdf:
-
- case 0xe0:
- case 0xe1:
- case 0xe2:
- case 0xe3:
- case 0xe4:
- case 0xe5:
- case 0xe6:
- case 0xe7:
- case 0xe8:
- case 0xe9:
- case 0xea:
- case 0xeb:
- case 0xec:
- case 0xed:
- case 0xee:
- case 0xef:
- return tag - BC_LONG_ZERO;
-
- /* byte long */
- case 0xf0:
- case 0xf1:
- case 0xf2:
- case 0xf3:
- case 0xf4:
- case 0xf5:
- case 0xf6:
- case 0xf7:
- case 0xf8:
- case 0xf9:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- case 0xfd:
- case 0xfe:
- case 0xff:
- return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
-
- /* short long */
- case 0x38:
- case 0x39:
- case 0x3a:
- case 0x3b:
- case 0x3c:
- case 0x3d:
- case 0x3e:
- case 0x3f:
- return ((tag - BC_LONG_SHORT_ZERO) << 16) + 256 * read() + read();
-
- case 'L':
- return (int) parseLong();
-
- case BC_DOUBLE_ZERO:
- return 0;
-
- case BC_DOUBLE_ONE:
- return 1;
-
- //case LONG_BYTE:
- case BC_DOUBLE_BYTE:
- return (byte) (_offset < _length ? _buffer[_offset++] : read());
-
- //case INT_SHORT:
- //case LONG_SHORT:
- case BC_DOUBLE_SHORT:
- return (short) (256 * read() + read());
-
- case BC_DOUBLE_MILL: {
- int mills = parseInt();
-
- return (int) (0.001 * mills);
- }
-
- case 'D':
- return (int) parseDouble();
-
- default:
- throw expect("integer", tag);
- }
- }
-
- /**
- * Reads a long
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public long readLong()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return 0;
-
- case 'F':
- return 0;
-
- case 'T':
- return 1;
-
- // direct integer
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8a:
- case 0x8b:
- case 0x8c:
- case 0x8d:
- case 0x8e:
- case 0x8f:
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9a:
- case 0x9b:
- case 0x9c:
- case 0x9d:
- case 0x9e:
- case 0x9f:
-
- case 0xa0:
- case 0xa1:
- case 0xa2:
- case 0xa3:
- case 0xa4:
- case 0xa5:
- case 0xa6:
- case 0xa7:
- case 0xa8:
- case 0xa9:
- case 0xaa:
- case 0xab:
- case 0xac:
- case 0xad:
- case 0xae:
- case 0xaf:
-
- case 0xb0:
- case 0xb1:
- case 0xb2:
- case 0xb3:
- case 0xb4:
- case 0xb5:
- case 0xb6:
- case 0xb7:
- case 0xb8:
- case 0xb9:
- case 0xba:
- case 0xbb:
- case 0xbc:
- case 0xbd:
- case 0xbe:
- case 0xbf:
- return tag - BC_INT_ZERO;
-
- /* byte int */
- case 0xc0:
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- case 0xc5:
- case 0xc6:
- case 0xc7:
- case 0xc8:
- case 0xc9:
- case 0xca:
- case 0xcb:
- case 0xcc:
- case 0xcd:
- case 0xce:
- case 0xcf:
- return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
-
- /* short int */
- case 0xd0:
- case 0xd1:
- case 0xd2:
- case 0xd3:
- case 0xd4:
- case 0xd5:
- case 0xd6:
- case 0xd7:
- return ((tag - BC_INT_SHORT_ZERO) << 16) + 256 * read() + read();
-
- //case LONG_BYTE:
- case BC_DOUBLE_BYTE:
- return (byte) (_offset < _length ? _buffer[_offset++] : read());
-
- //case INT_SHORT:
- //case LONG_SHORT:
- case BC_DOUBLE_SHORT:
- return (short) (256 * read() + read());
-
- case 'I':
- case BC_LONG_INT:
- return parseInt();
-
- // direct long
- case 0xd8:
- case 0xd9:
- case 0xda:
- case 0xdb:
- case 0xdc:
- case 0xdd:
- case 0xde:
- case 0xdf:
-
- case 0xe0:
- case 0xe1:
- case 0xe2:
- case 0xe3:
- case 0xe4:
- case 0xe5:
- case 0xe6:
- case 0xe7:
- case 0xe8:
- case 0xe9:
- case 0xea:
- case 0xeb:
- case 0xec:
- case 0xed:
- case 0xee:
- case 0xef:
- return tag - BC_LONG_ZERO;
-
- /* byte long */
- case 0xf0:
- case 0xf1:
- case 0xf2:
- case 0xf3:
- case 0xf4:
- case 0xf5:
- case 0xf6:
- case 0xf7:
- case 0xf8:
- case 0xf9:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- case 0xfd:
- case 0xfe:
- case 0xff:
- return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
-
- /* short long */
- case 0x38:
- case 0x39:
- case 0x3a:
- case 0x3b:
- case 0x3c:
- case 0x3d:
- case 0x3e:
- case 0x3f:
- return ((tag - BC_LONG_SHORT_ZERO) << 16) + 256 * read() + read();
-
- case 'L':
- return parseLong();
-
- case BC_DOUBLE_ZERO:
- return 0;
-
- case BC_DOUBLE_ONE:
- return 1;
-
- case BC_DOUBLE_MILL: {
- int mills = parseInt();
-
- return (long) (0.001 * mills);
- }
-
- case 'D':
- return (long) parseDouble();
-
- default:
- throw expect("long", tag);
- }
- }
-
- /**
- * Reads a float
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- public float readFloat()
- throws IOException {
- return (float) readDouble();
- }
-
- /**
- * Reads a double
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public double readDouble()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return 0;
-
- case 'F':
- return 0;
-
- case 'T':
- return 1;
-
- // direct integer
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8a:
- case 0x8b:
- case 0x8c:
- case 0x8d:
- case 0x8e:
- case 0x8f:
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9a:
- case 0x9b:
- case 0x9c:
- case 0x9d:
- case 0x9e:
- case 0x9f:
-
- case 0xa0:
- case 0xa1:
- case 0xa2:
- case 0xa3:
- case 0xa4:
- case 0xa5:
- case 0xa6:
- case 0xa7:
- case 0xa8:
- case 0xa9:
- case 0xaa:
- case 0xab:
- case 0xac:
- case 0xad:
- case 0xae:
- case 0xaf:
-
- case 0xb0:
- case 0xb1:
- case 0xb2:
- case 0xb3:
- case 0xb4:
- case 0xb5:
- case 0xb6:
- case 0xb7:
- case 0xb8:
- case 0xb9:
- case 0xba:
- case 0xbb:
- case 0xbc:
- case 0xbd:
- case 0xbe:
- case 0xbf:
- return tag - 0x90;
-
- /* byte int */
- case 0xc0:
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- case 0xc5:
- case 0xc6:
- case 0xc7:
- case 0xc8:
- case 0xc9:
- case 0xca:
- case 0xcb:
- case 0xcc:
- case 0xcd:
- case 0xce:
- case 0xcf:
- return ((tag - BC_INT_BYTE_ZERO) << 8) + read();
-
- /* short int */
- case 0xd0:
- case 0xd1:
- case 0xd2:
- case 0xd3:
- case 0xd4:
- case 0xd5:
- case 0xd6:
- case 0xd7:
- return ((tag - BC_INT_SHORT_ZERO) << 16) + 256 * read() + read();
-
- case 'I':
- case BC_LONG_INT:
- return parseInt();
-
- // direct long
- case 0xd8:
- case 0xd9:
- case 0xda:
- case 0xdb:
- case 0xdc:
- case 0xdd:
- case 0xde:
- case 0xdf:
-
- case 0xe0:
- case 0xe1:
- case 0xe2:
- case 0xe3:
- case 0xe4:
- case 0xe5:
- case 0xe6:
- case 0xe7:
- case 0xe8:
- case 0xe9:
- case 0xea:
- case 0xeb:
- case 0xec:
- case 0xed:
- case 0xee:
- case 0xef:
- return tag - BC_LONG_ZERO;
-
- /* byte long */
- case 0xf0:
- case 0xf1:
- case 0xf2:
- case 0xf3:
- case 0xf4:
- case 0xf5:
- case 0xf6:
- case 0xf7:
- case 0xf8:
- case 0xf9:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- case 0xfd:
- case 0xfe:
- case 0xff:
- return ((tag - BC_LONG_BYTE_ZERO) << 8) + read();
-
- /* short long */
- case 0x38:
- case 0x39:
- case 0x3a:
- case 0x3b:
- case 0x3c:
- case 0x3d:
- case 0x3e:
- case 0x3f:
- return ((tag - BC_LONG_SHORT_ZERO) << 16) + 256 * read() + read();
-
- case 'L':
- return (double) parseLong();
-
- case BC_DOUBLE_ZERO:
- return 0;
-
- case BC_DOUBLE_ONE:
- return 1;
-
- case BC_DOUBLE_BYTE:
- return (byte) (_offset < _length ? _buffer[_offset++] : read());
-
- case BC_DOUBLE_SHORT:
- return (short) (256 * read() + read());
-
- case BC_DOUBLE_MILL: {
- int mills = parseInt();
-
- return 0.001 * mills;
- }
-
- case 'D':
- return parseDouble();
-
- default:
- throw expect("double", tag);
- }
- }
-
- /**
- * Reads a date.
- *
- * T b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public long readUTCDate()
- throws IOException {
- int tag = read();
-
- if (tag == BC_DATE) {
- return parseLong();
- } else if (tag == BC_DATE_MINUTE) {
- return parseInt() * 60000L;
- } else
- throw expect("date", tag);
- }
-
- /**
- * Reads a byte from the stream.
- */
- public int readChar()
- throws IOException {
- if (_chunkLength > 0) {
- _chunkLength--;
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- int ch = parseUTF8Char();
- return ch;
- } else if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- }
-
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'S':
- case BC_STRING_CHUNK:
- _isLastChunk = tag == 'S';
- _chunkLength = (read() << 8) + read();
-
- _chunkLength--;
- int value = parseUTF8Char();
-
- // special code so successive read byte won't
- // be read as a single object.
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return value;
-
- default:
- throw expect("char", tag);
- }
- }
-
- /**
- * Reads a byte array from the stream.
- */
- public int readString(char[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- } else if (_chunkLength == 0) {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'S':
- case BC_STRING_CHUNK:
- _isLastChunk = tag == 'S';
- _chunkLength = (read() << 8) + read();
- break;
-
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
- _isLastChunk = true;
- _chunkLength = tag - 0x00;
- break;
-
- default:
- throw expect("string", tag);
- }
- }
-
- while (length > 0) {
- if (_chunkLength > 0) {
- buffer[offset++] = (char) parseUTF8Char();
- _chunkLength--;
- length--;
- readLength++;
- } else if (_isLastChunk) {
- if (readLength == 0)
- return -1;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- } else {
- int tag = read();
-
- switch (tag) {
- case 'S':
- case BC_STRING_CHUNK:
- _isLastChunk = tag == 'S';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("string", tag);
- }
- }
- }
-
- if (readLength == 0)
- return -1;
- else if (_chunkLength > 0 || !_isLastChunk)
- return readLength;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- }
-
- /**
- * Reads a string
- *
- * S b16 b8 string value
- *
- */
- @Override
- public String readString()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
- case 'T':
- return "true";
- case 'F':
- return "false";
-
- // direct integer
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8a:
- case 0x8b:
- case 0x8c:
- case 0x8d:
- case 0x8e:
- case 0x8f:
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9a:
- case 0x9b:
- case 0x9c:
- case 0x9d:
- case 0x9e:
- case 0x9f:
-
- case 0xa0:
- case 0xa1:
- case 0xa2:
- case 0xa3:
- case 0xa4:
- case 0xa5:
- case 0xa6:
- case 0xa7:
- case 0xa8:
- case 0xa9:
- case 0xaa:
- case 0xab:
- case 0xac:
- case 0xad:
- case 0xae:
- case 0xaf:
-
- case 0xb0:
- case 0xb1:
- case 0xb2:
- case 0xb3:
- case 0xb4:
- case 0xb5:
- case 0xb6:
- case 0xb7:
- case 0xb8:
- case 0xb9:
- case 0xba:
- case 0xbb:
- case 0xbc:
- case 0xbd:
- case 0xbe:
- case 0xbf:
- return String.valueOf((tag - 0x90));
-
- /* byte int */
- case 0xc0:
- case 0xc1:
- case 0xc2:
- case 0xc3:
- case 0xc4:
- case 0xc5:
- case 0xc6:
- case 0xc7:
- case 0xc8:
- case 0xc9:
- case 0xca:
- case 0xcb:
- case 0xcc:
- case 0xcd:
- case 0xce:
- case 0xcf:
- return String.valueOf(((tag - BC_INT_BYTE_ZERO) << 8) + read());
-
- /* short int */
- case 0xd0:
- case 0xd1:
- case 0xd2:
- case 0xd3:
- case 0xd4:
- case 0xd5:
- case 0xd6:
- case 0xd7:
- return String.valueOf(((tag - BC_INT_SHORT_ZERO) << 16)
- + 256 * read() + read());
-
- case 'I':
- case BC_LONG_INT:
- return String.valueOf(parseInt());
-
- // direct long
- case 0xd8:
- case 0xd9:
- case 0xda:
- case 0xdb:
- case 0xdc:
- case 0xdd:
- case 0xde:
- case 0xdf:
-
- case 0xe0:
- case 0xe1:
- case 0xe2:
- case 0xe3:
- case 0xe4:
- case 0xe5:
- case 0xe6:
- case 0xe7:
- case 0xe8:
- case 0xe9:
- case 0xea:
- case 0xeb:
- case 0xec:
- case 0xed:
- case 0xee:
- case 0xef:
- return String.valueOf(tag - BC_LONG_ZERO);
-
- /* byte long */
- case 0xf0:
- case 0xf1:
- case 0xf2:
- case 0xf3:
- case 0xf4:
- case 0xf5:
- case 0xf6:
- case 0xf7:
- case 0xf8:
- case 0xf9:
- case 0xfa:
- case 0xfb:
- case 0xfc:
- case 0xfd:
- case 0xfe:
- case 0xff:
- return String.valueOf(((tag - BC_LONG_BYTE_ZERO) << 8) + read());
-
- /* short long */
- case 0x38:
- case 0x39:
- case 0x3a:
- case 0x3b:
- case 0x3c:
- case 0x3d:
- case 0x3e:
- case 0x3f:
- return String.valueOf(((tag - BC_LONG_SHORT_ZERO) << 16)
- + 256 * read() + read());
-
- case 'L':
- return String.valueOf(parseLong());
-
- case BC_DOUBLE_ZERO:
- return "0.0";
-
- case BC_DOUBLE_ONE:
- return "1.0";
-
- case BC_DOUBLE_BYTE:
- return String.valueOf((byte) (_offset < _length
- ? _buffer[_offset++]
- : read()));
-
- case BC_DOUBLE_SHORT:
- return String.valueOf(((short) (256 * read() + read())));
-
- case BC_DOUBLE_MILL: {
- int mills = parseInt();
-
- return String.valueOf(0.001 * mills);
- }
-
- case 'D':
- return String.valueOf(parseDouble());
-
- case 'S':
- case BC_STRING_CHUNK:
- _isLastChunk = tag == 'S';
- _chunkLength = (read() << 8) + read();
-
- _sbuf.setLength(0);
- int ch;
-
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
-
- // 0-byte string
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
- _isLastChunk = true;
- _chunkLength = tag - 0x00;
-
- _sbuf.setLength(0);
-
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
-
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- _isLastChunk = true;
- _chunkLength = (tag - 0x30) * 256 + read();
-
- _sbuf.setLength(0);
-
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
-
- default:
- throw expect("string", tag);
- }
- }
-
- /**
- * Reads a byte array
- *
- * B b16 b8 data value
- *
- */
- @Override
- public byte[] readBytes()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'B':
- case BC_BINARY_CHUNK:
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
- int data;
- while ((data = parseByte()) >= 0)
- bos.write(data);
-
- return bos.toByteArray();
-
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2a:
- case 0x2b:
- case 0x2c:
- case 0x2d:
- case 0x2e:
- case 0x2f: {
- _isLastChunk = true;
- _chunkLength = tag - 0x20;
-
- byte[] buffer = new byte[_chunkLength];
-
- int k = 0;
- while ((data = parseByte()) >= 0)
- buffer[k++] = (byte) data;
-
- return buffer;
- }
-
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37: {
- _isLastChunk = true;
- _chunkLength = (tag - 0x34) * 256 + read();
-
- byte[] buffer = new byte[_chunkLength];
- int k = 0;
-
- while ((data = parseByte()) >= 0) {
- buffer[k++] = (byte) data;
- }
-
- return buffer;
- }
-
- default:
- throw expect("bytes", tag);
- }
- }
-
- /**
- * Reads a byte from the stream.
- */
- public int readByte()
- throws IOException {
- if (_chunkLength > 0) {
- _chunkLength--;
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return read();
- } else if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- }
-
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'B':
- case BC_BINARY_CHUNK:
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
-
- int value = parseByte();
-
- // special code so successive read byte won't
- // be read as a single object.
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return value;
-
- default:
- throw expect("binary", tag);
- }
- }
-
- /**
- * Reads a byte array from the stream.
- */
- public int readBytes(byte[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- } else if (_chunkLength == 0) {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'B':
- case BC_BINARY_CHUNK:
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("binary", tag);
- }
- }
-
- while (length > 0) {
- if (_chunkLength > 0) {
- buffer[offset++] = (byte) read();
- _chunkLength--;
- length--;
- readLength++;
- } else if (_isLastChunk) {
- if (readLength == 0)
- return -1;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- } else {
- int tag = read();
-
- switch (tag) {
- case 'B':
- case BC_BINARY_CHUNK:
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("binary", tag);
- }
- }
- }
-
- if (readLength == 0)
- return -1;
- else if (_chunkLength > 0 || !_isLastChunk)
- return readLength;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- }
-
- /**
- * Reads a fault.
- */
- private HashMap readFault()
- throws IOException {
- HashMap map = new HashMap();
-
- int code = read();
- for (; code > 0 && code != 'Z'; code = read()) {
- _offset--;
-
- Object key = readObject();
- Object value = readObject();
-
- if (key != null && value != null)
- map.put(key, value);
- }
-
- if (code != 'Z')
- throw expect("fault", code);
-
- return map;
- }
-
- /**
- * Reads an object from the input stream with an expected type.
- */
- @Override
- public Object readObject(Class cl)
- throws IOException {
- return readObject(cl, null, null);
- }
-
- @Override
- public Object readObject(Class expectedClass, Class>... expectedTypes) throws IOException {
- if (expectedClass == null || expectedClass == Object.class)
- return readObject();
-
- int tag = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'H': {
- Deserializer reader = findSerializerFactory().getDeserializer(expectedClass);
-
- boolean keyValuePair = expectedTypes != null && expectedTypes.length == 2;
- // fix deserialize of short type
- return reader.readMap(this
- , keyValuePair ? expectedTypes[0] : null
- , keyValuePair ? expectedTypes[1] : null);
- }
-
- case 'M': {
- String type = readType();
-
- // hessian/3bb3
- if ("".equals(type)) {
- Deserializer reader;
- reader = findSerializerFactory().getDeserializer(expectedClass);
-
- return reader.readMap(this);
- } else {
- Deserializer reader;
- reader = findSerializerFactory().getObjectDeserializer(type, expectedClass);
-
- return reader.readMap(this);
- }
- }
-
- case 'C': {
- readObjectDefinition(expectedClass);
-
- return readObject(expectedClass);
- }
-
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6a:
- case 0x6b:
- case 0x6c:
- case 0x6d:
- case 0x6e:
- case 0x6f: {
- int ref = tag - 0x60;
- int size = _classDefs.size();
-
- if (ref < 0 || size <= ref)
- throw new HessianProtocolException("'" + ref + "' is an unknown class definition");
-
- ObjectDefinition def = (ObjectDefinition) _classDefs.get(ref);
-
- return readObjectInstance(expectedClass, def);
- }
-
- case 'O': {
- int ref = readInt();
- int size = _classDefs.size();
-
- if (ref < 0 || size <= ref)
- throw new HessianProtocolException("'" + ref + "' is an unknown class definition");
-
- ObjectDefinition def = (ObjectDefinition) _classDefs.get(ref);
-
- return readObjectInstance(expectedClass, def);
- }
-
- case BC_LIST_VARIABLE: {
- String type = readType();
-
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(type, expectedClass);
-
- Object v = reader.readList(this, -1);
-
- return v;
- }
-
- case BC_LIST_FIXED: {
- String type = readType();
- int length = readInt();
-
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(type, expectedClass);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- Object v = reader.readLengthList(this, length, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77: {
- int length = tag - 0x70;
-
- String type = readType();
-
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(null, expectedClass);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- // fix deserialize of short type
- Object v = reader.readLengthList(this, length, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case BC_LIST_VARIABLE_UNTYPED: {
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(null, expectedClass);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- // fix deserialize of short type
- Object v = reader.readList(this, -1, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case BC_LIST_FIXED_UNTYPED: {
- int length = readInt();
-
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(null, expectedClass);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- // fix deserialize of short type
- Object v = reader.readLengthList(this, length, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case 0x78:
- case 0x79:
- case 0x7a:
- case 0x7b:
- case 0x7c:
- case 0x7d:
- case 0x7e:
- case 0x7f: {
- int length = tag - 0x78;
-
- Deserializer reader;
- reader = findSerializerFactory().getListDeserializer(null, expectedClass);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- // fix deserialize of short type
- Object v = reader.readLengthList(this, length, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case BC_REF: {
- int ref = readInt();
-
- return _refs.get(ref);
- }
- }
-
- if (tag >= 0)
- _offset--;
-
- // hessian/3b2i vs hessian/3406
- // return readObject();
- Object value = findSerializerFactory().getDeserializer(expectedClass).readObject(this);
- return value;
- }
-
- /**
- * Reads an arbitrary object from the input stream when the type
- * is unknown.
- */
- @Override
- public Object readObject()
- throws IOException {
- return readObject((List
- * O string
- */
- private void readObjectDefinition(Class cl)
- throws IOException {
- String type = readString();
- int len = readInt();
-
- String[] fieldNames = new String[len];
- for (int i = 0; i < len; i++)
- fieldNames[i] = readString();
-
- ObjectDefinition def = new ObjectDefinition(type, fieldNames);
-
- if (_classDefs == null)
- _classDefs = new ArrayList();
-
- _classDefs.add(def);
- }
-
- private Object readObjectInstance(Class cl, ObjectDefinition def)
- throws IOException {
- String type = def.getType();
- String[] fieldNames = def.getFieldNames();
-
- if (cl != null) {
- Deserializer reader;
- reader = findSerializerFactory().getObjectDeserializer(type, cl);
-
- return reader.readObject(this, fieldNames);
- } else {
- return findSerializerFactory().readObject(this, type, fieldNames);
- }
- }
-
- private String readLenString()
- throws IOException {
- int len = readInt();
-
- _isLastChunk = true;
- _chunkLength = len;
-
- _sbuf.setLength(0);
- int ch;
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
- }
-
- private String readLenString(int len)
- throws IOException {
- _isLastChunk = true;
- _chunkLength = len;
-
- _sbuf.setLength(0);
- int ch;
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
- }
-
- /**
- * Reads a remote object.
- */
- @Override
- public Object readRemote()
- throws IOException {
- String type = readType();
- String url = readString();
-
- return resolveRemote(type, url);
- }
-
- /**
- * Reads a reference.
- */
- @Override
- public Object readRef()
- throws IOException {
- return _refs.get(parseInt());
- }
-
- /**
- * Reads the start of a list.
- */
- @Override
- public int readListStart()
- throws IOException {
- return read();
- }
-
- /**
- * Reads the start of a list.
- */
- @Override
- public int readMapStart()
- throws IOException {
- return read();
- }
-
- /**
- * Returns true if this is the end of a list or a map.
- */
- @Override
- public boolean isEnd()
- throws IOException {
- int code;
-
- if (_offset < _length)
- code = (_buffer[_offset] & 0xff);
- else {
- code = read();
-
- if (code >= 0)
- _offset--;
- }
-
- return (code < 0 || code == 'Z');
- }
-
- /**
- * Reads the end byte.
- */
- @Override
- public void readEnd()
- throws IOException {
- int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- if (code == 'Z')
- return;
- else if (code < 0)
- throw error("unexpected end of file");
- else
- throw error("unknown code:" + codeName(code));
- }
-
- /**
- * Reads the end byte.
- */
- @Override
- public void readMapEnd()
- throws IOException {
- int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- if (code != 'Z')
- throw error("expected end of map ('Z') at '" + codeName(code) + "'");
- }
-
- /**
- * Reads the end byte.
- */
- @Override
- public void readListEnd()
- throws IOException {
- int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- if (code != 'Z')
- throw error("expected end of list ('Z') at '" + codeName(code) + "'");
- }
-
- /**
- * Adds a list/map reference.
- */
- @Override
- public int addRef(Object ref) {
- if (_refs == null)
- _refs = new ArrayList();
-
- _refs.add(ref);
-
- return _refs.size() - 1;
- }
-
- /**
- * Adds a list/map reference.
- */
- @Override
- public void setRef(int i, Object ref) {
- _refs.set(i, ref);
- }
-
- /**
- * Resets the references for streaming.
- */
- @Override
- public void resetReferences() {
- if (_refs != null)
- _refs.clear();
- }
-
- public Object readStreamingObject()
- throws IOException {
- if (_refs != null)
- _refs.clear();
-
- return readObject();
- }
-
- /**
- * Resolves a remote object.
- */
- public Object resolveRemote(String type, String url)
- throws IOException {
- HessianRemoteResolver resolver = getRemoteResolver();
-
- if (resolver != null)
- return resolver.lookup(type, url);
- else
- return new HessianRemote(type, url);
- }
-
- /**
- * Parses a type from the stream.
- *
- * type ::= string
- * type ::= int
- *
- */
- @Override
- public String readType()
- throws IOException {
- int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
- _offset--;
-
- switch (code) {
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
-
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case BC_STRING_CHUNK:
- case 'S': {
- String type = readString();
-
- if (_types == null)
- _types = new ArrayList();
-
- _types.add(type);
-
- return type;
- }
-
- default: {
- int ref = readInt();
-
- if (_types.size() <= ref)
- throw new IndexOutOfBoundsException("type ref #" + ref + " is greater than the number of valid types (" + _types.size() + ")");
-
- return (String) _types.get(ref);
- }
- }
- }
-
- /**
- * Parses the length for an array
- *
- * l b32 b24 b16 b8
- *
- */
- @Override
- public int readLength()
- throws IOException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Parses a 32-bit integer value from the stream.
- *
- * b32 b24 b16 b8
- *
- */
- private int parseInt()
- throws IOException {
- int offset = _offset;
-
- if (offset + 3 < _length) {
- byte[] buffer = _buffer;
-
- int b32 = buffer[offset + 0] & 0xff;
- int b24 = buffer[offset + 1] & 0xff;
- int b16 = buffer[offset + 2] & 0xff;
- int b8 = buffer[offset + 3] & 0xff;
-
- _offset = offset + 4;
-
- return (b32 << 24) + (b24 << 16) + (b16 << 8) + b8;
- } else {
- int b32 = read();
- int b24 = read();
- int b16 = read();
- int b8 = read();
-
- return (b32 << 24) + (b24 << 16) + (b16 << 8) + b8;
- }
- }
-
- /**
- * Parses a 64-bit long value from the stream.
- *
- * b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- private long parseLong()
- throws IOException {
- long b64 = read();
- long b56 = read();
- long b48 = read();
- long b40 = read();
- long b32 = read();
- long b24 = read();
- long b16 = read();
- long b8 = read();
-
- return ((b64 << 56)
- + (b56 << 48)
- + (b48 << 40)
- + (b40 << 32)
- + (b32 << 24)
- + (b24 << 16)
- + (b16 << 8)
- + b8);
- }
-
- /**
- * Parses a 64-bit double value from the stream.
- *
- * b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- private double parseDouble()
- throws IOException {
- long bits = parseLong();
-
- return Double.longBitsToDouble(bits);
- }
-
- org.w3c.dom.Node parseXML()
- throws IOException {
- throw new UnsupportedOperationException();
- }
-
- private boolean parseChunkLength()
- throws IOException {
- if (_isLastChunk)
- return false;
-
- int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- switch (code) {
- case BC_STRING_CHUNK:
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'S':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0a:
- case 0x0b:
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1a:
- case 0x1b:
- case 0x1c:
- case 0x1d:
- case 0x1e:
- case 0x1f:
- _isLastChunk = true;
- _chunkLength = code - 0x00;
- break;
-
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- _isLastChunk = true;
- _chunkLength = (code - 0x30) * 256 + read();
- break;
-
- default:
- throw expect("string", code);
- }
-
- return true;
- }
-
- /**
- * Reads a character from the underlying stream.
- */
- private int parseChar()
- throws IOException {
- while (_chunkLength <= 0) {
- if (!parseChunkLength())
- return -1;
- }
-
- _chunkLength--;
-
- return parseUTF8Char();
- }
-
- /**
- * Parses a single UTF8 character.
- */
- private int parseUTF8Char()
- throws IOException {
- int ch = _offset < _length ? (_buffer[_offset++] & 0xff) : read();
-
- if (ch < 0x80)
- return ch;
- else if ((ch & 0xe0) == 0xc0) {
- int ch1 = read();
- int v = ((ch & 0x1f) << 6) + (ch1 & 0x3f);
-
- return v;
- } else if ((ch & 0xf0) == 0xe0) {
- int ch1 = read();
- int ch2 = read();
- int v = ((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f);
-
- return v;
- } else
- throw error("bad utf-8 encoding at " + codeName(ch));
- }
-
- /**
- * Reads a byte from the underlying stream.
- */
- private int parseByte()
- throws IOException {
- while (_chunkLength <= 0) {
- if (_isLastChunk) {
- return -1;
- }
-
- int code = read();
-
- switch (code) {
- case BC_BINARY_CHUNK:
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'B':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2a:
- case 0x2b:
- case 0x2c:
- case 0x2d:
- case 0x2e:
- case 0x2f:
- _isLastChunk = true;
-
- _chunkLength = code - 0x20;
- break;
-
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- _isLastChunk = true;
- _chunkLength = (code - 0x34) * 256 + read();
- break;
-
- default:
- throw expect("byte[]", code);
- }
- }
-
- _chunkLength--;
-
- return read();
- }
-
- /**
- * Reads bytes based on an input stream.
- */
- @Override
- public InputStream readInputStream()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2a:
- case 0x2b:
- case 0x2c:
- case 0x2d:
- case 0x2e:
- case 0x2f:
- _isLastChunk = true;
- _chunkLength = tag - 0x20;
- break;
-
- default:
- throw expect("binary", tag);
- }
-
- return new ReadInputStream();
- }
-
- /**
- * Reads bytes from the underlying stream.
- */
- int read(byte[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- while (length > 0) {
- while (_chunkLength <= 0) {
- if (_isLastChunk)
- return readLength == 0 ? -1 : readLength;
-
- int code = read();
-
- switch (code) {
- case 'b':
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'B':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2a:
- case 0x2b:
- case 0x2c:
- case 0x2d:
- case 0x2e:
- case 0x2f:
- _isLastChunk = true;
- _chunkLength = code - 0x20;
- break;
-
- default:
- throw expect("byte[]", code);
- }
- }
-
- int sublen = _chunkLength;
- if (length < sublen)
- sublen = length;
-
- if (_length <= _offset && !readBuffer())
- return -1;
-
- if (_length - _offset < sublen)
- sublen = _length - _offset;
-
- System.arraycopy(_buffer, _offset, buffer, offset, sublen);
-
- _offset += sublen;
-
- offset += sublen;
- readLength += sublen;
- length -= sublen;
- _chunkLength -= sublen;
- }
-
- return readLength;
- }
-
- /**
- * Normally, shouldn't be called externally, but needed for QA, e.g.
- * ejb/3b01.
- */
- public final int read()
- throws IOException {
- if (_length <= _offset && !readBuffer())
- return -1;
-
- return _buffer[_offset++] & 0xff;
- }
-
- private final boolean readBuffer()
- throws IOException {
- byte[] buffer = _buffer;
- int offset = _offset;
- int length = _length;
-
- if (offset < length) {
- System.arraycopy(buffer, offset, buffer, 0, length - offset);
- offset = length - offset;
- } else
- offset = 0;
-
- int len = _is.read(buffer, offset, SIZE - offset);
-
- if (len <= 0) {
- _length = offset;
- _offset = 0;
-
- return offset > 0;
- }
-
- _length = offset + len;
- _offset = 0;
-
- return true;
- }
-
- @Override
- public Reader getReader() {
- return null;
- }
-
- protected IOException expect(String expect, int ch)
- throws IOException {
- if (ch < 0)
- return error("expected " + expect + " at end of file");
- else {
- _offset--;
-
- try {
- Object obj = readObject();
-
- if (obj != null) {
- return error("expected " + expect
- + " at 0x" + Integer.toHexString(ch & 0xff)
- + " " + obj.getClass().getName() + " (" + obj + ")");
- } else
- return error("expected " + expect
- + " at 0x" + Integer.toHexString(ch & 0xff) + " null");
- } catch (IOException e) {
- log.log(Level.FINE, e.toString(), e);
-
- return error("expected " + expect
- + " at 0x" + Integer.toHexString(ch & 0xff));
- }
- }
- }
-
- protected String codeName(int ch) {
- if (ch < 0)
- return "end of file";
- else
- return "0x" + Integer.toHexString(ch & 0xff) + " (" + (char) +ch + ")";
- }
-
- protected IOException error(String message) {
- if (_method != null)
- return new HessianProtocolException(_method + ": " + message);
- else
- return new HessianProtocolException(message);
- }
-
- @Override
- public void close()
- throws IOException {
- InputStream is = _is;
- _is = null;
-
- if (_isCloseStreamOnClose && is != null)
- is.close();
- }
-
- ;
-
- final static class ObjectDefinition {
- private final String _type;
- private final String[] _fields;
-
- ObjectDefinition(String type, String[] fields) {
- _type = type;
- _fields = fields;
- }
-
- String getType() {
- return _type;
- }
-
- String[] getFieldNames() {
- return _fields;
- }
- }
-
- class ReadInputStream extends InputStream {
- boolean _isClosed = false;
-
- @Override
- public int read()
- throws IOException {
- if (_isClosed)
- return -1;
-
- int ch = parseByte();
- if (ch < 0)
- _isClosed = true;
-
- return ch;
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length)
- throws IOException {
- if (_isClosed)
- return -1;
-
- int len = Hessian2Input.this.read(buffer, offset, length);
- if (len < 0)
- _isClosed = true;
-
- return len;
- }
-
- @Override
- public void close()
- throws IOException {
- while (read() >= 0) {
- }
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java
deleted file mode 100644
index 3eb98b577ba..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java
+++ /dev/null
@@ -1,1537 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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 com.alibaba.com.caucho.hessian.util.IdentityIntMap;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-
-/**
- * Output stream for Hessian 2 requests.
- *
- * OutputStream os = ...; // from http connection
- * Hessian2Output out = new Hessian2Output(os);
- * String value;
- *
- * out.startCall("hello", 1); // start hello call
- * out.writeString("arg1"); // write a string argument
- * out.completeCall(); // complete the call
- *
- */
-public class Hessian2Output
- extends AbstractHessianOutput
- implements Hessian2Constants {
- public final static int SIZE = 4096;
- private final byte[] _buffer = new byte[SIZE];
- // the output stream/
- protected OutputStream _os;
- // map of references
- private IdentityIntMap _refs = new IdentityIntMap();
- private boolean _isCloseStreamOnClose;
- // map of classes
- private HashMap _classRefs;
- // map of types
- private HashMap _typeRefs;
- private int _offset;
-
- private boolean _isStreaming;
-
- /**
- * Creates a new Hessian output stream, initialized with an
- * underlying output stream.
- *
- * @param os the underlying output stream.
- */
- public Hessian2Output(OutputStream os) {
- _os = os;
- }
-
- public boolean isCloseStreamOnClose() {
- return _isCloseStreamOnClose;
- }
-
- public void setCloseStreamOnClose(boolean isClose) {
- _isCloseStreamOnClose = isClose;
- }
-
- /**
- * Writes a complete method call.
- */
- @Override
- public void call(String method, Object[] args)
- throws IOException {
- int length = args != null ? args.length : 0;
-
- startCall(method, length);
-
- for (int i = 0; i < args.length; i++)
- writeObject(args[i]);
-
- completeCall();
- }
-
- /**
- * Starts the method call. Clients would use startCall
- * instead of call
if they wanted finer control over
- * writing the arguments, or needed to write headers.
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void startCall(String method, int length)
- throws IOException {
- int offset = _offset;
-
- if (SIZE < offset + 32) {
- flush();
- offset = _offset;
- }
-
- byte[] buffer = _buffer;
-
- buffer[_offset++] = (byte) 'C';
-
- writeString(method);
- writeInt(length);
- }
-
- /**
- * Writes the call tag. This would be followed by the
- * method and the arguments
- *
- * C
- * string # method name
- * int # arg count
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void startCall()
- throws IOException {
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'C';
- }
-
- /**
- * Starts an envelope.
- *
- * C
- *
- *
- * @param method the method name to call.
- */
- public void startEnvelope(String method)
- throws IOException {
- int offset = _offset;
-
- if (SIZE < offset + 32) {
- flush();
- offset = _offset;
- }
-
- _buffer[_offset++] = (byte) 'E';
-
- writeString(method);
- }
-
- /**
- * Completes an envelope.
- *
- * E major minor
- * m b16 b8 method-name
- *
- * Z
- *
- */
- public void completeEnvelope()
- throws IOException {
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'Z';
- }
-
- /**
- * Writes the method tag.
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void writeMethod(String method)
- throws IOException {
- writeString(method);
- }
-
- /**
- * Completes.
- *
- * string
- *
- */
- @Override
- public void completeCall()
- throws IOException {
- /*
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'Z';
- */
- }
-
- /**
- * Starts the reply
- *
- * z
- *
- * R
- *
- */
- @Override
- public void startReply()
- throws IOException {
- writeVersion();
-
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'R';
- }
-
- public void writeVersion()
- throws IOException {
- flushIfFull();
- _buffer[_offset++] = (byte) 'H';
- _buffer[_offset++] = (byte) 2;
- _buffer[_offset++] = (byte) 0;
- }
-
- /**
- * Completes reading the reply
- *
- * z
- *
- */
- @Override
- public void completeReply()
- throws IOException {
- }
-
- /**
- * Starts a packet
- *
- * p x02 x00
- *
- */
- public void startMessage()
- throws IOException {
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'p';
- _buffer[_offset++] = (byte) 2;
- _buffer[_offset++] = (byte) 0;
- }
-
- /**
- * Completes reading the message
- *
- * z
- *
- */
- public void completeMessage()
- throws IOException {
- flushIfFull();
-
- _buffer[_offset++] = (byte) 'z';
- }
-
- /**
- * Writes a fault. The fault will be written
- * as a descriptive string followed by an object:
- *
- *
- * F map
- *
- *
- * @param code the fault code, a three digit
- */
- @Override
- public void writeFault(String code, String message, Object detail)
- throws IOException {
- flushIfFull();
-
- writeVersion();
-
- _buffer[_offset++] = (byte) 'F';
- _buffer[_offset++] = (byte) 'H';
-
- _refs.put(new HashMap(), _refs.size());
-
- writeString("code");
- writeString(code);
-
- writeString("message");
- writeString(message);
-
- if (detail != null) {
- writeString("detail");
- writeObject(detail);
- }
-
- flushIfFull();
- _buffer[_offset++] = (byte) 'Z';
- }
-
- /**
- * Writes any object to the output stream.
- */
- @Override
- public void writeObject(Object object)
- throws IOException {
- if (object == null) {
- writeNull();
- return;
- }
-
- Serializer serializer;
-
- serializer = findSerializerFactory().getSerializer(object.getClass());
-
- serializer.writeObject(object, this);
- }
-
- /**
- * Writes the list header to the stream. List writers will call
- *
- * F H
- * \x04code
- * \x10the fault code
- *
writeListBegin
followed by the list contents and then
- * call writeListEnd
.
- *
- *
- * @return true for variable lists, false for fixed lists
- */
- @Override
- public boolean writeListBegin(int length, String type)
- throws IOException {
- flushIfFull();
-
- if (length < 0) {
- if (type != null) {
- _buffer[_offset++] = (byte) BC_LIST_VARIABLE;
- writeType(type);
- } else
- _buffer[_offset++] = (byte) BC_LIST_VARIABLE_UNTYPED;
-
- return true;
- } else if (length <= LIST_DIRECT_MAX) {
- if (type != null) {
- _buffer[_offset++] = (byte) (BC_LIST_DIRECT + length);
- writeType(type);
- } else {
- _buffer[_offset++] = (byte) (BC_LIST_DIRECT_UNTYPED + length);
- }
-
- return false;
- } else {
- if (type != null) {
- _buffer[_offset++] = (byte) BC_LIST_FIXED;
- writeType(type);
- } else {
- _buffer[_offset++] = (byte) BC_LIST_FIXED_UNTYPED;
- }
-
- writeInt(length);
-
- return false;
- }
- }
-
- /**
- * Writes the tail of the list to the stream for a variable-length list.
- */
- @Override
- public void writeListEnd()
- throws IOException {
- flushIfFull();
-
- _buffer[_offset++] = (byte) BC_END;
- }
-
- /**
- * Writes the map header to the stream. Map writers will call
- *
- * list ::= V type value* Z
- * ::= v type int value*
- *
writeMapBegin
followed by the map contents and then
- * call writeMapEnd
.
- *
- */
- @Override
- public void writeMapBegin(String type)
- throws IOException {
- if (SIZE < _offset + 32)
- flush();
-
- if (type != null) {
- _buffer[_offset++] = BC_MAP;
-
- writeType(type);
- } else
- _buffer[_offset++] = BC_MAP_UNTYPED;
- }
-
- /**
- * Writes the tail of the map to the stream.
- */
- @Override
- public void writeMapEnd()
- throws IOException {
- if (SIZE < _offset + 32)
- flush();
-
- _buffer[_offset++] = (byte) BC_END;
- }
-
- /**
- * Writes the object definition
- *
- * map ::= M type (
- */
- @Override
- public int writeObjectBegin(String type)
- throws IOException {
- if (_classRefs == null)
- _classRefs = new HashMap();
-
- Integer refV = (Integer) _classRefs.get(type);
-
- if (refV != null) {
- int ref = refV.intValue();
-
- if (SIZE < _offset + 32)
- flush();
-
- if (ref <= OBJECT_DIRECT_MAX) {
- _buffer[_offset++] = (byte) (BC_OBJECT_DIRECT + ref);
- } else {
- _buffer[_offset++] = (byte) 'O';
- writeInt(ref);
- }
-
- return ref;
- } else {
- int ref = _classRefs.size();
-
- _classRefs.put(type, Integer.valueOf(ref));
-
- if (SIZE < _offset + 32)
- flush();
-
- _buffer[_offset++] = (byte) 'C';
-
- writeString(type);
-
- return -1;
- }
- }
-
- /**
- * Writes the tail of the class definition to the stream.
- */
- @Override
- public void writeClassFieldLength(int len)
- throws IOException {
- writeInt(len);
- }
-
- /**
- * Writes the tail of the object definition to the stream.
- */
- @Override
- public void writeObjectEnd()
- throws IOException {
- }
-
- /**
- *
- * C <string> <int> <string>*
- *
- */
- private void writeType(String type)
- throws IOException {
- flushIfFull();
-
- int len = type.length();
- if (len == 0) {
- throw new IllegalArgumentException("empty type is not allowed");
- }
-
- if (_typeRefs == null)
- _typeRefs = new HashMap();
-
- Integer typeRefV = (Integer) _typeRefs.get(type);
-
- if (typeRefV != null) {
- int typeRef = typeRefV.intValue();
-
- writeInt(typeRef);
- } else {
- _typeRefs.put(type, Integer.valueOf(_typeRefs.size()));
-
- writeString(type);
- }
- }
-
- /**
- * Writes a boolean value to the stream. The boolean will be written
- * with the following syntax:
- *
- * type ::= string
- * ::= int
- *
- *
- * @param value the boolean value to write.
- */
- @Override
- public void writeBoolean(boolean value)
- throws IOException {
- if (SIZE < _offset + 16)
- flush();
-
- if (value)
- _buffer[_offset++] = (byte) 'T';
- else
- _buffer[_offset++] = (byte) 'F';
- }
-
- /**
- * Writes an integer value to the stream. The integer will be written
- * with the following syntax:
- *
- * T
- * F
- *
- *
- * @param value the integer value to write.
- */
- @Override
- public void writeInt(int value)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- if (INT_DIRECT_MIN <= value && value <= INT_DIRECT_MAX)
- buffer[offset++] = (byte) (value + BC_INT_ZERO);
- else if (INT_BYTE_MIN <= value && value <= INT_BYTE_MAX) {
- buffer[offset++] = (byte) (BC_INT_BYTE_ZERO + (value >> 8));
- buffer[offset++] = (byte) (value);
- } else if (INT_SHORT_MIN <= value && value <= INT_SHORT_MAX) {
- buffer[offset++] = (byte) (BC_INT_SHORT_ZERO + (value >> 16));
- buffer[offset++] = (byte) (value >> 8);
- buffer[offset++] = (byte) (value);
- } else {
- buffer[offset++] = (byte) ('I');
- buffer[offset++] = (byte) (value >> 24);
- buffer[offset++] = (byte) (value >> 16);
- buffer[offset++] = (byte) (value >> 8);
- buffer[offset++] = (byte) (value);
- }
-
- _offset = offset;
- }
-
- /**
- * Writes a long value to the stream. The long will be written
- * with the following syntax:
- *
- * I b32 b24 b16 b8
- *
- *
- * @param value the long value to write.
- */
- @Override
- public void writeLong(long value)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- if (LONG_DIRECT_MIN <= value && value <= LONG_DIRECT_MAX) {
- buffer[offset++] = (byte) (value + BC_LONG_ZERO);
- } else if (LONG_BYTE_MIN <= value && value <= LONG_BYTE_MAX) {
- buffer[offset++] = (byte) (BC_LONG_BYTE_ZERO + (value >> 8));
- buffer[offset++] = (byte) (value);
- } else if (LONG_SHORT_MIN <= value && value <= LONG_SHORT_MAX) {
- buffer[offset++] = (byte) (BC_LONG_SHORT_ZERO + (value >> 16));
- buffer[offset++] = (byte) (value >> 8);
- buffer[offset++] = (byte) (value);
- } else if (-0x80000000L <= value && value <= 0x7fffffffL) {
- buffer[offset + 0] = (byte) BC_LONG_INT;
- buffer[offset + 1] = (byte) (value >> 24);
- buffer[offset + 2] = (byte) (value >> 16);
- buffer[offset + 3] = (byte) (value >> 8);
- buffer[offset + 4] = (byte) (value);
-
- offset += 5;
- } else {
- buffer[offset + 0] = (byte) 'L';
- buffer[offset + 1] = (byte) (value >> 56);
- buffer[offset + 2] = (byte) (value >> 48);
- buffer[offset + 3] = (byte) (value >> 40);
- buffer[offset + 4] = (byte) (value >> 32);
- buffer[offset + 5] = (byte) (value >> 24);
- buffer[offset + 6] = (byte) (value >> 16);
- buffer[offset + 7] = (byte) (value >> 8);
- buffer[offset + 8] = (byte) (value);
-
- offset += 9;
- }
-
- _offset = offset;
- }
-
- /**
- * Writes a double value to the stream. The double will be written
- * with the following syntax:
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- * @param value the double value to write.
- */
- @Override
- public void writeDouble(double value)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- int intValue = (int) value;
-
- if (intValue == value) {
- if (intValue == 0) {
- buffer[offset++] = (byte) BC_DOUBLE_ZERO;
-
- _offset = offset;
-
- return;
- } else if (intValue == 1) {
- buffer[offset++] = (byte) BC_DOUBLE_ONE;
-
- _offset = offset;
-
- return;
- } else if (-0x80 <= intValue && intValue < 0x80) {
- buffer[offset++] = (byte) BC_DOUBLE_BYTE;
- buffer[offset++] = (byte) intValue;
-
- _offset = offset;
-
- return;
- } else if (-0x8000 <= intValue && intValue < 0x8000) {
- buffer[offset + 0] = (byte) BC_DOUBLE_SHORT;
- buffer[offset + 1] = (byte) (intValue >> 8);
- buffer[offset + 2] = (byte) intValue;
-
- _offset = offset + 3;
-
- return;
- }
- }
-
- int mills = (int) (value * 1000);
-
- if (0.001 * mills == value) {
- buffer[offset + 0] = (byte) (BC_DOUBLE_MILL);
- buffer[offset + 1] = (byte) (mills >> 24);
- buffer[offset + 2] = (byte) (mills >> 16);
- buffer[offset + 3] = (byte) (mills >> 8);
- buffer[offset + 4] = (byte) (mills);
-
- _offset = offset + 5;
-
- return;
- }
-
- long bits = Double.doubleToLongBits(value);
-
- buffer[offset + 0] = (byte) 'D';
- buffer[offset + 1] = (byte) (bits >> 56);
- buffer[offset + 2] = (byte) (bits >> 48);
- buffer[offset + 3] = (byte) (bits >> 40);
- buffer[offset + 4] = (byte) (bits >> 32);
- buffer[offset + 5] = (byte) (bits >> 24);
- buffer[offset + 6] = (byte) (bits >> 16);
- buffer[offset + 7] = (byte) (bits >> 8);
- buffer[offset + 8] = (byte) (bits);
-
- _offset = offset + 9;
- }
-
- /**
- * Writes a date to the stream.
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- * @param time the date in milliseconds from the epoch in UTC
- */
- @Override
- public void writeUTCDate(long time)
- throws IOException {
- if (SIZE < _offset + 32)
- flush();
-
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (time % 60000L == 0) {
- // compact date ::= x65 b3 b2 b1 b0
-
- long minutes = time / 60000L;
-
- if ((minutes >> 31) == 0 || (minutes >> 31) == -1) {
- buffer[offset++] = (byte) BC_DATE_MINUTE;
- buffer[offset++] = ((byte) (minutes >> 24));
- buffer[offset++] = ((byte) (minutes >> 16));
- buffer[offset++] = ((byte) (minutes >> 8));
- buffer[offset++] = ((byte) (minutes >> 0));
-
- _offset = offset;
- return;
- }
- }
-
- buffer[offset++] = (byte) BC_DATE;
- buffer[offset++] = ((byte) (time >> 56));
- buffer[offset++] = ((byte) (time >> 48));
- buffer[offset++] = ((byte) (time >> 40));
- buffer[offset++] = ((byte) (time >> 32));
- buffer[offset++] = ((byte) (time >> 24));
- buffer[offset++] = ((byte) (time >> 16));
- buffer[offset++] = ((byte) (time >> 8));
- buffer[offset++] = ((byte) (time));
-
- _offset = offset;
- }
-
- /**
- * Writes a null value to the stream.
- * The null will be written with the following syntax
- *
- * date ::= d b7 b6 b5 b4 b3 b2 b1 b0
- * ::= x65 b3 b2 b1 b0
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeNull()
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- buffer[offset++] = 'N';
-
- _offset = offset;
- }
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- * S b16 b8 string-value
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeString(String value)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- if (value == null) {
- buffer[offset++] = (byte) 'N';
-
- _offset = offset;
- } else {
- int length = value.length();
- int strOffset = 0;
-
- while (length > 0x8000) {
- int sublen = 0x8000;
-
- offset = _offset;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- // chunk can't end in high surrogate
- char tail = value.charAt(strOffset + sublen - 1);
-
- if (0xd800 <= tail && tail <= 0xdbff)
- sublen--;
-
- buffer[offset + 0] = (byte) BC_STRING_CHUNK;
- buffer[offset + 1] = (byte) (sublen >> 8);
- buffer[offset + 2] = (byte) (sublen);
-
- _offset = offset + 3;
-
- printString(value, strOffset, sublen);
-
- length -= sublen;
- strOffset += sublen;
- }
-
- offset = _offset;
-
- if (SIZE <= offset + 16) {
- flush();
- offset = _offset;
- }
-
- if (length <= STRING_DIRECT_MAX) {
- buffer[offset++] = (byte) (BC_STRING_DIRECT + length);
- } else if (length <= STRING_SHORT_MAX) {
- buffer[offset++] = (byte) (BC_STRING_SHORT + (length >> 8));
- buffer[offset++] = (byte) (length);
- } else {
- buffer[offset++] = (byte) ('S');
- buffer[offset++] = (byte) (length >> 8);
- buffer[offset++] = (byte) (length);
- }
-
- _offset = offset;
-
- printString(value, strOffset, length);
- }
- }
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- * S b16 b8 string-value
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeString(char[] buffer, int offset, int length)
- throws IOException {
- if (buffer == null) {
- if (SIZE < _offset + 16)
- flush();
-
- _buffer[_offset++] = (byte) ('N');
- } else {
- while (length > 0x8000) {
- int sublen = 0x8000;
-
- if (SIZE < _offset + 16)
- flush();
-
- // chunk can't end in high surrogate
- char tail = buffer[offset + sublen - 1];
-
- if (0xd800 <= tail && tail <= 0xdbff)
- sublen--;
-
- _buffer[_offset++] = (byte) BC_STRING_CHUNK;
- _buffer[_offset++] = (byte) (sublen >> 8);
- _buffer[_offset++] = (byte) (sublen);
-
- printString(buffer, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
-
- if (SIZE < _offset + 16)
- flush();
-
- if (length <= STRING_DIRECT_MAX) {
- _buffer[_offset++] = (byte) (BC_STRING_DIRECT + length);
- } else if (length <= STRING_SHORT_MAX) {
- _buffer[_offset++] = (byte) (BC_STRING_SHORT + (length >> 8));
- _buffer[_offset++] = (byte) length;
- } else {
- _buffer[_offset++] = (byte) ('S');
- _buffer[_offset++] = (byte) (length >> 8);
- _buffer[_offset++] = (byte) (length);
- }
-
- printString(buffer, offset, length);
- }
- }
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- * B b16 b18 bytes
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeBytes(byte[] buffer)
- throws IOException {
- if (buffer == null) {
- if (SIZE < _offset + 16)
- flush();
-
- _buffer[_offset++] = 'N';
- } else
- writeBytes(buffer, 0, buffer.length);
- }
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- * B b16 b18 bytes
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeBytes(byte[] buffer, int offset, int length)
- throws IOException {
- if (buffer == null) {
- if (SIZE < _offset + 16)
- flushBuffer();
-
- _buffer[_offset++] = (byte) 'N';
- } else {
- flush();
-
- while (SIZE - _offset - 3 < length) {
- int sublen = SIZE - _offset - 3;
-
- if (sublen < 16) {
- flushBuffer();
-
- sublen = SIZE - _offset - 3;
-
- if (length < sublen)
- sublen = length;
- }
-
- _buffer[_offset++] = (byte) BC_BINARY_CHUNK;
- _buffer[_offset++] = (byte) (sublen >> 8);
- _buffer[_offset++] = (byte) sublen;
-
- System.arraycopy(buffer, offset, _buffer, _offset, sublen);
- _offset += sublen;
-
- length -= sublen;
- offset += sublen;
-
- flushBuffer();
- }
-
- if (SIZE < _offset + 16)
- flushBuffer();
-
- if (length <= BINARY_DIRECT_MAX) {
- _buffer[_offset++] = (byte) (BC_BINARY_DIRECT + length);
- } else if (length <= BINARY_SHORT_MAX) {
- _buffer[_offset++] = (byte) (BC_BINARY_SHORT + (length >> 8));
- _buffer[_offset++] = (byte) (length);
- } else {
- _buffer[_offset++] = (byte) 'B';
- _buffer[_offset++] = (byte) (length >> 8);
- _buffer[_offset++] = (byte) (length);
- }
-
- System.arraycopy(buffer, offset, _buffer, _offset, length);
-
- _offset += length;
- }
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- * N
- *
- */
- @Override
- public void writeByteBufferStart()
- throws IOException {
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- *
- */
- @Override
- public void writeByteBufferPart(byte[] buffer, int offset, int length)
- throws IOException {
- while (length > 0) {
- int sublen = length;
-
- if (0x8000 < sublen)
- sublen = 0x8000;
-
- flush(); // bypass buffer
-
- _os.write(BC_BINARY_CHUNK);
- _os.write(sublen >> 8);
- _os.write(sublen);
-
- _os.write(buffer, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- * b b16 b18 bytes
- *
- */
- @Override
- public void writeByteBufferEnd(byte[] buffer, int offset, int length)
- throws IOException {
- writeBytes(buffer, offset, length);
- }
-
- /**
- * Returns an output stream to write binary data.
- */
- public OutputStream getBytesOutputStream()
- throws IOException {
- return new BytesOutputStream();
- }
-
- /**
- * Writes a reference.
- *
- * b b16 b18 bytes
- *
- *
- * @param value the integer value to write.
- */
- @Override
- protected void writeRef(int value)
- throws IOException {
- if (SIZE < _offset + 16)
- flush();
-
- _buffer[_offset++] = (byte) BC_REF;
-
- writeInt(value);
- }
-
- /**
- * If the object has already been written, just write its ref.
- *
- * @return true if we're writing a ref.
- */
- @Override
- public boolean addRef(Object object)
- throws IOException {
- int ref = _refs.get(object);
-
- if (ref >= 0) {
- writeRef(ref);
-
- return true;
- } else {
- _refs.put(object, _refs.size());
-
- return false;
- }
- }
-
- /**
- * Removes a reference.
- */
- @Override
- public boolean removeRef(Object obj)
- throws IOException {
- if (_refs != null) {
- _refs.remove(obj);
-
- return true;
- } else
- return false;
- }
-
- /**
- * Replaces a reference from one object to another.
- */
- @Override
- public boolean replaceRef(Object oldRef, Object newRef)
- throws IOException {
- Integer value = (Integer) _refs.remove(oldRef);
-
- if (value != null) {
- _refs.put(newRef, value);
- return true;
- } else
- return false;
- }
-
- /**
- * Resets the references for streaming.
- */
- @Override
- public void resetReferences() {
- if (_refs != null)
- _refs.clear();
- }
-
- /**
- * Starts the streaming message
- *
- * x51 <int>
- *
- * P x02 x00
- *
- */
- public void writeStreamingObject(Object obj)
- throws IOException {
- startStreamingPacket();
-
- writeObject(obj);
-
- endStreamingPacket();
- }
-
- /**
- * Starts a streaming packet
- *
- * P x02 x00
- *
- */
- public void startStreamingPacket()
- throws IOException {
- if (_refs != null)
- _refs.clear();
-
- flush();
-
- _isStreaming = true;
- _offset = 3;
- }
-
- public void endStreamingPacket()
- throws IOException {
- int len = _offset - 3;
-
- _buffer[0] = (byte) 'P';
- _buffer[1] = (byte) (len >> 8);
- _buffer[2] = (byte) len;
-
- _isStreaming = false;
-
- flush();
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8 with preceeding length
- *
- * @param v the string to print.
- */
- public void printLenString(String v)
- throws IOException {
- if (SIZE < _offset + 16)
- flush();
-
- if (v == null) {
- _buffer[_offset++] = (byte) (0);
- _buffer[_offset++] = (byte) (0);
- } else {
- int len = v.length();
- _buffer[_offset++] = (byte) (len >> 8);
- _buffer[_offset++] = (byte) (len);
-
- printString(v, 0, len);
- }
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(String v)
- throws IOException {
- printString(v, 0, v.length());
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(String v, int strOffset, int length)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- for (int i = 0; i < length; i++) {
- if (SIZE <= offset + 16) {
- _offset = offset;
- flush();
- offset = _offset;
- }
-
- char ch = v.charAt(i + strOffset);
-
- if (ch < 0x80)
- buffer[offset++] = (byte) (ch);
- else if (ch < 0x800) {
- buffer[offset++] = (byte) (0xc0 + ((ch >> 6) & 0x1f));
- buffer[offset++] = (byte) (0x80 + (ch & 0x3f));
- } else {
- buffer[offset++] = (byte) (0xe0 + ((ch >> 12) & 0xf));
- buffer[offset++] = (byte) (0x80 + ((ch >> 6) & 0x3f));
- buffer[offset++] = (byte) (0x80 + (ch & 0x3f));
- }
- }
-
- _offset = offset;
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(char[] v, int strOffset, int length)
- throws IOException {
- int offset = _offset;
- byte[] buffer = _buffer;
-
- for (int i = 0; i < length; i++) {
- if (SIZE <= offset + 16) {
- _offset = offset;
- flush();
- offset = _offset;
- }
-
- char ch = v[i + strOffset];
-
- if (ch < 0x80)
- buffer[offset++] = (byte) (ch);
- else if (ch < 0x800) {
- buffer[offset++] = (byte) (0xc0 + ((ch >> 6) & 0x1f));
- buffer[offset++] = (byte) (0x80 + (ch & 0x3f));
- } else {
- buffer[offset++] = (byte) (0xe0 + ((ch >> 12) & 0xf));
- buffer[offset++] = (byte) (0x80 + ((ch >> 6) & 0x3f));
- buffer[offset++] = (byte) (0x80 + (ch & 0x3f));
- }
- }
-
- _offset = offset;
- }
-
- private final void flushIfFull()
- throws IOException {
- int offset = _offset;
-
- if (SIZE < offset + 32) {
- _offset = 0;
- _os.write(_buffer, 0, offset);
- }
- }
-
- @Override
- public final void flush()
- throws IOException {
- flushBuffer();
-
- if (_os != null)
- _os.flush();
- }
-
- public final void flushBuffer()
- throws IOException {
- int offset = _offset;
-
- if (!_isStreaming && offset > 0) {
- _offset = 0;
-
- _os.write(_buffer, 0, offset);
- } else if (_isStreaming && offset > 3) {
- int len = offset - 3;
- _buffer[0] = 'p';
- _buffer[1] = (byte) (len >> 8);
- _buffer[2] = (byte) len;
- _offset = 3;
-
- _os.write(_buffer, 0, offset);
- }
- }
-
- @Override
- public final void close()
- throws IOException {
- // hessian/3a8c
- flush();
-
- OutputStream os = _os;
- _os = null;
-
- if (os != null) {
- if (_isCloseStreamOnClose)
- os.close();
- }
- }
-
- class BytesOutputStream extends OutputStream {
- private int _startOffset;
-
- BytesOutputStream()
- throws IOException {
- if (SIZE < _offset + 16) {
- Hessian2Output.this.flush();
- }
-
- _startOffset = _offset;
- _offset += 3; // skip 'b' xNN xNN
- }
-
- @Override
- public void write(int ch)
- throws IOException {
- if (SIZE <= _offset) {
- int length = (_offset - _startOffset) - 3;
-
- _buffer[_startOffset] = (byte) BC_BINARY_CHUNK;
- _buffer[_startOffset + 1] = (byte) (length >> 8);
- _buffer[_startOffset + 2] = (byte) (length);
-
- Hessian2Output.this.flush();
-
- _startOffset = _offset;
- _offset += 3;
- }
-
- _buffer[_offset++] = (byte) ch;
- }
-
- @Override
- public void write(byte[] buffer, int offset, int length)
- throws IOException {
- while (length > 0) {
- int sublen = SIZE - _offset;
-
- if (length < sublen)
- sublen = length;
-
- if (sublen > 0) {
- System.arraycopy(buffer, offset, _buffer, _offset, sublen);
- _offset += sublen;
- }
-
- length -= sublen;
- offset += sublen;
-
- if (SIZE <= _offset) {
- int chunkLength = (_offset - _startOffset) - 3;
-
- _buffer[_startOffset] = (byte) BC_BINARY_CHUNK;
- _buffer[_startOffset + 1] = (byte) (chunkLength >> 8);
- _buffer[_startOffset + 2] = (byte) (chunkLength);
-
- Hessian2Output.this.flush();
-
- _startOffset = _offset;
- _offset += 3;
- }
- }
- }
-
- @Override
- public void close()
- throws IOException {
- int startOffset = _startOffset;
- _startOffset = -1;
-
- if (startOffset < 0)
- return;
-
- int length = (_offset - startOffset) - 3;
-
- _buffer[startOffset] = (byte) 'B';
- _buffer[startOffset + 1] = (byte) (length >> 8);
- _buffer[startOffset + 2] = (byte) (length);
-
- Hessian2Output.this.flush();
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingInput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingInput.java
deleted file mode 100644
index ebf8b779bd0..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingInput.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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;
-
-/**
- * Output stream for Hessian 2 streaming requests.
- */
-public class Hessian2StreamingInput {
- private Hessian2Input _in;
-
- /**
- * Creates a new Hessian input stream, initialized with an
- * underlying input stream.
- *
- * @param is the underlying output stream.
- */
- public Hessian2StreamingInput(InputStream is) {
- _in = new Hessian2Input(new StreamingInputStream(is));
- }
-
- /**
- * Read the next object
- */
- public Object readObject()
- throws IOException {
- return _in.readStreamingObject();
- }
-
- /**
- * Close the output.
- */
- public void close()
- throws IOException {
- _in.close();
- }
-
- static class StreamingInputStream extends InputStream {
- private InputStream _is;
- private int _length;
-
- StreamingInputStream(InputStream is) {
- _is = is;
- }
-
- @Override
- public int read()
- throws IOException {
- InputStream is = _is;
-
- while (_length == 0) {
- int code = is.read();
-
- if (code < 0)
- return -1;
- else if (code != 'p' && code != 'P')
- throw new HessianProtocolException("expected streaming packet at 0x"
- + Integer.toHexString(code & 0xff));
-
- int d1 = is.read();
- int d2 = is.read();
-
- if (d2 < 0)
- return -1;
-
- _length = (d1 << 8) + d2;
- }
-
- _length--;
- return is.read();
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length)
- throws IOException {
- InputStream is = _is;
-
- while (_length == 0) {
- int code = is.read();
-
- if (code < 0)
- return -1;
- else if (code != 'p' && code != 'P') {
- throw new HessianProtocolException("expected streaming packet at 0x"
- + Integer.toHexString(code & 0xff)
- + " (" + (char) code + ")");
- }
-
- int d1 = is.read();
- int d2 = is.read();
-
- if (d2 < 0)
- return -1;
-
- _length = (d1 << 8) + d2;
- }
-
- int sublen = _length;
- if (length < sublen)
- sublen = length;
-
- sublen = is.read(buffer, offset, sublen);
-
- if (sublen < 0)
- return -1;
-
- _length -= sublen;
-
- return sublen;
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingOutput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingOutput.java
deleted file mode 100644
index 19fb33169e8..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2StreamingOutput.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.OutputStream;
-
-/**
- * Output stream for Hessian 2 streaming requests.
- */
-public class Hessian2StreamingOutput {
- private Hessian2Output _out;
-
- /**
- * Creates a new Hessian output stream, initialized with an
- * underlying output stream.
- *
- * @param os the underlying output stream.
- */
- public Hessian2StreamingOutput(OutputStream os) {
- _out = new Hessian2Output(os);
- }
-
- public boolean isCloseStreamOnClose() {
- return _out.isCloseStreamOnClose();
- }
-
- public void setCloseStreamOnClose(boolean isClose) {
- _out.setCloseStreamOnClose(isClose);
- }
-
- /**
- * Writes any object to the output stream.
- */
- public void writeObject(Object object)
- throws IOException {
- _out.writeStreamingObject(object);
- }
-
- /**
- * Flushes the output.
- */
- public void flush()
- throws IOException {
- _out.flush();
- }
-
- /**
- * Close the output.
- */
- public void close()
- throws IOException {
- _out.close();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugInputStream.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugInputStream.java
deleted file mode 100644
index 092fa22822e..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugInputStream.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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 "Hessian", "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.PrintWriter;
-import java.io.Writer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Debugging input stream for Hessian requests.
- */
-public class HessianDebugInputStream extends InputStream {
- private InputStream _is;
-
- private HessianDebugState _state;
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianDebugInputStream(InputStream is, PrintWriter dbg) {
- _is = is;
-
- if (dbg == null)
- dbg = new PrintWriter(System.out);
-
- _state = new HessianDebugState(dbg);
- }
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianDebugInputStream(InputStream is, Logger log, Level level) {
- this(is, new PrintWriter(new LogWriter(log, level)));
- }
-
- public void startTop2() {
- _state.startTop2();
- }
-
- /**
- * Reads a character.
- */
- @Override
- public int read()
- throws IOException {
- int ch;
-
- InputStream is = _is;
-
- if (is == null)
- return -1;
- else {
- ch = is.read();
- }
-
- _state.next(ch);
-
- return ch;
- }
-
- /**
- * closes the stream.
- */
- @Override
- public void close()
- throws IOException {
- InputStream is = _is;
- _is = null;
-
- if (is != null)
- is.close();
-
- _state.println();
- }
-
- static class LogWriter extends Writer {
- private Logger _log;
- private Level _level;
- private StringBuilder _sb = new StringBuilder();
-
- LogWriter(Logger log, Level level) {
- _log = log;
- _level = level;
- }
-
- public void write(char ch) {
- if (ch == '\n' && _sb.length() > 0) {
- _log.log(_level, _sb.toString());
- _sb.setLength(0);
- } else
- _sb.append((char) ch);
- }
-
- @Override
- public void write(char[] buffer, int offset, int length) {
- for (int i = 0; i < length; i++) {
- char ch = buffer[offset + i];
-
- if (ch == '\n' && _sb.length() > 0) {
- _log.log(_level, _sb.toString());
- _sb.setLength(0);
- } else
- _sb.append((char) ch);
- }
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- public void close() {
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugOutputStream.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugOutputStream.java
deleted file mode 100644
index 5d45d930e0a..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugOutputStream.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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 "Hessian", "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.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Debugging output stream for Hessian requests.
- */
-public class HessianDebugOutputStream extends OutputStream {
- private OutputStream _os;
-
- private HessianDebugState _state;
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianDebugOutputStream(OutputStream os, PrintWriter dbg) {
- _os = os;
-
- _state = new HessianDebugState(dbg);
- }
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianDebugOutputStream(OutputStream os, Logger log, Level level) {
- this(os, new PrintWriter(new LogWriter(log, level)));
- }
-
- public void startTop2() {
- _state.startTop2();
- }
-
- /**
- * Writes a character.
- */
- @Override
- public void write(int ch)
- throws IOException {
- ch = ch & 0xff;
-
- _os.write(ch);
-
- _state.next(ch);
- }
-
- @Override
- public void flush()
- throws IOException {
- _os.flush();
- }
-
- /**
- * closes the stream.
- */
- @Override
- public void close()
- throws IOException {
- OutputStream os = _os;
- _os = null;
-
- if (os != null)
- os.close();
-
- _state.println();
- }
-
- static class LogWriter extends Writer {
- private Logger _log;
- private Level _level;
- private StringBuilder _sb = new StringBuilder();
-
- LogWriter(Logger log, Level level) {
- _log = log;
- _level = level;
- }
-
- public void write(char ch) {
- if (ch == '\n' && _sb.length() > 0) {
- _log.log(_level, _sb.toString());
- _sb.setLength(0);
- } else
- _sb.append((char) ch);
- }
-
- @Override
- public void write(char[] buffer, int offset, int length) {
- for (int i = 0; i < length; i++) {
- char ch = buffer[offset + i];
-
- if (ch == '\n' && _sb.length() > 0) {
- _log.log(_level, _sb.toString());
- _sb.setLength(0);
- } else
- _sb.append((char) ch);
- }
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- public void close() {
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugState.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugState.java
deleted file mode 100644
index 07982890707..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugState.java
+++ /dev/null
@@ -1,2204 +0,0 @@
-/*
- * 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 "Hessian", "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.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * Debugging input stream for Hessian requests.
- */
-public class HessianDebugState implements Hessian2Constants {
- private PrintWriter _dbg;
-
- private State _state;
- private ArrayList
- * InputStream is = ...; // from http connection
- * HessianInput in = new HessianInput(is);
- * String value;
- *
- * in.startReply(); // read reply header
- * value = in.readString(); // read string value
- * in.completeReply(); // read reply footer
- *
- */
-public class HessianInput extends AbstractHessianInput {
- private static int END_OF_DATA = -2;
-
- private static Field _detailMessageField;
-
- static {
- try {
- _detailMessageField = Throwable.class.getDeclaredField("detailMessage");
- _detailMessageField.setAccessible(true);
- } catch (Throwable e) {
- }
- }
-
- // factory for deserializing objects in the input stream
- protected SerializerFactory _serializerFactory;
- protected ArrayList _refs;
- // a peek character
- protected int _peek = -1;
- // the underlying input stream
- private InputStream _is;
- // the method for a call
- private String _method;
- private Reader _chunkReader;
- private InputStream _chunkInputStream;
- private Throwable _replyFault;
- private StringBuffer _sbuf = new StringBuffer();
- // true if this is the last chunk
- private boolean _isLastChunk;
- // the chunk length
- private int _chunkLength;
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianInput() {
- }
-
- /**
- * Creates a new Hessian input stream, initialized with an
- * underlying input stream.
- *
- * @param is the underlying input stream.
- */
- public HessianInput(InputStream is) {
- init(is);
- }
-
- /**
- * Gets the serializer factory.
- */
- public SerializerFactory getSerializerFactory() {
- return _serializerFactory;
- }
-
- /**
- * Sets the serializer factory.
- */
- @Override
- public void setSerializerFactory(SerializerFactory factory) {
- _serializerFactory = factory;
- }
-
- /**
- * Initialize the hessian stream with the underlying input stream.
- */
- @Override
- public void init(InputStream is) {
- _is = is;
- _method = null;
- _isLastChunk = true;
- _chunkLength = 0;
- _peek = -1;
- _refs = null;
- _replyFault = null;
-
- if (_serializerFactory == null)
- _serializerFactory = new SerializerFactory();
- }
-
- /**
- * Returns the calls method
- */
- @Override
- public String getMethod() {
- return _method;
- }
-
- /**
- * Returns any reply fault.
- */
- public Throwable getReplyFault() {
- return _replyFault;
- }
-
- /**
- * Starts reading the call
- *
- * c major minor
- *
- */
- @Override
- public int readCall()
- throws IOException {
- int tag = read();
-
- if (tag != 'c')
- throw error("expected hessian call ('c') at " + codeName(tag));
-
- int major = read();
- int minor = read();
-
- return (major << 16) + minor;
- }
-
- /**
- * For backward compatibility with HessianSkeleton
- */
- @Override
- public void skipOptionalCall()
- throws IOException {
- int tag = read();
-
- if (tag == 'c') {
- read();
- read();
- } else
- _peek = tag;
- }
-
- /**
- * Starts reading the call
- *
- * m b16 b8 method
- *
- */
- @Override
- public String readMethod()
- throws IOException {
- int tag = read();
-
- if (tag != 'm')
- throw error("expected hessian method ('m') at " + codeName(tag));
- int d1 = read();
- int d2 = read();
-
- _isLastChunk = true;
- _chunkLength = d1 * 256 + d2;
- _sbuf.setLength(0);
- int ch;
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- _method = _sbuf.toString();
-
- return _method;
- }
-
- /**
- * Starts reading the call, including the headers.
- *
- * c major minor
- * m b16 b8 method
- *
- */
- @Override
- public void startCall()
- throws IOException {
- readCall();
-
- while (readHeader() != null) {
- readObject();
- }
-
- readMethod();
- }
-
- /**
- * Completes reading the call
- *
- * z
- *
- */
- @Override
- public void completeCall()
- throws IOException {
- int tag = read();
-
- if (tag == 'z') {
- } else
- throw error("expected end of call ('z') at " + codeName(tag) + ". Check method arguments and ensure method overloading is enabled if necessary");
- }
-
- /**
- * Reads a reply as an object.
- * If the reply has a fault, throws the exception.
- */
- @Override
- public Object readReply(Class expectedClass)
- throws Throwable {
- int tag = read();
-
- if (tag != 'r')
- error("expected hessian reply at " + codeName(tag));
-
- int major = read();
- int minor = read();
-
- tag = read();
- if (tag == 'f')
- throw prepareFault();
- else {
- _peek = tag;
-
- Object value = readObject(expectedClass);
-
- completeValueReply();
-
- return value;
- }
- }
-
- /**
- * Starts reading the reply
- *
- * r
- *
- */
- @Override
- public void startReply()
- throws Throwable {
- int tag = read();
-
- if (tag != 'r')
- error("expected hessian reply at " + codeName(tag));
-
- int major = read();
- int minor = read();
-
- tag = read();
- if (tag == 'f')
- throw prepareFault();
- else
- _peek = tag;
- }
-
- /**
- * Prepares the fault.
- */
- private Throwable prepareFault()
- throws IOException {
- HashMap fault = readFault();
-
- Object detail = fault.get("detail");
- String message = (String) fault.get("message");
-
- if (detail instanceof Throwable) {
- _replyFault = (Throwable) detail;
-
- if (message != null && _detailMessageField != null) {
- try {
- _detailMessageField.set(_replyFault, message);
- } catch (Throwable e) {
- }
- }
-
- return _replyFault;
- } else {
- String code = (String) fault.get("code");
-
- _replyFault = new HessianServiceException(message, code, detail);
-
- return _replyFault;
- }
- }
-
- /**
- * Completes reading the call
- *
- * z
- *
- */
- @Override
- public void completeReply()
- throws IOException {
- int tag = read();
-
- if (tag != 'z')
- error("expected end of reply at " + codeName(tag));
- }
-
- /**
- * Completes reading the call
- *
- * z
- *
- */
- public void completeValueReply()
- throws IOException {
- int tag = read();
-
- if (tag != 'z')
- error("expected end of reply at " + codeName(tag));
- }
-
- /**
- * Reads a header, returning null if there are no headers.
- *
- * H b16 b8 value
- *
- */
- @Override
- public String readHeader()
- throws IOException {
- int tag = read();
-
- if (tag == 'H') {
- _isLastChunk = true;
- _chunkLength = (read() << 8) + read();
-
- _sbuf.setLength(0);
- int ch;
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
- }
-
- _peek = tag;
-
- return null;
- }
-
- /**
- * Reads a null
- *
- * N
- *
- */
- @Override
- public void readNull()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return;
-
- default:
- throw expect("null", tag);
- }
- }
-
- /**
- * Reads a byte
- *
- *
- * I b32 b24 b16 b8
- *
- */
- /*
- public byte readByte()
- throws IOException
- {
- return (byte) readInt();
- }
- */
-
- /**
- * Reads a boolean
- *
- * T
- * F
- *
- */
- @Override
- public boolean readBoolean()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'T':
- return true;
- case 'F':
- return false;
- case 'I':
- return parseInt() == 0;
- case 'L':
- return parseLong() == 0;
- case 'D':
- return parseDouble() == 0.0;
- case 'N':
- return false;
-
- default:
- throw expect("boolean", tag);
- }
- }
-
- /**
- * Reads a short
- *
- * I b32 b24 b16 b8
- *
- */
- public short readShort()
- throws IOException {
- return (short) readInt();
- }
-
- /**
- * Reads an integer
- *
- * I b32 b24 b16 b8
- *
- */
- @Override
- public int readInt()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'T':
- return 1;
- case 'F':
- return 0;
- case 'I':
- return parseInt();
- case 'L':
- return (int) parseLong();
- case 'D':
- return (int) parseDouble();
-
- default:
- throw expect("int", tag);
- }
- }
-
- /**
- * Reads a long
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public long readLong()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'T':
- return 1;
- case 'F':
- return 0;
- case 'I':
- return parseInt();
- case 'L':
- return parseLong();
- case 'D':
- return (long) parseDouble();
-
- default:
- throw expect("long", tag);
- }
- }
-
- /**
- * Reads a float
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- public float readFloat()
- throws IOException {
- return (float) readDouble();
- }
-
- /**
- * Reads a double
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public double readDouble()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'T':
- return 1;
- case 'F':
- return 0;
- case 'I':
- return parseInt();
- case 'L':
- return (double) parseLong();
- case 'D':
- return parseDouble();
-
- default:
- throw expect("long", tag);
- }
- }
-
- /**
- * Reads a date.
- *
- * T b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- @Override
- public long readUTCDate()
- throws IOException {
- int tag = read();
-
- if (tag != 'd')
- throw error("expected date at " + codeName(tag));
-
- long b64 = read();
- long b56 = read();
- long b48 = read();
- long b40 = read();
- long b32 = read();
- long b24 = read();
- long b16 = read();
- long b8 = read();
-
- return ((b64 << 56) +
- (b56 << 48) +
- (b48 << 40) +
- (b40 << 32) +
- (b32 << 24) +
- (b24 << 16) +
- (b16 << 8) +
- b8);
- }
-
- /**
- * Reads a byte from the stream.
- */
- public int readChar()
- throws IOException {
- if (_chunkLength > 0) {
- _chunkLength--;
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- int ch = parseUTF8Char();
- return ch;
- } else if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- }
-
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'S':
- case 's':
- case 'X':
- case 'x':
- _isLastChunk = tag == 'S' || tag == 'X';
- _chunkLength = (read() << 8) + read();
-
- _chunkLength--;
- int value = parseUTF8Char();
-
- // special code so successive read byte won't
- // be read as a single object.
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return value;
-
- default:
- throw new IOException("expected 'S' at " + (char) tag);
- }
- }
-
- /**
- * Reads a byte array from the stream.
- */
- public int readString(char[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- } else if (_chunkLength == 0) {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'S':
- case 's':
- case 'X':
- case 'x':
- _isLastChunk = tag == 'S' || tag == 'X';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw new IOException("expected 'S' at " + (char) tag);
- }
- }
-
- while (length > 0) {
- if (_chunkLength > 0) {
- buffer[offset++] = (char) parseUTF8Char();
- _chunkLength--;
- length--;
- readLength++;
- } else if (_isLastChunk) {
- if (readLength == 0)
- return -1;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- } else {
- int tag = read();
-
- switch (tag) {
- case 'S':
- case 's':
- case 'X':
- case 'x':
- _isLastChunk = tag == 'S' || tag == 'X';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw new IOException("expected 'S' at " + (char) tag);
- }
- }
- }
-
- if (readLength == 0)
- return -1;
- else if (_chunkLength > 0 || !_isLastChunk)
- return readLength;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- }
-
- /**
- * Reads a string
- *
- * S b16 b8 string value
- *
- */
- @Override
- public String readString()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'I':
- return String.valueOf(parseInt());
- case 'L':
- return String.valueOf(parseLong());
- case 'D':
- return String.valueOf(parseDouble());
-
- case 'S':
- case 's':
- case 'X':
- case 'x':
- _isLastChunk = tag == 'S' || tag == 'X';
- _chunkLength = (read() << 8) + read();
-
- _sbuf.setLength(0);
- int ch;
-
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
-
- default:
- throw expect("string", tag);
- }
- }
-
- /**
- * Reads an XML node.
- *
- * S b16 b8 string value
- *
- */
- @Override
- public org.w3c.dom.Node readNode()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'S':
- case 's':
- case 'X':
- case 'x':
- _isLastChunk = tag == 'S' || tag == 'X';
- _chunkLength = (read() << 8) + read();
-
- throw error("Can't handle string in this context");
-
- default:
- throw expect("string", tag);
- }
- }
-
- /**
- * Reads a byte array
- *
- * B b16 b8 data value
- *
- */
- @Override
- public byte[] readBytes()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
-
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
- int data;
- while ((data = parseByte()) >= 0)
- bos.write(data);
-
- return bos.toByteArray();
-
- default:
- throw expect("bytes", tag);
- }
- }
-
- /**
- * Reads a byte from the stream.
- */
- public int readByte()
- throws IOException {
- if (_chunkLength > 0) {
- _chunkLength--;
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return read();
- } else if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- }
-
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
-
- int value = parseByte();
-
- // special code so successive read byte won't
- // be read as a single object.
- if (_chunkLength == 0 && _isLastChunk)
- _chunkLength = END_OF_DATA;
-
- return value;
-
- default:
- throw new IOException("expected 'B' at " + (char) tag);
- }
- }
-
- /**
- * Reads a byte array from the stream.
- */
- public int readBytes(byte[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- if (_chunkLength == END_OF_DATA) {
- _chunkLength = 0;
- return -1;
- } else if (_chunkLength == 0) {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return -1;
-
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw new IOException("expected 'B' at " + (char) tag);
- }
- }
-
- while (length > 0) {
- if (_chunkLength > 0) {
- buffer[offset++] = (byte) read();
- _chunkLength--;
- length--;
- readLength++;
- } else if (_isLastChunk) {
- if (readLength == 0)
- return -1;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- } else {
- int tag = read();
-
- switch (tag) {
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw new IOException("expected 'B' at " + (char) tag);
- }
- }
- }
-
- if (readLength == 0)
- return -1;
- else if (_chunkLength > 0 || !_isLastChunk)
- return readLength;
- else {
- _chunkLength = END_OF_DATA;
- return readLength;
- }
- }
-
- /**
- * Reads a fault.
- */
- private HashMap readFault()
- throws IOException {
- HashMap map = new HashMap();
-
- int code = read();
- for (; code > 0 && code != 'z'; code = read()) {
- _peek = code;
-
- Object key = readObject();
- Object value = readObject();
-
- if (key != null && value != null)
- map.put(key, value);
- }
-
- if (code != 'z')
- throw expect("fault", code);
-
- return map;
- }
-
- /**
- * Reads an object from the input stream with an expected type.
- */
- @Override
- public Object readObject(Class cl)
- throws IOException {
- return readObject(cl, null, null);
- }
-
- /**
- * Reads an object from the input stream with an expected type.
- */
- public Object readObject(Class expectedClass, Class>... expectedTypes)
- throws IOException {
- if (expectedClass == null || expectedClass == Object.class)
- return readObject();
-
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'M': {
- String type = readType();
-
- boolean keyValuePair = expectedTypes != null && expectedTypes.length == 2;
-
- // hessian/3386
- if ("".equals(type)) {
- Deserializer reader;
- reader = _serializerFactory.getDeserializer(expectedClass);
-
- return reader.readMap(this
- , keyValuePair ? expectedTypes[0] : null
- , keyValuePair ? expectedTypes[1] : null);
- } else {
- Deserializer reader;
- reader = _serializerFactory.getObjectDeserializer(type, expectedClass);
-
- return reader.readMap(this
- , keyValuePair ? expectedTypes[0] : null
- , keyValuePair ? expectedTypes[1] : null);
- }
- }
-
- case 'V': {
- String type = readType();
- int length = readLength();
-
- Deserializer reader;
- reader = _serializerFactory.getObjectDeserializer(type);
-
- boolean valueType = expectedTypes != null && expectedTypes.length == 1;
-
- if (expectedClass != reader.getType() && expectedClass.isAssignableFrom(reader.getType()))
- return reader.readList(this, length, valueType ? expectedTypes[0] : null);
-
- reader = _serializerFactory.getDeserializer(expectedClass);
-
- Object v = reader.readList(this, length, valueType ? expectedTypes[0] : null);
-
- return v;
- }
-
- case 'R': {
- int ref = parseInt();
-
- return _refs.get(ref);
- }
-
- case 'r': {
- String type = readType();
- String url = readString();
-
- return resolveRemote(type, url);
- }
- }
-
- _peek = tag;
-
- // hessian/332i vs hessian/3406
- //return readObject();
-
- Object value = _serializerFactory.getDeserializer(expectedClass).readObject(this);
-
- return value;
- }
-
- /**
- * Reads an arbitrary object from the input stream when the type
- * is unknown.
- */
- @Override
- public Object readObject()
- throws IOException {
- return readObject((List
- * t b16 b8
- *
- */
- @Override
- public String readType()
- throws IOException {
- int code = read();
-
- if (code != 't') {
- _peek = code;
- return "";
- }
-
- _isLastChunk = true;
- _chunkLength = (read() << 8) + read();
-
- _sbuf.setLength(0);
- int ch;
- while ((ch = parseChar()) >= 0)
- _sbuf.append((char) ch);
-
- return _sbuf.toString();
- }
-
- /**
- * Parses the length for an array
- *
- * l b32 b24 b16 b8
- *
- */
- @Override
- public int readLength()
- throws IOException {
- int code = read();
-
- if (code != 'l') {
- _peek = code;
- return -1;
- }
-
- return parseInt();
- }
-
- /**
- * Parses a 32-bit integer value from the stream.
- *
- * b32 b24 b16 b8
- *
- */
- private int parseInt()
- throws IOException {
- int b32 = read();
- int b24 = read();
- int b16 = read();
- int b8 = read();
-
- return (b32 << 24) + (b24 << 16) + (b16 << 8) + b8;
- }
-
- /**
- * Parses a 64-bit long value from the stream.
- *
- * b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- private long parseLong()
- throws IOException {
- long b64 = read();
- long b56 = read();
- long b48 = read();
- long b40 = read();
- long b32 = read();
- long b24 = read();
- long b16 = read();
- long b8 = read();
-
- return ((b64 << 56) +
- (b56 << 48) +
- (b48 << 40) +
- (b40 << 32) +
- (b32 << 24) +
- (b24 << 16) +
- (b16 << 8) +
- b8);
- }
-
- /**
- * Parses a 64-bit double value from the stream.
- *
- * b64 b56 b48 b40 b32 b24 b16 b8
- *
- */
- private double parseDouble()
- throws IOException {
- long b64 = read();
- long b56 = read();
- long b48 = read();
- long b40 = read();
- long b32 = read();
- long b24 = read();
- long b16 = read();
- long b8 = read();
-
- long bits = ((b64 << 56) +
- (b56 << 48) +
- (b48 << 40) +
- (b40 << 32) +
- (b32 << 24) +
- (b24 << 16) +
- (b16 << 8) +
- b8);
-
- return Double.longBitsToDouble(bits);
- }
-
- org.w3c.dom.Node parseXML()
- throws IOException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Reads a character from the underlying stream.
- */
- private int parseChar()
- throws IOException {
- while (_chunkLength <= 0) {
- if (_isLastChunk)
- return -1;
-
- int code = read();
-
- switch (code) {
- case 's':
- case 'x':
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'S':
- case 'X':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("string", code);
- }
-
- }
-
- _chunkLength--;
-
- return parseUTF8Char();
- }
-
- /**
- * Parses a single UTF8 character.
- */
- private int parseUTF8Char()
- throws IOException {
- int ch = read();
-
- if (ch < 0x80)
- return ch;
- else if ((ch & 0xe0) == 0xc0) {
- int ch1 = read();
- int v = ((ch & 0x1f) << 6) + (ch1 & 0x3f);
-
- return v;
- } else if ((ch & 0xf0) == 0xe0) {
- int ch1 = read();
- int ch2 = read();
- int v = ((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f);
-
- return v;
- } else
- throw error("bad utf-8 encoding at " + codeName(ch));
- }
-
- /**
- * Reads a byte from the underlying stream.
- */
- private int parseByte()
- throws IOException {
- while (_chunkLength <= 0) {
- if (_isLastChunk) {
- return -1;
- }
-
- int code = read();
-
- switch (code) {
- case 'b':
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'B':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("byte[]", code);
- }
- }
-
- _chunkLength--;
-
- return read();
- }
-
- /**
- * Reads bytes based on an input stream.
- */
- @Override
- public InputStream readInputStream()
- throws IOException {
- int tag = read();
-
- switch (tag) {
- case 'N':
- return null;
-
- case 'B':
- case 'b':
- _isLastChunk = tag == 'B';
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("inputStream", tag);
- }
-
- return new InputStream() {
- boolean _isClosed = false;
-
- @Override
- public int read()
- throws IOException {
- if (_isClosed || _is == null)
- return -1;
-
- int ch = parseByte();
- if (ch < 0)
- _isClosed = true;
-
- return ch;
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length)
- throws IOException {
- if (_isClosed || _is == null)
- return -1;
-
- int len = HessianInput.this.read(buffer, offset, length);
- if (len < 0)
- _isClosed = true;
-
- return len;
- }
-
- @Override
- public void close()
- throws IOException {
- while (read() >= 0) {
- }
-
- _isClosed = true;
- }
- };
- }
-
- /**
- * Reads bytes from the underlying stream.
- */
- int read(byte[] buffer, int offset, int length)
- throws IOException {
- int readLength = 0;
-
- while (length > 0) {
- while (_chunkLength <= 0) {
- if (_isLastChunk)
- return readLength == 0 ? -1 : readLength;
-
- int code = read();
-
- switch (code) {
- case 'b':
- _isLastChunk = false;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- case 'B':
- _isLastChunk = true;
-
- _chunkLength = (read() << 8) + read();
- break;
-
- default:
- throw expect("byte[]", code);
- }
- }
-
- int sublen = _chunkLength;
- if (length < sublen)
- sublen = length;
-
- sublen = _is.read(buffer, offset, sublen);
- offset += sublen;
- readLength += sublen;
- length -= sublen;
- _chunkLength -= sublen;
- }
-
- return readLength;
- }
-
- final int read()
- throws IOException {
- if (_peek >= 0) {
- int value = _peek;
- _peek = -1;
- return value;
- }
-
- int ch = _is.read();
-
- return ch;
- }
-
- @Override
- public void close() {
- _is = null;
- }
-
- @Override
- public Reader getReader() {
- return null;
- }
-
- protected IOException expect(String expect, int ch) {
- return error("expected " + expect + " at " + codeName(ch));
- }
-
- protected String codeName(int ch) {
- if (ch < 0)
- return "end of file";
- else
- return "0x" + Integer.toHexString(ch & 0xff) + " (" + (char) +ch + ")";
- }
-
- protected IOException error(String message) {
- if (_method != null)
- return new HessianProtocolException(_method + ": " + message);
- else
- return new HessianProtocolException(message);
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInputFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInputFactory.java
deleted file mode 100644
index 2c0cf697d66..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInputFactory.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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 "Hessian", "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.util.logging.Logger;
-
-public class HessianInputFactory {
- public static final Logger log
- = Logger.getLogger(HessianInputFactory.class.getName());
-
- private SerializerFactory _serializerFactory;
-
- public SerializerFactory getSerializerFactory() {
- return _serializerFactory;
- }
-
- public void setSerializerFactory(SerializerFactory factory) {
- _serializerFactory = factory;
- }
-
- public AbstractHessianInput open(InputStream is)
- throws IOException {
- int code = is.read();
-
- int major = is.read();
- int minor = is.read();
-
- switch (code) {
- case 'c':
- case 'C':
- case 'r':
- case 'R':
- if (major >= 2) {
- AbstractHessianInput in = new Hessian2Input(is);
- in.setSerializerFactory(_serializerFactory);
- return in;
- } else {
- AbstractHessianInput in = new HessianInput(is);
- in.setSerializerFactory(_serializerFactory);
- return in;
- }
-
- default:
- throw new IOException((char) code + " is an unknown Hessian message code.");
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianOutput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianOutput.java
deleted file mode 100644
index aad614b98e5..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianOutput.java
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.OutputStream;
-import java.util.IdentityHashMap;
-
-/**
- * Output stream for Hessian requests, compatible with microedition
- * Java. It only uses classes and types available in JDK.
- *
- * OutputStream os = ...; // from http connection
- * HessianOutput out = new HessianOutput(os);
- * String value;
- *
- * out.startCall("hello"); // start hello call
- * out.writeString("arg1"); // write a string argument
- * out.completeCall(); // complete the call
- *
- */
-public class HessianOutput extends AbstractHessianOutput {
- // the output stream/
- protected OutputStream os;
- // map of references
- private IdentityHashMap _refs;
- private int _version = 1;
-
- /**
- * Creates a new Hessian output stream, initialized with an
- * underlying output stream.
- *
- * @param os the underlying output stream.
- */
- public HessianOutput(OutputStream os) {
- init(os);
- }
-
- /**
- * Creates an uninitialized Hessian output stream.
- */
- public HessianOutput() {
- }
-
- /**
- * Initializes the output
- */
- @Override
- public void init(OutputStream os) {
- this.os = os;
-
- _refs = null;
-
- if (_serializerFactory == null)
- _serializerFactory = new SerializerFactory();
- }
-
- /**
- * Sets the client's version.
- */
- public void setVersion(int version) {
- _version = version;
- }
-
- /**
- * Writes a complete method call.
- */
- @Override
- public void call(String method, Object[] args)
- throws IOException {
- int length = args != null ? args.length : 0;
-
- startCall(method, length);
-
- for (int i = 0; i < length; i++)
- writeObject(args[i]);
-
- completeCall();
- }
-
- /**
- * Starts the method call. Clients would use startCall
- * instead of call
if they wanted finer control over
- * writing the arguments, or needed to write headers.
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void startCall(String method, int length)
- throws IOException {
- os.write('c');
- os.write(_version);
- os.write(0);
-
- os.write('m');
- int len = method.length();
- os.write(len >> 8);
- os.write(len);
- printString(method, 0, len);
- }
-
- /**
- * Writes the call tag. This would be followed by the
- * headers and the method tag.
- *
- * c major minor
- * m b16 b8 method-name
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void startCall()
- throws IOException {
- os.write('c');
- os.write(0);
- os.write(1);
- }
-
- /**
- * Writes the method tag.
- *
- * c major minor
- *
- *
- * @param method the method name to call.
- */
- @Override
- public void writeMethod(String method)
- throws IOException {
- os.write('m');
- int len = method.length();
- os.write(len >> 8);
- os.write(len);
- printString(method, 0, len);
- }
-
- /**
- * Completes.
- *
- * m b16 b8 method-name
- *
- */
- @Override
- public void completeCall()
- throws IOException {
- os.write('z');
- }
-
- /**
- * Starts the reply
- *
- * z
- *
- * r
- *
- */
- @Override
- public void startReply()
- throws IOException {
- os.write('r');
- os.write(1);
- os.write(0);
- }
-
- /**
- * Completes reading the reply
- *
- * z
- *
- */
- @Override
- public void completeReply()
- throws IOException {
- os.write('z');
- }
-
- /**
- * Writes a header name. The header value must immediately follow.
- *
- */
- @Override
- public void writeHeader(String name)
- throws IOException {
- int len = name.length();
-
- os.write('H');
- os.write(len >> 8);
- os.write(len);
-
- printString(name);
- }
-
- /**
- * Writes a fault. The fault will be written
- * as a descriptive string followed by an object:
- *
- * H b16 b8 foo value
- *
- *
- * @param code the fault code, a three digit
- */
- @Override
- public void writeFault(String code, String message, Object detail)
- throws IOException {
- os.write('f');
- writeString("code");
- writeString(code);
-
- writeString("message");
- writeString(message);
-
- if (detail != null) {
- writeString("detail");
- writeObject(detail);
- }
- os.write('z');
- }
-
- /**
- * Writes any object to the output stream.
- */
- @Override
- public void writeObject(Object object)
- throws IOException {
- if (object == null) {
- writeNull();
- return;
- }
-
- Serializer serializer;
-
- serializer = _serializerFactory.getSerializer(object.getClass());
-
- serializer.writeObject(object, this);
- }
-
- /**
- * Writes the list header to the stream. List writers will call
- *
- * f
- * <string>code
- * <string>the fault code
- *
writeListBegin
followed by the list contents and then
- * call writeListEnd
.
- *
- */
- @Override
- public boolean writeListBegin(int length, String type)
- throws IOException {
- os.write('V');
-
- if (type != null) {
- os.write('t');
- printLenString(type);
- }
-
- if (length >= 0) {
- os.write('l');
- os.write(length >> 24);
- os.write(length >> 16);
- os.write(length >> 8);
- os.write(length);
- }
-
- return true;
- }
-
- /**
- * Writes the tail of the list to the stream.
- */
- @Override
- public void writeListEnd()
- throws IOException {
- os.write('z');
- }
-
- /**
- * Writes the map header to the stream. Map writers will call
- *
- * V
- * t b16 b8 type
- * l b32 b24 b16 b8
- *
writeMapBegin
followed by the map contents and then
- * call writeMapEnd
.
- *
- */
- @Override
- public void writeMapBegin(String type)
- throws IOException {
- os.write('M');
- os.write('t');
- printLenString(type);
- }
-
- /**
- * Writes the tail of the map to the stream.
- */
- @Override
- public void writeMapEnd()
- throws IOException {
- os.write('z');
- }
-
- /**
- * Writes a remote object reference to the stream. The type is the
- * type of the remote interface.
- *
- * Mt b16 b8 (
- */
- public void writeRemote(String type, String url)
- throws IOException {
- os.write('r');
- os.write('t');
- printLenString(type);
- os.write('S');
- printLenString(url);
- }
-
- /**
- * Writes a boolean value to the stream. The boolean will be written
- * with the following syntax:
- *
- * 'r' 't' b16 b8 type url
- *
- *
- * @param value the boolean value to write.
- */
- @Override
- public void writeBoolean(boolean value)
- throws IOException {
- if (value)
- os.write('T');
- else
- os.write('F');
- }
-
- /**
- * Writes an integer value to the stream. The integer will be written
- * with the following syntax:
- *
- * T
- * F
- *
- *
- * @param value the integer value to write.
- */
- @Override
- public void writeInt(int value)
- throws IOException {
- os.write('I');
- os.write(value >> 24);
- os.write(value >> 16);
- os.write(value >> 8);
- os.write(value);
- }
-
- /**
- * Writes a long value to the stream. The long will be written
- * with the following syntax:
- *
- * I b32 b24 b16 b8
- *
- *
- * @param value the long value to write.
- */
- @Override
- public void writeLong(long value)
- throws IOException {
- os.write('L');
- os.write((byte) (value >> 56));
- os.write((byte) (value >> 48));
- os.write((byte) (value >> 40));
- os.write((byte) (value >> 32));
- os.write((byte) (value >> 24));
- os.write((byte) (value >> 16));
- os.write((byte) (value >> 8));
- os.write((byte) (value));
- }
-
- /**
- * Writes a double value to the stream. The double will be written
- * with the following syntax:
- *
- * L b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- * @param value the double value to write.
- */
- @Override
- public void writeDouble(double value)
- throws IOException {
- long bits = Double.doubleToLongBits(value);
-
- os.write('D');
- os.write((byte) (bits >> 56));
- os.write((byte) (bits >> 48));
- os.write((byte) (bits >> 40));
- os.write((byte) (bits >> 32));
- os.write((byte) (bits >> 24));
- os.write((byte) (bits >> 16));
- os.write((byte) (bits >> 8));
- os.write((byte) (bits));
- }
-
- /**
- * Writes a date to the stream.
- *
- * D b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- * @param time the date in milliseconds from the epoch in UTC
- */
- @Override
- public void writeUTCDate(long time)
- throws IOException {
- os.write('d');
- os.write((byte) (time >> 56));
- os.write((byte) (time >> 48));
- os.write((byte) (time >> 40));
- os.write((byte) (time >> 32));
- os.write((byte) (time >> 24));
- os.write((byte) (time >> 16));
- os.write((byte) (time >> 8));
- os.write((byte) (time));
- }
-
- /**
- * Writes a null value to the stream.
- * The null will be written with the following syntax
- *
- * T b64 b56 b48 b40 b32 b24 b16 b8
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeNull()
- throws IOException {
- os.write('N');
- }
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- * S b16 b8 string-value
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeString(String value)
- throws IOException {
- if (value == null) {
- os.write('N');
- } else {
- int length = value.length();
- int offset = 0;
-
- while (length > 0x8000) {
- int sublen = 0x8000;
-
- // chunk can't end in high surrogate
- char tail = value.charAt(offset + sublen - 1);
-
- if (0xd800 <= tail && tail <= 0xdbff)
- sublen--;
-
- os.write('s');
- os.write(sublen >> 8);
- os.write(sublen);
-
- printString(value, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
-
- os.write('S');
- os.write(length >> 8);
- os.write(length);
-
- printString(value, offset, length);
- }
- }
-
- /**
- * Writes a string value to the stream using UTF-8 encoding.
- * The string will be written with the following syntax:
- *
- * N
- *
- *
- * S b16 b8 string-value
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeString(char[] buffer, int offset, int length)
- throws IOException {
- if (buffer == null) {
- os.write('N');
- } else {
- while (length > 0x8000) {
- int sublen = 0x8000;
-
- // chunk can't end in high surrogate
- char tail = buffer[offset + sublen - 1];
-
- if (0xd800 <= tail && tail <= 0xdbff)
- sublen--;
-
- os.write('s');
- os.write(sublen >> 8);
- os.write(sublen);
-
- printString(buffer, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
-
- os.write('S');
- os.write(length >> 8);
- os.write(length);
-
- printString(buffer, offset, length);
- }
- }
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- * B b16 b18 bytes
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeBytes(byte[] buffer)
- throws IOException {
- if (buffer == null)
- os.write('N');
- else
- writeBytes(buffer, 0, buffer.length);
- }
-
- /**
- * Writes a byte array to the stream.
- * The array will be written with the following syntax:
- *
- * N
- *
- *
- * B b16 b18 bytes
- *
- *
- * @param value the string value to write.
- */
- @Override
- public void writeBytes(byte[] buffer, int offset, int length)
- throws IOException {
- if (buffer == null) {
- os.write('N');
- } else {
- while (length > 0x8000) {
- int sublen = 0x8000;
-
- os.write('b');
- os.write(sublen >> 8);
- os.write(sublen);
-
- os.write(buffer, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
-
- os.write('B');
- os.write(length >> 8);
- os.write(length);
- os.write(buffer, offset, length);
- }
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- * N
- *
- */
- @Override
- public void writeByteBufferStart()
- throws IOException {
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- *
- */
- @Override
- public void writeByteBufferPart(byte[] buffer, int offset, int length)
- throws IOException {
- while (length > 0) {
- int sublen = length;
-
- if (0x8000 < sublen)
- sublen = 0x8000;
-
- os.write('b');
- os.write(sublen >> 8);
- os.write(sublen);
-
- os.write(buffer, offset, sublen);
-
- length -= sublen;
- offset += sublen;
- }
- }
-
- /**
- * Writes a byte buffer to the stream.
- *
- * b b16 b18 bytes
- *
- */
- @Override
- public void writeByteBufferEnd(byte[] buffer, int offset, int length)
- throws IOException {
- writeBytes(buffer, offset, length);
- }
-
- /**
- * Writes a reference.
- *
- * b b16 b18 bytes
- *
- *
- * @param value the integer value to write.
- */
- @Override
- public void writeRef(int value)
- throws IOException {
- os.write('R');
- os.write(value >> 24);
- os.write(value >> 16);
- os.write(value >> 8);
- os.write(value);
- }
-
- /**
- * Writes a placeholder.
- *
- * R b32 b24 b16 b8
- *
- */
- public void writePlaceholder()
- throws IOException {
- os.write('P');
- }
-
- /**
- * If the object has already been written, just write its ref.
- *
- * @return true if we're writing a ref.
- */
- @Override
- public boolean addRef(Object object)
- throws IOException {
- if (_refs == null)
- _refs = new IdentityHashMap();
-
- Integer ref = (Integer) _refs.get(object);
-
- if (ref != null) {
- int value = ref.intValue();
-
- writeRef(value);
- return true;
- } else {
- _refs.put(object, new Integer(_refs.size()));
-
- return false;
- }
- }
-
- /**
- * Resets the references for streaming.
- */
- @Override
- public void resetReferences() {
- if (_refs != null)
- _refs.clear();
- }
-
- /**
- * Removes a reference.
- */
- @Override
- public boolean removeRef(Object obj)
- throws IOException {
- if (_refs != null) {
- _refs.remove(obj);
-
- return true;
- } else
- return false;
- }
-
- /**
- * Replaces a reference from one object to another.
- */
- @Override
- public boolean replaceRef(Object oldRef, Object newRef)
- throws IOException {
- Integer value = (Integer) _refs.remove(oldRef);
-
- if (value != null) {
- _refs.put(newRef, value);
- return true;
- } else
- return false;
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8 with preceeding length
- *
- * @param v the string to print.
- */
- public void printLenString(String v)
- throws IOException {
- if (v == null) {
- os.write(0);
- os.write(0);
- } else {
- int len = v.length();
- os.write(len >> 8);
- os.write(len);
-
- printString(v, 0, len);
- }
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(String v)
- throws IOException {
- printString(v, 0, v.length());
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(String v, int offset, int length)
- throws IOException {
- for (int i = 0; i < length; i++) {
- char ch = v.charAt(i + offset);
-
- if (ch < 0x80)
- os.write(ch);
- else if (ch < 0x800) {
- os.write(0xc0 + ((ch >> 6) & 0x1f));
- os.write(0x80 + (ch & 0x3f));
- } else {
- os.write(0xe0 + ((ch >> 12) & 0xf));
- os.write(0x80 + ((ch >> 6) & 0x3f));
- os.write(0x80 + (ch & 0x3f));
- }
- }
- }
-
- /**
- * Prints a string to the stream, encoded as UTF-8
- *
- * @param v the string to print.
- */
- public void printString(char[] v, int offset, int length)
- throws IOException {
- for (int i = 0; i < length; i++) {
- char ch = v[i + offset];
-
- if (ch < 0x80)
- os.write(ch);
- else if (ch < 0x800) {
- os.write(0xc0 + ((ch >> 6) & 0x1f));
- os.write(0x80 + (ch & 0x3f));
- } else {
- os.write(0xe0 + ((ch >> 12) & 0xf));
- os.write(0x80 + ((ch >> 6) & 0x3f));
- os.write(0x80 + (ch & 0x3f));
- }
- }
- }
-
- @Override
- public void flush()
- throws IOException {
- if (this.os != null)
- this.os.flush();
- }
-
- @Override
- public void close()
- throws IOException {
- if (this.os != null)
- this.os.flush();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianProtocolException.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianProtocolException.java
deleted file mode 100644
index 28aa320a926..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianProtocolException.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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;
-
-/**
- * Exception for faults when the fault doesn't return a java exception.
- * This exception is required for MicroHessianInput.
- */
-public class HessianProtocolException extends IOException {
- private Throwable rootCause;
-
- /**
- * Zero-arg constructor.
- */
- public HessianProtocolException() {
- }
-
- /**
- * Create the exception.
- */
- public HessianProtocolException(String message) {
- super(message);
- }
-
- /**
- * Create the exception.
- */
- public HessianProtocolException(String message, Throwable rootCause) {
- super(message);
-
- this.rootCause = rootCause;
- }
-
- /**
- * Create the exception.
- */
- public HessianProtocolException(Throwable rootCause) {
- super(String.valueOf(rootCause));
-
- this.rootCause = rootCause;
- }
-
- /**
- * Returns the underlying cause.
- */
- public Throwable getRootCause() {
- return rootCause;
- }
-
- /**
- * Returns the underlying cause.
- */
- @Override
- public Throwable getCause() {
- return getRootCause();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemote.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemote.java
deleted file mode 100644
index 0f5755e8986..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemote.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Encapsulates a remote address when no stub is available, e.g. for
- * Java MicroEdition.
- */
-public class HessianRemote {
- private String type;
- private String url;
-
- /**
- * Creates a new Hessian remote object.
- *
- * @param type the remote stub interface
- * @param url the remote url
- */
- public HessianRemote(String type, String url) {
- this.type = type;
- this.url = url;
- }
-
- /**
- * Creates an uninitialized Hessian remote.
- */
- public HessianRemote() {
- }
-
- /**
- * Returns the remote api class name.
- */
- public String getType() {
- return type;
- }
-
- /**
- * Returns the remote URL.
- */
- public String getURL() {
- return url;
- }
-
- /**
- * Sets the remote URL.
- */
- public void setURL(String url) {
- this.url = url;
- }
-
- /**
- * Defines the hashcode.
- */
- @Override
- public int hashCode() {
- return url.hashCode();
- }
-
- /**
- * Defines equality
- */
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof HessianRemote))
- return false;
-
- HessianRemote remote = (HessianRemote) obj;
-
- return url.equals(remote.url);
- }
-
- /**
- * Readable version of the remote.
- */
- @Override
- public String toString() {
- return "[HessianRemote " + url + "]";
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteObject.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteObject.java
deleted file mode 100644
index 1d5afe5d776..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteObject.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Interface for any hessian remote object.
- */
-public interface HessianRemoteObject {
- public String getHessianType();
-
- public String getHessianURL();
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteResolver.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteResolver.java
deleted file mode 100644
index 9f1e325187e..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianRemoteResolver.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Looks up remote objects. The default just returns a HessianRemote object.
- */
-public interface HessianRemoteResolver {
- /**
- * Looks up a proxy object.
- */
- public Object lookup(String type, String url)
- throws IOException;
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerInput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerInput.java
deleted file mode 100644
index ceed54bf9e1..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerInput.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * 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.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-/**
- * Input stream for Hessian requests, deserializing objects using the
- * java.io.Serialization protocol.
- *
- * P
- *
Serialization
- *
- * InputStream is = new FileInputStream("test.xml");
- * HessianOutput in = new HessianSerializerOutput(is);
- *
- * Object obj = in.readObject();
- * is.close();
- *
- * Parsing a Hessian reply
- *
- * InputStream is = ...; // from http connection
- * HessianInput in = new HessianSerializerInput(is);
- * String value;
- *
- * in.startReply(); // read reply header
- * value = in.readString(); // read string value
- * in.completeReply(); // read reply footer
- *
- */
-public class HessianSerializerInput extends HessianInput {
- /**
- * Creates a new Hessian input stream, initialized with an
- * underlying input stream.
- *
- * @param is the underlying input stream.
- */
- public HessianSerializerInput(InputStream is) {
- super(is);
- }
-
- /**
- * Creates an uninitialized Hessian input stream.
- */
- public HessianSerializerInput() {
- }
-
- /**
- * Reads an object from the input stream. cl is known not to be
- * a Map.
- */
- protected Object readObjectImpl(Class cl)
- throws IOException {
- try {
- Object obj = cl.newInstance();
-
- if (_refs == null)
- _refs = new ArrayList();
- _refs.add(obj);
-
- HashMap fieldMap = getFieldMap(cl);
-
- int code = read();
- for (; code >= 0 && code != 'z'; code = read()) {
- _peek = code;
-
- Object key = readObject();
-
- Field field = (Field) fieldMap.get(key);
-
- if (field != null) {
- Object value = readObject(field.getType());
- field.set(obj, value);
- } else {
- Object value = readObject();
- }
- }
-
- if (code != 'z')
- throw expect("map", code);
-
- // if there's a readResolve method, call it
- try {
- Method method = cl.getMethod("readResolve", new Class[0]);
- return method.invoke(obj, new Object[0]);
- } catch (Exception e) {
- }
-
- return obj;
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(e);
- }
- }
-
- /**
- * Creates a map of the classes fields.
- */
- protected HashMap getFieldMap(Class cl) {
- HashMap fieldMap = new HashMap();
-
- for (; cl != null; cl = cl.getSuperclass()) {
- Field[] fields = cl.getDeclaredFields();
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
-
- if (Modifier.isTransient(field.getModifiers()) ||
- Modifier.isStatic(field.getModifiers()))
- continue;
-
- // XXX: could parameterize the handler to only deal with public
- field.setAccessible(true);
-
- fieldMap.put(field.getName(), field);
- }
- }
-
- return fieldMap;
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerOutput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerOutput.java
deleted file mode 100644
index 56a8772d4ed..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianSerializerOutput.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * 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 "Hessian", "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.OutputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/**
- * Output stream for Hessian requests.
- * Serialization
- *
- * OutputStream os = new FileOutputStream("test.xml");
- * HessianOutput out = new HessianSerializerOutput(os);
- *
- * out.writeObject(obj);
- * os.close();
- *
- * Writing an RPC Call
- *
- * OutputStream os = ...; // from http connection
- * HessianOutput out = new HessianSerializerOutput(os);
- * String value;
- *
- * out.startCall("hello"); // start hello call
- * out.writeString("arg1"); // write a string argument
- * out.completeCall(); // complete the call
- *
- */
-public class HessianSerializerOutput extends HessianOutput {
- /**
- * Creates a new Hessian output stream, initialized with an
- * underlying output stream.
- *
- * @param os the underlying output stream.
- */
- public HessianSerializerOutput(OutputStream os) {
- super(os);
- }
-
- /**
- * Creates an uninitialized Hessian output stream.
- */
- public HessianSerializerOutput() {
- }
-
- /**
- * Applications which override this can do custom serialization.
- *
- * @param object the object to write.
- */
- public void writeObjectImpl(Object obj)
- throws IOException {
- Class cl = obj.getClass();
-
- try {
- Method method = cl.getMethod("writeReplace", new Class[0]);
- Object repl = method.invoke(obj, new Object[0]);
-
- writeObject(repl);
- return;
- } catch (Exception e) {
- }
-
- try {
- writeMapBegin(cl.getName());
- for (; cl != null; cl = cl.getSuperclass()) {
- Field[] fields = cl.getDeclaredFields();
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
-
- if (Modifier.isTransient(field.getModifiers()) ||
- Modifier.isStatic(field.getModifiers()))
- continue;
-
- // XXX: could parameterize the handler to only deal with public
- field.setAccessible(true);
-
- writeString(field.getName());
- writeObject(field.get(obj));
- }
- }
- writeMapEnd();
- } catch (IllegalAccessException e) {
- throw new IOExceptionWrapper(e);
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianServiceException.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianServiceException.java
deleted file mode 100644
index f90842864b9..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianServiceException.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Exception for faults when the fault doesn't return a java exception.
- * This exception is required for MicroHessianInput.
- */
-public class HessianServiceException extends Exception {
- private String code;
- private Object detail;
-
- /**
- * Zero-arg constructor.
- */
- public HessianServiceException() {
- }
-
- /**
- * Create the exception.
- */
- public HessianServiceException(String message, String code, Object detail) {
- super(message);
- this.code = code;
- this.detail = detail;
- }
-
- /**
- * Returns the code.
- */
- public String getCode() {
- return code;
- }
-
- /**
- * Returns the detail.
- */
- public Object getDetail() {
- return detail;
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IOExceptionWrapper.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IOExceptionWrapper.java
deleted file mode 100644
index 261d4beca74..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IOExceptionWrapper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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 "Hessian", "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;
-
-/**
- * Exception wrapper for IO.
- */
-public class IOExceptionWrapper extends IOException {
- private Throwable _cause;
-
- public IOExceptionWrapper(Throwable cause) {
- super(cause.toString());
-
- _cause = cause;
- }
-
- public IOExceptionWrapper(String msg, Throwable cause) {
- super(msg);
-
- _cause = cause;
- }
-
- @Override
- public Throwable getCause() {
- return _cause;
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamDeserializer.java
deleted file mode 100644
index 2dd02908e5d..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamDeserializer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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;
-
-/**
- * Serializing a stream object.
- */
-public class InputStreamDeserializer extends AbstractDeserializer {
- public InputStreamDeserializer() {
- }
-
- @Override
- public Object readObject(AbstractHessianInput in)
- throws IOException {
- return in.readInputStream();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
deleted file mode 100644
index 9bf87e6913a..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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;
-
-/**
- * Serializing a stream object.
- */
-public class InputStreamSerializer extends AbstractSerializer {
- public InputStreamSerializer() {
- }
-
- @Override
- public void writeObject(Object obj, AbstractHessianOutput out)
- throws IOException {
- InputStream is = (InputStream) obj;
-
- if (is == null)
- out.writeNull();
- else {
- byte[] buf = new byte[1024];
- int len;
-
- while ((len = is.read(buf, 0, buf.length)) > 0) {
- out.writeByteBufferPart(buf, 0, len);
- }
-
- out.writeByteBufferEnd(buf, 0, 0);
- }
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IteratorSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IteratorSerializer.java
deleted file mode 100644
index 2d704d2630d..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/IteratorSerializer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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 "Hessian", "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.Iterator;
-
-/**
- * Serializing a JDK 1.2 Iterator.
- */
-public class IteratorSerializer extends AbstractSerializer {
- private static IteratorSerializer _serializer;
-
- public static IteratorSerializer create() {
- if (_serializer == null)
- _serializer = new IteratorSerializer();
-
- return _serializer;
- }
-
- @Override
- public void writeObject(Object obj, AbstractHessianOutput out)
- throws IOException {
- Iterator iter = (Iterator) obj;
-
- boolean hasEnd = out.writeListBegin(-1, null);
-
- while (iter.hasNext()) {
- Object value = iter.next();
-
- out.writeObject(value);
- }
-
- if (hasEnd)
- out.writeListEnd();
- }
-}
diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java
deleted file mode 100644
index 229f6858ed1..00000000000
--- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaDeserializer.java
+++ /dev/null
@@ -1,754 +0,0 @@
-/*
- * Copyright (c) 2001-2008 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.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-/**
- * Serializing an object for known object types.
- */
-public class JavaDeserializer extends AbstractMapDeserializer {
- private static final Logger log
- = Logger.getLogger(JavaDeserializer.class.getName());
-
- private Class _type;
- private HashMap _fieldMap;
- private Method _readResolve;
- private Constructor _constructor;
- private Object[] _constructorArgs;
-
- public JavaDeserializer(Class cl) {
- _type = cl;
- _fieldMap = getFieldMap(cl);
-
- _readResolve = getReadResolve(cl);
-
- if (_readResolve != null) {
- _readResolve.setAccessible(true);
- }
-
- Constructor[] constructors = cl.getDeclaredConstructors();
- long bestCost = Long.MAX_VALUE;
-
- for (int i = 0; i < constructors.length; i++) {
- Class[] param = constructors[i].getParameterTypes();
- long cost = 0;
-
- for (int j = 0; j < param.length; j++) {
- cost = 4 * cost;
-
- if (Object.class.equals(param[j]))
- cost += 1;
- else if (String.class.equals(param[j]))
- cost += 2;
- else if (int.class.equals(param[j]))
- cost += 3;
- else if (long.class.equals(param[j]))
- cost += 4;
- else if (param[j].isPrimitive())
- cost += 5;
- else
- cost += 6;
- }
-
- if (cost < 0 || cost > (1 << 48))
- cost = 1 << 48;
-
- cost += (long) param.length << 48;
-
- if (cost < bestCost) {
- _constructor = constructors[i];
- bestCost = cost;
- }
- }
-
- if (_constructor != null) {
- _constructor.setAccessible(true);
- Class[] params = _constructor.getParameterTypes();
- _constructorArgs = new Object[params.length];
- for (int i = 0; i < params.length; i++) {
- _constructorArgs[i] = getParamArg(params[i]);
- }
- }
- }
-
- /**
- * Creates a map of the classes fields.
- */
- protected static Object getParamArg(Class cl) {
- if (!cl.isPrimitive())
- return null;
- else if (boolean.class.equals(cl))
- return Boolean.FALSE;
- else if (byte.class.equals(cl))
- return new Byte((byte) 0);
- else if (short.class.equals(cl))
- return new Short((short) 0);
- else if (char.class.equals(cl))
- return new Character((char) 0);
- else if (int.class.equals(cl))
- return Integer.valueOf(0);
- else if (long.class.equals(cl))
- return Long.valueOf(0);
- else if (float.class.equals(cl))
- return Float.valueOf(0);
- else if (double.class.equals(cl))
- return Double.valueOf(0);
- else
- throw new UnsupportedOperationException();
- }
-
- static void logDeserializeError(Field field, Object obj, Object value,
- Throwable e)
- throws IOException {
- String fieldName = (field.getDeclaringClass().getName()
- + "." + field.getName());
-
- if (e instanceof HessianFieldException)
- throw (HessianFieldException) e;
- else if (e instanceof IOException)
- throw new HessianFieldException(fieldName + ": " + e.getMessage(), e);
-
- if (value != null)
- throw new HessianFieldException(fieldName + ": " + value.getClass().getName() + " (" + value + ")"
- + " cannot be assigned to '" + field.getType().getName() + "'", e);
- else
- throw new HessianFieldException(fieldName + ": " + field.getType().getName() + " cannot be assigned from null", e);
- }
-
- @Override
- public Class getType() {
- return _type;
- }
-
- @Override
- public Object readMap(AbstractHessianInput in)
- throws IOException {
- try {
- Object obj = instantiate();
-
- return readMap(in, obj);
- } catch (IOException e) {
- throw e;
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(_type.getName() + ":" + e.getMessage(), e);
- }
- }
-
- @Override
- public Object readObject(AbstractHessianInput in, String[] fieldNames)
- throws IOException {
- try {
- Object obj = instantiate();
-
- return readObject(in, obj, fieldNames);
- } catch (IOException e) {
- throw e;
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(_type.getName() + ":" + e.getMessage(), e);
- }
- }
-
- /**
- * Returns the readResolve method
- */
- protected Method getReadResolve(Class cl) {
- for (; cl != null; cl = cl.getSuperclass()) {
- Method[] methods = cl.getDeclaredMethods();
-
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
-
- if (method.getName().equals("readResolve") &&
- method.getParameterTypes().length == 0)
- return method;
- }
- }
-
- return null;
- }
-
- public Object readMap(AbstractHessianInput in, Object obj)
- throws IOException {
- try {
- int ref = in.addRef(obj);
-
- while (!in.isEnd()) {
- Object key = in.readObject();
-
- FieldDeserializer deser = (FieldDeserializer) _fieldMap.get(key);
-
- if (deser != null)
- deser.deserialize(in, obj);
- else
- in.readObject();
- }
-
- in.readMapEnd();
-
- Object resolve = resolve(obj);
-
- if (obj != resolve)
- in.setRef(ref, resolve);
-
- return resolve;
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(e);
- }
- }
-
- public Object readObject(AbstractHessianInput in,
- Object obj,
- String[] fieldNames)
- throws IOException {
- try {
- int ref = in.addRef(obj);
-
- for (int i = 0; i < fieldNames.length; i++) {
- String name = fieldNames[i];
-
- FieldDeserializer deser = (FieldDeserializer) _fieldMap.get(name);
-
- if (deser != null)
- deser.deserialize(in, obj);
- else
- in.readObject();
- }
-
- Object resolve = resolve(obj);
-
- if (obj != resolve)
- in.setRef(ref, resolve);
-
- return resolve;
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- throw new IOExceptionWrapper(obj.getClass().getName() + ":" + e, e);
- }
- }
-
- private Object resolve(Object obj)
- throws Exception {
- // if there's a readResolve method, call it
- try {
- if (_readResolve != null)
- return _readResolve.invoke(obj, new Object[0]);
- } catch (InvocationTargetException e) {
- if (e.getTargetException() != null)
- throw e;
- }
-
- return obj;
- }
-
- protected Object instantiate()
- throws Exception {
- try {
- if (_constructor != null)
- return _constructor.newInstance(_constructorArgs);
- else
- return _type.newInstance();
- } catch (Exception e) {
- throw new HessianProtocolException("'" + _type.getName() + "' could not be instantiated", e);
- }
- }
-
- /**
- * Creates a map of the classes fields.
- */
- protected HashMap getFieldMap(Class cl) {
- HashMap fieldMap = new HashMap();
-
- for (; cl != null; cl = cl.getSuperclass()) {
- Field[] fields = cl.getDeclaredFields();
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
-
- if (Modifier.isTransient(field.getModifiers())
- || Modifier.isStatic(field.getModifiers()))
- continue;
- else if (fieldMap.get(field.getName()) != null)
- continue;
-
- // XXX: could parameterize the handler to only deal with public
- try {
- field.setAccessible(true);
- } catch (Throwable e) {
- e.printStackTrace();
- }
-
- Class type = field.getType();
- FieldDeserializer deser;
-
- if (String.class.equals(type))
- deser = new StringFieldDeserializer(field);
- else if (byte.class.equals(type)) {
- deser = new ByteFieldDeserializer(field);
- } else if (short.class.equals(type)) {
- deser = new ShortFieldDeserializer(field);
- } else if (int.class.equals(type)) {
- deser = new IntFieldDeserializer(field);
- } else if (long.class.equals(type)) {
- deser = new LongFieldDeserializer(field);
- } else if (float.class.equals(type)) {
- deser = new FloatFieldDeserializer(field);
- } else if (double.class.equals(type)) {
- deser = new DoubleFieldDeserializer(field);
- } else if (boolean.class.equals(type)) {
- deser = new BooleanFieldDeserializer(field);
- } else if (java.sql.Date.class.equals(type)) {
- deser = new SqlDateFieldDeserializer(field);
- } else if (java.sql.Timestamp.class.equals(type)) {
- deser = new SqlTimestampFieldDeserializer(field);
- } else if (java.sql.Time.class.equals(type)) {
- deser = new SqlTimeFieldDeserializer(field);
- }
- // support generic type of map
- else if (Map.class.equals(type)
- && field.getGenericType() != field.getType()) {
- deser = new ObjectMapFieldDeserializer(field);
- } else if (List.class.equals(type)
- && field.getGenericType() != field.getType()) {
- deser = new ObjectListFieldDeserializer(field);
- } else {
- deser = new ObjectFieldDeserializer(field);
- }
-
- fieldMap.put(field.getName(), deser);
- }
- }
-
- return fieldMap;
- }
-
- abstract static class FieldDeserializer {
- abstract void deserialize(AbstractHessianInput in, Object obj)
- throws IOException;
- }
-
- static class ObjectFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- ObjectFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- Object value = null;
-
- try {
- value = in.readObject(_field.getType());
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class BooleanFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- BooleanFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- boolean value = false;
-
- try {
- value = in.readBoolean();
-
- _field.setBoolean(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class ByteFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- ByteFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- int value = 0;
-
- try {
- value = in.readInt();
-
- _field.setByte(obj, (byte) value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class ShortFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- ShortFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- int value = 0;
-
- try {
- value = in.readInt();
-
- _field.setShort(obj, (short) value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class ObjectMapFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- ObjectMapFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- Object value = null;
-
- try {
-
- Type[] types = ((ParameterizedType) _field.getGenericType()).getActualTypeArguments();
- value = in.readObject(_field.getType(),
- isPrimitive(types[0]) ? (Class>) types[0] : null,
- isPrimitive(types[1]) ? (Class>) types[1] : null
- );
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class ObjectListFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- ObjectListFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- Object value = null;
-
- try {
-
- Type[] types = ((ParameterizedType) _field.getGenericType()).getActualTypeArguments();
- value = in.readObject(_field.getType(),
- isPrimitive(types[0]) ? (Class>) types[0] : null
- );
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class IntFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- IntFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- int value = 0;
-
- try {
- value = in.readInt();
-
- _field.setInt(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class LongFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- LongFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- long value = 0;
-
- try {
- value = in.readLong();
-
- _field.setLong(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class FloatFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- FloatFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- double value = 0;
-
- try {
- value = in.readDouble();
-
- _field.setFloat(obj, (float) value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class DoubleFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- DoubleFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- double value = 0;
-
- try {
- value = in.readDouble();
-
- _field.setDouble(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class StringFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- StringFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- String value = null;
-
- try {
- value = in.readString();
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class SqlDateFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- SqlDateFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- java.sql.Date value = null;
-
- try {
- java.util.Date date = (java.util.Date) in.readObject();
- if (date != null)
- value = new java.sql.Date(date.getTime());
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class SqlTimestampFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- SqlTimestampFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- java.sql.Timestamp value = null;
-
- try {
- java.util.Date date = (java.util.Date) in.readObject();
- if (date != null)
- value = new java.sql.Timestamp(date.getTime());
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- static class SqlTimeFieldDeserializer extends FieldDeserializer {
- private final Field _field;
-
- SqlTimeFieldDeserializer(Field field) {
- _field = field;
- }
-
- @Override
- void deserialize(AbstractHessianInput in, Object obj)
- throws IOException {
- java.sql.Time value = null;
-
- try {
- java.util.Date date = (java.util.Date) in.readObject();
- if (date != null) value = new java.sql.Time(date.getTime());
-
- _field.set(obj, value);
- } catch (Exception e) {
- logDeserializeError(_field, obj, value, e);
- }
- }
- }
-
- /**
- * @see java.lang.Boolean#TYPE
- * @see java.lang.Character#TYPE
- * @see java.lang.Byte#TYPE
- * @see java.lang.Short#TYPE
- * @see java.lang.Integer#TYPE
- * @see java.lang.Long#TYPE
- * @see java.lang.Float#TYPE
- * @see java.lang.Double#TYPE
- * @see java.lang.Void#TYPE
- */
- private static boolean isPrimitive(Type type) {
- try {
- if (type != null) {
- if (type instanceof Class>) {
- Class> clazz = (Class>) type;
- return clazz.isPrimitive()
- || PRIMITIVE_TYPE.containsKey(clazz.getName());
- }
- }
- } catch (Exception e) {
- // ignore exception
- }
- return false;
- }
-
- static final Map