[Red5devs] [red5 commit] r3100 - doc/trunk java/server/trunk/src/org/red5/io/amf java/server/trunk/src/org/red5/io/amf3 ja...
codesite-noreply at google.com
codesite-noreply at google.com
Wed Sep 24 22:37:14 PDT 2008
Author: mondain
Date: Wed Sep 24 22:36:51 2008
New Revision: 3100
Modified:
doc/trunk/changelog.txt
java/server/trunk/src/org/red5/io/amf/Input.java
java/server/trunk/src/org/red5/io/amf3/Input.java
java/server/trunk/src/org/red5/io/mock/Input.java
java/server/trunk/src/org/red5/io/object/Deserializer.java
java/server/trunk/src/org/red5/io/object/Input.java
java/server/trunk/src/org/red5/server/PersistableAttributeStore.java
Log:
APPSERVER-293 patch applied from Harald Radi. Updated changelog for release
Modified: doc/trunk/changelog.txt
==============================================================================
--- doc/trunk/changelog.txt (original)
+++ doc/trunk/changelog.txt Wed Sep 24 22:36:51 2008
@@ -4,7 +4,16 @@
This file contains informations about the changes between the different
versions of Red5.
-Red5 0.7.1 (unreleased)
+Red5 0.8.1 (unreleased)
+------------------------
+New Features:
+
+Bugfixes:
+
+Other:
+
+
+Red5 0.8.0 (next release)
------------------------
New Features:
- Added socket policy file server to support new security model, starting
@@ -36,6 +45,8 @@
- Added patch for start and stop scripts
- Fixed logging in web applications
- Root cause was not being sent on error in Flex message service (Jira
APPSERVER-288)
+- Allow serializer to make use of other annotations like JPA (Jira
APPSERVER-277)
+- Collections are not serialized appropriately (Jira APPSERVER-293)
Other:
- Split demos and flash sources into their own top level directories
Modified: java/server/trunk/src/org/red5/io/amf/Input.java
==============================================================================
--- java/server/trunk/src/org/red5/io/amf/Input.java (original)
+++ java/server/trunk/src/org/red5/io/amf/Input.java Wed Sep 24 22:36:51
2008
@@ -168,7 +168,7 @@
*
* @return Object
*/
- public Object readNull() {
+ public Object readNull(Type target) {
return null;
}
@@ -177,7 +177,7 @@
*
* @return boolean
*/
- public Boolean readBoolean() {
+ public Boolean readBoolean(Type target) {
// TODO: check values
return (buf.get() == AMF.VALUE_TRUE) ? Boolean.TRUE : Boolean.FALSE;
}
@@ -188,7 +188,7 @@
*
* @return Number
*/
- public Number readNumber() {
+ public Number readNumber(Type target) {
double num = buf.getDouble();
if (num == Math.round(num)) {
if (num < Integer.MAX_VALUE) {
@@ -259,7 +259,7 @@
*
* @return Date Decoded string object
*/
- public Date readDate() {
+ public Date readDate(Type target) {
/*
* Date: 0x0B T7 T6 .. T0 Z1 Z2 T7 to T0 form a 64 bit Big Endian number
* that specifies the number of nanoseconds that have passed since
@@ -277,7 +277,7 @@
// Array
- public Object readArray(Deserializer deserializer) {
+ public Object readArray(Deserializer deserializer, Type target) {
int count = buf.getInt();
List<Object> result = new ArrayList<Object>(count);
storeReference(result);
@@ -318,7 +318,7 @@
skipEndObject();
}
- public Object readMap(Deserializer deserializer) {
+ public Object readMap(Deserializer deserializer, Type target) {
// The maximum number used in this mixed array.
int maxNumber = buf.getInt();
log.debug("Read start mixed array: {}", maxNumber);
@@ -444,7 +444,7 @@
* @param deserializer Deserializer to use
* @return Read object
*/
- public Object readObject(Deserializer deserializer) {
+ public Object readObject(Deserializer deserializer, Type target) {
String className;
if (currentDataType == AMF.TYPE_CLASS_OBJECT) {
className = getString(buf);
@@ -523,7 +523,7 @@
*
* @return String XML as string
*/
- public Document readXML() {
+ public Document readXML(Type target) {
final String xmlString = readString();
Document doc = null;
try {
@@ -540,7 +540,7 @@
*
* @return Object Custom type object
*/
- public Object readCustom() {
+ public Object readCustom(Type target) {
// Return null for now
return null;
}
@@ -550,7 +550,7 @@
*
* @return ByteArray object
*/
- public ByteArray readByteArray() {
+ public ByteArray readByteArray(Type target) {
throw new RuntimeException("ByteArray objects not supported with AMF0");
}
@@ -559,7 +559,7 @@
*
* @return Object Read reference to object
*/
- public Object readReference() {
+ public Object readReference(Type target) {
if (referenceMode == ReferenceMode.MODE_RTMP) {
return getReference(buf.getUnsignedShort() - 1);
} else {
Modified: java/server/trunk/src/org/red5/io/amf3/Input.java
==============================================================================
--- java/server/trunk/src/org/red5/io/amf3/Input.java (original)
+++ java/server/trunk/src/org/red5/io/amf3/Input.java Wed Sep 24 22:36:51
2008
@@ -21,14 +21,13 @@
import java.io.IOException;
import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.lang.reflect.Type;
+import java.lang.reflect.ParameterizedType;
+import java.util.*;
import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.beanutils.ConvertUtilsBean;
+import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.mina.common.ByteBuffer;
import org.red5.io.amf.AMF;
import org.red5.io.object.DataTypes;
@@ -42,12 +41,13 @@
/**
* Input for Red5 data (AMF3) types
- *
+ *
* @author The Red5 Project (red5 at osflash.org)
* @author Luke Hubbard, Codegent Ltd (luke at codegent.com)
* @author Joachim Bauch (jojo at struktur.de)
*/
public class Input extends org.red5.io.amf.Input implements
org.red5.io.object.Input {
+ private static ConvertUtilsBean convertUtilsBean =
BeanUtilsBean.getInstance().getConvertUtils();
/**
* Holds informations about already deserialized classes.
@@ -266,7 +266,7 @@
* @return Object null
*/
@Override
- public Object readNull() {
+ public Object readNull(Type target) {
return null;
}
@@ -276,7 +276,7 @@
* @return boolean Boolean value
*/
@Override
- public Boolean readBoolean() {
+ public Boolean readBoolean(Type target) {
return (currentDataType == AMF3.TYPE_BOOLEAN_TRUE) ? Boolean.TRUE
: Boolean.FALSE;
}
@@ -287,14 +287,23 @@
* @return Number Number
*/
@Override
- public Number readNumber() {
- if (currentDataType == AMF3.TYPE_NUMBER) {
- return buf.getDouble();
+ public Number readNumber(Type target) {
+ Number v;
+
+ if (currentDataType == AMF3.TYPE_NUMBER) {
+ v = buf.getDouble();
} else {
// we are decoding an int
- return readAMF3Integer();
+ v = readAMF3Integer();
}
- }
+
+ if (target instanceof Class) {
+ Class cls = (Class) target;
+ if (!cls.isAssignableFrom(v.getClass())) v = (Number)
convertUtilsBean.convert(v.toString(), cls);
+ }
+
+ return v;
+ }
/**
* Reads a string
@@ -339,7 +348,7 @@
* @return Date Date object
*/
@Override
- public Date readDate() {
+ public Date readDate(Type target) {
int ref = readAMF3Integer();
if ((ref & 1) == 0) {
// Reference to previously found date
@@ -359,7 +368,7 @@
*
* @return int Length of array
*/
- public Object readArray(Deserializer deserializer) {
+ public Object readArray(Deserializer deserializer, Type target) {
int count = readAMF3Integer();
if ((count & 1) == 0) {
// Reference
@@ -371,25 +380,87 @@
amf3_mode += 1;
Object result;
if (key.equals("")) {
- // normal array
- List<Object> resultList = new ArrayList<Object>(count);
+ Class<?> nested = Object.class;
+ Class<?> collection = Collection.class;
+
+ if (target instanceof ParameterizedType) {
+ ParameterizedType t = (ParameterizedType) target;
+ Type[] actualTypeArguments = t.getActualTypeArguments();
+ if (actualTypeArguments.length == 1) {
+ nested = (Class<?>) actualTypeArguments[0];
+ }
+ target = t.getRawType();
+ }
+
+ if (target instanceof Class) {
+ collection = (Class) target;
+ }
+
+ if (SortedSet.class.isAssignableFrom(collection)) {
+ collection = TreeSet.class;
+ } else if (Set.class.isAssignableFrom(collection)) {
+ collection = HashSet.class;
+ } else {
+ collection = ArrayList.class;
+ }
+
+ Collection resultList;
+
+ try {
+ resultList= (Collection) collection.newInstance();
+ } catch (Exception e) {
+ resultList = new ArrayList(count);
+ }
+
+ // normal array
storeReference(resultList);
for (int i=0; i<count; i++) {
- final Object value = deserializer.deserialize(this, Object.class);
+ final Object value = deserializer.deserialize(this, nested);
resultList.add(value);
}
result = resultList;
} else {
+ Class<?> k = Object.class;
+ Class<?> v = Object.class;
+ Class<?> collection = Collection.class;
+
+ if (target instanceof ParameterizedType) {
+ ParameterizedType t = (ParameterizedType) target;
+ Type[] actualTypeArguments = t.getActualTypeArguments();
+ if (actualTypeArguments.length == 2) {
+ k = (Class<?>) actualTypeArguments[0];
+ v = (Class<?>) actualTypeArguments[1];
+ }
+ target = t.getRawType();
+ }
+
+ if (target instanceof Class) {
+ collection = (Class) target;
+ }
+
+ if (SortedMap.class.isAssignableFrom(collection)) {
+ collection = TreeMap.class;
+ } else {
+ collection = HashMap.class;
+ }
+
+ Map resultMap;
+
+ try {
+ resultMap= (Map) collection.newInstance();
+ } catch (Exception e) {
+ resultMap = new HashMap(count);
+ }
+
// associative array
- Map<Object, Object> resultMap = new HashMap<Object, Object>();
storeReference(resultMap);
while (!key.equals("")) {
- final Object value = deserializer.deserialize(this, Object.class);
- resultMap.put(key, value);
+ final Object value = deserializer.deserialize(this, v);
+ resultMap.put(key, value);
key = readString();
}
for (int i=0; i<count; i++) {
- final Object value = deserializer.deserialize(this, Object.class);
+ final Object value = deserializer.deserialize(this, v);
resultMap.put(i, value);
}
result = resultMap;
@@ -398,14 +469,14 @@
return result;
}
- public Object readMap(Deserializer deserializer) {
+ public Object readMap(Deserializer deserializer, Type target) {
throw new RuntimeException("AMF3 doesn't support maps.");
}
// Object
@SuppressWarnings("unchecked")
- public Object readObject(Deserializer deserializer) {
+ public Object readObject(Deserializer deserializer, Type target) {
int type = readAMF3Integer();
if ((type & 1) == 0) {
// Reference
@@ -576,7 +647,7 @@
return result;
}
- public ByteArray readByteArray() {
+ public ByteArray readByteArray(Type target) {
int type = readAMF3Integer();
if ((type & 1) == 0) {
// Reference
@@ -597,13 +668,13 @@
* @return Object Custom type object
*/
@Override
- public Object readCustom() {
+ public Object readCustom(Type target) {
// Return null for now
return null;
}
/** {@inheritDoc} */
- public Object readReference() {
+ public Object readReference(Type target) {
throw new RuntimeException("AMF3 doesn't support direct references.");
}
@@ -664,7 +735,7 @@
}
/** {@inheritDoc} */
- public Document readXML() {
+ public Document readXML(Type target) {
int len = readAMF3Integer();
if (len == 1)
// Empty string, should not happen
Modified: java/server/trunk/src/org/red5/io/mock/Input.java
==============================================================================
--- java/server/trunk/src/org/red5/io/mock/Input.java (original)
+++ java/server/trunk/src/org/red5/io/mock/Input.java Wed Sep 24 22:36:51
2008
@@ -22,6 +22,7 @@
import java.util.Date;
import java.util.List;
import java.util.Map;
+import java.lang.reflect.Type;
import org.red5.io.amf3.ByteArray;
import org.red5.io.object.BaseInput;
@@ -62,17 +63,17 @@
// Basic
/** {@inheritDoc} */
- public Object readNull() {
+ public Object readNull(Type target) {
return null;
}
/** {@inheritDoc} */
- public Boolean readBoolean() {
+ public Boolean readBoolean(Type target) {
return (Boolean) getNext();
}
/** {@inheritDoc} */
- public Number readNumber() {
+ public Number readNumber(Type target) {
return (Number) getNext();
}
/** {@inheritDoc} */
@@ -85,19 +86,19 @@
}
/** {@inheritDoc} */
- public Date readDate() {
+ public Date readDate(Type target) {
return (Date) getNext();
}
// Array
/** {@inheritDoc} */
- public Object readArray(Deserializer deserializer) {
+ public Object readArray(Deserializer deserializer, Type target) {
return getNext();
}
/** {@inheritDoc} */
- public Object readMap(Deserializer deserializer) {
+ public Object readMap(Deserializer deserializer, Type target) {
return getNext();
}
@@ -110,28 +111,28 @@
// Object
/** {@inheritDoc} */
- public Object readObject(Deserializer deserializer) {
+ public Object readObject(Deserializer deserializer, Type target) {
return getNext();
}
/** {@inheritDoc} */
- public Document readXML() {
+ public Document readXML(Type target) {
return (Document) getNext();
}
/** {@inheritDoc} */
- public Object readCustom() {
+ public Object readCustom(Type target) {
// Not supported
return null;
}
/** {@inheritDoc} */
- public ByteArray readByteArray() {
+ public ByteArray readByteArray(Type target) {
return (ByteArray) getNext();
}
/** {@inheritDoc} */
- public Object readReference() {
+ public Object readReference(Type target) {
final Short num = (Short) getNext();
return getReference(num.shortValue());
}
Modified: java/server/trunk/src/org/red5/io/object/Deserializer.java
==============================================================================
--- java/server/trunk/src/org/red5/io/object/Deserializer.java (original)
+++ java/server/trunk/src/org/red5/io/object/Deserializer.java Wed Sep 24
22:36:51 2008
@@ -59,40 +59,40 @@
switch (type) {
case DataTypes.CORE_NULL:
- result = in.readNull();
+ result = in.readNull(target);
break;
case DataTypes.CORE_BOOLEAN:
- result = in.readBoolean();
+ result = in.readBoolean(target);
break;
case DataTypes.CORE_NUMBER:
- result = in.readNumber();
+ result = in.readNumber(target);
break;
case DataTypes.CORE_STRING:
result = in.readString();
break;
case DataTypes.CORE_DATE:
- result = in.readDate();
+ result = in.readDate(target);
break;
case DataTypes.CORE_ARRAY:
- result = in.readArray(this);
+ result = in.readArray(this, target);
break;
case DataTypes.CORE_MAP:
- result = in.readMap(this);
+ result = in.readMap(this, target);
break;
case DataTypes.CORE_XML:
- result = in.readXML();
+ result = in.readXML(target);
break;
case DataTypes.CORE_OBJECT:
- result = in.readObject(this);
+ result = in.readObject(this, target);
break;
case DataTypes.CORE_BYTEARRAY:
- result = in.readByteArray();
+ result = in.readByteArray(target);
break;
case DataTypes.OPT_REFERENCE:
- result = in.readReference();
+ result = in.readReference(target);
break;
default:
- result = in.readCustom();
+ result = in.readCustom(target);
break;
}
Modified: java/server/trunk/src/org/red5/io/object/Input.java
==============================================================================
--- java/server/trunk/src/org/red5/io/object/Input.java (original)
+++ java/server/trunk/src/org/red5/io/object/Input.java Wed Sep 24 22:36:51
2008
@@ -21,6 +21,7 @@
import java.util.Date;
import java.util.Map;
+import java.lang.reflect.Type;
import org.red5.io.amf3.ByteArray;
import org.w3c.dom.Document;
@@ -51,19 +52,19 @@
* Read Null data type
* @return Null datatype (AS)
*/
- Object readNull();
+ Object readNull(Type target);
/**
* Read Boolean value
* @return Boolean
*/
- Boolean readBoolean();
+ Boolean readBoolean(Type target);
/**
* Read Number object
* @return Number
*/
- Number readNumber();
+ Number readNumber(Type target);
/**
* Read String object
@@ -75,7 +76,7 @@
* Read date object
* @return Date
*/
- Date readDate();
+ Date readDate(Type target);
/**
* Read an array. This can result in a List or Map being
@@ -83,7 +84,7 @@
*
* @return array
*/
- Object readArray(Deserializer deserializer);
+ Object readArray(Deserializer deserializer, Type target);
/**
* Read a map containing key - value pairs. This can result
@@ -92,39 +93,39 @@
*
* @return Map
*/
- Object readMap(Deserializer deserializer);
+ Object readMap(Deserializer deserializer, Type target);
/**
* Read an object.
*
* @return object
*/
- Object readObject(Deserializer deserializer);
+ Object readObject(Deserializer deserializer, Type target);
/**
* Read XML document
* @return XML DOM document
*/
- Document readXML();
+ Document readXML(Type target);
/**
* Read custom object
* @return Custom object
*/
- Object readCustom();
+ Object readCustom(Type target);
/**
* Read ByteArray object.
*
* @return ByteArray object
*/
- ByteArray readByteArray();
+ ByteArray readByteArray(Type target);
/**
* Read reference to Complex Data Type. Objects that are collaborators
(properties) of other
* objects must be stored as references in map of id-reference pairs.
*/
- Object readReference();
+ Object readReference(Type target);
/**
* Clears all references
Modified:
java/server/trunk/src/org/red5/server/PersistableAttributeStore.java
==============================================================================
--- java/server/trunk/src/org/red5/server/PersistableAttributeStore.java
(original)
+++ java/server/trunk/src/org/red5/server/PersistableAttributeStore.java
Wed Sep 24 22:36:51 2008
@@ -185,10 +185,9 @@
* @param input Input object
* @throws IOException I/O exception
*/
- @SuppressWarnings("unchecked")
public void deserialize(Input input) throws IOException {
Deserializer deserializer = new Deserializer();
- setAttributes(deserializer.<Map>deserialize(input, Map.class));
+ setAttributes(deserializer.<Map<String, Object>>deserialize(input,
Map.class));
}
/**
More information about the Red5devs
mailing list