重构项目结构
This commit is contained in:
parent
17becc2d66
commit
977bd905c3
|
|
@ -1,41 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
- Copyright 1999-2011 Alibaba Group.
|
||||
-
|
||||
- Licensed 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.
|
||||
-->
|
||||
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>dubbo-remoting</artifactId>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<version>2.5.4-SNAPSHOT</version>
|
||||
</parent>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>dubbo-remoting-nio</artifactId>
|
||||
<name>dubbo-remoting-nio</name>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>dubbo-remoting-api</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
@ -35,6 +35,5 @@
|
|||
<module>dubbo-remoting-p2p</module>
|
||||
<module>dubbo-remoting-http</module>
|
||||
<module>dubbo-remoting-zookeeper</module>
|
||||
<module>dubbo-remoting-nio</module>
|
||||
</modules>
|
||||
</modules>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>dubbo-parent</artifactId>
|
||||
<version>2.5.4-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>hessian-lite</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>3.2.1-fixed-2</version>
|
||||
<name>Hessian Lite(Alibaba embed version)</name>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
* 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 {
|
||||
public Class getType()
|
||||
{
|
||||
return Object.class;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
public Object readList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(String.valueOf(this));
|
||||
}
|
||||
|
||||
public Object readLengthList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(String.valueOf(this));
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,442 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Abstract base class for Hessian requests. Hessian users should only
|
||||
* need to use the methods in this class.
|
||||
*
|
||||
* <pre>
|
||||
* AbstractHessianInput in = ...; // get input
|
||||
* String value;
|
||||
*
|
||||
* in.startReply(); // read reply header
|
||||
* value = in.readString(); // read string value
|
||||
* in.completeReply(); // read reply footer
|
||||
* </pre>
|
||||
*/
|
||||
abstract public class AbstractHessianInput {
|
||||
private HessianRemoteResolver resolver;
|
||||
|
||||
/**
|
||||
* Initialize the Hessian stream with the underlying input stream.
|
||||
*/
|
||||
public void init(InputStream is)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the call's method
|
||||
*/
|
||||
abstract public String getMethod();
|
||||
|
||||
/**
|
||||
* Sets the resolver used to lookup remote objects.
|
||||
*/
|
||||
public void setRemoteResolver(HessianRemoteResolver resolver)
|
||||
{
|
||||
this.resolver = resolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the resolver used to lookup remote objects.
|
||||
*/
|
||||
public HessianRemoteResolver getRemoteResolver()
|
||||
{
|
||||
return resolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the serializer factory.
|
||||
*/
|
||||
public void setSerializerFactory(SerializerFactory ser)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the call
|
||||
*
|
||||
* <pre>
|
||||
* c major minor
|
||||
* </pre>
|
||||
*/
|
||||
abstract public int readCall()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* For backward compatibility with HessianSkeleton
|
||||
*/
|
||||
public void skipOptionalCall()
|
||||
throws IOException
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a header, returning null if there are no headers.
|
||||
*
|
||||
* <pre>
|
||||
* H b16 b8 value
|
||||
* </pre>
|
||||
*/
|
||||
abstract public String readHeader()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Starts reading the call
|
||||
*
|
||||
* <p>A successful completion will have a single value:
|
||||
*
|
||||
* <pre>
|
||||
* m b16 b8 method
|
||||
* </pre>
|
||||
*/
|
||||
abstract public String readMethod()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads the number of method arguments
|
||||
*
|
||||
* @return -1 for a variable length (hessian 1.0)
|
||||
*/
|
||||
public int readMethodArgLength()
|
||||
throws IOException
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts reading the call, including the headers.
|
||||
*
|
||||
* <p>The call expects the following protocol data
|
||||
*
|
||||
* <pre>
|
||||
* c major minor
|
||||
* m b16 b8 method
|
||||
* </pre>
|
||||
*/
|
||||
abstract public void startCall()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Completes reading the call
|
||||
*
|
||||
* <p>The call expects the following protocol data
|
||||
*
|
||||
* <pre>
|
||||
* Z
|
||||
* </pre>
|
||||
*/
|
||||
abstract public void completeCall()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a reply as an object.
|
||||
* If the reply has a fault, throws the exception.
|
||||
*/
|
||||
abstract public Object readReply(Class expectedClass)
|
||||
throws Throwable;
|
||||
|
||||
/**
|
||||
* Starts reading the reply
|
||||
*
|
||||
* <p>A successful completion will have a single value:
|
||||
*
|
||||
* <pre>
|
||||
* r
|
||||
* v
|
||||
* </pre>
|
||||
*/
|
||||
abstract public void startReply()
|
||||
throws Throwable;
|
||||
|
||||
/**
|
||||
* Completes reading the call
|
||||
*
|
||||
* <p>A successful completion will have a single value:
|
||||
*
|
||||
* <pre>
|
||||
* z
|
||||
* </pre>
|
||||
*/
|
||||
abstract public void completeReply()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a boolean
|
||||
*
|
||||
* <pre>
|
||||
* T
|
||||
* F
|
||||
* </pre>
|
||||
*/
|
||||
abstract public boolean readBoolean()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a null
|
||||
*
|
||||
* <pre>
|
||||
* N
|
||||
* </pre>
|
||||
*/
|
||||
abstract public void readNull()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads an integer
|
||||
*
|
||||
* <pre>
|
||||
* I b32 b24 b16 b8
|
||||
* </pre>
|
||||
*/
|
||||
abstract public int readInt()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a long
|
||||
*
|
||||
* <pre>
|
||||
* L b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre>
|
||||
*/
|
||||
abstract public long readLong()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a double.
|
||||
*
|
||||
* <pre>
|
||||
* D b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre>
|
||||
*/
|
||||
abstract public double readDouble()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a date.
|
||||
*
|
||||
* <pre>
|
||||
* T b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre>
|
||||
*/
|
||||
abstract public long readUTCDate()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a string encoded in UTF-8
|
||||
*
|
||||
* <pre>
|
||||
* s b16 b8 non-final string chunk
|
||||
* S b16 b8 final string chunk
|
||||
* </pre>
|
||||
*/
|
||||
abstract public String readString()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads an XML node encoded in UTF-8
|
||||
*
|
||||
* <pre>
|
||||
* x b16 b8 non-final xml chunk
|
||||
* X b16 b8 final xml chunk
|
||||
* </pre>
|
||||
*/
|
||||
public org.w3c.dom.Node readNode()
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(getClass().getSimpleName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts reading a string. All the characters must be read before
|
||||
* calling the next method. The actual characters will be read with
|
||||
* the reader's read() or read(char [], int, int).
|
||||
*
|
||||
* <pre>
|
||||
* s b16 b8 non-final string chunk
|
||||
* S b16 b8 final string chunk
|
||||
* </pre>
|
||||
*/
|
||||
abstract public Reader getReader()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Starts reading a byte array using an input stream. All the bytes
|
||||
* must be read before calling the following method.
|
||||
*
|
||||
* <pre>
|
||||
* b b16 b8 non-final binary chunk
|
||||
* B b16 b8 final binary chunk
|
||||
* </pre>
|
||||
*/
|
||||
abstract public InputStream readInputStream()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a byte array.
|
||||
*
|
||||
* <pre>
|
||||
* b b16 b8 non-final binary chunk
|
||||
* B b16 b8 final binary chunk
|
||||
* </pre>
|
||||
*/
|
||||
abstract public byte []readBytes()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads an arbitrary object from the input stream.
|
||||
*
|
||||
* @param expectedClass the expected class if the protocol doesn't supply it.
|
||||
*/
|
||||
abstract public Object readObject(Class expectedClass)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads an arbitrary object from the input stream.
|
||||
*/
|
||||
abstract public Object readObject()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a remote object reference to the stream. The type is the
|
||||
* type of the remote interface.
|
||||
*
|
||||
* <code><pre>
|
||||
* 'r' 't' b16 b8 type url
|
||||
* </pre></code>
|
||||
*/
|
||||
abstract public Object readRemote()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads a reference
|
||||
*
|
||||
* <pre>
|
||||
* R b32 b24 b16 b8
|
||||
* </pre>
|
||||
*/
|
||||
abstract public Object readRef()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Adds an object reference.
|
||||
*/
|
||||
abstract public int addRef(Object obj)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Sets an object reference.
|
||||
*/
|
||||
abstract public void setRef(int i, Object obj)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Resets the references for streaming.
|
||||
*/
|
||||
public void resetReferences()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the start of a list
|
||||
*/
|
||||
abstract public int readListStart()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads the length of a list.
|
||||
*/
|
||||
abstract public int readLength()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads the start of a map
|
||||
*/
|
||||
abstract public int readMapStart()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Reads an object type.
|
||||
*/
|
||||
abstract public String readType()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Returns true if the data has ended.
|
||||
*/
|
||||
abstract public boolean isEnd()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Read the end byte
|
||||
*/
|
||||
abstract public void readEnd()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Read the end byte
|
||||
*/
|
||||
abstract public void readMapEnd()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Read the end byte
|
||||
*/
|
||||
abstract public void readListEnd()
|
||||
throws IOException;
|
||||
|
||||
public void close()
|
||||
throws IOException
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,531 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* <pre>
|
||||
* 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
|
||||
* </pre>
|
||||
*/
|
||||
abstract public class AbstractHessianOutput {
|
||||
// serializer factory
|
||||
protected SerializerFactory _serializerFactory;
|
||||
|
||||
/**
|
||||
* Sets the serializer factory.
|
||||
*/
|
||||
public void setSerializerFactory(SerializerFactory factory)
|
||||
{
|
||||
_serializerFactory = factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the serializer factory.
|
||||
*/
|
||||
public SerializerFactory getSerializerFactory()
|
||||
{
|
||||
return _serializerFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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:
|
||||
*
|
||||
* <code><pre>
|
||||
* C
|
||||
* </pre></code>
|
||||
*
|
||||
* @param method the method name to call.
|
||||
*/
|
||||
abstract public void startCall()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Starts the method call:
|
||||
*
|
||||
* <code><pre>
|
||||
* C string int
|
||||
* </pre></code>
|
||||
*
|
||||
* @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.
|
||||
*
|
||||
* <code><pre>
|
||||
* string
|
||||
* </pre></code>
|
||||
*
|
||||
* @param method the method name to call.
|
||||
*/
|
||||
abstract public void writeMethod(String method)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Completes the method call:
|
||||
*
|
||||
* <code><pre>
|
||||
* </pre></code>
|
||||
*/
|
||||
abstract public void completeCall()
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Writes a boolean value to the stream. The boolean will be written
|
||||
* with the following syntax:
|
||||
*
|
||||
* <code><pre>
|
||||
* T
|
||||
* F
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* I b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* L b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* D b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the double value to write.
|
||||
*/
|
||||
abstract public void writeDouble(double value)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Writes a date to the stream.
|
||||
*
|
||||
* <code><pre>
|
||||
* T b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @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
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* S b16 b8 string-value
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* S b16 b8 string-value
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* B b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @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:
|
||||
*
|
||||
* <code><pre>
|
||||
* B b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @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.
|
||||
*
|
||||
* <code><pre>
|
||||
* b b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* @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.
|
||||
*
|
||||
* <code><pre>
|
||||
* b b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
abstract public void writeByteBufferEnd(byte []buffer,
|
||||
int offset,
|
||||
int length)
|
||||
throws IOException;
|
||||
|
||||
/**
|
||||
* Writes a reference.
|
||||
*
|
||||
* <code><pre>
|
||||
* Q int
|
||||
* </pre></code>
|
||||
*
|
||||
* @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.
|
||||
*
|
||||
* <code><pre>
|
||||
* R b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @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
|
||||
* <code>writeListBegin</code> followed by the list contents and then
|
||||
* call <code>writeListEnd</code>.
|
||||
*
|
||||
* <code><pre>
|
||||
* V
|
||||
* x13 java.util.ArrayList # type
|
||||
* x93 # length=3
|
||||
* x91 # 1
|
||||
* x92 # 2
|
||||
* x93 # 3
|
||||
* </list>
|
||||
* </pre></code>
|
||||
*/
|
||||
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
|
||||
* <code>writeMapBegin</code> followed by the map contents and then
|
||||
* call <code>writeMapEnd</code>.
|
||||
*
|
||||
* <code><pre>
|
||||
* M type (<key> <value>)* Z
|
||||
* </pre></code>
|
||||
*/
|
||||
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
|
||||
* <code>writeObjectBegin</code> followed by the map contents and then
|
||||
* call <code>writeObjectEnd</code>.
|
||||
*
|
||||
* <code><pre>
|
||||
* C type int <key>*
|
||||
* C int <value>*
|
||||
* </pre></code>
|
||||
*
|
||||
* @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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
public Object lookup(String type, String url)
|
||||
throws IOException
|
||||
{
|
||||
return new HessianRemote(type, url);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* 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 {
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* 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 {
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return HashMap.class;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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.*;
|
||||
|
||||
/**
|
||||
* Serializing an object.
|
||||
*/
|
||||
abstract public class AbstractSerializer implements Serializer {
|
||||
protected static final Logger log
|
||||
= Logger.getLogger(AbstractSerializer.class.getName());
|
||||
|
||||
abstract public void writeObject(Object obj, AbstractHessianOutput out)
|
||||
throws IOException;
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the array.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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];
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return "ArrayDeserializer[" + _componentType + "]";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* 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 {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,608 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,295 @@
|
|||
/*
|
||||
* 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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,315 @@
|
|||
/*
|
||||
* 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.*;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
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<Method> {
|
||||
public int compare(Method a, Method b)
|
||||
{
|
||||
return a.getName().compareTo(b.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
protected Deserializer getDefaultDeserializer(Class cl)
|
||||
{
|
||||
return new BeanDeserializer(cl);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package com.alibaba.com.caucho.hessian.io;
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gang.lvg@alibaba-inc.com">kimi</a>
|
||||
*/
|
||||
public class BigIntegerDeserializer extends JavaDeserializer {
|
||||
|
||||
public BigIntegerDeserializer() {
|
||||
super(BigInteger.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object instantiate() throws Exception {
|
||||
return new BigInteger("0");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* 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<String,Class> _primClasses
|
||||
= new HashMap<String,Class>();
|
||||
|
||||
private ClassLoader _loader;
|
||||
|
||||
public ClassDeserializer(ClassLoader loader)
|
||||
{
|
||||
_loader = loader;
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return Class.class;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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 {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
* 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.*;
|
||||
|
||||
/**
|
||||
* Deserializing a JDK 1.2 Collection.
|
||||
*/
|
||||
public class CollectionDeserializer extends AbstractListDeserializer {
|
||||
private Class _type;
|
||||
|
||||
public CollectionDeserializer(Class type)
|
||||
{
|
||||
_type = type;
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
public Object readList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
Collection list = createList();
|
||||
|
||||
in.addRef(list);
|
||||
|
||||
while (! in.isEnd())
|
||||
list.add(in.readObject());
|
||||
|
||||
in.readEnd();
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public Object readLengthList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
Collection list = createList();
|
||||
|
||||
in.addRef(list);
|
||||
|
||||
for (; length > 0; length--)
|
||||
list.add(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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Set true if the java type of the collection should be sent.
|
||||
*/
|
||||
public void setSendJavaType(boolean sendJavaType)
|
||||
{
|
||||
_sendJavaType = sendJavaType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the java type of the collection should be sent.
|
||||
*/
|
||||
public boolean getSendJavaType()
|
||||
{
|
||||
return _sendJavaType;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
/*
|
||||
* 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.*;
|
||||
import java.util.zip.*;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
import com.alibaba.com.caucho.hessian.io.*;
|
||||
|
||||
public class Deflation extends HessianEnvelope {
|
||||
public Deflation()
|
||||
{
|
||||
}
|
||||
|
||||
public Hessian2Output wrap(Hessian2Output out)
|
||||
throws IOException
|
||||
{
|
||||
OutputStream os = new DeflateOutputStream(out);
|
||||
|
||||
Hessian2Output filterOut = new Hessian2Output(os);
|
||||
|
||||
filterOut.setCloseStreamOnClose(true);
|
||||
|
||||
return filterOut;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public void write(int ch)
|
||||
throws IOException
|
||||
{
|
||||
_deflateOut.write(ch);
|
||||
}
|
||||
|
||||
public void write(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
_deflateOut.write(buffer, offset, length);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public int read()
|
||||
throws IOException
|
||||
{
|
||||
return _inflateIn.read();
|
||||
}
|
||||
|
||||
public int read(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
return _inflateIn.read(buffer, offset, length);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
public Object readLengthList(AbstractHessianInput in, int length)
|
||||
throws IOException;
|
||||
|
||||
public Object readMap(AbstractHessianInput in)
|
||||
throws IOException;
|
||||
|
||||
public Object readObject(AbstractHessianInput in, String []fieldNames)
|
||||
throws IOException;
|
||||
}
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _enumType;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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.*;
|
||||
|
||||
public class EnvelopeFactory
|
||||
{
|
||||
private static final Logger log
|
||||
= Logger.getLogger(EnvelopeFactory.class.getName());
|
||||
}
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
public Deserializer getDeserializer(Class cl)
|
||||
throws HessianProtocolException
|
||||
{
|
||||
return (Deserializer) _deserializerMap.get(cl);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,165 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* 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.HashMap;
|
||||
|
||||
/**
|
||||
* 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 void setCloseStreamOnClose(boolean isClose)
|
||||
{
|
||||
_out.setCloseStreamOnClose(isClose);
|
||||
}
|
||||
|
||||
public boolean isCloseStreamOnClose()
|
||||
{
|
||||
return _out.isCloseStreamOnClose();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* 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.Writer;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void flush()
|
||||
{
|
||||
}
|
||||
|
||||
public void close()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* 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.Writer;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public void write(int ch)
|
||||
throws IOException
|
||||
{
|
||||
ch = ch & 0xff;
|
||||
|
||||
_os.write(ch);
|
||||
|
||||
_state.next(ch);
|
||||
}
|
||||
|
||||
public void flush()
|
||||
throws IOException
|
||||
{
|
||||
_os.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* closes the stream.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void flush()
|
||||
{
|
||||
}
|
||||
|
||||
public void close()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* 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.*;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* 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 {
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* 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.*;
|
||||
import java.io.*;
|
||||
|
||||
public class HessianInputFactory
|
||||
{
|
||||
public static final Logger log
|
||||
= Logger.getLogger(HessianInputFactory.class.getName());
|
||||
|
||||
private SerializerFactory _serializerFactory;
|
||||
|
||||
public void setSerializerFactory(SerializerFactory factory)
|
||||
{
|
||||
_serializerFactory = factory;
|
||||
}
|
||||
|
||||
public SerializerFactory getSerializerFactory()
|
||||
{
|
||||
return _serializerFactory;
|
||||
}
|
||||
|
||||
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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,949 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* <p>Since HessianOutput does not depend on any classes other than
|
||||
* in the JDK, it can be extracted independently into a smaller package.
|
||||
*
|
||||
* <p>HessianOutput is unbuffered, so any client needs to provide
|
||||
* its own buffering.
|
||||
*
|
||||
* <pre>
|
||||
* 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
|
||||
* </pre>
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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 <code>startCall</code>
|
||||
* instead of <code>call</code> if they wanted finer control over
|
||||
* writing the arguments, or needed to write headers.
|
||||
*
|
||||
* <code><pre>
|
||||
* c major minor
|
||||
* m b16 b8 method-name
|
||||
* </pre></code>
|
||||
*
|
||||
* @param method the method name to call.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* c major minor
|
||||
* </pre></code>
|
||||
*
|
||||
* @param method the method name to call.
|
||||
*/
|
||||
public void startCall()
|
||||
throws IOException
|
||||
{
|
||||
os.write('c');
|
||||
os.write(0);
|
||||
os.write(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the method tag.
|
||||
*
|
||||
* <code><pre>
|
||||
* m b16 b8 method-name
|
||||
* </pre></code>
|
||||
*
|
||||
* @param method the method name to call.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* z
|
||||
* </pre></code>
|
||||
*/
|
||||
public void completeCall()
|
||||
throws IOException
|
||||
{
|
||||
os.write('z');
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the reply
|
||||
*
|
||||
* <p>A successful completion will have a single value:
|
||||
*
|
||||
* <pre>
|
||||
* r
|
||||
* </pre>
|
||||
*/
|
||||
public void startReply()
|
||||
throws IOException
|
||||
{
|
||||
os.write('r');
|
||||
os.write(1);
|
||||
os.write(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Completes reading the reply
|
||||
*
|
||||
* <p>A successful completion will have a single value:
|
||||
*
|
||||
* <pre>
|
||||
* z
|
||||
* </pre>
|
||||
*/
|
||||
public void completeReply()
|
||||
throws IOException
|
||||
{
|
||||
os.write('z');
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a header name. The header value must immediately follow.
|
||||
*
|
||||
* <code><pre>
|
||||
* H b16 b8 foo <em>value</em>
|
||||
* </pre></code>
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* f
|
||||
* <string>code
|
||||
* <string>the fault code
|
||||
*
|
||||
* <string>message
|
||||
* <string>the fault mesage
|
||||
*
|
||||
* <string>detail
|
||||
* mt\x00\xnnjavax.ejb.FinderException
|
||||
* ...
|
||||
* z
|
||||
* z
|
||||
* </pre></code>
|
||||
*
|
||||
* @param code the fault code, a three digit
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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
|
||||
* <code>writeListBegin</code> followed by the list contents and then
|
||||
* call <code>writeListEnd</code>.
|
||||
*
|
||||
* <code><pre>
|
||||
* V
|
||||
* t b16 b8 type
|
||||
* l b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
public void writeListEnd()
|
||||
throws IOException
|
||||
{
|
||||
os.write('z');
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the map header to the stream. Map writers will call
|
||||
* <code>writeMapBegin</code> followed by the map contents and then
|
||||
* call <code>writeMapEnd</code>.
|
||||
*
|
||||
* <code><pre>
|
||||
* Mt b16 b8 (<key> <value>)z
|
||||
* </pre></code>
|
||||
*/
|
||||
public void writeMapBegin(String type)
|
||||
throws IOException
|
||||
{
|
||||
os.write('M');
|
||||
os.write('t');
|
||||
printLenString(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the tail of the map to the stream.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* 'r' 't' b16 b8 type url
|
||||
* </pre></code>
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* T
|
||||
* F
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the boolean value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* I b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the integer value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* L b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the long value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* D b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the double value to write.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* T b64 b56 b48 b40 b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param time the date in milliseconds from the epoch in UTC
|
||||
*/
|
||||
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
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* S b16 b8 string-value
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* S b16 b8 string-value
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* B b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
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:
|
||||
*
|
||||
* <code><pre>
|
||||
* B b16 b18 bytes
|
||||
* </pre></code>
|
||||
*
|
||||
* If the value is null, it will be written as
|
||||
*
|
||||
* <code><pre>
|
||||
* N
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the string value to write.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* </pre></code>
|
||||
*/
|
||||
public void writeByteBufferStart()
|
||||
throws IOException
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a byte buffer to the stream.
|
||||
*
|
||||
* <code><pre>
|
||||
* b b16 b18 bytes
|
||||
* </pre></code>
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* b b16 b18 bytes
|
||||
* </pre></code>
|
||||
*/
|
||||
public void writeByteBufferEnd(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
writeBytes(buffer, offset, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a reference.
|
||||
*
|
||||
* <code><pre>
|
||||
* R b32 b24 b16 b8
|
||||
* </pre></code>
|
||||
*
|
||||
* @param value the integer value to write.
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* <code><pre>
|
||||
* P
|
||||
* </pre></code>
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
public void resetReferences()
|
||||
{
|
||||
if (_refs != null)
|
||||
_refs.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a reference.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void flush()
|
||||
throws IOException
|
||||
{
|
||||
if (this.os != null)
|
||||
this.os.flush();
|
||||
}
|
||||
|
||||
public void close()
|
||||
throws IOException
|
||||
{
|
||||
if (this.os != null)
|
||||
this.os.flush();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
public Throwable getCause()
|
||||
{
|
||||
return getRootCause();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
public int hashCode()
|
||||
{
|
||||
return url.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines equality
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
public String toString()
|
||||
{
|
||||
return "[HessianRemote " + url + "]";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
/*
|
||||
* Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
|
||||
*
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution, if
|
||||
* any, must include the following acknowlegement:
|
||||
* "This product includes software developed by the
|
||||
* Caucho Technology (http://www.caucho.com/)."
|
||||
* Alternately, this acknowlegement may appear in the software itself,
|
||||
* if and wherever such third-party acknowlegements normally appear.
|
||||
*
|
||||
* 4. The names "Burlap", "Resin", and "Caucho" must not be used to
|
||||
* endorse or promote products derived from this software without prior
|
||||
* written permission. For written permission, please contact
|
||||
* info@caucho.com.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Resin"
|
||||
* nor may "Resin" appear in their names without prior written
|
||||
* permission of Caucho Technology.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @author Scott Ferguson
|
||||
*/
|
||||
|
||||
package com.alibaba.com.caucho.hessian.io;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Input stream for Hessian requests, deserializing objects using the
|
||||
* java.io.Serialization protocol.
|
||||
*
|
||||
* <p>HessianSerializerInput is unbuffered, so any client needs to provide
|
||||
* its own buffering.
|
||||
*
|
||||
* <h3>Serialization</h3>
|
||||
*
|
||||
* <pre>
|
||||
* InputStream is = new FileInputStream("test.xml");
|
||||
* HessianOutput in = new HessianSerializerOutput(is);
|
||||
*
|
||||
* Object obj = in.readObject();
|
||||
* is.close();
|
||||
* </pre>
|
||||
*
|
||||
* <h3>Parsing a Hessian reply</h3>
|
||||
*
|
||||
* <pre>
|
||||
* 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
|
||||
* </pre>
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* <p>HessianOutput is unbuffered, so any client needs to provide
|
||||
* its own buffering.
|
||||
*
|
||||
* <h3>Serialization</h3>
|
||||
*
|
||||
* <pre>
|
||||
* OutputStream os = new FileOutputStream("test.xml");
|
||||
* HessianOutput out = new HessianSerializerOutput(os);
|
||||
*
|
||||
* out.writeObject(obj);
|
||||
* os.close();
|
||||
* </pre>
|
||||
*
|
||||
* <h3>Writing an RPC Call</h3>
|
||||
*
|
||||
* <pre>
|
||||
* 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
|
||||
* </pre>
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
public Throwable getCause()
|
||||
{
|
||||
return _cause;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* 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 InputStreamDeserializer extends AbstractDeserializer {
|
||||
public InputStreamDeserializer()
|
||||
{
|
||||
}
|
||||
|
||||
public Object readObject(AbstractHessianInput in)
|
||||
throws IOException
|
||||
{
|
||||
return in.readInputStream();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* 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()
|
||||
{
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,679 @@
|
|||
/*
|
||||
* 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.util.HashMap;
|
||||
|
||||
import java.util.logging.*;
|
||||
|
||||
/**
|
||||
* 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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
else {
|
||||
deser = new ObjectFieldDeserializer(field);
|
||||
}
|
||||
|
||||
fieldMap.put(field.getName(), deser);
|
||||
}
|
||||
}
|
||||
|
||||
return fieldMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 IntFieldDeserializer extends FieldDeserializer {
|
||||
private final Field _field;
|
||||
|
||||
IntFieldDeserializer(Field field)
|
||||
{
|
||||
_field = field;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void deserialize(AbstractHessianInput in, Object obj)
|
||||
throws IOException
|
||||
{
|
||||
java.sql.Date value = null;
|
||||
|
||||
try {
|
||||
java.util.Date date = (java.util.Date) in.readObject();
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void deserialize(AbstractHessianInput in, Object obj)
|
||||
throws IOException
|
||||
{
|
||||
java.sql.Time value = null;
|
||||
|
||||
try {
|
||||
java.util.Date date = (java.util.Date) in.readObject();
|
||||
value = new java.sql.Time(date.getTime());
|
||||
|
||||
_field.set(obj, value);
|
||||
} catch (Exception e) {
|
||||
logDeserializeError(_field, obj, value, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,434 @@
|
|||
/*
|
||||
* 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.Serializable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
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);
|
||||
|
||||
ArrayList primitiveFields = new ArrayList();
|
||||
ArrayList 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);
|
||||
}
|
||||
}
|
||||
|
||||
ArrayList fields = new ArrayList();
|
||||
fields.addAll(primitiveFields);
|
||||
fields.addAll(compoundFields);
|
||||
|
||||
_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());
|
||||
}
|
||||
}
|
||||
|
||||
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 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* 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()
|
||||
{
|
||||
String s = this.value;
|
||||
|
||||
if (s == null)
|
||||
return null;
|
||||
|
||||
int len = s.length();
|
||||
char ch = ' ';
|
||||
|
||||
int i = 0;
|
||||
for (;
|
||||
i < len && ('a' <= (ch = s.charAt(i)) && ch <= 'z'
|
||||
|| 'A' <= ch && ch <= 'Z'
|
||||
|| '0' <= ch && ch <= '9');
|
||||
i++) {
|
||||
}
|
||||
|
||||
String language = s.substring(0, i);
|
||||
String country = null;
|
||||
String var = null;
|
||||
|
||||
if (ch == '-' || ch == '_') {
|
||||
int head = ++i;
|
||||
|
||||
for (;
|
||||
i < len && ('a' <= (ch = s.charAt(i)) && ch <= 'z'
|
||||
|| 'A' <= ch && ch <= 'Z'
|
||||
|| '0' <= ch && ch <= '9');
|
||||
i++) {
|
||||
}
|
||||
|
||||
country = s.substring(head, i);
|
||||
}
|
||||
|
||||
if (ch == '-' || ch == '_') {
|
||||
int head = ++i;
|
||||
|
||||
for (;
|
||||
i < len && ('a' <= (ch = s.charAt(i)) && ch <= 'z'
|
||||
|| 'A' <= ch && ch <= 'Z'
|
||||
|| '0' <= ch && ch <= '9');
|
||||
i++) {
|
||||
}
|
||||
|
||||
var = s.substring(head, i);
|
||||
}
|
||||
|
||||
if (var != null)
|
||||
return new Locale(language, country, var);
|
||||
else if (country != null)
|
||||
return new Locale(language, country);
|
||||
else
|
||||
return new Locale(language);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* 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.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
if (_type != null)
|
||||
return _type;
|
||||
else
|
||||
return HashMap.class;
|
||||
}
|
||||
|
||||
public Object readMap(AbstractHessianInput in)
|
||||
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);
|
||||
|
||||
while (! in.isEnd()) {
|
||||
map.put(in.readObject(), in.readObject());
|
||||
}
|
||||
|
||||
in.readEnd();
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Set true if the java type of the collection should be sent.
|
||||
*/
|
||||
public void setSendJavaType(boolean sendJavaType)
|
||||
{
|
||||
_isSendJavaType = sendJavaType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if the java type of the collection should be sent.
|
||||
*/
|
||||
public boolean getSendJavaType()
|
||||
{
|
||||
return _isSendJavaType;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
* 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 ObjectDeserializer extends AbstractDeserializer {
|
||||
private Class _cl;
|
||||
|
||||
public ObjectDeserializer(Class cl)
|
||||
{
|
||||
_cl = cl;
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _cl;
|
||||
}
|
||||
|
||||
public Object readObject(AbstractHessianInput in)
|
||||
throws IOException
|
||||
{
|
||||
return in.readObject();
|
||||
}
|
||||
|
||||
public Object readObject(AbstractHessianInput in, String []fieldNames)
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(String.valueOf(this));
|
||||
}
|
||||
|
||||
public Object readList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(String.valueOf(this));
|
||||
}
|
||||
|
||||
public Object readLengthList(AbstractHessianInput in, int length)
|
||||
throws IOException
|
||||
{
|
||||
throw new UnsupportedOperationException(String.valueOf(this));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getSimpleName() + "[" + _cl + "]";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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 {
|
||||
public void writeObject(Object obj, AbstractHessianOutput out)
|
||||
throws IOException
|
||||
{
|
||||
// XXX: needs to be handled as a separate class
|
||||
throw new UnsupportedOperationException(getClass().getName());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* 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;
|
||||
}
|
||||
|
|
@ -0,0 +1,649 @@
|
|||
/*
|
||||
* 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.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.management.*;
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
private ClassLoader _loader;
|
||||
|
||||
protected Serializer _defaultSerializer;
|
||||
|
||||
// Additional factories
|
||||
protected ArrayList _factories = new ArrayList();
|
||||
|
||||
protected CollectionSerializer _collectionSerializer;
|
||||
protected MapSerializer _mapSerializer;
|
||||
|
||||
private Deserializer _hashMapDeserializer;
|
||||
private Deserializer _arrayListDeserializer;
|
||||
private HashMap _cachedSerializerMap;
|
||||
private HashMap _cachedDeserializerMap;
|
||||
private HashMap _cachedTypeDeserializerMap;
|
||||
|
||||
private boolean _isAllowNonSerializable;
|
||||
|
||||
public SerializerFactory()
|
||||
{
|
||||
this(Thread.currentThread().getContextClassLoader());
|
||||
}
|
||||
|
||||
public SerializerFactory(ClassLoader loader)
|
||||
{
|
||||
_loader = loader;
|
||||
}
|
||||
|
||||
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 void setAllowNonSerializable(boolean allow)
|
||||
{
|
||||
_isAllowNonSerializable = allow;
|
||||
}
|
||||
|
||||
/**
|
||||
* If true, non-serializable objects are allowed.
|
||||
*/
|
||||
public boolean isAllowNonSerializable()
|
||||
{
|
||||
return _isAllowNonSerializable;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public Serializer getSerializer(Class cl)
|
||||
throws HessianProtocolException
|
||||
{
|
||||
Serializer serializer;
|
||||
|
||||
serializer = (Serializer) _staticSerializerMap.get(cl);
|
||||
if (serializer != null)
|
||||
return serializer;
|
||||
|
||||
if (_cachedSerializerMap != null) {
|
||||
synchronized (_cachedSerializerMap) {
|
||||
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 (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 HashMap(8);
|
||||
|
||||
synchronized (_cachedSerializerMap) {
|
||||
_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.
|
||||
*/
|
||||
public Deserializer getDeserializer(Class cl)
|
||||
throws HessianProtocolException
|
||||
{
|
||||
Deserializer deserializer;
|
||||
|
||||
deserializer = (Deserializer) _staticDeserializerMap.get(cl);
|
||||
if (deserializer != null)
|
||||
return deserializer;
|
||||
|
||||
if (_cachedDeserializerMap != null) {
|
||||
synchronized (_cachedDeserializerMap) {
|
||||
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 HashMap(8);
|
||||
|
||||
synchronized (_cachedDeserializerMap) {
|
||||
_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
|
||||
{
|
||||
Deserializer deserializer = getDeserializer(type);
|
||||
|
||||
if (deserializer != null)
|
||||
return deserializer.readMap(in);
|
||||
else if (_hashMapDeserializer != null)
|
||||
return _hashMapDeserializer.readMap(in);
|
||||
else {
|
||||
_hashMapDeserializer = new MapDeserializer(HashMap.class);
|
||||
|
||||
return _hashMapDeserializer.readMap(in);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
synchronized (_cachedTypeDeserializerMap) {
|
||||
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 HashMap(8);
|
||||
|
||||
synchronized (_cachedTypeDeserializerMap) {
|
||||
_cachedTypeDeserializerMap.put(type, deserializer);
|
||||
}
|
||||
}
|
||||
|
||||
return deserializer;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* 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 });
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _cl;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* 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
|
||||
{
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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.*;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
public Class getType()
|
||||
{
|
||||
return _cl;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* 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 {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
public void writeObject(Object obj, AbstractHessianOutput out)
|
||||
throws IOException
|
||||
{
|
||||
Throwable e = (Throwable) obj;
|
||||
|
||||
e.getStackTrace();
|
||||
|
||||
super.writeObject(obj, out);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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 {
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
/*
|
||||
* 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 java.security.*;
|
||||
import java.security.cert.*;
|
||||
import java.util.*;
|
||||
import javax.crypto.*;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
import com.alibaba.com.caucho.hessian.io.*;
|
||||
|
||||
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()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the encryption algorithm for the content.
|
||||
*/
|
||||
public void setAlgorithm(String algorithm)
|
||||
{
|
||||
if (algorithm == null)
|
||||
throw new NullPointerException();
|
||||
|
||||
_algorithm = algorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the encryption algorithm for the content.
|
||||
*/
|
||||
public String getAlgorithm()
|
||||
{
|
||||
return _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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void write(int ch)
|
||||
throws IOException
|
||||
{
|
||||
_cipherOut.write(ch);
|
||||
}
|
||||
|
||||
public void write(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
_cipherOut.write(buffer, offset, length);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public int read()
|
||||
throws IOException
|
||||
{
|
||||
return _cipherIn.read();
|
||||
}
|
||||
|
||||
public int read(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
return _cipherIn.read(buffer, offset, length);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,397 @@
|
|||
/*
|
||||
* 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 java.security.*;
|
||||
import java.security.cert.*;
|
||||
import java.util.*;
|
||||
import javax.crypto.*;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
import com.alibaba.com.caucho.hessian.io.*;
|
||||
|
||||
public class X509Signature extends HessianEnvelope {
|
||||
private String _algorithm = "HmacSHA256";
|
||||
private X509Certificate _cert;
|
||||
private PrivateKey _privateKey;
|
||||
private SecureRandom _secureRandom;
|
||||
|
||||
public X509Signature()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the encryption algorithm for the content.
|
||||
*/
|
||||
public void setAlgorithm(String algorithm)
|
||||
{
|
||||
if (algorithm == null)
|
||||
throw new NullPointerException();
|
||||
|
||||
_algorithm = algorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the encryption algorithm for the content.
|
||||
*/
|
||||
public String getAlgorithm()
|
||||
{
|
||||
return _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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void write(int ch)
|
||||
throws IOException
|
||||
{
|
||||
_bodyOut.write(ch);
|
||||
_mac.update((byte) ch);
|
||||
}
|
||||
|
||||
public void write(byte []buffer, int offset, int length)
|
||||
throws IOException
|
||||
{
|
||||
_bodyOut.write(buffer, offset, length);
|
||||
_mac.update(buffer, offset, length);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public int read()
|
||||
throws IOException
|
||||
{
|
||||
int ch = _bodyIn.read();
|
||||
|
||||
if (ch < 0)
|
||||
return ch;
|
||||
|
||||
_mac.update((byte) ch);
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,252 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* <p>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;
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,252 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* <p>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;
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
67
pom.xml
67
pom.xml
|
|
@ -16,11 +16,12 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<!--<parent>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>opensesame</artifactId>
|
||||
<version>2.0</version>
|
||||
</parent>
|
||||
</parent>-->
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>dubbo-parent</artifactId>
|
||||
<version>2.5.4-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
|
@ -54,6 +55,7 @@
|
|||
<module>dubbo-simple</module>
|
||||
<module>dubbo-admin</module>
|
||||
<module>dubbo-demo</module>
|
||||
<module>hessian-lite</module>
|
||||
</modules>
|
||||
<profiles>
|
||||
<profile>
|
||||
|
|
@ -131,6 +133,18 @@
|
|||
<!-- generate idea copyright -->
|
||||
<copyright>Copyright 1999-2012 Alibaba Group. Licensed 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.</copyright>
|
||||
<profile.name>oss</profile.name>
|
||||
|
||||
<!-- for maven compiler plugin -->
|
||||
<maven_compiler_plugin_version>2.3.2</maven_compiler_plugin_version>
|
||||
<java_source_version>1.5</java_source_version>
|
||||
<java_target_version>1.5</java_target_version>
|
||||
<file_encoding>UTF-8</file_encoding>
|
||||
|
||||
<maven_source_plugin_version>2.1.1</maven_source_plugin_version>
|
||||
<maven_jar_plugin_version>2.3.2</maven_jar_plugin_version>
|
||||
<maven_war_plugin_version>2.1.1</maven_war_plugin_version>
|
||||
<maven_install_plugin_version>2.3.1</maven_install_plugin_version>
|
||||
<maven_deploy_plugin_version>2.7</maven_deploy_plugin_version>
|
||||
</properties>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
|
|
@ -450,19 +464,44 @@
|
|||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>${maven_jar_plugin_version}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-war-plugin</artifactId>
|
||||
<version>${maven_war_plugin_version}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>${maven_install_plugin_version}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-deploy-plugin</artifactId>
|
||||
<version>${maven_deploy_plugin_version}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven_compiler_plugin_version}</version>
|
||||
<configuration>
|
||||
<source>${java_source_version}</source>
|
||||
<target>${java_target_version}</target>
|
||||
<encoding>${file_encoding}</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>opensesame.releases</id>
|
||||
<url>http://code.alibabatech.com/mvn/releases</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<issueManagement>
|
||||
<system>jira</system>
|
||||
<url>http://code.alibabatech.com/jira/browse/DUBBO</url>
|
||||
|
|
|
|||
Loading…
Reference in New Issue