diff --git a/all/pom.xml b/all/pom.xml index 0a90faac855..afc1ed661df 100644 --- a/all/pom.xml +++ b/all/pom.xml @@ -29,6 +29,7 @@ The all in one project of dubbo false + 3.2.3 @@ -328,7 +329,7 @@ com.alibaba hessian-lite - 3.2.3 + ${hessian_lite_version} compile true diff --git a/bom/pom.xml b/bom/pom.xml index 4b2a39aa42c..66c14d4fc3c 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -2,6 +2,9 @@ 4.0.0 + + 3.2.3 + org.sonatype.oss @@ -281,7 +284,7 @@ com.alibaba hessian-lite - 3.2.3 + ${hessian_lite_version} diff --git a/dependencies-bom/pom.xml b/dependencies-bom/pom.xml index c8526d5abf6..e9a3f80b2c5 100644 --- a/dependencies-bom/pom.xml +++ b/dependencies-bom/pom.xml @@ -111,6 +111,7 @@ 2.2.7 1.2.0 + 3.2.3 @@ -352,7 +353,11 @@ javax.activation ${activation_version} - + + com.alibaba + hessian-lite + ${hessian_lite_version} + org.apache.curator diff --git a/hessian-lite/pom.xml b/hessian-lite/pom.xml deleted file mode 100644 index 911e7267001..00000000000 --- a/hessian-lite/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - 4.0.0 - - com.alibaba - dubbo-parent - 2.6.3-SNAPSHOT - - hessian-lite - jar - 3.2.3 - Hessian Lite(Alibaba embed version) - diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/HessianException.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/HessianException.java deleted file mode 100644 index f16146cac43..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/HessianException.java +++ /dev/null @@ -1,81 +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; - -/** - * Base runtime exception for Hessian exceptions. - */ -public class HessianException extends RuntimeException { - /** - * Zero-arg constructor. - */ - public HessianException() { - } - - /** - * Create the exception. - */ - public HessianException(String message) { - super(message); - } - - /** - * Create the exception. - */ - public HessianException(String message, Throwable rootCause) { - super(message, rootCause); - } - - /** - * Create the exception. - */ - public HessianException(Throwable rootCause) { - super(rootCause); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractDeserializer.java deleted file mode 100644 index 1946f4a84d2..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractDeserializer.java +++ /dev/null @@ -1,150 +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; - -/** - * Deserializing an object. - */ -abstract public class AbstractDeserializer implements Deserializer { - @Override - public Class getType() { - return Object.class; - } - - @Override - public Object readObject(AbstractHessianInput in) - throws IOException { - Object obj = in.readObject(); - - String className = getClass().getName(); - - if (obj != null) - throw error(className + ": unexpected object " + obj.getClass().getName() + " (" + obj + ")"); - else - throw error(className + ": unexpected null value"); - } - - @Override - public Object readList(AbstractHessianInput in, int length) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readList(AbstractHessianInput in, int length, Class expectType) throws IOException { - if (expectType == null) { - return readList(in, length); - } - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readLengthList(AbstractHessianInput in, int length) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readLengthList(AbstractHessianInput in, int length, Class expectType) throws IOException { - if (expectType == null) { - return readLengthList(in, length); - } - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - Object obj = in.readObject(); - - String className = getClass().getName(); - - if (obj != null) - throw error(className + ": unexpected object " + obj.getClass().getName() + " (" + obj + ")"); - else - throw error(className + ": unexpected null value"); - } - - @Override - public Object readMap(AbstractHessianInput in, Class expectKeyType, Class expectValueType) throws IOException { - if (expectKeyType == null && expectValueType == null) { - return readMap(in); - } - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - protected HessianProtocolException error(String msg) { - return new HessianProtocolException(msg); - } - - protected String codeName(int ch) { - if (ch < 0) - return "end of file"; - else - return "0x" + Integer.toHexString(ch & 0xff); - } - - protected SerializerFactory findSerializerFactory(AbstractHessianInput in) { - SerializerFactory serializerFactory = null; - if (in instanceof Hessian2Input) { - serializerFactory = ((Hessian2Input) in).findSerializerFactory(); - } else if (in instanceof HessianInput) { - serializerFactory = ((HessianInput) in).getSerializerFactory(); - } - return serializerFactory == null ? new SerializerFactory() : serializerFactory; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java deleted file mode 100644 index 1d63fec368a..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractHessianInput.java +++ /dev/null @@ -1,457 +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.io.Reader; -import java.util.List; - -/** - * Abstract base class for Hessian requests. Hessian users should only - * need to use the methods in this class. - *

- *

- * 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> expectedTypes) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - /** - * Reads a remote object reference to the stream. The type is the - * type of the remote interface. - *

- *

-     * 'r' 't' b16 b8 type url
-     * 
- */ - abstract public Object readRemote() - throws IOException; - - /** - * Reads a reference - *

- *

-     * 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: - *

- *

-     * C
-     * 
- * - * @param method the method name to call. - */ - abstract public void startCall() - throws IOException; - - /** - * Starts the method call: - *

- *

-     * C string int
-     * 
- * - * @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. - *

- *

-     * string
-     * 
- * - * @param method the method name to call. - */ - abstract public void writeMethod(String method) - throws IOException; - - /** - * Completes the method call: - *

- *

-     * 
- */ - abstract public void completeCall() - throws IOException; - - /** - * Writes a boolean value to the stream. The boolean will be written - * with the following syntax: - *

- *

-     * T
-     * F
-     * 
- * - * @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: - *

- *

-     * I b32 b24 b16 b8
-     * 
- * - * @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: - *

- *

-     * L b64 b56 b48 b40 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: - *

- *

-     * D 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. - *

- *

-     * T  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 - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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. - *

- *

-     * b b16 b18 bytes
-     * 
- * - * @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. - *

- *

-     * Q int
-     * 
- * - * @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. - *

- *

-     * R b32 b24 b16 b8
-     * 
- * - * @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 - * writeListBegin followed by the list contents and then - * call writeListEnd. - *

- *

-     * V
-     *   x13 java.util.ArrayList   # type
-     *   x93                       # length=3
-     *   x91                       # 1
-     *   x92                       # 2
-     *   x93                       # 3
-     * </list>
-     * 
- */ - 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 - * writeMapBegin followed by the map contents and then - * call writeMapEnd. - *

- *

-     * M type ( )* Z
-     * 
- */ - 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 - * writeObjectBegin followed by the map contents and then - * call writeObjectEnd. - *

- *

-     * C type int *
-     * C int *
-     * 
- * - * @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 { - @Override - public int compare(Method a, Method b) { - return a.getName().compareTo(b.getName()); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializerFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializerFactory.java deleted file mode 100644 index 7c8e328a485..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BeanSerializerFactory.java +++ /dev/null @@ -1,80 +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. - */ -public class BeanSerializerFactory extends SerializerFactory { - /** - * Returns the default serializer for a class that isn't matched - * directly. Application can override this method to produce - * bean-style serialization instead of field serialization. - * - * @param cl the class of the object that needs to be serialized. - * @return a serializer object for the serialization. - */ - @Override - protected Serializer getDefaultSerializer(Class cl) { - return new BeanSerializer(cl, getClassLoader()); - } - - /** - * Returns the default deserializer for a class that isn't matched - * directly. Application can override this method to produce - * bean-style serialization instead of field serialization. - * - * @param cl the class of the object that needs to be serialized. - * @return a serializer object for the serialization. - */ - @Override - protected Deserializer getDefaultDeserializer(Class cl) { - return new BeanDeserializer(cl); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BigIntegerDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BigIntegerDeserializer.java deleted file mode 100644 index 5cd0498db0b..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BigIntegerDeserializer.java +++ /dev/null @@ -1,32 +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 java.math.BigInteger; - -public class BigIntegerDeserializer extends JavaDeserializer { - - public BigIntegerDeserializer() { - super(BigInteger.class); - } - - @Override - protected Object instantiate() throws Exception { - return new BigInteger("0"); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarHandle.java deleted file mode 100644 index ccb90b21e5b..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarHandle.java +++ /dev/null @@ -1,90 +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.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -/** - * Handle for a calendar object. - */ -public class CalendarHandle implements java.io.Serializable, HessianHandle { - private Class type; - private Date date; - - public CalendarHandle() { - } - - public CalendarHandle(Class type, long time) { - if (!GregorianCalendar.class.equals(type)) - this.type = type; - - this.date = new Date(time); - } - - private Object readResolve() { - try { - Calendar cal; - - if (this.type != null) - cal = (Calendar) this.type.newInstance(); - else - cal = new GregorianCalendar(); - - cal.setTimeInMillis(this.date.getTime()); - - return cal; - } catch (RuntimeException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarSerializer.java deleted file mode 100644 index 0db6c148918..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CalendarSerializer.java +++ /dev/null @@ -1,76 +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.Calendar; - -/** - * Serializing a calendar. - */ -public class CalendarSerializer extends AbstractSerializer { - private static CalendarSerializer SERIALIZER = new CalendarSerializer(); - - public static CalendarSerializer create() { - return SERIALIZER; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (obj == null) - out.writeNull(); - else { - Calendar cal = (Calendar) obj; - - out.writeObject(new CalendarHandle(cal.getClass(), - cal.getTimeInMillis())); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassDeserializer.java deleted file mode 100644 index 422333c6a32..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassDeserializer.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.util.HashMap; - -/** - * Deserializing a JDK 1.2 Class. - */ -public class ClassDeserializer extends AbstractMapDeserializer { - private static final HashMap _primClasses - = new HashMap(); - - static { - _primClasses.put("void", void.class); - _primClasses.put("boolean", boolean.class); - _primClasses.put("java.lang.Boolean", Boolean.class); - _primClasses.put("byte", byte.class); - _primClasses.put("java.lang.Byte", Byte.class); - _primClasses.put("char", char.class); - _primClasses.put("java.lang.Character", Character.class); - _primClasses.put("short", short.class); - _primClasses.put("java.lang.Short", Short.class); - _primClasses.put("int", int.class); - _primClasses.put("java.lang.Integer", Integer.class); - _primClasses.put("long", long.class); - _primClasses.put("java.lang.Long", Long.class); - _primClasses.put("float", float.class); - _primClasses.put("java.lang.Float", Float.class); - _primClasses.put("double", double.class); - _primClasses.put("java.lang.Double", Double.class); - _primClasses.put("java.lang.String", String.class); - } - - private ClassLoader _loader; - - public ClassDeserializer(ClassLoader loader) { - _loader = loader; - } - - @Override - public Class getType() { - return Class.class; - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - int ref = in.addRef(null); - - String name = null; - - while (!in.isEnd()) { - String key = in.readString(); - - if (key.equals("name")) - name = in.readString(); - else - in.readObject(); - } - - in.readMapEnd(); - - Object value = create(name); - - in.setRef(ref, value); - - return value; - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - int ref = in.addRef(null); - - String name = null; - - for (int i = 0; i < fieldNames.length; i++) { - if ("name".equals(fieldNames[i])) - name = in.readString(); - else - in.readObject(); - } - - Object value = create(name); - - in.setRef(ref, value); - - return value; - } - - Object create(String name) - throws IOException { - if (name == null) - throw new IOException("Serialized Class expects name."); - - Class cl = _primClasses.get(name); - - if (cl != null) - return cl; - - try { - if (_loader != null) - return Class.forName(name, false, _loader); - else - return Class.forName(name); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java deleted file mode 100644 index 7529e17b60c..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java +++ /dev/null @@ -1,84 +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 remote object. - */ -public class ClassSerializer extends AbstractSerializer { - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - Class cl = (Class) obj; - - if (cl == null) { - out.writeNull(); - } else if (out.addRef(obj)) { - return; - } else { - int ref = out.writeObjectBegin("java.lang.Class"); - - if (ref < -1) { - out.writeString("name"); - out.writeString(cl.getName()); - out.writeMapEnd(); - } else { - if (ref == -1) { - out.writeInt(1); - out.writeString("name"); - out.writeObjectBegin("java.lang.Class"); - } - - out.writeString(cl.getName()); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java deleted file mode 100644 index 1d3bc89234d..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java +++ /dev/null @@ -1,161 +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.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - -/** - * Deserializing a JDK 1.2 Collection. - */ -public class CollectionDeserializer extends AbstractListDeserializer { - private Class _type; - - public CollectionDeserializer(Class type) { - _type = type; - } - - @Override - public Class getType() { - return _type; - } - - @Override - public Object readList(AbstractHessianInput in, int length) - throws IOException { - return readList(in, length, null); - } - - @Override - public Object readList(AbstractHessianInput in, int length, Class expectType) throws IOException { - Collection list = createList(); - - in.addRef(list); - - Deserializer deserializer = null; - - SerializerFactory factory = findSerializerFactory(in); - if (expectType != null) { - deserializer = factory.getDeserializer(expectType.getName()); - } - - while (!in.isEnd()) - list.add(deserializer != null ? deserializer.readObject(in) : in.readObject()); - - in.readEnd(); - - return list; - } - - @Override - public Object readLengthList(AbstractHessianInput in, int length) - throws IOException { - return readList(in, length, null); - } - - @Override - public Object readLengthList(AbstractHessianInput in, int length, Class expectType) throws IOException { - Collection list = createList(); - - in.addRef(list); - - Deserializer deserializer = null; - - SerializerFactory factory = findSerializerFactory(in); - if (expectType != null) { - deserializer = factory.getDeserializer(expectType.getName()); - } - - for (; length > 0; length--) - list.add(deserializer != null ? deserializer.readObject(in) : in.readObject()); - - return list; - } - - private Collection createList() - throws IOException { - Collection list = null; - - if (_type == null) - list = new ArrayList(); - else if (!_type.isInterface()) { - try { - list = (Collection) _type.newInstance(); - } catch (Exception e) { - } - } - - if (list != null) { - } else if (SortedSet.class.isAssignableFrom(_type)) - list = new TreeSet(); - else if (Set.class.isAssignableFrom(_type)) - list = new HashSet(); - else if (List.class.isAssignableFrom(_type)) - list = new ArrayList(); - else if (Collection.class.isAssignableFrom(_type)) - list = new ArrayList(); - else { - try { - list = (Collection) _type.newInstance(); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } - - return list; - } -} - - diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionSerializer.java deleted file mode 100644 index 7ede5af0266..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionSerializer.java +++ /dev/null @@ -1,105 +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.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; - -/** - * Serializing a JDK 1.2 Collection. - */ -public class CollectionSerializer extends AbstractSerializer { - private boolean _sendJavaType = true; - - /** - * Return true if the java type of the collection should be sent. - */ - public boolean getSendJavaType() { - return _sendJavaType; - } - - /** - * Set true if the java type of the collection should be sent. - */ - public void setSendJavaType(boolean sendJavaType) { - _sendJavaType = sendJavaType; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (out.addRef(obj)) - return; - - Collection list = (Collection) obj; - - Class cl = obj.getClass(); - boolean hasEnd; - - if (cl.equals(ArrayList.class) - || !_sendJavaType - || !Serializable.class.isAssignableFrom(cl)) - hasEnd = out.writeListBegin(list.size(), null); - else - hasEnd = out.writeListBegin(list.size(), obj.getClass().getName()); - - Iterator iter = list.iterator(); - 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/Deflation.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Deflation.java deleted file mode 100644 index 11380adedea..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Deflation.java +++ /dev/null @@ -1,201 +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.io.OutputStream; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; - -public class Deflation extends HessianEnvelope { - public Deflation() { - } - - @Override - public Hessian2Output wrap(Hessian2Output out) - throws IOException { - OutputStream os = new DeflateOutputStream(out); - - Hessian2Output filterOut = new Hessian2Output(os); - - filterOut.setCloseStreamOnClose(true); - - return filterOut; - } - - @Override - public Hessian2Input unwrap(Hessian2Input in) - throws IOException { - int version = in.readEnvelope(); - - String method = in.readMethod(); - - if (!method.equals(getClass().getName())) - throw new IOException("expected hessian Envelope method '" + - getClass().getName() + "' at '" + method + "'"); - - return unwrapHeaders(in); - } - - @Override - public Hessian2Input unwrapHeaders(Hessian2Input in) - throws IOException { - InputStream is = new DeflateInputStream(in); - - Hessian2Input filter = new Hessian2Input(is); - - filter.setCloseStreamOnClose(true); - - return filter; - } - - static class DeflateOutputStream extends OutputStream { - private Hessian2Output _out; - private OutputStream _bodyOut; - private DeflaterOutputStream _deflateOut; - - DeflateOutputStream(Hessian2Output out) - throws IOException { - _out = out; - - _out.startEnvelope(Deflation.class.getName()); - - _out.writeInt(0); - - _bodyOut = _out.getBytesOutputStream(); - - _deflateOut = new DeflaterOutputStream(_bodyOut); - } - - @Override - public void write(int ch) - throws IOException { - _deflateOut.write(ch); - } - - @Override - public void write(byte[] buffer, int offset, int length) - throws IOException { - _deflateOut.write(buffer, offset, length); - } - - @Override - public void close() - throws IOException { - Hessian2Output out = _out; - _out = null; - - if (out != null) { - _deflateOut.close(); - _bodyOut.close(); - - out.writeInt(0); - - out.completeEnvelope(); - - out.close(); - } - } - } - - static class DeflateInputStream extends InputStream { - private Hessian2Input _in; - - private InputStream _bodyIn; - private InflaterInputStream _inflateIn; - - DeflateInputStream(Hessian2Input in) - throws IOException { - _in = in; - - int len = in.readInt(); - - if (len != 0) - throw new IOException("expected no headers"); - - _bodyIn = _in.readInputStream(); - - _inflateIn = new InflaterInputStream(_bodyIn); - } - - @Override - public int read() - throws IOException { - return _inflateIn.read(); - } - - @Override - public int read(byte[] buffer, int offset, int length) - throws IOException { - return _inflateIn.read(buffer, offset, length); - } - - @Override - public void close() - throws IOException { - Hessian2Input in = _in; - _in = null; - - if (in != null) { - _inflateIn.close(); - _bodyIn.close(); - - int len = in.readInt(); - - if (len != 0) - throw new IOException("Unexpected footer"); - - in.completeEnvelope(); - - in.close(); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Deserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Deserializer.java deleted file mode 100644 index d8b682490fa..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Deserializer.java +++ /dev/null @@ -1,109 +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; - -/** - * Deserializing an object. - * - */ -public interface Deserializer { - public Class getType(); - - public Object readObject(AbstractHessianInput in) - throws IOException; - - public Object readList(AbstractHessianInput in, int length) - throws IOException; - - /** - * deserialize list object from expect type. - * - * @param in - * @param length - * @param expectType - * @return - * @throws IOException - */ - public Object readList(AbstractHessianInput in, int length, Class expectType) - throws IOException; - - public Object readLengthList(AbstractHessianInput in, int length) - throws IOException; - - /** - * deserialize list object from expect type. - * - * @param in - * @param length - * @param expectType - * @return - * @throws IOException - */ - public Object readLengthList(AbstractHessianInput in, int length, Class expectType) - throws IOException; - - public Object readMap(AbstractHessianInput in) - throws IOException; - - /** - * deserialize map object from expect key and value type. - * @param in - * @param expectKeyType - * @param expectValueType - * @return - * @throws IOException - */ - public Object readMap(AbstractHessianInput in, Class expectKeyType, Class expectValueType) - throws IOException; - - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumDeserializer.java deleted file mode 100644 index d1876a8cbc8..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumDeserializer.java +++ /dev/null @@ -1,136 +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.Method; - -/** - * Deserializing an enum valued object - */ -public class EnumDeserializer extends AbstractDeserializer { - private Class _enumType; - private Method _valueOf; - - public EnumDeserializer(Class cl) { - // hessian/33b[34], hessian/3bb[78] - if (cl.isEnum()) - _enumType = cl; - else if (cl.getSuperclass().isEnum()) - _enumType = cl.getSuperclass(); - else - throw new RuntimeException("Class " + cl.getName() + " is not an enum"); - - try { - _valueOf = _enumType.getMethod("valueOf", - new Class[]{Class.class, String.class}); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public Class getType() { - return _enumType; - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - String name = null; - - while (!in.isEnd()) { - String key = in.readString(); - - if (key.equals("name")) - name = in.readString(); - else - in.readObject(); - } - - in.readMapEnd(); - - Object obj = create(name); - - in.addRef(obj); - - return obj; - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - String name = null; - - for (int i = 0; i < fieldNames.length; i++) { - if ("name".equals(fieldNames[i])) - name = in.readString(); - else - in.readObject(); - } - - Object obj = create(name); - - in.addRef(obj); - - return obj; - } - - private Object create(String name) - throws IOException { - if (name == null) - throw new IOException(_enumType.getName() + " expects name."); - - try { - return _valueOf.invoke(null, _enumType, name); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSerializer.java deleted file mode 100644 index 6ebf1386de7..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSerializer.java +++ /dev/null @@ -1,106 +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; - -/** - * Serializing an object for known object types. - */ -public class EnumSerializer extends AbstractSerializer { - private Method _name; - - public EnumSerializer(Class cl) { - // hessian/32b[12], hessian/3ab[23] - if (!cl.isEnum() && cl.getSuperclass().isEnum()) - cl = cl.getSuperclass(); - - try { - _name = cl.getMethod("name", new Class[0]); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (out.addRef(obj)) - return; - - Class cl = obj.getClass(); - - if (!cl.isEnum() && cl.getSuperclass().isEnum()) - cl = cl.getSuperclass(); - - String name = null; - try { - name = (String) _name.invoke(obj, (Object[]) null); - } catch (Exception e) { - throw new RuntimeException(e); - } - - int ref = out.writeObjectBegin(cl.getName()); - - if (ref < -1) { - out.writeString("name"); - out.writeString(name); - out.writeMapEnd(); - } else { - if (ref == -1) { - out.writeClassFieldLength(1); - out.writeString("name"); - out.writeObjectBegin(cl.getName()); - } - - out.writeString(name); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetHandler.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetHandler.java deleted file mode 100644 index 3c0a6235518..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetHandler.java +++ /dev/null @@ -1,39 +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 java.io.Serializable; -import java.util.Arrays; -import java.util.EnumSet; - -class EnumSetHandler implements Serializable, HessianHandle { - private Class type; - private Object[] objects; - - EnumSetHandler(Class type, Object[] objects) { - this.type = type; - this.objects = objects; - } - - @SuppressWarnings("unchecked") - private Object readResolve() { - EnumSet enumSet = EnumSet.noneOf(type); - enumSet.addAll(Arrays.asList(objects)); - return enumSet; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java deleted file mode 100644 index 9fa45356739..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java +++ /dev/null @@ -1,48 +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 java.io.IOException; -import java.lang.reflect.Field; -import java.util.EnumSet; - -public class EnumSetSerializer extends AbstractSerializer { - private static EnumSetSerializer SERIALIZER = new EnumSetSerializer(); - - public static EnumSetSerializer getInstance() { - return SERIALIZER; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) throws IOException { - if (obj == null) { - out.writeNull(); - } else { - try { - Field field = EnumSet.class.getDeclaredField("elementType"); - field.setAccessible(true); - Class type = (Class) field.get(obj); - EnumSet enumSet = (EnumSet) obj; - Object[] objects = enumSet.toArray(); - out.writeObject(new EnumSetHandler(type, objects)); - } catch (Throwable t) { - throw new IOException(t); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationDeserializer.java deleted file mode 100644 index b912fa8d21a..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationDeserializer.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.Vector; - -/** - * Deserializing a JDK 1.2 Collection. - */ -public class EnumerationDeserializer extends AbstractListDeserializer { - private static EnumerationDeserializer _deserializer; - - public static EnumerationDeserializer create() { - if (_deserializer == null) - _deserializer = new EnumerationDeserializer(); - - return _deserializer; - } - - @Override - public Object readList(AbstractHessianInput in, int length) - throws IOException { - Vector list = new Vector(); - - in.addRef(list); - - while (!in.isEnd()) - list.add(in.readObject()); - - in.readEnd(); - - return list.elements(); - } -} - - diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationSerializer.java deleted file mode 100644 index 0665132d5da..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumerationSerializer.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.Enumeration; - -/** - * Serializing a JDK 1.2 Enumeration. - */ -public class EnumerationSerializer extends AbstractSerializer { - private static EnumerationSerializer _serializer; - - public static EnumerationSerializer create() { - if (_serializer == null) - _serializer = new EnumerationSerializer(); - - return _serializer; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - Enumeration iter = (Enumeration) obj; - - boolean hasEnd = out.writeListBegin(-1, null); - - while (iter.hasMoreElements()) { - Object value = iter.nextElement(); - - out.writeObject(value); - } - - if (hasEnd) - out.writeListEnd(); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnvelopeFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnvelopeFactory.java deleted file mode 100644 index be505fbf870..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnvelopeFactory.java +++ /dev/null @@ -1,56 +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.util.logging.Logger; - -public class EnvelopeFactory { - private static final Logger log - = Logger.getLogger(EnvelopeFactory.class.getName()); -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ExtSerializerFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ExtSerializerFactory.java deleted file mode 100644 index 1b11a447dff..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ExtSerializerFactory.java +++ /dev/null @@ -1,103 +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.util.HashMap; - -/** - * Factory for returning serialization methods. - */ -public class ExtSerializerFactory extends AbstractSerializerFactory { - private HashMap _serializerMap = new HashMap(); - private HashMap _deserializerMap = new HashMap(); - - /** - * Adds a serializer. - * - * @param cl the class of the serializer - * @param serializer the serializer - */ - public void addSerializer(Class cl, Serializer serializer) { - _serializerMap.put(cl, serializer); - } - - /** - * Adds a deserializer. - * - * @param cl the class of the deserializer - * @param deserializer the deserializer - */ - public void addDeserializer(Class cl, Deserializer deserializer) { - _deserializerMap.put(cl, deserializer); - } - - /** - * 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. - */ - @Override - public Serializer getSerializer(Class cl) - throws HessianProtocolException { - return (Serializer) _serializerMap.get(cl); - } - - /** - * 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. - */ - @Override - public Deserializer getDeserializer(Class cl) - throws HessianProtocolException { - return (Deserializer) _deserializerMap.get(cl); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Constants.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Constants.java deleted file mode 100644 index 993b71fea85..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Constants.java +++ /dev/null @@ -1,145 +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; - -public interface Hessian2Constants { - public static final int BC_BINARY = 'B'; // final chunk - public static final int BC_BINARY_CHUNK = 'A'; // non-final chunk - public static final int BC_BINARY_DIRECT = 0x20; // 1-byte length binary - public static final int BINARY_DIRECT_MAX = 0x0f; - public static final int BC_BINARY_SHORT = 0x34; // 2-byte length binary - public static final int BINARY_SHORT_MAX = 0x3ff; // 0-1023 binary - - public static final int BC_CLASS_DEF = 'C'; // object/class definition - - public static final int BC_DATE = 0x4a; // 64-bit millisecond UTC date - public static final int BC_DATE_MINUTE = 0x4b; // 32-bit minute UTC date - - public static final int BC_DOUBLE = 'D'; // IEEE 64-bit double - - public static final int BC_DOUBLE_ZERO = 0x5b; - public static final int BC_DOUBLE_ONE = 0x5c; - public static final int BC_DOUBLE_BYTE = 0x5d; - public static final int BC_DOUBLE_SHORT = 0x5e; - public static final int BC_DOUBLE_MILL = 0x5f; - - public static final int BC_FALSE = 'F'; // boolean false - - public static final int BC_INT = 'I'; // 32-bit int - - public static final int INT_DIRECT_MIN = -0x10; - public static final int INT_DIRECT_MAX = 0x2f; - public static final int BC_INT_ZERO = 0x90; - - public static final int INT_BYTE_MIN = -0x800; - public static final int INT_BYTE_MAX = 0x7ff; - public static final int BC_INT_BYTE_ZERO = 0xc8; - - public static final int BC_END = 'Z'; - - public static final int INT_SHORT_MIN = -0x40000; - public static final int INT_SHORT_MAX = 0x3ffff; - public static final int BC_INT_SHORT_ZERO = 0xd4; - - public static final int BC_LIST_VARIABLE = 0x55; - public static final int BC_LIST_FIXED = 'V'; - public static final int BC_LIST_VARIABLE_UNTYPED = 0x57; - public static final int BC_LIST_FIXED_UNTYPED = 0x58; - - public static final int BC_LIST_DIRECT = 0x70; - public static final int BC_LIST_DIRECT_UNTYPED = 0x78; - public static final int LIST_DIRECT_MAX = 0x7; - - public static final int BC_LONG = 'L'; // 64-bit signed integer - public static final long LONG_DIRECT_MIN = -0x08; - public static final long LONG_DIRECT_MAX = 0x0f; - public static final int BC_LONG_ZERO = 0xe0; - - public static final long LONG_BYTE_MIN = -0x800; - public static final long LONG_BYTE_MAX = 0x7ff; - public static final int BC_LONG_BYTE_ZERO = 0xf8; - - public static final int LONG_SHORT_MIN = -0x40000; - public static final int LONG_SHORT_MAX = 0x3ffff; - public static final int BC_LONG_SHORT_ZERO = 0x3c; - - public static final int BC_LONG_INT = 0x59; - - public static final int BC_MAP = 'M'; - public static final int BC_MAP_UNTYPED = 'H'; - - public static final int BC_NULL = 'N'; - - public static final int BC_OBJECT = 'O'; - public static final int BC_OBJECT_DEF = 'C'; - - public static final int BC_OBJECT_DIRECT = 0x60; - public static final int OBJECT_DIRECT_MAX = 0x0f; - - public static final int BC_REF = 0x51; - - public static final int BC_STRING = 'S'; // final string - public static final int BC_STRING_CHUNK = 'R'; // non-final string - - public static final int BC_STRING_DIRECT = 0x00; - public static final int STRING_DIRECT_MAX = 0x1f; - public static final int BC_STRING_SHORT = 0x30; - public static final int STRING_SHORT_MAX = 0x3ff; - - public static final int BC_TRUE = 'T'; - - public static final int P_PACKET_CHUNK = 0x4f; - public static final int P_PACKET = 'P'; - - public static final int P_PACKET_DIRECT = 0x80; - public static final int PACKET_DIRECT_MAX = 0x7f; - - public static final int P_PACKET_SHORT = 0x70; - public static final int PACKET_SHORT_MAX = 0xfff; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java deleted file mode 100644 index 8d6d7d7b700..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java +++ /dev/null @@ -1,3615 +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.ByteArrayOutputStream; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Input stream for Hessian requests. - *

- *

HessianInput is unbuffered, so any client needs to provide - * its own buffering. - *

- *

- * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * Z
-     * 
- */ - public void completeEnvelope() - throws IOException { - int tag = read(); - - if (tag != 'Z') - error("expected end of envelope at " + codeName(tag)); - } - - /** - * Starts reading the call - *

- *

A successful completion will have a single value: - *

- *

-     * 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. - *

- *

The call expects the following protocol data - *

- *

-     * c major minor
-     * m b16 b8 method
-     * 
- */ - @Override - public void startCall() - throws IOException { - readCall(); - - readMethod(); - } - - /** - * Completes reading the call - *

- *

A successful completion will have a single value: - *

- *

-     * 
- */ - @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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * z
-     * 
- */ - @Override - public void completeReply() - throws IOException { - } - - /** - * Completes reading the call - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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>) null); - } - - @Override - public Object readObject(List> expectedTypes) throws IOException { - int tag = _offset < _length ? (_buffer[_offset++] & 0xff) : read(); - - switch (tag) { - case 'N': - return null; - - case 'T': - return Boolean.valueOf(true); - - case 'F': - return Boolean.valueOf(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 Integer.valueOf(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 Integer.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 Integer.valueOf(((tag - BC_INT_SHORT_ZERO) << 16) - + 256 * read() + read()); - - case 'I': - return Integer.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 Long.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 Long.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 Long.valueOf(((tag - BC_LONG_SHORT_ZERO) << 16) + 256 * read() + read()); - - case BC_LONG_INT: - return Long.valueOf(parseInt()); - - case 'L': - return Long.valueOf(parseLong()); - - case BC_DOUBLE_ZERO: - return Double.valueOf(0); - - case BC_DOUBLE_ONE: - return Double.valueOf(1); - - case BC_DOUBLE_BYTE: - return Double.valueOf((byte) read()); - - case BC_DOUBLE_SHORT: - return Double.valueOf((short) (256 * read() + read())); - - case BC_DOUBLE_MILL: { - int mills = parseInt(); - - return Double.valueOf(0.001 * mills); - } - - case 'D': - return Double.valueOf(parseDouble()); - - case BC_DATE: - return new Date(parseLong()); - - case BC_DATE_MINUTE: - return new Date(parseInt() * 60000L); - - case BC_STRING_CHUNK: - case 'S': { - _isLastChunk = tag == 'S'; - _chunkLength = (read() << 8) + read(); - - _sbuf.setLength(0); - - parseString(_sbuf); - - return _sbuf.toString(); - } - - 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); - - parseString(_sbuf); - - return _sbuf.toString(); - } - - case 0x30: - case 0x31: - case 0x32: - case 0x33: { - _isLastChunk = true; - _chunkLength = (tag - 0x30) * 256 + read(); - - _sbuf.setLength(0); - - parseString(_sbuf); - - return _sbuf.toString(); - } - - case BC_BINARY_CHUNK: - case 'B': { - _isLastChunk = tag == 'B'; - _chunkLength = (read() << 8) + read(); - - int data; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - 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; - int len = tag - 0x20; - _chunkLength = 0; - - byte[] data = new byte[len]; - - for (int i = 0; i < len; i++) - data[i] = (byte) read(); - - return data; - } - - case 0x34: - case 0x35: - case 0x36: - case 0x37: { - _isLastChunk = true; - int len = (tag - 0x34) * 256 + read(); - _chunkLength = 0; - - byte[] buffer = new byte[len]; - - for (int i = 0; i < len; i++) { - buffer[i] = (byte) read(); - } - - return buffer; - } - - case BC_LIST_VARIABLE: { - // variable length list - String type = readType(); - - return findSerializerFactory().readList(this, -1, type); - } - - case BC_LIST_VARIABLE_UNTYPED: { - return findSerializerFactory().readList(this, -1, null); - } - - case BC_LIST_FIXED: { - // fixed length lists - String type = readType(); - int length = readInt(); - - Deserializer reader; - reader = findSerializerFactory().getListDeserializer(type, null); - - boolean valueType = expectedTypes != null && expectedTypes.size() == 1; - - return reader.readLengthList(this, length, valueType ? expectedTypes.get(0) : null); - } - - case BC_LIST_FIXED_UNTYPED: { - // fixed length lists - int length = readInt(); - - Deserializer reader; - reader = findSerializerFactory().getListDeserializer(null, null); - - boolean valueType = expectedTypes != null && expectedTypes.size() == 1; - - return reader.readLengthList(this, length, valueType ? expectedTypes.get(0) : null); - } - - // compact fixed list - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: { - // fixed length lists - String type = readType(); - int length = tag - 0x70; - - Deserializer reader; - reader = findSerializerFactory().getListDeserializer(type, null); - - boolean valueType = expectedTypes != null && expectedTypes.size() == 1; - - return reader.readLengthList(this, length, valueType ? expectedTypes.get(0) : null); - } - - // compact fixed untyped list - case 0x78: - case 0x79: - case 0x7a: - case 0x7b: - case 0x7c: - case 0x7d: - case 0x7e: - case 0x7f: { - // fixed length lists - int length = tag - 0x78; - - Deserializer reader; - reader = findSerializerFactory().getListDeserializer(null, null); - - boolean valueType = expectedTypes != null && expectedTypes.size() == 1; - - return reader.readLengthList(this, length, valueType ? expectedTypes.get(0) : null); - } - - case 'H': { - - boolean keyValuePair = expectedTypes != null && expectedTypes.size() == 2; - - // fix deserialize of short type - Deserializer reader; - reader = findSerializerFactory().getDeserializer(Map.class); - - return reader.readMap(this - , keyValuePair ? expectedTypes.get(0) : null - , keyValuePair ? expectedTypes.get(1) : null); - } - - case 'M': { - String type = readType(); - - return findSerializerFactory().readMap(this, type); - } - - case 'C': { - readObjectDefinition(null); - - return readObject(); - } - - 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; - - if (_classDefs == null) - throw error("No classes defined at reference '{0}'" + tag); - - ObjectDefinition def = (ObjectDefinition) _classDefs.get(ref); - - return readObjectInstance(null, def); - } - - case 'O': { - int ref = readInt(); - - ObjectDefinition def = (ObjectDefinition) _classDefs.get(ref); - - return readObjectInstance(null, def); - } - - case BC_REF: { - int ref = readInt(); - - return _refs.get(ref); - } - - default: - if (tag < 0) - throw new EOFException("readObject: unexpected end of file"); - else - throw error("readObject: unknown code " + codeName(tag)); - } - } - - private void parseString(StringBuilder sbuf) - throws IOException { - while (true) { - if (_chunkLength <= 0) { - if (!parseChunkLength()) - return; - } - - int length = _chunkLength; - _chunkLength = 0; - - while (length-- > 0) { - sbuf.append((char) parseUTF8Char()); - } - } - } - - /** - * Reads an object definition: - *

- *

-     * O string  (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. - *

- *

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. - *

- *

- * 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. - *

- *

-     * C
-     * string # method name
-     * int    # arg count
-     * 
- * - * @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
-     * 
- * - * @param method the method name to call. - */ - @Override - public void startCall() - throws IOException { - flushIfFull(); - - _buffer[_offset++] = (byte) 'C'; - } - - /** - * Starts an envelope. - *

- *

-     * E major minor
-     * m b16 b8 method-name
-     * 
- * - * @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. - *

- *

A successful completion will have a single value: - *

- *

-     * Z
-     * 
- */ - public void completeEnvelope() - throws IOException { - flushIfFull(); - - _buffer[_offset++] = (byte) 'Z'; - } - - /** - * Writes the method tag. - *

- *

-     * string
-     * 
- * - * @param method the method name to call. - */ - @Override - public void writeMethod(String method) - throws IOException { - writeString(method); - } - - /** - * Completes. - *

- *

-     * z
-     * 
- */ - @Override - public void completeCall() - throws IOException { - /* - flushIfFull(); - - _buffer[_offset++] = (byte) 'Z'; - */ - } - - /** - * Starts the reply - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * z
-     * 
- */ - @Override - public void completeReply() - throws IOException { - } - - /** - * Starts a packet - *

- *

A message contains several objects encapsulated by a length

- *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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
-     * 
- *

- *

-     * F H
-     * \x04code
-     * \x10the fault code
-     * 

- * \x07message - * \x11the fault message - *

- * \x06detail - * M\xnnjavax.ejb.FinderException - * ... - * Z - * Z - *

- * - * @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 - * writeListBegin followed by the list contents and then - * call writeListEnd. - *

- *

-     * list ::= V type value* Z
-     *      ::= v type int value*
-     * 
- * - * @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 - * writeMapBegin followed by the map contents and then - * call writeMapEnd. - *

- *

-     * map ::= M type ( )* Z
-     *     ::= H ( )* Z
-     * 
- */ - @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 - *

- *

-     * C <string> <int> <string>*
-     * 
- */ - @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 { - } - - /** - *
-     * type ::= string
-     *      ::= int
-     * 
- */ - 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: - *

- *

-     * T
-     * F
-     * 
- * - * @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: - *

- *

-     * I b32 b24 b16 b8
-     * 
- * - * @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: - *

- *

-     * L b64 b56 b48 b40 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: - *

- *

-     * D 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. - *

- *

-     * date ::= d   b7 b6 b5 b4 b3 b2 b1 b0
-     *      ::= x65 b3 b2 b1 b0
-     * 
- * - * @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 - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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. - *

- *

-     * 
- */ - @Override - public void writeByteBufferStart() - throws IOException { - } - - /** - * Writes a byte buffer to the stream. - *

- *

-     * b b16 b18 bytes
-     * 
- */ - @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. - *

- *

-     * x51 <int>
-     * 
- * - * @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 - *

- *

A streaming message starts with 'P'

- *

- *

-     * P x02 x00
-     * 
- */ - public void writeStreamingObject(Object obj) - throws IOException { - startStreamingPacket(); - - writeObject(obj); - - endStreamingPacket(); - } - - /** - * Starts a streaming packet - *

- *

A streaming message starts with 'P'

- *

- *

-     * 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 _stateStack = new ArrayList(); - - private ArrayList _objectDefList - = new ArrayList(); - - private ArrayList _typeDefList - = new ArrayList(); - - private int _refId; - private boolean _isNewline = true; - private boolean _isObject = false; - private int _column; - - /** - * Creates an uninitialized Hessian input stream. - */ - public HessianDebugState(PrintWriter dbg) { - _dbg = dbg; - - _state = new InitialState(); - } - - static boolean isString(int ch) { - switch (ch) { - 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 'R': - case 'S': - return true; - - default: - return false; - } - } - - static boolean isInteger(int ch) { - switch (ch) { - 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: - - 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: - - case 0xd0: - case 0xd1: - case 0xd2: - case 0xd3: - case 0xd4: - case 0xd5: - case 0xd6: - case 0xd7: - - case 'I': - return true; - - default: - return false; - } - } - - public void startTop2() { - _state = new Top2State(); - } - - /** - * Reads a character. - */ - public void next(int ch) - throws IOException { - _state = _state.next(ch); - } - - void pushStack(State state) { - _stateStack.add(state); - } - - State popStack() { - return _stateStack.remove(_stateStack.size() - 1); - } - - void println() { - if (!_isNewline) { - _dbg.println(); - _dbg.flush(); - } - - _isNewline = true; - _column = 0; - } - - static class ObjectDef { - private String _type; - private ArrayList _fields; - - ObjectDef(String type, ArrayList fields) { - _type = type; - _fields = fields; - } - - String getType() { - return _type; - } - - ArrayList getFields() { - return _fields; - } - } - - abstract class State { - State _next; - - State() { - } - - State(State next) { - _next = next; - } - - abstract State next(int ch); - - boolean isShift(Object value) { - return false; - } - - State shift(Object value) { - return this; - } - - int depth() { - if (_next != null) - return _next.depth(); - else - return 0; - } - - void printIndent(int depth) { - if (_isNewline) { - for (int i = _column; i < depth() + depth; i++) { - _dbg.print(" "); - _column++; - } - } - } - - void print(String string) { - print(0, string); - } - - void print(int depth, String string) { - printIndent(depth); - - _dbg.print(string); - _isNewline = false; - _isObject = false; - - int p = string.lastIndexOf('\n'); - if (p > 0) - _column = string.length() - p - 1; - else - _column += string.length(); - } - - void println(String string) { - println(0, string); - } - - void println(int depth, String string) { - printIndent(depth); - - _dbg.println(string); - _dbg.flush(); - _isNewline = true; - _isObject = false; - _column = 0; - } - - void println() { - if (!_isNewline) { - _dbg.println(); - _dbg.flush(); - } - - _isNewline = true; - _isObject = false; - _column = 0; - } - - void printObject(String string) { - if (_isObject) - println(); - - printIndent(0); - - _dbg.print(string); - _dbg.flush(); - - _column += string.length(); - - _isNewline = false; - _isObject = true; - } - - protected State nextObject(int ch) { - switch (ch) { - case -1: - println(); - return this; - - case 'N': - if (isShift(null)) - return shift(null); - else { - printObject("null"); - return this; - } - - case 'T': - if (isShift(Boolean.TRUE)) - return shift(Boolean.TRUE); - else { - printObject("true"); - return this; - } - - case 'F': - if (isShift(Boolean.FALSE)) - return shift(Boolean.FALSE); - else { - printObject("false"); - return this; - } - - 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: { - Integer value = new Integer(ch - 0x90); - - if (isShift(value)) - return shift(value); - else { - printObject(value.toString()); - return this; - } - } - - 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 new IntegerState(this, "int", ch - 0xc8, 3); - - case 0xd0: - case 0xd1: - case 0xd2: - case 0xd3: - case 0xd4: - case 0xd5: - case 0xd6: - case 0xd7: - return new IntegerState(this, "int", ch - 0xd4, 2); - - case 'I': - return new IntegerState(this, "int"); - - 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: { - Long value = new Long(ch - 0xe0); - - if (isShift(value)) - return shift(value); - else { - printObject(value.toString() + "L"); - return this; - } - } - - 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 new LongState(this, "long", ch - 0xf8, 7); - - case 0x38: - case 0x39: - case 0x3a: - case 0x3b: - case 0x3c: - case 0x3d: - case 0x3e: - case 0x3f: - return new LongState(this, "long", ch - 0x3c, 6); - - case BC_LONG_INT: - return new LongState(this, "long", 0, 4); - - case 'L': - return new LongState(this, "long"); - - case 0x5b: - case 0x5c: { - Double value = new Double(ch - 0x5b); - - if (isShift(value)) - return shift(value); - else { - printObject(value.toString()); - return this; - } - } - - case 0x5d: - return new DoubleIntegerState(this, 3); - - case 0x5e: - return new DoubleIntegerState(this, 2); - - case 0x5f: - return new MillsState(this); - - case 'D': - return new DoubleState(this); - - case 'Q': - return new RefState(this); - - case BC_DATE: - return new DateState(this); - - case BC_DATE_MINUTE: - return new DateState(this, true); - - case 0x00: { - String value = "\"\""; - - if (isShift(value)) - return shift(value); - else { - printObject(value.toString()); - return this; - } - } - - 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: - return new StringState(this, 'S', ch); - - case 0x30: - case 0x31: - case 0x32: - case 0x33: - return new StringState(this, 'S', ch - 0x30, true); - - case 'R': - return new StringState(this, 'S', false); - - case 'S': - return new StringState(this, 'S', true); - - case 0x20: { - String value = "binary(0)"; - - if (isShift(value)) - return shift(value); - else { - printObject(value.toString()); - return this; - } - } - - 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: - return new BinaryState(this, 'B', ch - 0x20); - - case 0x34: - case 0x35: - case 0x36: - case 0x37: - return new BinaryState(this, 'B', ch - 0x34, true); - - case 'A': - return new BinaryState(this, 'B', false); - - case 'B': - return new BinaryState(this, 'B', true); - - case 'M': - return new MapState(this, _refId++); - - case 'H': - return new MapState(this, _refId++, false); - - case BC_LIST_VARIABLE: - return new ListState(this, _refId++, true); - - case BC_LIST_VARIABLE_UNTYPED: - return new ListState(this, _refId++, false); - - case BC_LIST_FIXED: - return new CompactListState(this, _refId++, true); - - case BC_LIST_FIXED_UNTYPED: - return new CompactListState(this, _refId++, false); - - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - return new CompactListState(this, _refId++, true, ch - 0x70); - - case 0x78: - case 0x79: - case 0x7a: - case 0x7b: - case 0x7c: - case 0x7d: - case 0x7e: - case 0x7f: - return new CompactListState(this, _refId++, false, ch - 0x78); - - case 'C': - return new ObjectDefState(this); - - 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: - return new ObjectState(this, _refId++, ch - 0x60); - - case 'O': - return new ObjectState(this, _refId++); - - default: - return this; - } - } - } - - class InitialState extends State { - @Override - State next(int ch) { - println(); - - if (ch == 'r') { - return new ReplyState(this); - } else if (ch == 'c') { - return new CallState(this); - } else - return nextObject(ch); - } - } - - class Top2State extends State { - @Override - State next(int ch) { - println(); - - if (ch == 'R') { - return new Reply2State(this); - } else if (ch == 'F') { - return new Fault2State(this); - } else if (ch == 'C') { - return new Call2State(this); - } else if (ch == 'H') { - return new Hessian2State(this); - } else if (ch == 'r') { - return new ReplyState(this); - } else if (ch == 'c') { - return new CallState(this); - } else - return nextObject(ch); - } - } - - class IntegerState extends State { - String _typeCode; - - int _length; - int _value; - - IntegerState(State next, String typeCode) { - super(next); - - _typeCode = typeCode; - } - - IntegerState(State next, String typeCode, int value, int length) { - super(next); - - _typeCode = typeCode; - - _value = value; - _length = length; - } - - @Override - State next(int ch) { - _value = 256 * _value + (ch & 0xff); - - if (++_length == 4) { - Integer value = new Integer(_value); - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString()); - - return _next; - } - } else - return this; - } - } - - class LongState extends State { - String _typeCode; - - int _length; - long _value; - - LongState(State next, String typeCode) { - super(next); - - _typeCode = typeCode; - } - - LongState(State next, String typeCode, long value, int length) { - super(next); - - _typeCode = typeCode; - - _value = value; - _length = length; - } - - @Override - State next(int ch) { - _value = 256 * _value + (ch & 0xff); - - if (++_length == 8) { - Long value = new Long(_value); - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString() + "L"); - - return _next; - } - } else - return this; - } - } - - class DoubleIntegerState extends State { - int _length; - int _value; - boolean _isFirst = true; - - DoubleIntegerState(State next, int length) { - super(next); - - _length = length; - } - - @Override - State next(int ch) { - if (_isFirst) - _value = (byte) ch; - else - _value = 256 * _value + (ch & 0xff); - - _isFirst = false; - - if (++_length == 4) { - Double value = new Double(_value); - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString()); - - return _next; - } - } else - return this; - } - } - - class RefState extends State { - String _typeCode; - - int _length; - int _value; - - RefState(State next) { - super(next); - } - - RefState(State next, String typeCode) { - super(next); - - _typeCode = typeCode; - } - - RefState(State next, String typeCode, int value, int length) { - super(next); - - _typeCode = typeCode; - - _value = value; - _length = length; - } - - @Override - boolean isShift(Object o) { - return true; - } - - @Override - State shift(Object o) { - println("ref #" + o); - - return _next; - } - - @Override - State next(int ch) { - return nextObject(ch); - } - } - - class DateState extends State { - int _length; - long _value; - boolean _isMinute; - - DateState(State next) { - super(next); - } - - DateState(State next, boolean isMinute) { - super(next); - - _length = 4; - _isMinute = isMinute; - } - - - @Override - State next(int ch) { - _value = 256 * _value + (ch & 0xff); - - if (++_length == 8) { - java.util.Date value; - - if (_isMinute) - value = new java.util.Date(_value * 60000L); - else - value = new java.util.Date(_value); - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString()); - - return _next; - } - } else - return this; - } - } - - class DoubleState extends State { - int _length; - long _value; - - DoubleState(State next) { - super(next); - } - - @Override - State next(int ch) { - _value = 256 * _value + (ch & 0xff); - - if (++_length == 8) { - Double value = Double.longBitsToDouble(_value); - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString()); - - return _next; - } - } else - return this; - } - } - - class MillsState extends State { - int _length; - int _value; - - MillsState(State next) { - super(next); - } - - @Override - State next(int ch) { - _value = 256 * _value + (ch & 0xff); - - if (++_length == 4) { - Double value = 0.001 * _value; - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value.toString()); - - return _next; - } - } else - return this; - } - } - - class StringState extends State { - private static final int TOP = 0; - private static final int UTF_2_1 = 1; - private static final int UTF_3_1 = 2; - private static final int UTF_3_2 = 3; - - char _typeCode; - - StringBuilder _value = new StringBuilder(); - int _lengthIndex; - int _length; - boolean _isLastChunk; - - int _utfState; - char _ch; - - StringState(State next, char typeCode, boolean isLastChunk) { - super(next); - - _typeCode = typeCode; - _isLastChunk = isLastChunk; - } - - StringState(State next, char typeCode, int length) { - super(next); - - _typeCode = typeCode; - _isLastChunk = true; - _length = length; - _lengthIndex = 2; - } - - StringState(State next, char typeCode, int length, boolean isLastChunk) { - super(next); - - _typeCode = typeCode; - _isLastChunk = isLastChunk; - _length = length; - _lengthIndex = 1; - } - - @Override - State next(int ch) { - if (_lengthIndex < 2) { - _length = 256 * _length + (ch & 0xff); - - if (++_lengthIndex == 2 && _length == 0 && _isLastChunk) { - if (_next.isShift(_value.toString())) - return _next.shift(_value.toString()); - else { - printObject("\"" + _value + "\""); - return _next; - } - } else - return this; - } else if (_length == 0) { - if (ch == 's' || ch == 'x') { - _isLastChunk = false; - _lengthIndex = 0; - return this; - } else if (ch == 'S' || ch == 'X') { - _isLastChunk = true; - _lengthIndex = 0; - return this; - } else if (ch == 0x00) { - if (_next.isShift(_value.toString())) - return _next.shift(_value.toString()); - else { - printObject("\"" + _value + "\""); - return _next; - } - } else if (0x00 <= ch && ch < 0x20) { - _isLastChunk = true; - _lengthIndex = 2; - _length = ch & 0xff; - return this; - } else if (0x30 <= ch && ch < 0x34) { - _isLastChunk = true; - _lengthIndex = 1; - _length = (ch - 0x30); - return this; - } else { - println(String.valueOf((char) ch) + ": unexpected character"); - return _next; - } - } - - switch (_utfState) { - case TOP: - if (ch < 0x80) { - _length--; - - _value.append((char) ch); - } else if (ch < 0xe0) { - _ch = (char) ((ch & 0x1f) << 6); - _utfState = UTF_2_1; - } else { - _ch = (char) ((ch & 0xf) << 12); - _utfState = UTF_3_1; - } - break; - - case UTF_2_1: - case UTF_3_2: - _ch += ch & 0x3f; - _value.append(_ch); - _length--; - _utfState = TOP; - break; - - case UTF_3_1: - _ch += (char) ((ch & 0x3f) << 6); - _utfState = UTF_3_2; - break; - } - - if (_length == 0 && _isLastChunk) { - if (_next.isShift(_value.toString())) - return _next.shift(_value.toString()); - else { - printObject("\"" + _value + "\""); - - return _next; - } - } else - return this; - } - } - - class BinaryState extends State { - char _typeCode; - - int _totalLength; - - int _lengthIndex; - int _length; - boolean _isLastChunk; - - BinaryState(State next, char typeCode, boolean isLastChunk) { - super(next); - - _typeCode = typeCode; - _isLastChunk = isLastChunk; - } - - BinaryState(State next, char typeCode, int length) { - super(next); - - _typeCode = typeCode; - _isLastChunk = true; - _length = length; - _lengthIndex = 2; - } - - BinaryState(State next, char typeCode, int length, boolean isLastChunk) { - super(next); - - _typeCode = typeCode; - _isLastChunk = isLastChunk; - _length = length; - _lengthIndex = 1; - } - - @Override - State next(int ch) { - if (_lengthIndex < 2) { - _length = 256 * _length + (ch & 0xff); - - if (++_lengthIndex == 2 && _length == 0 && _isLastChunk) { - String value = "binary(" + _totalLength + ")"; - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value); - return _next; - } - } else - return this; - } else if (_length == 0) { - if (ch == 'b') { - _isLastChunk = false; - _lengthIndex = 0; - return this; - } else if (ch == 'B') { - _isLastChunk = true; - _lengthIndex = 0; - return this; - } else if (ch == 0x20) { - String value = "binary(" + _totalLength + ")"; - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value); - return _next; - } - } else if (0x20 <= ch && ch < 0x30) { - _isLastChunk = true; - _lengthIndex = 2; - _length = (ch & 0xff) - 0x20; - return this; - } else { - println(String.valueOf((char) ch) + ": unexpected character"); - return _next; - } - } - - _length--; - _totalLength++; - - if (_length == 0 && _isLastChunk) { - String value = "binary(" + _totalLength + ")"; - - if (_next.isShift(value)) - return _next.shift(value); - else { - printObject(value); - - return _next; - } - } else - return this; - } - } - - class MapState extends State { - private static final int TYPE = 0; - private static final int KEY = 1; - private static final int VALUE = 2; - - private int _refId; - - private int _state; - private int _valueDepth; - private boolean _hasData; - - MapState(State next, int refId) { - super(next); - - _refId = refId; - _state = TYPE; - } - - MapState(State next, int refId, boolean isType) { - super(next); - - _refId = refId; - - if (isType) - _state = TYPE; - else { - printObject("map (#" + _refId + ")"); - _state = VALUE; - } - } - - @Override - boolean isShift(Object value) { - return _state == TYPE; - } - - @Override - State shift(Object type) { - if (_state == TYPE) { - if (type instanceof String) { - _typeDefList.add((String) type); - } else if (type instanceof Integer) { - int iValue = (Integer) type; - - if (iValue >= 0 && iValue < _typeDefList.size()) - type = _typeDefList.get(iValue); - } - - printObject("map " + type + " (#" + _refId + ")"); - - _state = VALUE; - - return this; - } else - throw new IllegalStateException(); - } - - @Override - int depth() { - if (_state == TYPE) - return _next.depth(); - else if (_state == KEY) - return _next.depth() + 2; - else - return _valueDepth; - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - return nextObject(ch); - - case VALUE: - if (ch == 'Z') { - if (_hasData) - println(); - - return _next; - } else { - if (_hasData) - println(); - - _hasData = true; - _state = KEY; - - return nextObject(ch); - } - - case KEY: - print(" => "); - _isObject = false; - _valueDepth = _column; - - _state = VALUE; - - return nextObject(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class ObjectDefState extends State { - private static final int TYPE = 1; - private static final int COUNT = 2; - private static final int FIELD = 3; - private static final int COMPLETE = 4; - - private int _refId; - - private int _state; - private boolean _hasData; - private int _count; - - private String _type; - private ArrayList _fields = new ArrayList(); - - ObjectDefState(State next) { - super(next); - - _state = TYPE; - } - - @Override - boolean isShift(Object value) { - return true; - } - - @Override - State shift(Object object) { - if (_state == TYPE) { - _type = (String) object; - - print("/* defun " + _type + " ["); - - _objectDefList.add(new ObjectDef(_type, _fields)); - - _state = COUNT; - } else if (_state == COUNT) { - _count = (Integer) object; - - _state = FIELD; - } else if (_state == FIELD) { - String field = (String) object; - - _count--; - - _fields.add(field); - - if (_fields.size() == 1) - print(field); - else - print(", " + field); - } else { - throw new UnsupportedOperationException(); - } - - return this; - } - - @Override - int depth() { - if (_state <= TYPE) - return _next.depth(); - else - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - return nextObject(ch); - - case COUNT: - return nextObject(ch); - - case FIELD: - if (_count == 0) { - println("] */"); - _next.printIndent(0); - - return _next.nextObject(ch); - } else - return nextObject(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class ObjectState extends State { - private static final int TYPE = 0; - private static final int FIELD = 1; - - private int _refId; - - private int _state; - private ObjectDef _def; - private int _count; - private int _fieldDepth; - - ObjectState(State next, int refId) { - super(next); - - _refId = refId; - _state = TYPE; - } - - ObjectState(State next, int refId, int def) { - super(next); - - _refId = refId; - _state = FIELD; - - if (def < 0 || _objectDefList.size() <= def) { - throw new IllegalStateException(def + " is an unknown object type"); - } - - _def = _objectDefList.get(def); - - println("object " + _def.getType() + " (#" + _refId + ")"); - } - - @Override - boolean isShift(Object value) { - if (_state == TYPE) - return true; - else - return false; - } - - @Override - State shift(Object object) { - if (_state == TYPE) { - int def = (Integer) object; - - _def = _objectDefList.get(def); - - println("object " + _def.getType() + " (#" + _refId + ")"); - - _state = FIELD; - - if (_def.getFields().size() == 0) - return _next; - } - - return this; - } - - @Override - int depth() { - if (_state <= TYPE) - return _next.depth(); - else - return _fieldDepth; - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - return nextObject(ch); - - case FIELD: - if (_def.getFields().size() <= _count) - return _next.next(ch); - - _fieldDepth = _next.depth() + 2; - println(); - print(_def.getFields().get(_count++) + ": "); - - _fieldDepth = _column; - - _isObject = false; - return nextObject(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class ListState extends State { - private static final int TYPE = 0; - private static final int LENGTH = 1; - private static final int VALUE = 2; - - private int _refId; - - private int _state; - private boolean _hasData; - private int _count; - private int _valueDepth; - - ListState(State next, int refId, boolean isType) { - super(next); - - _refId = refId; - - if (isType) - _state = TYPE; - else { - printObject("list (#" + _refId + ")"); - _state = VALUE; - } - } - - @Override - boolean isShift(Object value) { - return _state == TYPE || _state == LENGTH; - } - - @Override - State shift(Object object) { - if (_state == TYPE) { - Object type = object; - - if (type instanceof String) { - _typeDefList.add((String) type); - } else if (object instanceof Integer) { - int index = (Integer) object; - - if (index >= 0 && index < _typeDefList.size()) - type = _typeDefList.get(index); - else - type = "type-unknown(" + index + ")"; - } - - printObject("list " + type + "(#" + _refId + ")"); - - _state = VALUE; - - return this; - } else if (_state == LENGTH) { - _state = VALUE; - - return this; - } else - return this; - } - - @Override - int depth() { - if (_state <= LENGTH) - return _next.depth(); - else if (_state == VALUE) - return _valueDepth; - else - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - return nextObject(ch); - - case VALUE: - if (ch == 'Z') { - if (_count > 0) - println(); - - return _next; - } else { - _valueDepth = _next.depth() + 2; - println(); - printObject(_count++ + ": "); - _valueDepth = _column; - _isObject = false; - - return nextObject(ch); - } - - default: - throw new IllegalStateException(); - } - } - } - - class CompactListState extends State { - private static final int TYPE = 0; - private static final int LENGTH = 1; - private static final int VALUE = 2; - - private int _refId; - - private boolean _isTyped; - private boolean _isLength; - - private int _state; - private boolean _hasData; - private int _length; - private int _count; - private int _valueDepth; - - CompactListState(State next, int refId, boolean isTyped) { - super(next); - - _isTyped = isTyped; - _refId = refId; - - if (isTyped) - _state = TYPE; - else - _state = LENGTH; - } - - CompactListState(State next, int refId, boolean isTyped, int length) { - super(next); - - _isTyped = isTyped; - _refId = refId; - _length = length; - - _isLength = true; - - if (isTyped) - _state = TYPE; - else { - printObject("list (#" + _refId + ")"); - - _state = VALUE; - } - } - - @Override - boolean isShift(Object value) { - return _state == TYPE || _state == LENGTH; - } - - @Override - State shift(Object object) { - if (_state == TYPE) { - Object type = object; - - if (object instanceof Integer) { - int index = (Integer) object; - - if (index >= 0 && index < _typeDefList.size()) - type = _typeDefList.get(index); - else - type = "type-unknown(" + index + ")"; - } else if (object instanceof String) - _typeDefList.add((String) object); - - printObject("list " + type + " (#" + _refId + ")"); - - if (_isLength) { - _state = VALUE; - - if (_length == 0) - return _next; - } else - _state = LENGTH; - - return this; - } else if (_state == LENGTH) { - _length = (Integer) object; - - if (!_isTyped) - printObject("list (#" + _refId + ")"); - - _state = VALUE; - - if (_length == 0) - return _next; - else - return this; - } else - return this; - } - - @Override - int depth() { - if (_state <= LENGTH) - return _next.depth(); - else if (_state == VALUE) - return _valueDepth; - else - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - return nextObject(ch); - - case LENGTH: - return nextObject(ch); - - case VALUE: - if (_length <= _count) - return _next.next(ch); - else { - _valueDepth = _next.depth() + 2; - println(); - printObject(_count++ + ": "); - _valueDepth = _column; - _isObject = false; - - return nextObject(ch); - } - - default: - throw new IllegalStateException(); - } - } - } - - class Hessian2State extends State { - private static final int MAJOR = 0; - private static final int MINOR = 1; - - private int _state; - private int _major; - private int _minor; - - Hessian2State(State next) { - super(next); - } - - @Override - int depth() { - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case MAJOR: - _major = ch; - _state = MINOR; - return this; - - case MINOR: - _minor = ch; - println(-2, "hessian " + _major + "." + _minor); - return _next; - - default: - throw new IllegalStateException(); - } - } - } - - class CallState extends State { - private static final int MAJOR = 0; - private static final int MINOR = 1; - private static final int HEADER = 2; - private static final int METHOD = 3; - private static final int VALUE = 4; - private static final int ARG = 5; - - private int _state; - private int _major; - private int _minor; - - CallState(State next) { - super(next); - } - - @Override - int depth() { - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case MAJOR: - _major = ch; - _state = MINOR; - return this; - - case MINOR: - _minor = ch; - _state = HEADER; - println(-2, "call " + _major + "." + _minor); - return this; - - case HEADER: - if (ch == 'H') { - println(); - print("header "); - _isObject = false; - _state = VALUE; - return new StringState(this, 'H', true); - } else if (ch == 'm') { - println(); - print("method "); - _isObject = false; - _state = ARG; - return new StringState(this, 'm', true); - } else { - println((char) ch + ": unexpected char"); - return popStack(); - } - - case VALUE: - print(" => "); - _isObject = false; - _state = HEADER; - return nextObject(ch); - - case ARG: - if (ch == 'Z') - return _next; - else - return nextObject(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class Call2State extends State { - private static final int METHOD = 0; - private static final int COUNT = 1; - private static final int ARG = 2; - - private int _state = METHOD; - private int _i; - private int _count; - - Call2State(State next) { - super(next); - } - - @Override - int depth() { - return _next.depth() + 5; - } - - @Override - boolean isShift(Object value) { - return _state != ARG; - } - - @Override - State shift(Object object) { - if (_state == METHOD) { - println(-5, "Call " + object); - - _state = COUNT; - return this; - } else if (_state == COUNT) { - Integer count = (Integer) object; - - _count = count; - - _state = ARG; - - if (_count == 0) - return _next; - else - return this; - } else - return this; - } - - @Override - State next(int ch) { - switch (_state) { - case COUNT: - return nextObject(ch); - - case METHOD: - return nextObject(ch); - - case ARG: - if (_count <= _i) - return _next.next(ch); - else { - println(); - print(-3, _i++ + ": "); - - return nextObject(ch); - } - - default: - throw new IllegalStateException(); - } - } - } - - class ReplyState extends State { - private static final int MAJOR = 0; - private static final int MINOR = 1; - private static final int HEADER = 2; - private static final int VALUE = 3; - private static final int END = 4; - - private int _state; - private int _major; - private int _minor; - - ReplyState(State next) { - _next = next; - } - - @Override - int depth() { - return _next.depth() + 2; - } - - @Override - State next(int ch) { - switch (_state) { - case MAJOR: - if (ch == 't' || ch == 'S') - return new RemoteState(this).next(ch); - - _major = ch; - _state = MINOR; - return this; - - case MINOR: - _minor = ch; - _state = HEADER; - println(-2, "reply " + _major + "." + _minor); - return this; - - case HEADER: - if (ch == 'H') { - _state = VALUE; - return new StringState(this, 'H', true); - } else if (ch == 'f') { - print("fault "); - _isObject = false; - _state = END; - return new MapState(this, 0); - } else { - _state = END; - return nextObject(ch); - } - - case VALUE: - _state = HEADER; - return nextObject(ch); - - case END: - println(); - if (ch == 'Z') { - return _next; - } else - return _next.next(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class Reply2State extends State { - Reply2State(State next) { - super(next); - - println(-2, "Reply"); - } - - @Override - int depth() { - return _next.depth() + 2; - } - - @Override - State next(int ch) { - return nextObject(ch); - } - } - - class Fault2State extends State { - Fault2State(State next) { - super(next); - - println(-2, "Fault"); - } - - @Override - int depth() { - return _next.depth() + 2; - } - - @Override - State next(int ch) { - return nextObject(ch); - } - } - - class IndirectState extends State { - IndirectState(State next) { - super(next); - } - - @Override - boolean isShift(Object object) { - return _next.isShift(object); - } - - @Override - State shift(Object object) { - return _next.shift(object); - } - - @Override - State next(int ch) { - return nextObject(ch); - } - } - - class RemoteState extends State { - private static final int TYPE = 0; - private static final int VALUE = 1; - private static final int END = 2; - - private int _state; - private int _major; - private int _minor; - - RemoteState(State next) { - super(next); - } - - @Override - State next(int ch) { - switch (_state) { - case TYPE: - println(-1, "remote"); - if (ch == 't') { - _state = VALUE; - return new StringState(this, 't', false); - } else { - _state = END; - return nextObject(ch); - } - - case VALUE: - _state = END; - return _next.nextObject(ch); - - case END: - return _next.next(ch); - - default: - throw new IllegalStateException(); - } - } - } - - class StreamingState extends State { - private int _digit; - private int _length; - private boolean _isLast; - private boolean _isFirst = true; - - private State _childState; - - StreamingState(State next, boolean isLast) { - super(next); - - _isLast = isLast; - _childState = new InitialState(); - } - - @Override - State next(int ch) { - if (_digit < 2) { - _length = 256 * _length + ch; - _digit++; - - if (_digit == 2 && _length == 0 && _isLast) { - _refId = 0; - return _next; - } else { - if (_digit == 2) - println(-1, "packet-start(" + _length + ")"); - - return this; - } - } else if (_length == 0) { - _isLast = (ch == 'P'); - _digit = 0; - - return this; - } - - _childState = _childState.next(ch); - - _length--; - - if (_length == 0 && _isLast) { - println(-1, ""); - println(-1, "packet-end"); - _refId = 0; - return _next; - } else - return this; - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianEnvelope.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianEnvelope.java deleted file mode 100644 index 21bd3a77139..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianEnvelope.java +++ /dev/null @@ -1,78 +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; - -/** - * Factory class for wrapping and unwrapping hessian streams. - */ -abstract public class HessianEnvelope { - /** - * Wrap the Hessian output stream in an envelope. - */ - abstract public Hessian2Output wrap(Hessian2Output out) - throws IOException; - - /** - * Unwrap the Hessian input stream with this envelope. It is an - * error if the actual envelope does not match the expected envelope - * class. - */ - abstract public Hessian2Input unwrap(Hessian2Input in) - throws IOException; - - /** - * Unwrap the envelope after having read the envelope code ('E') and - * the envelope method. Called by the EnvelopeFactory for dynamic - * reading of the envelopes. - */ - abstract public Hessian2Input unwrapHeaders(Hessian2Input in) - throws IOException; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianFieldException.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianFieldException.java deleted file mode 100644 index bc5f9a0bf36..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianFieldException.java +++ /dev/null @@ -1,81 +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; - -/** - * Exception during field reading. - */ -public class HessianFieldException extends HessianProtocolException { - /** - * Zero-arg constructor. - */ - public HessianFieldException() { - } - - /** - * Create the exception. - */ - public HessianFieldException(String message) { - super(message); - } - - /** - * Create the exception. - */ - public HessianFieldException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Create the exception. - */ - public HessianFieldException(Throwable cause) { - super(cause); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianHandle.java deleted file mode 100644 index 3103a871f76..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianHandle.java +++ /dev/null @@ -1,55 +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; - -/** - * Marks a type as a handle - */ -public interface HessianHandle { -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java deleted file mode 100644 index 417b7564aa5..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/HessianInput.java +++ /dev/null @@ -1,1712 +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.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; - -/** - * Input stream for Hessian requests. - *

- *

HessianInput is unbuffered, so any client needs to provide - * its own buffering. - *

- *

- * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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. - *

- *

The call expects the following protocol data - *

- *

-     * c major minor
-     * m b16 b8 method
-     * 
- */ - @Override - public void startCall() - throws IOException { - readCall(); - - while (readHeader() != null) { - readObject(); - } - - readMethod(); - } - - /** - * Completes reading the call - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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 - *

- *

A successful completion will have a single value: - *

- *

-     * 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>) null); - } - - /** - * Reads an arbitrary object from the input stream when the type - * is unknown. - */ - public Object readObject(List> expectedTypes) - throws IOException { - int tag = read(); - - switch (tag) { - case 'N': - return null; - - case 'T': - return Boolean.valueOf(true); - - case 'F': - return Boolean.valueOf(false); - - case 'I': - return Integer.valueOf(parseInt()); - - case 'L': - return Long.valueOf(parseLong()); - - case 'D': - return Double.valueOf(parseDouble()); - - case 'd': - return new Date(parseLong()); - - case 'x': - case 'X': { - _isLastChunk = tag == 'X'; - _chunkLength = (read() << 8) + read(); - - return parseXML(); - } - - case 's': - case 'S': { - _isLastChunk = tag == 'S'; - _chunkLength = (read() << 8) + read(); - - int data; - _sbuf.setLength(0); - - while ((data = parseChar()) >= 0) - _sbuf.append((char) data); - - return _sbuf.toString(); - } - - case 'b': - case 'B': { - _isLastChunk = tag == 'B'; - _chunkLength = (read() << 8) + read(); - - int data; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - while ((data = parseByte()) >= 0) - bos.write(data); - - return bos.toByteArray(); - } - - case 'V': { - String type = readType(); - int length = readLength(); - - Deserializer reader; - reader = _serializerFactory.getObjectDeserializer(type); - - boolean valueType = expectedTypes != null && expectedTypes.size() == 1; - - if (List.class != reader.getType() && List.class.isAssignableFrom(reader.getType())) - return reader.readList(this, length, valueType ? expectedTypes.get(0) : null); - - reader = _serializerFactory.getDeserializer(List.class); - - Object v = reader.readList(this, length, valueType ? expectedTypes.get(0) : null); - - return v; - } - - case 'M': { - String type = readType(); - - boolean keyValuePair = expectedTypes != null && expectedTypes.size() == 2; - - return _serializerFactory.readMap(this, type - , keyValuePair ? expectedTypes.get(0) : null - , keyValuePair ? expectedTypes.get(1) : null); - } - - case 'R': { - int ref = parseInt(); - - return _refs.get(ref); - } - - case 'r': { - String type = readType(); - String url = readString(); - - return resolveRemote(type, url); - } - - default: - throw error("unknown code for readObject at " + codeName(tag)); - } - } - - /** - * 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 = read(); - - _peek = code; - - return (code < 0 || code == 'z'); - } - - /** - * Reads the end byte. - */ - @Override - public void readEnd() - throws IOException { - int code = read(); - - if (code != 'z') - throw error("unknown code at " + codeName(code)); - } - - /** - * Reads the end byte. - */ - @Override - public void readMapEnd() - throws IOException { - int code = 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 = 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(); - } - - /** - * 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. - *

- *

-     * 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. - *

- *

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. - *

- *

- * 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. - *

- *

-     * c major minor
-     * m b16 b8 method-name
-     * 
- * - * @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
-     * 
- * - * @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. - *

- *

-     * m b16 b8 method-name
-     * 
- * - * @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. - *

- *

-     * z
-     * 
- */ - @Override - public void completeCall() - throws IOException { - os.write('z'); - } - - /** - * Starts the reply - *

- *

A successful completion will have a single value: - *

- *

-     * r
-     * 
- */ - @Override - public void startReply() - throws IOException { - os.write('r'); - os.write(1); - os.write(0); - } - - /** - * Completes reading the reply - *

- *

A successful completion will have a single value: - *

- *

-     * z
-     * 
- */ - @Override - public void completeReply() - throws IOException { - os.write('z'); - } - - /** - * Writes a header name. The header value must immediately follow. - *

- *

-     * H b16 b8 foo value
-     * 
- */ - @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: - *

- *

-     * f
-     * <string>code
-     * <string>the fault code
-     * 

- * <string>message - * <string>the fault mesage - *

- * <string>detail - * mt\x00\xnnjavax.ejb.FinderException - * ... - * z - * z - *

- * - * @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 - * writeListBegin followed by the list contents and then - * call writeListEnd. - *

- *

-     * V
-     * t b16 b8 type
-     * l b32 b24 b16 b8
-     * 
- */ - @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 - * writeMapBegin followed by the map contents and then - * call writeMapEnd. - *

- *

-     * Mt b16 b8 ( )z
-     * 
- */ - @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. - *

- *

-     * 'r' 't' b16 b8 type url
-     * 
- */ - 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: - *

- *

-     * T
-     * F
-     * 
- * - * @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: - *

- *

-     * I b32 b24 b16 b8
-     * 
- * - * @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: - *

- *

-     * L b64 b56 b48 b40 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: - *

- *

-     * D 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. - *

- *

-     * T  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 - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * S b16 b8 string-value
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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: - *

- *

-     * B b16 b18 bytes
-     * 
- *

- * If the value is null, it will be written as - *

- *

-     * N
-     * 
- * - * @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. - *

- *

-     * 
- */ - @Override - public void writeByteBufferStart() - throws IOException { - } - - /** - * Writes a byte buffer to the stream. - *

- *

-     * b b16 b18 bytes
-     * 
- */ - @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. - *

- *

-     * R b32 b24 b16 b8
-     * 
- * - * @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. - *

- *

-     * P
-     * 
- */ - 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. - *

- *

HessianSerializerInput is unbuffered, so any client needs to provide - * its own buffering. - *

- *

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. - *

- *

HessianOutput is unbuffered, so any client needs to provide - * its own buffering. - *

- *

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 PRIMITIVE_TYPE = new HashMap() { - { - put(Boolean.class.getName(), true); - put(Character.class.getName(), true); - put(Byte.class.getName(), true); - put(Short.class.getName(), true); - put(Integer.class.getName(), true); - put(Long.class.getName(), true); - put(Float.class.getName(), true); - put(Double.class.getName(), true); - put(Void.class.getName(), true); - } - }; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaSerializer.java deleted file mode 100644 index 92a090f86da..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/JavaSerializer.java +++ /dev/null @@ -1,419 +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.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Serializing an object for known object types. - */ -public class JavaSerializer extends AbstractSerializer { - private static final Logger log - = Logger.getLogger(JavaSerializer.class.getName()); - - private static Object[] NULL_ARGS = new Object[0]; - - private Field[] _fields; - private FieldSerializer[] _fieldSerializers; - - private Object _writeReplaceFactory; - private Method _writeReplace; - - public JavaSerializer(Class cl, ClassLoader loader) { - introspectWriteReplace(cl, loader); - - if (_writeReplace != null) - _writeReplace.setAccessible(true); - - List primitiveFields = new ArrayList(); - List compoundFields = new ArrayList(); - - 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); - - if (field.getType().isPrimitive() - || (field.getType().getName().startsWith("java.lang.") - && !field.getType().equals(Object.class))) - primitiveFields.add(field); - else - compoundFields.add(field); - } - } - - List fields = new ArrayList(); - fields.addAll(primitiveFields); - fields.addAll(compoundFields); - Collections.reverse(fields); - - _fields = new Field[fields.size()]; - fields.toArray(_fields); - - _fieldSerializers = new FieldSerializer[_fields.length]; - - for (int i = 0; i < _fields.length; i++) { - _fieldSerializers[i] = getFieldSerializer(_fields[i].getType()); - } - } - - /** - * Returns the writeReplace method - */ - protected static 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; - } - - private static FieldSerializer getFieldSerializer(Class type) { - if (int.class.equals(type) - || byte.class.equals(type) - || short.class.equals(type) - || int.class.equals(type)) { - return IntFieldSerializer.SER; - } else if (long.class.equals(type)) { - return LongFieldSerializer.SER; - } else if (double.class.equals(type) || - float.class.equals(type)) { - return DoubleFieldSerializer.SER; - } else if (boolean.class.equals(type)) { - return BooleanFieldSerializer.SER; - } else if (String.class.equals(type)) { - return StringFieldSerializer.SER; - } else if (java.util.Date.class.equals(type) - || java.sql.Date.class.equals(type) - || java.sql.Timestamp.class.equals(type) - || java.sql.Time.class.equals(type)) { - return DateFieldSerializer.SER; - } else - return FieldSerializer.SER; - } - - 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, 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 (RuntimeException e) { - throw e; - } catch (Exception e) { - // log.log(Level.FINE, e.toString(), e); - throw new RuntimeException(e); - } - - int ref = out.writeObjectBegin(cl.getName()); - - if (ref < -1) { - writeObject10(obj, out); - } else { - if (ref == -1) { - writeDefinition20(out); - out.writeObjectBegin(cl.getName()); - } - - writeInstance(obj, out); - } - } - - private void writeObject10(Object obj, AbstractHessianOutput out) - throws IOException { - for (int i = 0; i < _fields.length; i++) { - Field field = _fields[i]; - - out.writeString(field.getName()); - - _fieldSerializers[i].serialize(out, obj, field); - } - - out.writeMapEnd(); - } - - private void writeDefinition20(AbstractHessianOutput out) - throws IOException { - out.writeClassFieldLength(_fields.length); - - for (int i = 0; i < _fields.length; i++) { - Field field = _fields[i]; - - out.writeString(field.getName()); - } - } - - public void writeInstance(Object obj, AbstractHessianOutput out) - throws IOException { - for (int i = 0; i < _fields.length; i++) { - Field field = _fields[i]; - - _fieldSerializers[i].serialize(out, obj, field); - } - } - - static class FieldSerializer { - static final FieldSerializer SER = new FieldSerializer(); - - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - Object value = null; - - try { - value = field.get(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - try { - out.writeObject(value); - } catch (RuntimeException e) { - throw new RuntimeException(e.getMessage() + "\n Java field: " + field, - e); - } catch (IOException e) { - throw new IOExceptionWrapper(e.getMessage() + "\n Java field: " + field, - e); - } - } - } - - static class BooleanFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new BooleanFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - boolean value = false; - - try { - value = field.getBoolean(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - out.writeBoolean(value); - } - } - - static class IntFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new IntFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - int value = 0; - - try { - value = field.getInt(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - out.writeInt(value); - } - } - - static class LongFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new LongFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - long value = 0; - - try { - value = field.getLong(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - out.writeLong(value); - } - } - - static class DoubleFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new DoubleFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - double value = 0; - - try { - value = field.getDouble(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - out.writeDouble(value); - } - } - - static class StringFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new StringFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - String value = null; - - try { - value = (String) field.get(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - out.writeString(value); - } - } - - static class DateFieldSerializer extends FieldSerializer { - static final FieldSerializer SER = new DateFieldSerializer(); - - @Override - void serialize(AbstractHessianOutput out, Object obj, Field field) - throws IOException { - java.util.Date value = null; - - try { - value = (java.util.Date) field.get(obj); - } catch (IllegalAccessException e) { - log.log(Level.FINE, e.toString(), e); - } - - if (value == null) - out.writeNull(); - else - out.writeUTCDate(value.getTime()); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleHandle.java deleted file mode 100644 index 751eee651d6..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleHandle.java +++ /dev/null @@ -1,90 +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.util.Locale; - -/** - * Handle for a locale object. - */ -public class LocaleHandle implements java.io.Serializable, HessianHandle { - private String value; - - public LocaleHandle(String locale) { - this.value = locale; - } - - private Object readResolve() { - if (value == null) { - return null; - } - - if (value.length() == 0) { - return new Locale(""); - } - - int extStart = value.indexOf("_#"); - if (extStart != -1) value = value.substring(0, extStart); - - String language = value, country = "", variant = ""; - int pos1 = value.indexOf('_'); - if (pos1 != -1) { - language = value.substring(0, pos1++); - - int pos2 = value.indexOf('_', pos1); - if (pos2 == -1) { - country = value.substring(pos1); - } else { - country = value.substring(pos1, pos2); - variant = value.substring(pos2 + 1); - } - } - return new Locale(language, country, variant); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java deleted file mode 100644 index 2ac93936ae8..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.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; -import java.util.Locale; - -/** - * Serializing a locale. - */ -public class LocaleSerializer extends AbstractSerializer { - private static LocaleSerializer SERIALIZER = new LocaleSerializer(); - - public static LocaleSerializer create() { - return SERIALIZER; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (obj == null) - out.writeNull(); - else { - Locale locale = (Locale) obj; - - out.writeObject(new LocaleHandle(locale.toString())); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java deleted file mode 100644 index 9720fb6446f..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java +++ /dev/null @@ -1,184 +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.Constructor; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.SortedMap; -import java.util.TreeMap; - -/** - * Deserializing a JDK 1.2 Map. - */ -public class MapDeserializer extends AbstractMapDeserializer { - private Class _type; - private Constructor _ctor; - - public MapDeserializer(Class type) { - if (type == null) - type = HashMap.class; - - _type = type; - - Constructor[] ctors = type.getConstructors(); - for (int i = 0; i < ctors.length; i++) { - if (ctors[i].getParameterTypes().length == 0) - _ctor = ctors[i]; - } - - if (_ctor == null) { - try { - _ctor = HashMap.class.getConstructor(new Class[0]); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - } - - @Override - public Class getType() { - if (_type != null) - return _type; - else - return HashMap.class; - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - return readMap(in, null, null); - } - - /** - * support generic type of map, fix the type of short serialization

- * eg: Map serialize & deserialize - * - */ - @Override - public Object readMap(AbstractHessianInput in, Class expectKeyType, Class expectValueType) throws IOException { - Map map; - - if (_type == null) - map = new HashMap(); - else if (_type.equals(Map.class)) - map = new HashMap(); - else if (_type.equals(SortedMap.class)) - map = new TreeMap(); - else { - try { - map = (Map) _ctor.newInstance(); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } - - in.addRef(map); - - doReadMap(in, map, expectKeyType, expectValueType); - - in.readEnd(); - - return map; - } - - protected void doReadMap(AbstractHessianInput in, Map map, Class keyType, Class valueType) throws IOException { - Deserializer keyDeserializer = null, valueDeserializer = null; - - SerializerFactory factory = findSerializerFactory(in); - if(keyType != null){ - keyDeserializer = factory.getDeserializer(keyType.getName()); - } - if(valueType != null){ - valueDeserializer = factory.getDeserializer(valueType.getName()); - } - - while (!in.isEnd()) { - map.put(keyDeserializer != null ? keyDeserializer.readObject(in) : in.readObject(), - valueDeserializer != null? valueDeserializer.readObject(in) : in.readObject()); - } - } - - @Override - public Object readObject(AbstractHessianInput in, - String[] fieldNames) - throws IOException { - Map map = createMap(); - - int ref = in.addRef(map); - - for (int i = 0; i < fieldNames.length; i++) { - String name = fieldNames[i]; - - map.put(name, in.readObject()); - } - - return map; - } - - private Map createMap() - throws IOException { - - if (_type == null) - return new HashMap(); - else if (_type.equals(Map.class)) - return new HashMap(); - else if (_type.equals(SortedMap.class)) - return new TreeMap(); - else { - try { - return (Map) _ctor.newInstance(); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapSerializer.java deleted file mode 100644 index 5d48eaa009f..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapSerializer.java +++ /dev/null @@ -1,102 +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; -import java.util.Iterator; -import java.util.Map; - -/** - * Serializing a JDK 1.2 java.util.Map. - */ -public class MapSerializer extends AbstractSerializer { - private boolean _isSendJavaType = true; - - /** - * Return true if the java type of the collection should be sent. - */ - public boolean getSendJavaType() { - return _isSendJavaType; - } - - /** - * Set true if the java type of the collection should be sent. - */ - public void setSendJavaType(boolean sendJavaType) { - _isSendJavaType = sendJavaType; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (out.addRef(obj)) - return; - - Map map = (Map) obj; - - Class cl = obj.getClass(); - - if (cl.equals(HashMap.class) - || !_isSendJavaType - || !(obj instanceof java.io.Serializable)) - out.writeMapBegin(null); - else - out.writeMapBegin(obj.getClass().getName()); - - Iterator iter = map.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = (Map.Entry) iter.next(); - - out.writeObject(entry.getKey()); - out.writeObject(entry.getValue()); - } - out.writeMapEnd(); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectDeserializer.java deleted file mode 100644 index c4e69f1c763..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectDeserializer.java +++ /dev/null @@ -1,96 +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; - -/** - * Serializing an object for known object types. - */ -public class ObjectDeserializer extends AbstractDeserializer { - private Class _cl; - - public ObjectDeserializer(Class cl) { - _cl = cl; - } - - @Override - public Class getType() { - return _cl; - } - - @Override - public Object readObject(AbstractHessianInput in) - throws IOException { - return in.readObject(); - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readList(AbstractHessianInput in, int length) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public Object readLengthList(AbstractHessianInput in, int length) - throws IOException { - throw new UnsupportedOperationException(String.valueOf(this)); - } - - @Override - public String toString() { - return getClass().getSimpleName() + "[" + _cl + "]"; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/RemoteSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/RemoteSerializer.java deleted file mode 100644 index 29146884ae8..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/RemoteSerializer.java +++ /dev/null @@ -1,63 +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 remote object. - */ -public class RemoteSerializer extends AbstractSerializer { - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - // XXX: needs to be handled as a separate class - throw new UnsupportedOperationException(getClass().getName()); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Serializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Serializer.java deleted file mode 100644 index a0a4e60531e..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Serializer.java +++ /dev/null @@ -1,59 +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 an object. - */ -public interface Serializer { - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java deleted file mode 100644 index b233fdb4a4c..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SerializerFactory.java +++ /dev/null @@ -1,687 +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.io.java8.DurationHandle; -import com.alibaba.com.caucho.hessian.io.java8.InstantHandle; -import com.alibaba.com.caucho.hessian.io.java8.LocalDateHandle; -import com.alibaba.com.caucho.hessian.io.java8.LocalDateTimeHandle; -import com.alibaba.com.caucho.hessian.io.java8.LocalTimeHandle; -import com.alibaba.com.caucho.hessian.io.java8.MonthDayHandle; -import com.alibaba.com.caucho.hessian.io.java8.OffsetDateTimeHandle; -import com.alibaba.com.caucho.hessian.io.java8.OffsetTimeHandle; -import com.alibaba.com.caucho.hessian.io.java8.PeriodHandle; -import com.alibaba.com.caucho.hessian.io.java8.YearHandle; -import com.alibaba.com.caucho.hessian.io.java8.YearMonthHandle; -import com.alibaba.com.caucho.hessian.io.java8.ZoneIdSerializer; -import com.alibaba.com.caucho.hessian.io.java8.ZoneOffsetHandle; -import com.alibaba.com.caucho.hessian.io.java8.ZonedDateTimeHandle; - -import javax.management.ObjectName; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.EnumSet; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static com.alibaba.com.caucho.hessian.io.java8.Java8TimeSerializer.create; - -/** - * Factory for returning serialization methods. - */ -public class SerializerFactory extends AbstractSerializerFactory { - private static final Logger log - = Logger.getLogger(SerializerFactory.class.getName()); - - private static Deserializer OBJECT_DESERIALIZER - = new BasicDeserializer(BasicDeserializer.OBJECT); - - private static HashMap _staticSerializerMap; - private static HashMap _staticDeserializerMap; - private static HashMap _staticTypeMap; - - static { - _staticSerializerMap = new HashMap(); - _staticDeserializerMap = new HashMap(); - _staticTypeMap = new HashMap(); - - addBasic(void.class, "void", BasicSerializer.NULL); - - addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN); - addBasic(Byte.class, "byte", BasicSerializer.BYTE); - addBasic(Short.class, "short", BasicSerializer.SHORT); - addBasic(Integer.class, "int", BasicSerializer.INTEGER); - addBasic(Long.class, "long", BasicSerializer.LONG); - addBasic(Float.class, "float", BasicSerializer.FLOAT); - addBasic(Double.class, "double", BasicSerializer.DOUBLE); - addBasic(Character.class, "char", BasicSerializer.CHARACTER_OBJECT); - addBasic(String.class, "string", BasicSerializer.STRING); - addBasic(Object.class, "object", BasicSerializer.OBJECT); - addBasic(java.util.Date.class, "date", BasicSerializer.DATE); - - addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN); - addBasic(byte.class, "byte", BasicSerializer.BYTE); - addBasic(short.class, "short", BasicSerializer.SHORT); - addBasic(int.class, "int", BasicSerializer.INTEGER); - addBasic(long.class, "long", BasicSerializer.LONG); - addBasic(float.class, "float", BasicSerializer.FLOAT); - addBasic(double.class, "double", BasicSerializer.DOUBLE); - addBasic(char.class, "char", BasicSerializer.CHARACTER); - - addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY); - addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY); - addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY); - addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY); - addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY); - addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY); - addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY); - addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY); - addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY); - addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY); - - _staticSerializerMap.put(Class.class, new ClassSerializer()); - - _staticDeserializerMap.put(Number.class, new BasicDeserializer(BasicSerializer.NUMBER)); - - _staticSerializerMap.put(BigDecimal.class, new StringValueSerializer()); - try { - _staticDeserializerMap.put(BigDecimal.class, - new StringValueDeserializer(BigDecimal.class)); - _staticDeserializerMap.put(BigInteger.class, - new BigIntegerDeserializer()); - } catch (Throwable e) { - } - - _staticSerializerMap.put(File.class, new StringValueSerializer()); - try { - _staticDeserializerMap.put(File.class, - new StringValueDeserializer(File.class)); - } catch (Throwable e) { - } - - _staticSerializerMap.put(ObjectName.class, new StringValueSerializer()); - try { - _staticDeserializerMap.put(ObjectName.class, - new StringValueDeserializer(ObjectName.class)); - } catch (Throwable e) { - } - - _staticSerializerMap.put(java.sql.Date.class, new SqlDateSerializer()); - _staticSerializerMap.put(java.sql.Time.class, new SqlDateSerializer()); - _staticSerializerMap.put(java.sql.Timestamp.class, new SqlDateSerializer()); - - _staticSerializerMap.put(java.io.InputStream.class, - new InputStreamSerializer()); - _staticDeserializerMap.put(java.io.InputStream.class, - new InputStreamDeserializer()); - - try { - _staticDeserializerMap.put(java.sql.Date.class, - new SqlDateDeserializer(java.sql.Date.class)); - _staticDeserializerMap.put(java.sql.Time.class, - new SqlDateDeserializer(java.sql.Time.class)); - _staticDeserializerMap.put(java.sql.Timestamp.class, - new SqlDateDeserializer(java.sql.Timestamp.class)); - } catch (Throwable e) { - e.printStackTrace(); - } - - // hessian/3bb5 - try { - Class stackTrace = StackTraceElement.class; - - _staticDeserializerMap.put(stackTrace, new StackTraceElementDeserializer()); - } catch (Throwable e) { - } - - try { - if (isJava8()) { - _staticSerializerMap.put(Class.forName("java.time.LocalTime"), create(LocalTimeHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.LocalDate"), create(LocalDateHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.LocalDateTime"), create(LocalDateTimeHandle.class)); - - _staticSerializerMap.put(Class.forName("java.time.Instant"), create(InstantHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.Duration"), create(DurationHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.Period"), create(PeriodHandle.class)); - - _staticSerializerMap.put(Class.forName("java.time.Year"), create(YearHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.YearMonth"), create(YearMonthHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.MonthDay"), create(MonthDayHandle.class)); - - _staticSerializerMap.put(Class.forName("java.time.OffsetDateTime"), create(OffsetDateTimeHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.ZoneOffset"), create(ZoneOffsetHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.OffsetTime"), create(OffsetTimeHandle.class)); - _staticSerializerMap.put(Class.forName("java.time.ZonedDateTime"), create(ZonedDateTimeHandle.class)); - } - } catch (Throwable t) { - log.warning(String.valueOf(t.getCause())); - } - } - - protected Serializer _defaultSerializer; - - // Additional factories - protected ArrayList _factories = new ArrayList(); - - protected CollectionSerializer _collectionSerializer; - protected MapSerializer _mapSerializer; - private ClassLoader _loader; - private Deserializer _hashMapDeserializer; - private Deserializer _arrayListDeserializer; - private ConcurrentHashMap _cachedSerializerMap; - private ConcurrentHashMap _cachedDeserializerMap; - private ConcurrentHashMap _cachedTypeDeserializerMap; - private boolean _isAllowNonSerializable; - - public SerializerFactory() { - this(Thread.currentThread().getContextClassLoader()); - } - - public SerializerFactory(ClassLoader loader) { - _loader = loader; - } - - private static void addBasic(Class cl, String typeName, int type) { - _staticSerializerMap.put(cl, new BasicSerializer(type)); - - Deserializer deserializer = new BasicDeserializer(type); - _staticDeserializerMap.put(cl, deserializer); - _staticTypeMap.put(typeName, deserializer); - } - - public ClassLoader getClassLoader() { - return _loader; - } - - /** - * Set true if the collection serializer should send the java type. - */ - public void setSendCollectionType(boolean isSendType) { - if (_collectionSerializer == null) - _collectionSerializer = new CollectionSerializer(); - - _collectionSerializer.setSendJavaType(isSendType); - - if (_mapSerializer == null) - _mapSerializer = new MapSerializer(); - - _mapSerializer.setSendJavaType(isSendType); - } - - /** - * Adds a factory. - */ - public void addFactory(AbstractSerializerFactory factory) { - _factories.add(factory); - } - - /** - * If true, non-serializable objects are allowed. - */ - public boolean isAllowNonSerializable() { - return _isAllowNonSerializable; - } - - /** - * If true, non-serializable objects are allowed. - */ - public void setAllowNonSerializable(boolean allow) { - _isAllowNonSerializable = allow; - } - - /** - * 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. - */ - @Override - public Serializer getSerializer(Class cl) - throws HessianProtocolException { - Serializer serializer; - - serializer = (Serializer) _staticSerializerMap.get(cl); - if (serializer != null) { - return serializer; - } - - if (_cachedSerializerMap != null) { - serializer = (Serializer) _cachedSerializerMap.get(cl); - if (serializer != null) { - return serializer; - } - } - - for (int i = 0; - serializer == null && _factories != null && i < _factories.size(); - i++) { - AbstractSerializerFactory factory; - - factory = (AbstractSerializerFactory) _factories.get(i); - - serializer = factory.getSerializer(cl); - } - - if (serializer != null) { - - } else if (isZoneId(cl)) //must before "else if (JavaSerializer.getWriteReplace(cl) != null)" - serializer = ZoneIdSerializer.getInstance(); - else if (isEnumSet(cl)) - serializer = EnumSetSerializer.getInstance(); - else if (JavaSerializer.getWriteReplace(cl) != null) - serializer = new JavaSerializer(cl, _loader); - - else if (HessianRemoteObject.class.isAssignableFrom(cl)) - serializer = new RemoteSerializer(); - -// else if (BurlapRemoteObject.class.isAssignableFrom(cl)) -// serializer = new RemoteSerializer(); - - else if (Map.class.isAssignableFrom(cl)) { - if (_mapSerializer == null) - _mapSerializer = new MapSerializer(); - - serializer = _mapSerializer; - } else if (Collection.class.isAssignableFrom(cl)) { - if (_collectionSerializer == null) { - _collectionSerializer = new CollectionSerializer(); - } - - serializer = _collectionSerializer; - } else if (cl.isArray()) { - serializer = new ArraySerializer(); - } else if (Throwable.class.isAssignableFrom(cl)) { - serializer = new ThrowableSerializer(cl, getClassLoader()); - } else if (InputStream.class.isAssignableFrom(cl)) { - serializer = new InputStreamSerializer(); - } else if (Iterator.class.isAssignableFrom(cl)) { - serializer = IteratorSerializer.create(); - } else if (Enumeration.class.isAssignableFrom(cl)) { - serializer = EnumerationSerializer.create(); - } else if (Calendar.class.isAssignableFrom(cl)) { - serializer = CalendarSerializer.create(); - } else if (Locale.class.isAssignableFrom(cl)) { - serializer = LocaleSerializer.create(); - } else if (Enum.class.isAssignableFrom(cl)) { - serializer = new EnumSerializer(cl); - } - - if (serializer == null) { - serializer = getDefaultSerializer(cl); - } - - if (_cachedSerializerMap == null) { - _cachedSerializerMap = new ConcurrentHashMap(8); - } - - _cachedSerializerMap.put(cl, serializer); - - return serializer; - } - - /** - * Returns the default serializer for a class that isn't matched - * directly. Application can override this method to produce - * bean-style serialization instead of field serialization. - * - * @param cl the class of the object that needs to be serialized. - * @return a serializer object for the serialization. - */ - protected Serializer getDefaultSerializer(Class cl) { - if (_defaultSerializer != null) - return _defaultSerializer; - - if (!Serializable.class.isAssignableFrom(cl) - && !_isAllowNonSerializable) { - throw new IllegalStateException("Serialized class " + cl.getName() + " must implement java.io.Serializable"); - } - - return new JavaSerializer(cl, _loader); - } - - /** - * 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. - */ - @Override - public Deserializer getDeserializer(Class cl) - throws HessianProtocolException { - Deserializer deserializer; - - deserializer = (Deserializer) _staticDeserializerMap.get(cl); - if (deserializer != null) - return deserializer; - - if (_cachedDeserializerMap != null) { - deserializer = (Deserializer) _cachedDeserializerMap.get(cl); - if (deserializer != null) - return deserializer; - } - - - for (int i = 0; - deserializer == null && _factories != null && i < _factories.size(); - i++) { - AbstractSerializerFactory factory; - factory = (AbstractSerializerFactory) _factories.get(i); - - deserializer = factory.getDeserializer(cl); - } - - if (deserializer != null) { - } else if (Collection.class.isAssignableFrom(cl)) - deserializer = new CollectionDeserializer(cl); - - else if (Map.class.isAssignableFrom(cl)) - deserializer = new MapDeserializer(cl); - - else if (cl.isInterface()) - deserializer = new ObjectDeserializer(cl); - - else if (cl.isArray()) - deserializer = new ArrayDeserializer(cl.getComponentType()); - - else if (Enumeration.class.isAssignableFrom(cl)) - deserializer = EnumerationDeserializer.create(); - - else if (Enum.class.isAssignableFrom(cl)) - deserializer = new EnumDeserializer(cl); - - else if (Class.class.equals(cl)) - deserializer = new ClassDeserializer(_loader); - - else - deserializer = getDefaultDeserializer(cl); - - if (_cachedDeserializerMap == null) - _cachedDeserializerMap = new ConcurrentHashMap(8); - - _cachedDeserializerMap.put(cl, deserializer); - - return deserializer; - } - - /** - * Returns the default serializer for a class that isn't matched - * directly. Application can override this method to produce - * bean-style serialization instead of field serialization. - * - * @param cl the class of the object that needs to be serialized. - * @return a serializer object for the serialization. - */ - protected Deserializer getDefaultDeserializer(Class cl) { - return new JavaDeserializer(cl); - } - - /** - * Reads the object as a list. - */ - public Object readList(AbstractHessianInput in, int length, String type) - throws HessianProtocolException, IOException { - Deserializer deserializer = getDeserializer(type); - - if (deserializer != null) - return deserializer.readList(in, length); - else - return new CollectionDeserializer(ArrayList.class).readList(in, length); - } - - /** - * Reads the object as a map. - */ - public Object readMap(AbstractHessianInput in, String type) - throws HessianProtocolException, IOException { - return readMap(in, type, null, null); - } - - /** - * Reads the object as a map. - */ - public Object readMap(AbstractHessianInput in, String type, Class expectKeyType, Class expectValueType) - throws HessianProtocolException, IOException { - Deserializer deserializer = getDeserializer(type); - - if (deserializer != null) - return deserializer.readMap(in); - else if (_hashMapDeserializer != null) - return _hashMapDeserializer.readMap(in, expectKeyType, expectValueType); - else { - _hashMapDeserializer = new MapDeserializer(HashMap.class); - - return _hashMapDeserializer.readMap(in, expectKeyType, expectValueType); - } - } - - /** - * Reads the object as a map. - */ - public Object readObject(AbstractHessianInput in, - String type, - String[] fieldNames) - throws HessianProtocolException, IOException { - Deserializer deserializer = getDeserializer(type); - - if (deserializer != null) - return deserializer.readObject(in, fieldNames); - else if (_hashMapDeserializer != null) - return _hashMapDeserializer.readObject(in, fieldNames); - else { - _hashMapDeserializer = new MapDeserializer(HashMap.class); - - return _hashMapDeserializer.readObject(in, fieldNames); - } - } - - /** - * Reads the object as a map. - */ - public Deserializer getObjectDeserializer(String type, Class cl) - throws HessianProtocolException { - Deserializer reader = getObjectDeserializer(type); - - if (cl == null - || cl.equals(reader.getType()) - || cl.isAssignableFrom(reader.getType()) - || HessianHandle.class.isAssignableFrom(reader.getType())) { - return reader; - } - - if (log.isLoggable(Level.FINE)) { - log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' (" - + reader.getType().getName() + ")"); - } - - return getDeserializer(cl); - } - - /** - * Reads the object as a map. - */ - public Deserializer getObjectDeserializer(String type) - throws HessianProtocolException { - Deserializer deserializer = getDeserializer(type); - - if (deserializer != null) - return deserializer; - else if (_hashMapDeserializer != null) - return _hashMapDeserializer; - else { - _hashMapDeserializer = new MapDeserializer(HashMap.class); - - return _hashMapDeserializer; - } - } - - /** - * Reads the object as a map. - */ - public Deserializer getListDeserializer(String type, Class cl) - throws HessianProtocolException { - Deserializer reader = getListDeserializer(type); - - if (cl == null - || cl.equals(reader.getType()) - || cl.isAssignableFrom(reader.getType())) { - return reader; - } - - if (log.isLoggable(Level.FINE)) { - log.fine("hessian: expected '" + cl.getName() + "' at '" + type + "' (" - + reader.getType().getName() + ")"); - } - - return getDeserializer(cl); - } - - /** - * Reads the object as a map. - */ - public Deserializer getListDeserializer(String type) - throws HessianProtocolException { - Deserializer deserializer = getDeserializer(type); - - if (deserializer != null) - return deserializer; - else if (_arrayListDeserializer != null) - return _arrayListDeserializer; - else { - _arrayListDeserializer = new CollectionDeserializer(ArrayList.class); - - return _arrayListDeserializer; - } - } - - /** - * Returns a deserializer based on a string type. - */ - public Deserializer getDeserializer(String type) - throws HessianProtocolException { - if (type == null || type.equals("")) - return null; - - Deserializer deserializer; - - if (_cachedTypeDeserializerMap != null) { - deserializer = (Deserializer) _cachedTypeDeserializerMap.get(type); - - if (deserializer != null) - return deserializer; - } - - - deserializer = (Deserializer) _staticTypeMap.get(type); - if (deserializer != null) - return deserializer; - - if (type.startsWith("[")) { - Deserializer subDeserializer = getDeserializer(type.substring(1)); - - if (subDeserializer != null) - deserializer = new ArrayDeserializer(subDeserializer.getType()); - else - deserializer = new ArrayDeserializer(Object.class); - } else { - try { - Class cl = Class.forName(type, false, _loader); - deserializer = getDeserializer(cl); - } catch (Exception e) { - log.warning("Hessian/Burlap: '" + type + "' is an unknown class in " + _loader + ":\n" + e); - - log.log(Level.FINER, e.toString(), e); - } - } - - if (deserializer != null) { - if (_cachedTypeDeserializerMap == null) - _cachedTypeDeserializerMap = new ConcurrentHashMap(8); - - _cachedTypeDeserializerMap.put(type, deserializer); - } - - return deserializer; - } - - private static boolean isZoneId(Class cl) { - try { - return isJava8() && Class.forName("java.time.ZoneId").isAssignableFrom(cl); - } catch (ClassNotFoundException e) { - // ignore - } - return false; - } - - private static boolean isEnumSet(Class cl) { - return EnumSet.class.isAssignableFrom(cl); - } - - /** - * check if the environment is java 8 or beyond - * - * @return if on java 8 - */ - private static boolean isJava8() { - String javaVersion = System.getProperty("java.specification.version"); - return Double.valueOf(javaVersion) >= 1.8; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateDeserializer.java deleted file mode 100644 index df809d74572..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateDeserializer.java +++ /dev/null @@ -1,131 +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.Constructor; - -/** - * Deserializing a string valued object - */ -public class SqlDateDeserializer extends AbstractDeserializer { - private Class _cl; - private Constructor _constructor; - - public SqlDateDeserializer(Class cl) - throws NoSuchMethodException { - _cl = cl; - _constructor = cl.getConstructor(new Class[]{long.class}); - } - - @Override - public Class getType() { - return _cl; - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - int ref = in.addRef(null); - - long initValue = Long.MIN_VALUE; - - while (!in.isEnd()) { - String key = in.readString(); - - if (key.equals("value")) - initValue = in.readUTCDate(); - else - in.readString(); - } - - in.readMapEnd(); - - Object value = create(initValue); - - in.setRef(ref, value); - - return value; - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - int ref = in.addRef(null); - - long initValue = Long.MIN_VALUE; - - for (int i = 0; i < fieldNames.length; i++) { - String key = fieldNames[i]; - - if (key.equals("value")) - initValue = in.readUTCDate(); - else - in.readObject(); - } - - Object value = create(initValue); - - in.setRef(ref, value); - - return value; - } - - private Object create(long initValue) - throws IOException { - if (initValue == Long.MIN_VALUE) - throw new IOException(_cl.getName() + " expects name."); - - try { - return _constructor.newInstance(new Object[]{new Long(initValue)}); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java deleted file mode 100644 index 5e6c8f4a414..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java +++ /dev/null @@ -1,86 +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.Date; - -/** - * Serializing a sql date object. - */ -public class SqlDateSerializer extends AbstractSerializer { - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (obj == null) - out.writeNull(); - else { - Class cl = obj.getClass(); - - if (out.addRef(obj)) - return; - - int ref = out.writeObjectBegin(cl.getName()); - - if (ref < -1) { - out.writeString("value"); - out.writeUTCDate(((Date) obj).getTime()); - out.writeMapEnd(); - } else { - if (ref == -1) { - out.writeInt(1); - out.writeString("value"); - out.writeObjectBegin(cl.getName()); - } - - out.writeUTCDate(((Date) obj).getTime()); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StackTraceElementDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StackTraceElementDeserializer.java deleted file mode 100644 index 4f64859fe28..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StackTraceElementDeserializer.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 "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; - -/** - * Deserializing a JDK 1.4 StackTraceElement - */ -public class StackTraceElementDeserializer extends JavaDeserializer { - public StackTraceElementDeserializer() { - super(StackTraceElement.class); - } - - @Override - protected Object instantiate() - throws Exception { - return new StackTraceElement("", "", "", 0); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueDeserializer.java deleted file mode 100644 index 90ceef17052..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueDeserializer.java +++ /dev/null @@ -1,128 +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.Constructor; - -/** - * Deserializing a string valued object - */ -public class StringValueDeserializer extends AbstractDeserializer { - private Class _cl; - private Constructor _constructor; - - public StringValueDeserializer(Class cl) { - try { - _cl = cl; - _constructor = cl.getConstructor(new Class[]{String.class}); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public Class getType() { - return _cl; - } - - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - String value = null; - - while (!in.isEnd()) { - String key = in.readString(); - - if (key.equals("value")) - value = in.readString(); - else - in.readObject(); - } - - in.readMapEnd(); - - Object object = create(value); - - in.addRef(object); - - return object; - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - String value = null; - - for (int i = 0; i < fieldNames.length; i++) { - if ("value".equals(fieldNames[i])) - value = in.readString(); - else - in.readObject(); - } - - Object object = create(value); - - in.addRef(object); - - return object; - } - - private Object create(String value) - throws IOException { - if (value == null) - throw new IOException(_cl.getName() + " expects name."); - - try { - return _constructor.newInstance(new Object[]{value}); - } catch (Exception e) { - throw new IOExceptionWrapper(e); - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java deleted file mode 100644 index 16a00b4e5db..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java +++ /dev/null @@ -1,85 +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 remote object. - */ -public class StringValueSerializer extends AbstractSerializer { - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - if (obj == null) - out.writeNull(); - else { - if (out.addRef(obj)) - return; - - Class cl = obj.getClass(); - - int ref = out.writeObjectBegin(cl.getName()); - - if (ref < -1) { - out.writeString("value"); - out.writeString(obj.toString()); - out.writeMapEnd(); - } else { - if (ref == -1) { - out.writeInt(1); - out.writeString("value"); - out.writeObjectBegin(cl.getName()); - } - - out.writeString(obj.toString()); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ThrowableSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ThrowableSerializer.java deleted file mode 100644 index 1f65e7f05b6..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ThrowableSerializer.java +++ /dev/null @@ -1,70 +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 an object for known object types. - */ -public class ThrowableSerializer extends JavaSerializer { - public ThrowableSerializer(Class cl, ClassLoader loader) { - super(cl, loader); - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) - throws IOException { - Throwable e = (Throwable) obj; - - e.getStackTrace(); - - super.writeObject(obj, out); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ValueDeserializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ValueDeserializer.java deleted file mode 100644 index af548ac5232..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ValueDeserializer.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; - -/** - * Deserializing a string valued object - */ -abstract public class ValueDeserializer extends AbstractDeserializer { - @Override - public Object readMap(AbstractHessianInput in) - throws IOException { - String initValue = null; - - while (!in.isEnd()) { - String key = in.readString(); - - if (key.equals("value")) - initValue = in.readString(); - else - in.readObject(); - } - - in.readMapEnd(); - - return create(initValue); - } - - @Override - public Object readObject(AbstractHessianInput in, String[] fieldNames) - throws IOException { - String initValue = null; - - for (int i = 0; i < fieldNames.length; i++) { - if ("value".equals(fieldNames[i])) - initValue = in.readString(); - else - in.readObject(); - } - - return create(initValue); - } - - abstract Object create(String value) - throws IOException; -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationHandle.java deleted file mode 100755 index 08808e1c337..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationHandle.java +++ /dev/null @@ -1,58 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - - -@SuppressWarnings("unchecked") -public class DurationHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -4367309317780077156L; - - private long seconds; - private int nanos; - - public DurationHandle() { - } - - public DurationHandle(Object o) { - try { - Class c = Class.forName("java.time.Duration"); - Method m = c.getDeclaredMethod("getSeconds"); - this.seconds = (Long) m.invoke(o); - m = c.getDeclaredMethod("getNano"); - this.nanos = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.Duration"); - Method m = c.getDeclaredMethod("ofSeconds", long.class, long.class); - return m.invoke(null, seconds, nanos); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantHandle.java deleted file mode 100755 index 8165e091cf2..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantHandle.java +++ /dev/null @@ -1,58 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class InstantHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -4367309317780077156L; - - private long seconds; - private int nanos; - - public InstantHandle() { - } - - public InstantHandle(Object o) { - try { - Class c = Class.forName("java.time.Instant"); - Method m = c.getDeclaredMethod("getEpochSecond"); - this.seconds = (Long) m.invoke(o); - m = c.getDeclaredMethod("getNano"); - this.nanos = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - - private Object readResolve() { - try { - Class c = Class.forName("java.time.Instant"); - Method m = c.getDeclaredMethod("ofEpochSecond", long.class, long.class); - return m.invoke(null, seconds, nanos); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializer.java deleted file mode 100755 index dcc09ecf427..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializer.java +++ /dev/null @@ -1,56 +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.java8; - -import java.io.IOException; -import java.lang.reflect.Constructor; - -import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput; -import com.alibaba.com.caucho.hessian.io.AbstractSerializer; - -public class Java8TimeSerializer extends AbstractSerializer { - - // Type of handle - private Class handleType; - - private Java8TimeSerializer(Class handleType) { - this.handleType = handleType; - } - - public static Java8TimeSerializer create(Class handleType) { - return new Java8TimeSerializer(handleType); - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) throws IOException { - if(obj == null) { - out.writeNull(); - return; - } - - T handle = null; - try { - Constructor constructor = handleType.getConstructor(Object.class); - handle = constructor.newInstance(obj); - } catch (Exception e) { - throw new RuntimeException("the class :" + handleType.getName() + " construct failed:" + e.getMessage(), e); - } - - out.writeObject(handle); - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateHandle.java deleted file mode 100755 index 0592d8c77db..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateHandle.java +++ /dev/null @@ -1,60 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class LocalDateHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = 166018689500019951L; - - private int year; - private int month; - private int day; - - public LocalDateHandle() { - } - - public LocalDateHandle(Object o) { - try { - Class c = Class.forName("java.time.LocalDate"); - Method m = c.getDeclaredMethod("getYear"); - this.year = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getMonthValue"); - this.month = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getDayOfMonth"); - this.day = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - public Object readResolve() { - try { - Class c = Class.forName("java.time.LocalDate"); - Method m = c.getDeclaredMethod("of", int.class, int.class, int.class); - return m.invoke(null, year, month, day); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeHandle.java deleted file mode 100755 index 603ca46d6ff..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeHandle.java +++ /dev/null @@ -1,58 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class LocalDateTimeHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = 7563825215275989361L; - - private Object date; - private Object time; - - public LocalDateTimeHandle() { - } - - public LocalDateTimeHandle(Object o) { - try { - Class c = Class.forName("java.time.LocalDateTime"); - Method m = c.getDeclaredMethod("toLocalDate"); - date = m.invoke(o); - m = c.getDeclaredMethod("toLocalTime"); - time = m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.LocalDateTime"); - Method m = c.getDeclaredMethod("of", Class.forName("java.time.LocalDate"), - Class.forName("java.time.LocalTime")); - return m.invoke(null, date, time); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeHandle.java deleted file mode 100755 index 83ebbf64b73..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeHandle.java +++ /dev/null @@ -1,64 +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.java8; - - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class LocalTimeHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -5892919085390462315L; - - private int hour; - private int minute; - private int second; - private int nano; - - public LocalTimeHandle() { - } - - public LocalTimeHandle(Object o) { - try { - Class c = Class.forName("java.time.LocalTime"); - Method m = c.getDeclaredMethod("getHour"); - this.hour = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getMinute"); - this.minute = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getSecond"); - this.second = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getNano"); - this.nano = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.LocalTime"); - Method m = c.getDeclaredMethod("of", int.class, int.class, int.class, int.class); - return m.invoke(null, hour, minute, second, nano); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDayHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDayHandle.java deleted file mode 100755 index 6daa77e6c36..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDayHandle.java +++ /dev/null @@ -1,57 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class MonthDayHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = 5288238558666577745L; - - private int month; - private int day; - - public MonthDayHandle() { - } - - public MonthDayHandle(Object o) { - try { - Class c = Class.forName("java.time.MonthDay"); - Method m = c.getDeclaredMethod("getMonthValue"); - this.month = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getDayOfMonth"); - this.day = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.MonthDay"); - Method m = c.getDeclaredMethod("of", int.class, int.class); - return m.invoke(null, month, day); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeHandle.java deleted file mode 100755 index 6ce956f1905..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeHandle.java +++ /dev/null @@ -1,59 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class OffsetDateTimeHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -7823900532640515312L; - - private Object dateTime; - private Object offset; - - public OffsetDateTimeHandle() { - } - - public OffsetDateTimeHandle(Object o) { - try { - Class c = Class.forName("java.time.OffsetDateTime"); - Method m = c.getDeclaredMethod("toLocalDateTime"); - this.dateTime = m.invoke(o); - m = c.getDeclaredMethod("getOffset"); - this.offset = m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - - try { - Class c = Class.forName("java.time.OffsetDateTime"); - Method m = c.getDeclaredMethod("of", Class.forName("java.time.LocalDateTime"), - Class.forName("java.time.ZoneOffset")); - return m.invoke(null, dateTime, offset); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeHandle.java deleted file mode 100755 index 8c8236ac131..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeHandle.java +++ /dev/null @@ -1,58 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class OffsetTimeHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -3269846941421652860L; - - private Object localTime; - private Object zoneOffset; - - public OffsetTimeHandle() { - } - - public OffsetTimeHandle(Object o) { - try { - Class c = Class.forName("java.time.OffsetTime"); - Method m = c.getDeclaredMethod("getOffset"); - this.zoneOffset = m.invoke(o); - m = c.getDeclaredMethod("toLocalTime"); - this.localTime = m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.OffsetTime"); - Method m = c.getDeclaredMethod("of", Class.forName("java.time.LocalTime"), - Class.forName("java.time.ZoneOffset")); - return m.invoke(null, localTime, zoneOffset); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodHandle.java deleted file mode 100755 index 6586525fa4b..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodHandle.java +++ /dev/null @@ -1,61 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - - -@SuppressWarnings("unchecked") -public class PeriodHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = 4399720381283781186L; - - private int years; - private int months; - private int days; - - public PeriodHandle() { - } - - public PeriodHandle(Object o) { - try { - Class c = Class.forName("java.time.Period"); - Method m = c.getDeclaredMethod("getYears"); - this.years = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getMonths"); - this.months = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getDays"); - this.days = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.Period"); - Method m = c.getDeclaredMethod("of", int.class, int.class, int.class); - return m.invoke(null, years, months, days); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearHandle.java deleted file mode 100755 index 1da8be804e2..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearHandle.java +++ /dev/null @@ -1,55 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class YearHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -6299552890287487926L; - - private int year; - - public YearHandle() { - } - - public YearHandle(Object o) { - try { - Class c = Class.forName("java.time.Year"); - Method m = c.getDeclaredMethod("getValue"); - this.year = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.Year"); - Method m = c.getDeclaredMethod("of", int.class); - return m.invoke(null, year); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthHandle.java deleted file mode 100755 index a17d32578a7..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthHandle.java +++ /dev/null @@ -1,57 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class YearMonthHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -4150786187896925314L; - - private int year; - private int month; - - public YearMonthHandle() { - } - - public YearMonthHandle(Object o) { - try { - Class c = Class.forName("java.time.YearMonth"); - Method m = c.getDeclaredMethod("getYear"); - this.year = (Integer) m.invoke(o); - m = c.getDeclaredMethod("getMonthValue"); - this.month = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.YearMonth"); - Method m = c.getDeclaredMethod("of", int.class, int.class); - return m.invoke(null, year, month); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdHandle.java deleted file mode 100755 index e4ad26248d5..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdHandle.java +++ /dev/null @@ -1,55 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class ZoneIdHandle implements HessianHandle, Serializable { - - private static final long serialVersionUID = 8789182864066905552L; - - private String zoneId; - - public ZoneIdHandle() { - } - - public ZoneIdHandle(Object o) { - try { - Class c = Class.forName("java.time.ZoneId"); - Method m = c.getDeclaredMethod("getId"); - this.zoneId = (String) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.ZoneId"); - Method m = c.getDeclaredMethod("of", String.class); - return m.invoke(null, this.zoneId); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java deleted file mode 100755 index 7217be4b58e..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java +++ /dev/null @@ -1,42 +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.java8; - -import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput; -import com.alibaba.com.caucho.hessian.io.AbstractSerializer; - -import java.io.IOException; - -public class ZoneIdSerializer extends AbstractSerializer { - - private static final ZoneIdSerializer SERIALIZER = new ZoneIdSerializer(); - - public static ZoneIdSerializer getInstance() { - return SERIALIZER; - } - - @Override - public void writeObject(Object obj, AbstractHessianOutput out) throws IOException { - if (obj == null) { - out.writeNull(); - } else { - out.writeObject(new ZoneIdHandle(obj)); - } - } - -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetHandle.java deleted file mode 100755 index 1050548bd9a..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetHandle.java +++ /dev/null @@ -1,54 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class ZoneOffsetHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = 8841589723587858789L; - - private int seconds; - - public ZoneOffsetHandle() { - } - - public ZoneOffsetHandle(Object o) { - try { - Class c = Class.forName("java.time.ZoneOffset"); - Method m = c.getDeclaredMethod("getTotalSeconds"); - this.seconds = (Integer) m.invoke(o); - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class c = Class.forName("java.time.ZoneOffset"); - Method m = c.getDeclaredMethod("ofTotalSeconds", int.class); - return m.invoke(null, seconds); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeHandle.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeHandle.java deleted file mode 100755 index fa9c27f6491..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeHandle.java +++ /dev/null @@ -1,69 +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.java8; - -import com.alibaba.com.caucho.hessian.io.HessianHandle; - -import java.io.Serializable; -import java.lang.reflect.Method; - -@SuppressWarnings("unchecked") -public class ZonedDateTimeHandle implements HessianHandle, Serializable { - private static final long serialVersionUID = -6933460123278647569L; - - private Object dateTime; - private Object offset; - private String zoneId; - - - public ZonedDateTimeHandle() { - } - - public ZonedDateTimeHandle(Object o) { - try { - Class c = Class.forName("java.time.ZonedDateTime"); - Method m = c.getDeclaredMethod("toLocalDateTime"); - this.dateTime = m.invoke(o); - m = c.getDeclaredMethod("getOffset"); - this.offset = m.invoke(o); - m = c.getDeclaredMethod("getZone"); - Object zone = m.invoke(o); - if (zone != null) { - Class zoneId = Class.forName("java.time.ZoneId"); - m = zoneId.getDeclaredMethod("getId"); - this.zoneId = (String) m.invoke(zone); - } - } catch (Throwable t) { - // ignore - } - } - - private Object readResolve() { - try { - Class zoneDateTime = Class.forName("java.time.ZonedDateTime"); - Method ofLocal = zoneDateTime.getDeclaredMethod("ofLocal", Class.forName("java.time.LocalDateTime"), - Class.forName("java.time.ZoneId"), Class.forName("java.time.ZoneOffset")); - Class c = Class.forName("java.time.ZoneId"); - Method of = c.getDeclaredMethod("of", String.class); - return ofLocal.invoke(null, dateTime, of.invoke(null, this.zoneId), offset); - } catch (Throwable t) { - // ignore - } - return null; - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Encryption.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Encryption.java deleted file mode 100644 index 2156cec2b91..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Encryption.java +++ /dev/null @@ -1,379 +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.security; - -import com.alibaba.com.caucho.hessian.io.Hessian2Input; -import com.alibaba.com.caucho.hessian.io.Hessian2Output; -import com.alibaba.com.caucho.hessian.io.HessianEnvelope; - -import javax.crypto.Cipher; -import javax.crypto.CipherInputStream; -import javax.crypto.CipherOutputStream; -import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.Key; -import java.security.MessageDigest; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; - -public class X509Encryption extends HessianEnvelope { - private String _algorithm = "AES"; - - // certificate for encryption/decryption - private X509Certificate _cert; - - // private key for decryption - private PrivateKey _privateKey; - - private SecureRandom _secureRandom; - - public X509Encryption() { - } - - /** - * Gets the encryption algorithm for the content. - */ - public String getAlgorithm() { - return _algorithm; - } - - /** - * Sets the encryption algorithm for the content. - */ - public void setAlgorithm(String algorithm) { - if (algorithm == null) - throw new NullPointerException(); - - _algorithm = algorithm; - } - - /** - * The X509 certificate to obtain the public key of the recipient. - */ - public X509Certificate getCertificate() { - return _cert; - } - - /** - * The X509 certificate to obtain the public key of the recipient. - */ - public void setCertificate(X509Certificate cert) { - _cert = cert; - } - - /** - * The private key for decryption. - */ - public PrivateKey getPrivateKey() { - return _privateKey; - } - - /** - * The X509 certificate to obtain the public key of the recipient. - */ - public void setPrivateKey(PrivateKey privateKey) { - _privateKey = privateKey; - } - - /** - * The random number generator for the shared secrets. - */ - public SecureRandom getSecureRandom() { - return _secureRandom; - } - - /** - * The random number generator for the shared secrets. - */ - public void setSecureRandom(SecureRandom random) { - _secureRandom = random; - } - - @Override - public Hessian2Output wrap(Hessian2Output out) - throws IOException { - if (_cert == null) - throw new IOException("X509Encryption.wrap requires a certificate"); - - OutputStream os = new EncryptOutputStream(out); - - Hessian2Output filterOut = new Hessian2Output(os); - - filterOut.setCloseStreamOnClose(true); - - return filterOut; - } - - @Override - public Hessian2Input unwrap(Hessian2Input in) - throws IOException { - if (_privateKey == null) - throw new IOException("X509Encryption.unwrap requires a private key"); - - if (_cert == null) - throw new IOException("X509Encryption.unwrap requires a certificate"); - - int version = in.readEnvelope(); - - String method = in.readMethod(); - - if (!method.equals(getClass().getName())) - throw new IOException("expected hessian Envelope method '" + - getClass().getName() + "' at '" + method + "'"); - - return unwrapHeaders(in); - } - - @Override - public Hessian2Input unwrapHeaders(Hessian2Input in) - throws IOException { - if (_privateKey == null) - throw new IOException("X509Encryption.unwrap requires a private key"); - - if (_cert == null) - throw new IOException("X509Encryption.unwrap requires a certificate"); - - InputStream is = new EncryptInputStream(in); - - Hessian2Input filter = new Hessian2Input(is); - - filter.setCloseStreamOnClose(true); - - return filter; - } - - class EncryptOutputStream extends OutputStream { - private Hessian2Output _out; - - private Cipher _cipher; - private OutputStream _bodyOut; - private CipherOutputStream _cipherOut; - - EncryptOutputStream(Hessian2Output out) - throws IOException { - try { - _out = out; - - KeyGenerator keyGen = KeyGenerator.getInstance(_algorithm); - - if (_secureRandom != null) - keyGen.init(_secureRandom); - - SecretKey sharedKey = keyGen.generateKey(); - - _out = out; - - _out.startEnvelope(X509Encryption.class.getName()); - - PublicKey publicKey = _cert.getPublicKey(); - - byte[] encoded = publicKey.getEncoded(); - MessageDigest md = MessageDigest.getInstance("SHA1"); - md.update(encoded); - byte[] fingerprint = md.digest(); - - String keyAlgorithm = publicKey.getAlgorithm(); - Cipher keyCipher = Cipher.getInstance(keyAlgorithm); - if (_secureRandom != null) - keyCipher.init(Cipher.WRAP_MODE, _cert, _secureRandom); - else - keyCipher.init(Cipher.WRAP_MODE, _cert); - - byte[] encKey = keyCipher.wrap(sharedKey); - - _out.writeInt(4); - - _out.writeString("algorithm"); - _out.writeString(_algorithm); - _out.writeString("fingerprint"); - _out.writeBytes(fingerprint); - _out.writeString("key-algorithm"); - _out.writeString(keyAlgorithm); - _out.writeString("key"); - _out.writeBytes(encKey); - - _bodyOut = _out.getBytesOutputStream(); - - _cipher = Cipher.getInstance(_algorithm); - if (_secureRandom != null) - _cipher.init(Cipher.ENCRYPT_MODE, sharedKey, _secureRandom); - else - _cipher.init(Cipher.ENCRYPT_MODE, sharedKey); - - _cipherOut = new CipherOutputStream(_bodyOut, _cipher); - } catch (RuntimeException e) { - throw e; - } catch (IOException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public void write(int ch) - throws IOException { - _cipherOut.write(ch); - } - - @Override - public void write(byte[] buffer, int offset, int length) - throws IOException { - _cipherOut.write(buffer, offset, length); - } - - @Override - public void close() - throws IOException { - Hessian2Output out = _out; - _out = null; - - if (out != null) { - _cipherOut.close(); - _bodyOut.close(); - - out.writeInt(0); - out.completeEnvelope(); - out.close(); - } - } - } - - class EncryptInputStream extends InputStream { - private Hessian2Input _in; - - private Cipher _cipher; - private InputStream _bodyIn; - private CipherInputStream _cipherIn; - - EncryptInputStream(Hessian2Input in) - throws IOException { - try { - _in = in; - - byte[] fingerprint = null; - String keyAlgorithm = null; - String algorithm = null; - byte[] encKey = null; - - int len = in.readInt(); - - for (int i = 0; i < len; i++) { - String header = in.readString(); - - if ("fingerprint".equals(header)) - fingerprint = in.readBytes(); - else if ("key-algorithm".equals(header)) - keyAlgorithm = in.readString(); - else if ("algorithm".equals(header)) - algorithm = in.readString(); - else if ("key".equals(header)) - encKey = in.readBytes(); - else - throw new IOException("'" + header + "' is an unexpected header"); - } - - Cipher keyCipher = Cipher.getInstance(keyAlgorithm); - keyCipher.init(Cipher.UNWRAP_MODE, _privateKey); - - Key key = keyCipher.unwrap(encKey, algorithm, Cipher.SECRET_KEY); - _bodyIn = _in.readInputStream(); - - _cipher = Cipher.getInstance(algorithm); - _cipher.init(Cipher.DECRYPT_MODE, key); - - _cipherIn = new CipherInputStream(_bodyIn, _cipher); - } catch (RuntimeException e) { - throw e; - } catch (IOException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int read() - throws IOException { - return _cipherIn.read(); - } - - @Override - public int read(byte[] buffer, int offset, int length) - throws IOException { - return _cipherIn.read(buffer, offset, length); - } - - @Override - public void close() - throws IOException { - Hessian2Input in = _in; - _in = null; - - if (in != null) { - _cipherIn.close(); - _bodyIn.close(); - - int len = in.readInt(); - - if (len != 0) - throw new IOException("Unexpected footer"); - - in.completeEnvelope(); - - in.close(); - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Signature.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Signature.java deleted file mode 100644 index a8023e729bf..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/security/X509Signature.java +++ /dev/null @@ -1,396 +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.security; - -import com.alibaba.com.caucho.hessian.io.Hessian2Input; -import com.alibaba.com.caucho.hessian.io.Hessian2Output; -import com.alibaba.com.caucho.hessian.io.HessianEnvelope; - -import javax.crypto.Cipher; -import javax.crypto.CipherInputStream; -import javax.crypto.KeyGenerator; -import javax.crypto.Mac; -import javax.crypto.SecretKey; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.Key; -import java.security.MessageDigest; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; - -public class X509Signature extends HessianEnvelope { - private String _algorithm = "HmacSHA256"; - private X509Certificate _cert; - private PrivateKey _privateKey; - private SecureRandom _secureRandom; - - public X509Signature() { - } - - /** - * Gets the encryption algorithm for the content. - */ - public String getAlgorithm() { - return _algorithm; - } - - /** - * Sets the encryption algorithm for the content. - */ - public void setAlgorithm(String algorithm) { - if (algorithm == null) - throw new NullPointerException(); - - _algorithm = algorithm; - } - - /** - * The X509 certificate to obtain the public key of the recipient. - */ - public X509Certificate getCertificate() { - return _cert; - } - - /** - * The X509 certificate to obtain the public key of the recipient. - */ - public void setCertificate(X509Certificate cert) { - _cert = cert; - } - - /** - * The key to obtain the private key of the recipient. - */ - public PrivateKey getPrivateKey() { - return _privateKey; - } - - /** - * The private key. - */ - public void setPrivateKey(PrivateKey key) { - _privateKey = key; - } - - /** - * The random number generator for the shared secrets. - */ - public SecureRandom getSecureRandom() { - return _secureRandom; - } - - /** - * The random number generator for the shared secrets. - */ - public void setSecureRandom(SecureRandom random) { - _secureRandom = random; - } - - @Override - public Hessian2Output wrap(Hessian2Output out) - throws IOException { - if (_privateKey == null) - throw new IOException("X509Signature.wrap requires a private key"); - - if (_cert == null) - throw new IOException("X509Signature.wrap requires a certificate"); - - OutputStream os = new SignatureOutputStream(out); - - Hessian2Output filterOut = new Hessian2Output(os); - - filterOut.setCloseStreamOnClose(true); - - return filterOut; - } - - @Override - public Hessian2Input unwrap(Hessian2Input in) - throws IOException { - if (_cert == null) - throw new IOException("X509Signature.unwrap requires a certificate"); - - int version = in.readEnvelope(); - - String method = in.readMethod(); - - if (!method.equals(getClass().getName())) - throw new IOException("expected hessian Envelope method '" + - getClass().getName() + "' at '" + method + "'"); - - return unwrapHeaders(in); - } - - @Override - public Hessian2Input unwrapHeaders(Hessian2Input in) - throws IOException { - if (_cert == null) - throw new IOException("X509Signature.unwrap requires a certificate"); - - InputStream is = new SignatureInputStream(in); - - Hessian2Input filter = new Hessian2Input(is); - - filter.setCloseStreamOnClose(true); - - return filter; - } - - class SignatureOutputStream extends OutputStream { - private Hessian2Output _out; - private OutputStream _bodyOut; - private Mac _mac; - - SignatureOutputStream(Hessian2Output out) - throws IOException { - try { - KeyGenerator keyGen = KeyGenerator.getInstance(_algorithm); - - if (_secureRandom != null) - keyGen.init(_secureRandom); - - SecretKey sharedKey = keyGen.generateKey(); - - _out = out; - - _out.startEnvelope(X509Signature.class.getName()); - - PublicKey publicKey = _cert.getPublicKey(); - - byte[] encoded = publicKey.getEncoded(); - MessageDigest md = MessageDigest.getInstance("SHA1"); - md.update(encoded); - byte[] fingerprint = md.digest(); - - String keyAlgorithm = _privateKey.getAlgorithm(); - Cipher keyCipher = Cipher.getInstance(keyAlgorithm); - keyCipher.init(Cipher.WRAP_MODE, _privateKey); - - byte[] encKey = keyCipher.wrap(sharedKey); - - _out.writeInt(4); - _out.writeString("algorithm"); - _out.writeString(_algorithm); - _out.writeString("fingerprint"); - _out.writeBytes(fingerprint); - _out.writeString("key-algorithm"); - _out.writeString(keyAlgorithm); - _out.writeString("key"); - _out.writeBytes(encKey); - - _mac = Mac.getInstance(_algorithm); - _mac.init(sharedKey); - - _bodyOut = _out.getBytesOutputStream(); - } catch (RuntimeException e) { - throw e; - } catch (IOException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public void write(int ch) - throws IOException { - _bodyOut.write(ch); - _mac.update((byte) ch); - } - - @Override - public void write(byte[] buffer, int offset, int length) - throws IOException { - _bodyOut.write(buffer, offset, length); - _mac.update(buffer, offset, length); - } - - @Override - public void close() - throws IOException { - Hessian2Output out = _out; - _out = null; - - if (out == null) - return; - - _bodyOut.close(); - - byte[] sig = _mac.doFinal(); - - out.writeInt(1); - out.writeString("signature"); - out.writeBytes(sig); - - out.completeEnvelope(); - out.close(); - } - } - - class SignatureInputStream extends InputStream { - private Hessian2Input _in; - - private Mac _mac; - private InputStream _bodyIn; - private CipherInputStream _cipherIn; - - SignatureInputStream(Hessian2Input in) - throws IOException { - try { - _in = in; - - byte[] fingerprint = null; - String keyAlgorithm = null; - String algorithm = null; - byte[] encKey = null; - - int len = in.readInt(); - - for (int i = 0; i < len; i++) { - String header = in.readString(); - - if ("fingerprint".equals(header)) - fingerprint = in.readBytes(); - else if ("key-algorithm".equals(header)) - keyAlgorithm = in.readString(); - else if ("algorithm".equals(header)) - algorithm = in.readString(); - else if ("key".equals(header)) - encKey = in.readBytes(); - else - throw new IOException("'" + header + "' is an unexpected header"); - } - - Cipher keyCipher = Cipher.getInstance(keyAlgorithm); - keyCipher.init(Cipher.UNWRAP_MODE, _cert); - - Key key = keyCipher.unwrap(encKey, algorithm, Cipher.SECRET_KEY); - _bodyIn = _in.readInputStream(); - - _mac = Mac.getInstance(algorithm); - _mac.init(key); - } catch (RuntimeException e) { - throw e; - } catch (IOException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public int read() - throws IOException { - int ch = _bodyIn.read(); - - if (ch < 0) - return ch; - - _mac.update((byte) ch); - - return ch; - } - - @Override - public int read(byte[] buffer, int offset, int length) - throws IOException { - int len = _bodyIn.read(buffer, offset, length); - - if (len < 0) - return len; - - _mac.update(buffer, offset, len); - - return len; - } - - @Override - public void close() - throws IOException { - Hessian2Input in = _in; - _in = null; - - if (in != null) { - _bodyIn.close(); - - int len = in.readInt(); - byte[] signature = null; - - for (int i = 0; i < len; i++) { - String header = in.readString(); - - if ("signature".equals(header)) - signature = in.readBytes(); - } - - in.completeEnvelope(); - in.close(); - - - if (signature == null) - throw new IOException("Expected signature"); - - byte[] sig = _mac.doFinal(); - - if (sig.length != signature.length) - throw new IOException("mismatched signature"); - - for (int i = 0; i < sig.length; i++) { - if (signature[i] != sig[i]) - throw new IOException("mismatched signature"); - } - - // XXX: save principal - } - } - } -} diff --git a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IdentityIntMap.java b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IdentityIntMap.java deleted file mode 100644 index afa3a9f992f..00000000000 --- a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/util/IdentityIntMap.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 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 stringShortMap = new HashMap(); - stringShortMap.put("first", (short)0); - stringShortMap.put("last", (short)60); - stringShort.stringShortMap = stringShortMap; - - Hessian2StringShortType deserialize = baseHessianSerialize(stringShort); - assertTrue(deserialize.stringShortMap != null); - assertTrue(deserialize.stringShortMap.size() == 2); - assertTrue(deserialize.stringShortMap.get("last") instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.stringShortMap.get("first")); - assertEquals(Short.valueOf((short)60), deserialize.stringShortMap.get("last")); - } - - @Test - public void serialize_string_byte_map_then_deserialize() throws Exception { - - Hessian2StringShortType stringShort = new Hessian2StringShortType(); - Map stringByteMap = new HashMap(); - stringByteMap.put("first", (byte)0); - stringByteMap.put("last", (byte)60); - stringShort.stringByteMap = stringByteMap; - - Hessian2StringShortType deserialize = baseHessianSerialize(stringShort); - assertTrue(deserialize.stringByteMap != null); - assertTrue(deserialize.stringByteMap.size() == 2); - assertTrue(deserialize.stringByteMap.get("last") instanceof Byte); - assertEquals(Byte.valueOf((byte)0), deserialize.stringByteMap.get("first")); - assertEquals(Byte.valueOf((byte) 60), deserialize.stringByteMap.get("last")); - } - - @Test - public void serialize_map_then_deserialize() throws Exception { - - Map stringShortMap = new HashMap(); - stringShortMap.put("first", (short)0); - stringShortMap.put("last", (short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(stringShortMap); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - Map deserialize = (Map) input.readObject(HashMap.class, String.class, Short.class); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get("last") instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get("first")); - assertEquals(Short.valueOf((short)60), deserialize.get("last")); - } - - @Test - public void serialize_map_then_deserialize0() throws Exception { - - Map stringShortMap = new HashMap(); - stringShortMap.put("first", (short)0); - stringShortMap.put("last", (short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(stringShortMap); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - List> keyValueType = new ArrayList>(); - keyValueType.add(String.class); - keyValueType.add(short.class); - - Map deserialize = (Map) input.readObject(keyValueType); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get("last") instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get("first")); - assertEquals(Short.valueOf((short)60), deserialize.get("last")); - } - - @Test - public void serialize_string_person_map_then_deserialize() throws Exception { - - Hessian2StringShortType stringShort = new Hessian2StringShortType(); - Map stringPersonTypeMap = new HashMap(); - stringPersonTypeMap.put("first", new PersonType( - "jason.shang", 26, (double) 0.1, (short)1, (byte)2, Arrays.asList((short)1,(short)1) - )); - stringPersonTypeMap.put("last", new PersonType( - "jason.shang2", 52, (double) 0.2, (short)2, (byte)4, Arrays.asList((short)2,(short)2) - )); - stringShort.stringPersonTypeMap = stringPersonTypeMap; - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(stringShort); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - - Hessian2StringShortType deserialize = (Hessian2StringShortType) input.readObject(); - assertTrue(deserialize.stringPersonTypeMap != null); - assertTrue(deserialize.stringPersonTypeMap.size() == 2); - assertTrue(deserialize.stringPersonTypeMap.get("last") instanceof PersonType); - - - assertEquals(new PersonType( - "jason.shang", 26, (double) 0.1, (short)1, (byte)2, Arrays.asList((short)1,(short)1) - ), deserialize.stringPersonTypeMap.get("first")); - - assertEquals(new PersonType( - "jason.shang2", 52, (double) 0.2, (short)2, (byte)4, Arrays.asList((short)2,(short)2) - ), deserialize.stringPersonTypeMap.get("last")); - - } - - @Test - public void serialize_list_then_deserialize() throws Exception { - - List shortList = new ArrayList(); - shortList.add((short)0); - shortList.add((short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(shortList); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - List deserialize = (List) input.readObject(ArrayList.class, Short.class); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get(1) instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get(0)); - assertEquals(Short.valueOf((short)60), deserialize.get(1)); - } - - @Test - public void serialize_list_then_deserialize0() throws Exception { - - List shortList = new ArrayList(); - shortList.add((short)0); - shortList.add((short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(shortList); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - - List> valueType = new ArrayList>(); - valueType.add(short.class); - - List deserialize = (List) input.readObject(valueType); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get(1) instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get(0)); - assertEquals(Short.valueOf((short)60), deserialize.get(1)); - } - -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2EnumSetTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2EnumSetTest.java deleted file mode 100644 index 8550ab7a629..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2EnumSetTest.java +++ /dev/null @@ -1,56 +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.Type; - -import junit.framework.TestCase; -import org.junit.Test; - -import java.util.Arrays; -import java.util.EnumSet; - -import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertTrue; - -public class Hessian2EnumSetTest extends SerializeTestBase { - - @Test - public void singleton() throws Exception { - EnumSet h = EnumSet.of(Type.High); - EnumSet set = baseHessian2Serialize(h); - assertTrue(Arrays.asList(set.toArray()).contains(Type.High)); - assertFalse(Arrays.asList(set.toArray()).contains(Type.Lower)); - } - - @Test - public void set() throws Exception { - EnumSet types = EnumSet.of(Type.High, Type.Lower); - EnumSet set = baseHessian2Serialize(types); - assertTrue(set.contains(Type.High)); - assertFalse(set.contains(Type.Normal)); - } - - @Test - public void none() throws Exception { - EnumSet types = EnumSet.noneOf(Type.class); - EnumSet set = baseHessian2Serialize(types); - TestCase.assertEquals(set, EnumSet.noneOf(Type.class)); - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.java deleted file mode 100644 index 0b92f47be26..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2StringShortTest.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 Hessian2StringShortTest extends SerializeTestBase { - - @Test - public void serialize_string_short_map_then_deserialize() throws Exception { - - Hessian2StringShortType stringShort = new Hessian2StringShortType(); - Map stringShortMap = new HashMap(); - stringShortMap.put("first", (short) 0); - stringShortMap.put("last", (short) 60); - stringShort.stringShortMap = stringShortMap; - - Hessian2StringShortType deserialize = baseHessian2Serialize(stringShort); - assertTrue(deserialize.stringShortMap != null); - assertTrue(deserialize.stringShortMap.size() == 2); - assertTrue(deserialize.stringShortMap.get("last") instanceof Short); - assertEquals(Short.valueOf((short) 0), deserialize.stringShortMap.get("first")); - assertEquals(Short.valueOf((short) 60), deserialize.stringShortMap.get("last")); - } - - @Test - public void serialize_string_byte_map_then_deserialize() throws Exception { - - Hessian2StringShortType stringShort = new Hessian2StringShortType(); - Map stringByteMap = new HashMap(); - stringByteMap.put("first", (byte) 0); - stringByteMap.put("last", (byte) 60); - stringShort.stringByteMap = stringByteMap; - - Hessian2StringShortType deserialize = baseHessian2Serialize(stringShort); - assertTrue(deserialize.stringByteMap != null); - assertTrue(deserialize.stringByteMap.size() == 2); - assertTrue(deserialize.stringByteMap.get("last") instanceof Byte); - assertEquals(Byte.valueOf((byte) 0), deserialize.stringByteMap.get("first")); - assertEquals(Byte.valueOf((byte) 60), deserialize.stringByteMap.get("last")); - } - - @Test - public void serialize_map_then_deserialize() throws Exception { - - Map stringShortMap = new HashMap(); - stringShortMap.put("first", (short) 0); - stringShortMap.put("last", (short) 60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(stringShortMap); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - Map deserialize = (Map) input.readObject(HashMap.class, String.class, Short.class); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get("last") instanceof Short); - assertEquals(Short.valueOf((short) 0), deserialize.get("first")); - assertEquals(Short.valueOf((short) 60), deserialize.get("last")); - } - - @Test - public void serialize_map_then_deserialize0() throws Exception { - - Map stringShortMap = new HashMap(); - stringShortMap.put("first", (short)0); - stringShortMap.put("last", (short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(stringShortMap); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - - List> keyValueType = new ArrayList>(); - keyValueType.add(String.class); - keyValueType.add(short.class); - - Map deserialize = (Map) input.readObject(keyValueType); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get("last") instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get("first")); - assertEquals(Short.valueOf((short)60), deserialize.get("last")); - } - - @Test - public void serialize_string_person_map_then_deserialize() throws Exception { - - Hessian2StringShortType stringShort = new Hessian2StringShortType(); - Map stringPersonTypeMap = new HashMap(); - stringPersonTypeMap.put("first", new PersonType( - "jason.shang", 26, (double) 0.1, (short) 1, (byte) 2, Arrays.asList((short) 1, (short) 1) - )); - stringPersonTypeMap.put("last", new PersonType( - "jason.shang2", 52, (double) 0.2, (short) 2, (byte) 4, Arrays.asList((short) 2, (short) 2) - )); - stringShort.stringPersonTypeMap = stringPersonTypeMap; - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(stringShort); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - - Hessian2StringShortType deserialize = (Hessian2StringShortType) input.readObject(); - assertTrue(deserialize.stringPersonTypeMap != null); - assertTrue(deserialize.stringPersonTypeMap.size() == 2); - assertTrue(deserialize.stringPersonTypeMap.get("last") instanceof PersonType); - - - assertEquals(new PersonType( - "jason.shang", 26, (double) 0.1, (short) 1, (byte) 2, Arrays.asList((short) 1, (short) 1) - ), deserialize.stringPersonTypeMap.get("first")); - - assertEquals(new PersonType( - "jason.shang2", 52, (double) 0.2, (short) 2, (byte) 4, Arrays.asList((short) 2, (short) 2) - ), deserialize.stringPersonTypeMap.get("last")); - - } - - @Test - public void serialize_list_then_deserialize() throws Exception { - - List shortList = new ArrayList(); - shortList.add((short) 0); - shortList.add((short) 60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(shortList); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - List deserialize = (List) input.readObject(ArrayList.class, Short.class); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get(1) instanceof Short); - assertEquals(Short.valueOf((short) 0), deserialize.get(0)); - assertEquals(Short.valueOf((short) 60), deserialize.get(1)); - } - - @Test - public void serialize_list_then_deserialize0() throws Exception { - - List shortList = new ArrayList(); - shortList.add((short)0); - shortList.add((short)60); - - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(shortList); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - - List> valueType = new ArrayList>(); - valueType.add(short.class); - - List deserialize = (List) input.readObject(valueType); - assertTrue(deserialize != null); - assertTrue(deserialize.size() == 2); - assertTrue(deserialize.get(1) instanceof Short); - assertEquals(Short.valueOf((short)0), deserialize.get(0)); - assertEquals(Short.valueOf((short)60), deserialize.get(1)); - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java deleted file mode 100644 index 3a50709be0c..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java +++ /dev/null @@ -1,67 +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.BaseUser; -import com.alibaba.com.caucho.hessian.io.beans.GrandsonUser; -import com.alibaba.com.caucho.hessian.io.beans.SubUser; - -import org.junit.Assert; -import org.junit.Test; - -/** - * fix hessian serialize bug: - * the filed of parent class will cover the filed of sub class - * - */ -public class HessianJavaSerializeTest extends SerializeTestBase { - - @Test - public void testGetBaseUserName() throws Exception { - - BaseUser baseUser = new BaseUser(); - baseUser.setUserId(1); - baseUser.setUserName("tom"); - - BaseUser serializedUser = baseHessianSerialize(baseUser); - Assert.assertEquals("tom", serializedUser.getUserName()); - } - - - @Test - public void testGetSubUserName() throws Exception { - SubUser subUser = new SubUser(); - subUser.setUserId(1); - subUser.setUserName("tom"); - - SubUser serializedUser = baseHessianSerialize(subUser); - Assert.assertEquals("tom", serializedUser.getUserName()); - - } - - @Test - public void testGetGrandsonUserName() throws Exception { - GrandsonUser grandsonUser = new GrandsonUser(); - grandsonUser.setUserId(1); - grandsonUser.setUserName("tom"); - - GrandsonUser serializedUser = baseHessianSerialize(grandsonUser); - Assert.assertEquals("tom", serializedUser.getUserName()); - } - -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java deleted file mode 100644 index e7514382a0e..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java +++ /dev/null @@ -1,45 +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 java.io.IOException; -import java.util.Locale; - -import org.junit.Test; - -import com.alibaba.com.caucho.hessian.io.base.SerializeTestBase; - -import junit.framework.TestCase; - -public class LocaleSerializerTest extends SerializeTestBase { - - /** {@linkplain LocaleSerializer#writeObject(Object, AbstractHessianOutput)} */ - @Test - public void locale() throws IOException { - assertLocale(null); - assertLocale(new Locale("")); - assertLocale(new Locale("zh")); - assertLocale(new Locale("zh", "CN")); - assertLocale(new Locale("zh-hant", "CN")); - assertLocale(new Locale("zh-hant", "CN", "GBK")); - } - - private void assertLocale(Locale locale) throws IOException { - TestCase.assertEquals(locale, baseHessian2Serialize(locale)); - TestCase.assertEquals(locale, baseHessianSerialize(locale)); - } -} \ No newline at end of file diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/SerializerFactoryTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/SerializerFactoryTest.java deleted file mode 100644 index 652f8ef3fcc..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/SerializerFactoryTest.java +++ /dev/null @@ -1,102 +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 org.junit.Assert; -import org.junit.Test; - -import java.util.concurrent.CountDownLatch; - -public class SerializerFactoryTest { - - private static final int THREADS = 50; - - @Test - public void getSerializer() throws Exception { - final SerializerFactory serializerFactory = new SerializerFactory(); - final Class klass = TestClass.class; - - Serializer s1 = serializerFactory.getSerializer(klass); - Serializer s2 = serializerFactory.getSerializer(klass); - - Assert.assertTrue("several Serializer!", s1 == s2); - } - - @Test - public void getSerializerDuplicateThread() throws Exception { - final SerializerFactory serializerFactory = new SerializerFactory(); - final Class klass = TestClass.class; - final CountDownLatch countDownLatch = new CountDownLatch(THREADS); - - //init into cached map - final Serializer s = serializerFactory.getSerializer(klass); - - //get from duplicate thread - for (int i = 0; i < THREADS; i++) { - new Thread(new Runnable() { - @Override - public void run() { - try { - Assert.assertTrue("serveral Serializer!", s == serializerFactory.getSerializer(klass)); - } catch (HessianProtocolException e) { - e.printStackTrace(); - } - countDownLatch.countDown(); - } - }).start(); - } - countDownLatch.await(); - } - - @Test - public void getDeserializer() throws Exception { - final SerializerFactory serializerFactory = new SerializerFactory(); - final Class klass = TestClass.class; - - Deserializer d1 = serializerFactory.getDeserializer(klass); - Deserializer d2 = serializerFactory.getDeserializer(klass); - - Assert.assertTrue("several Deserializer!", d1 == d2); - } - - @Test - public void getDeserializerDuplicateThread() throws Exception { - final SerializerFactory serializerFactory = new SerializerFactory(); - final Class klass = TestClass.class; - final CountDownLatch countDownLatch = new CountDownLatch(THREADS); - - //init into cached map - final Deserializer s = serializerFactory.getDeserializer(klass); - - //get from duplicate thread - for (int i = 0; i < THREADS; i++) { - new Thread(new Runnable() { - @Override - public void run() { - try { - Assert.assertTrue("serveral Deserializer!", s == serializerFactory.getDeserializer(klass)); - } catch (HessianProtocolException e) { - e.printStackTrace(); - } - countDownLatch.countDown(); - } - }).start(); - } - countDownLatch.await(); - } - -} \ No newline at end of file diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/TestClass.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/TestClass.java deleted file mode 100644 index 43907b38133..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/TestClass.java +++ /dev/null @@ -1,22 +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 java.io.Serializable; - -public class TestClass implements Serializable { -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java deleted file mode 100644 index 45478dc3546..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java +++ /dev/null @@ -1,72 +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.base; - -import com.alibaba.com.caucho.hessian.io.Hessian2Input; -import com.alibaba.com.caucho.hessian.io.Hessian2Output; -import com.alibaba.com.caucho.hessian.io.HessianInput; -import com.alibaba.com.caucho.hessian.io.HessianOutput; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * hessian base serialize utils - * - */ -public class SerializeTestBase { - /** - * hessian serialize util - * - * @param data - * @param - * @return - * @throws IOException - */ - protected T baseHessianSerialize(T data) throws IOException { - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - HessianOutput out = new HessianOutput(bout); - - out.writeObject(data); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - HessianInput input = new HessianInput(bin); - return (T) input.readObject(); - } - - /** - * hessian2 serialize util - * - * @param data - * @param - * @return - * @throws IOException - */ - protected T baseHessian2Serialize(T data) throws IOException { - ByteArrayOutputStream bout = new ByteArrayOutputStream(); - Hessian2Output out = new Hessian2Output(bout); - - out.writeObject(data); - out.flush(); - - ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); - Hessian2Input input = new Hessian2Input(bin); - return (T) input.readObject(); - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/BaseUser.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/BaseUser.java deleted file mode 100644 index f0b36ce379b..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/BaseUser.java +++ /dev/null @@ -1,43 +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.beans; - -import java.io.Serializable; - -/** - */ -public class BaseUser implements Serializable { - private static final long serialVersionUID = 9104092580669691633L; - private Integer userId; - private String userName; - - public Integer getUserId() { - return userId; - } - - public void setUserId(Integer userId) { - this.userId = userId; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/GrandsonUser.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/GrandsonUser.java deleted file mode 100644 index c9bb635dc5f..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/GrandsonUser.java +++ /dev/null @@ -1,35 +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.beans; - -import java.io.Serializable; - -/** - */ -public class GrandsonUser extends SubUser implements Serializable { - private static final long serialVersionUID = 5013145666993778451L; - private String userName; - - @Override - public String getUserName() { - return userName; - } - @Override - public void setUserName(String userName) { - this.userName = userName; - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java deleted file mode 100644 index 4bc77c9d2c5..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Hessian2StringShortType.java +++ /dev/null @@ -1,36 +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.beans; - -import java.io.Serializable; -import java.util.Map; - -/** - * test short serialize & deserialize model - */ -public class Hessian2StringShortType implements Serializable { - - public Map stringShortMap; - - public Map stringByteMap; - - public Map stringPersonTypeMap; - - public Hessian2StringShortType() { - - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/PersonType.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/PersonType.java deleted file mode 100644 index 7e37c9951de..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/PersonType.java +++ /dev/null @@ -1,70 +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.beans; - -import java.io.Serializable; -import java.util.List; - -public class PersonType implements Serializable { - - String name; - int age; - double money; - short p1; - byte p2; - List p3; - - public PersonType(String name, int age, double money, short p1, byte p2, List p3) { - this.name = name; - this.age = age; - this.money = money; - this.p1 = p1; - this.p2 = p2; - this.p3 = p3; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - PersonType that = (PersonType) o; - - if (age != that.age) return false; - if (Double.compare(that.money, money) != 0) return false; - if (p1 != that.p1) return false; - if (p2 != that.p2) return false; - if (!name.equals(that.name)) return false; - if (!p3.equals(that.p3)) return false; - - return true; - } - - @Override - public int hashCode() { - int result; - long temp; - result = name.hashCode(); - result = 31 * result + age; - temp = Double.doubleToLongBits(money); - result = 31 * result + (int) (temp ^ (temp >>> 32)); - result = 31 * result + (int) p1; - result = 31 * result + (int) p2; - result = 31 * result + p3.hashCode(); - return result; - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java deleted file mode 100644 index 3c7214f2267..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/SubUser.java +++ /dev/null @@ -1,35 +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.beans; - -import java.io.Serializable; - -/** - */ -public class SubUser extends BaseUser implements Serializable { - private static final long serialVersionUID = 4017613093053853415L; - private String userName; - - @Override - public String getUserName() { - return userName; - } - @Override - public void setUserName(String userName) { - this.userName = userName; - } -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Type.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Type.java deleted file mode 100644 index cdeea74ad18..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/beans/Type.java +++ /dev/null @@ -1,21 +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.beans; -public enum Type { - High, Normal, Lower -} diff --git a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializerTest.java b/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializerTest.java deleted file mode 100644 index 84cc5497a78..00000000000 --- a/hessian-lite/src/test/java/com/alibaba/com/caucho/hessian/io/java8/Java8TimeSerializerTest.java +++ /dev/null @@ -1,203 +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.java8; - -import com.alibaba.com.caucho.hessian.io.Hessian2Input; -import com.alibaba.com.caucho.hessian.io.Hessian2Output; -import com.alibaba.com.caucho.hessian.io.SerializerFactory; -import junit.framework.TestCase; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.Calendar; - -/** - * Test Java8TimeSerializer class - */ -public class Java8TimeSerializerTest { - - private static SerializerFactory factory; - private static ByteArrayOutputStream os; - private static boolean isJava8; - - @BeforeClass - public static void setUp() { - String javaVersion = System.getProperty("java.specification.version"); - isJava8 = Double.valueOf(javaVersion) >= 1.8; - factory = new SerializerFactory(Thread.currentThread().getContextClassLoader()); - os = new ByteArrayOutputStream(); - } - - @Test - public void testNull() throws IOException { - testJava8Time(null); - } - - @Test - public void testInstant() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.Instant"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testDuration() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.Duration"); - Method m = c.getDeclaredMethod("ofDays", long.class); - testJava8Time(m.invoke(null, 2)); - } - } - - @Test - public void testLocalDate() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.LocalDate"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testLocalDateTime() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.LocalDateTime"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testLocalTime() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.LocalTime"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testYear() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.Year"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testYearMonth() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.YearMonth"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testMonthDay() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.MonthDay"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testPeriod() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.Period"); - Method m = c.getDeclaredMethod("ofDays", int.class); - testJava8Time(m.invoke(null, 3)); - } - } - - @Test - public void testOffsetTime() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.OffsetTime"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testZoneOffset() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.ZoneOffset"); - Method m = c.getDeclaredMethod("ofHours", int.class); - testJava8Time(m.invoke(null, 8)); - } - } - - @Test - public void testOffsetDateTime() throws Throwable { - if (isJava8) { - Class c = Class.forName("java.time.OffsetDateTime"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testZonedDateTime() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.ZonedDateTime"); - Method m = c.getDeclaredMethod("now"); - testJava8Time(m.invoke(null)); - } - } - - @Test - public void testZoneId() throws Exception { - if (isJava8) { - Class c = Class.forName("java.time.ZoneId"); - Method m = c.getDeclaredMethod("of", String.class); - testJava8Time(m.invoke(null, "America/New_York")); - } - } - - - @Test - public void testCalendar() throws IOException { - Calendar calendar = Calendar.getInstance(); - testJava8Time(calendar); - } - - private void testJava8Time(Object expected) throws IOException { - os.reset(); - - Hessian2Output output = new Hessian2Output(os); - output.setSerializerFactory(factory); - output.writeObject(expected); - output.flush(); - - ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); - Hessian2Input input = new Hessian2Input(is); - input.setSerializerFactory(factory); - Object actual = input.readObject(); - - TestCase.assertEquals(expected, actual); - } -} diff --git a/pom.xml b/pom.xml index f4637a13eaf..69aa46ede32 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,6 @@ - hessian-lite dubbo-common dubbo-container dubbo-remoting @@ -533,8 +532,6 @@ README.md **/codestyle/* **/resources/META-INF/** - - **/com/caucho/hessian/** **/com/alibaba/common/threadlocal/InternalThreadLocal.java **/com/alibaba/common/threadlocal/InternalThreadLocalMap.java