diff --git a/src/java/com/threerings/presents/tools/GenActionScriptTask.java b/src/java/com/threerings/presents/tools/GenActionScriptTask.java index 37e5a67c1..a184dee29 100644 --- a/src/java/com/threerings/presents/tools/GenActionScriptTask.java +++ b/src/java/com/threerings/presents/tools/GenActionScriptTask.java @@ -44,6 +44,8 @@ import com.threerings.io.ObjectOutputStream; import com.threerings.io.Streamable; import com.threerings.util.ActionScript; +import com.threerings.util.StreamableArrayList; +import com.threerings.util.StreamableHashMap; import com.threerings.presents.data.InvocationMarshaller; import com.threerings.presents.dobj.DObject; @@ -207,9 +209,21 @@ public class GenActionScriptTask extends GenTask return (Long.TYPE.equals(type) || !type.isPrimitive()) && !String.class.equals(type); } + /** Returns if the given class is an implementation of Map that doesn't know about Streaming */ + protected static boolean isNaiveMap (Class type) + { + return Map.class.isAssignableFrom(type) && !type.equals(StreamableHashMap.class); + } + + /** Returns if the given class is an implementation of List that doesn't know about Streaming */ + protected static boolean isNaiveList (Class type) + { + return List.class.isAssignableFrom(type) && !type.equals(StreamableArrayList.class); + } + protected static String toActionScriptType (Class type, boolean isField) { - if (type.isArray() || List.class.isAssignableFrom(type)) { + if (type.isArray() || isNaiveList(type)) { if (Byte.TYPE.equals(type.getComponentType())) { return "flash.utils.ByteArray"; } @@ -217,7 +231,7 @@ public class GenActionScriptTask extends GenTask return "com.threerings.io.TypedArray"; } return "Array"; - } else if (Map.class.isAssignableFrom(type)) { + } else if (isNaiveMap(type)) { return "com.threerings.util.Map"; } else if (Integer.TYPE.equals(type) || Byte.TYPE.equals(type) || @@ -273,10 +287,10 @@ public class GenActionScriptTask extends GenTask } else if (type.equals(Double.TYPE)) { return "readDouble()"; - } else if (Map.class.isAssignableFrom(type)) { + } else if (isNaiveMap(type)) { return "readField(MapStreamer.INSTANCE)"; - } else if (List.class.isAssignableFrom(type)) { + } else if (isNaiveList(type)) { return "readField(ArrayStreamer.INSTANCE)"; } else if (type.isArray()) { @@ -333,10 +347,10 @@ public class GenActionScriptTask extends GenTask (type.isArray() && type.getComponentType().isPrimitive())) { return "writeField(" + name + ")"; - } else if (List.class.isAssignableFrom(type)) { + } else if (isNaiveList(type)) { return "writeField(" + name + ", ArrayStreamer.INSTANCE)"; - } else if (Map.class.isAssignableFrom(type)) { + } else if (isNaiveMap(type)) { return "writeField(" + name + ", MapStreamer.INSTANCE)"; } else { diff --git a/src/java/com/threerings/util/StreamableArrayList.java b/src/java/com/threerings/util/StreamableArrayList.java index 5715a459e..821b9d1ce 100644 --- a/src/java/com/threerings/util/StreamableArrayList.java +++ b/src/java/com/threerings/util/StreamableArrayList.java @@ -25,17 +25,20 @@ import java.util.ArrayList; import java.io.IOException; +import com.samskivert.annotation.ReplacedBy; + import com.threerings.io.ObjectInputStream; import com.threerings.io.ObjectOutputStream; import com.threerings.io.Streamable; /** - * An {@link ArrayList} extension that can be streamed. The contents of - * the list must also be of streamable types. + * An {@link ArrayList} extension that can be streamed. The contents of the list must also be of + * streamable types. * * @see Streamable * @param the type of elements stored in this list. */ +@ReplacedBy("java.util.List") public class StreamableArrayList extends ArrayList implements Streamable { diff --git a/src/java/com/threerings/util/StreamableHashMap.java b/src/java/com/threerings/util/StreamableHashMap.java index e1f3c23bc..4827aef99 100644 --- a/src/java/com/threerings/util/StreamableHashMap.java +++ b/src/java/com/threerings/util/StreamableHashMap.java @@ -26,6 +26,8 @@ import java.util.Map; import java.io.IOException; +import com.samskivert.annotation.ReplacedBy; + import com.threerings.io.ObjectInputStream; import com.threerings.io.ObjectOutputStream; import com.threerings.io.Streamable; @@ -38,6 +40,7 @@ import com.threerings.io.Streamable; * @param the type of key stored in this map. * @param the type of value stored in this map. */ +@ReplacedBy("java.util.Map") public class StreamableHashMap extends HashMap implements Streamable { diff --git a/tests/src/as/com/threerings/io/ASStreamableSubset.as b/tests/src/as/com/threerings/io/ASStreamableSubset.as index 5db72af7c..61be94a44 100644 --- a/tests/src/as/com/threerings/io/ASStreamableSubset.as +++ b/tests/src/as/com/threerings/io/ASStreamableSubset.as @@ -4,7 +4,7 @@ // // Narya library - tools for developing networked games // Copyright (C) 2002-2010 Three Rings Design, Inc., All Rights Reserved -// http://www.threerings.net/code/narya/ +// http://code.google.com/p/narya/ // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published @@ -30,8 +30,10 @@ import com.threerings.util.Long; import com.threerings.io.TypedArray; import flash.utils.ByteArray; import com.threerings.io.streamers.ArrayStreamer; +import com.threerings.util.StreamableArrayList; import com.threerings.util.Map; import com.threerings.io.streamers.MapStreamer; +import com.threerings.util.StreamableHashMap; // GENERATED PREAMBLE END import com.threerings.util.Integer; @@ -41,8 +43,6 @@ import com.threerings.util.Util; // GENERATED CLASSDECL START public class ASStreamableSubset extends SimpleStreamableObject { - public function ASStreamableSubset () - {} // GENERATED CLASSDECL END public static function createWithJavaDefaults () :ASStreamableSubset @@ -85,12 +85,16 @@ public class ASStreamableSubset extends SimpleStreamableObject return bool1 === o.bool1 && short2 === o.short2 && int3 === o.int3 && long4.equals(o.long4) && float5 === o.float5 && double6 === o.double6 && char7 === o.char7 && byte8 === o.byte8 && string1 === o.string1 && nullString1 === o.nullString1 && + Util.equals(bools, o.bools) && Util.equals(bytes, o.bytes) && Util.equals(ints, o.ints) && Util.equals(nullBools, o.nullBools) && Util.equals(nullBytes, o.nullBytes) && Util.equals(nullInts, o.nullInts) && + Util.equals(strings, o.strings) && Util.equals(nullStrings, o.nullStrings) && + Util.equals(sal, o.sal) && + Maps.equals(stringMap, o.stringMap) && Maps.equals(stringIntMap, o.stringIntMap) - Maps.equals(nullStringMap, o.nullStringMap); + Maps.equals(nullStringMap, o.nullStringMap) && Maps.equals(shm, o.shm); } @@ -113,9 +117,11 @@ public class ASStreamableSubset extends SimpleStreamableObject public var nullInts :TypedArray; public var strings :TypedArray; public var nullStrings :TypedArray; + public var sal :StreamableArrayList; public var stringMap :Map; public var stringIntMap :Map; public var nullStringMap :Map; + public var shm :StreamableHashMap; override public function readObject (ins :ObjectInputStream) :void { @@ -138,9 +144,11 @@ public class ASStreamableSubset extends SimpleStreamableObject nullInts = ins.readField(TypedArray.getJavaType(int)); strings = ins.readField(ArrayStreamer.INSTANCE); nullStrings = ins.readField(ArrayStreamer.INSTANCE); + sal = ins.readObject(StreamableArrayList); stringMap = ins.readField(MapStreamer.INSTANCE); stringIntMap = ins.readField(MapStreamer.INSTANCE); nullStringMap = ins.readField(MapStreamer.INSTANCE); + shm = ins.readObject(StreamableHashMap); } override public function writeObject (out :ObjectOutputStream) :void @@ -164,9 +172,11 @@ public class ASStreamableSubset extends SimpleStreamableObject out.writeField(nullInts); out.writeField(strings, ArrayStreamer.INSTANCE); out.writeField(nullStrings, ArrayStreamer.INSTANCE); + out.writeObject(sal); out.writeField(stringMap, MapStreamer.INSTANCE); out.writeField(stringIntMap, MapStreamer.INSTANCE); out.writeField(nullStringMap, MapStreamer.INSTANCE); + out.writeObject(shm); } // GENERATED STREAMING END diff --git a/tests/src/as/com/threerings/io/StreamableTest.as b/tests/src/as/com/threerings/io/StreamableTest.as index 0d403679e..a42239176 100644 --- a/tests/src/as/com/threerings/io/StreamableTest.as +++ b/tests/src/as/com/threerings/io/StreamableTest.as @@ -56,9 +56,9 @@ public class StreamableTest extends TestCase "01000200000003000000000000000440a0000040180000000000000007080100036f6e6500010000" + "0003010001010000000301020301000000030000000100000002000000030000000100000003fffe" + "00106a6176612e6c616e672e537472696e6700036f6e650002000374776f00020005746872656500" + - "01000000030002000374776f0002000132000200036f6e6500020001310002000574687265650002" + - "00013301000000030002000374776ffffd00116a6176612e6c616e672e496e746567657200000002" + - "000200036f6e6500030000000100020005746872656500030000000300"); + "000001000000030002000374776f0002000132000200036f6e650002000131000200057468726565" + + "000200013301000000030002000374776ffffd00116a6176612e6c616e672e496e74656765720000" + + "0002000200036f6e65000300000001000200057468726565000300000003000000"); var input:ObjectInputStream = new ObjectInputStream(javaData); var read :ASStreamableSubset = input.readObject(ASStreamableSubset); assertTrue(sub.equals(read));