[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