Further cleanup: always look up streamers by their java name.

- Sliiiiightly less efficient in a few cases.
- But: looking typed arrays up by class didn't work anyway,
  there was some duplicated code in jname and class lookup,
  and the jname thing handles Lists from the server. So
  overall I think this is a win.
Less code is better code.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5610 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2008-12-31 00:41:20 +00:00
parent e9152193b7
commit 7728ed9bd3
4 changed files with 14 additions and 57 deletions
@@ -159,10 +159,11 @@ public class ObjectInputStream
return null; return null;
} }
var streamer :Streamer = (type is Class) var jname :String = type as String;
? Streamer.getStreamerByClass(type as Class) if (type is Class) {
: Streamer.getStreamerByJavaName(type as String); jname = Translations.getToServer(ClassUtil.getClassName(type));
}
var streamer :Streamer = Streamer.getStreamerByJavaName(jname);
if (streamer == null) { if (streamer == null) {
throw new Error("Cannot field stream " + type); throw new Error("Cannot field stream " + type);
} }
+7 -45
View File
@@ -42,39 +42,13 @@ public class Streamer
{ {
public static function getStreamer (obj :Object) :Streamer public static function getStreamer (obj :Object) :Streamer
{ {
var jname :String;
if (obj is TypedArray) { if (obj is TypedArray) {
return getStreamerByJavaName(TypedArray(obj).getJavaType()); jname = TypedArray(obj).getJavaType();
} else { } else {
return getStreamerByClass(ClassUtil.getClass(obj)); jname = Translations.getToServer(ClassUtil.getClassName(obj));
} }
} return getStreamerByJavaName(jname);
public static function getStreamerByClass (clazz :Class) :Streamer
{
initStreamers();
if (clazz === TypedArray) {
throw new Error("Broken, TODO");
}
var streamer :Streamer = _byClass[clazz] as Streamer;
if (streamer != null) {
return streamer;
}
if (ClassUtil.isAssignableAs(Enum, clazz)) {
streamer = new EnumStreamer(clazz);
} else if (ClassUtil.isAssignableAs(Streamable, clazz)) {
streamer = new Streamer(clazz);
} else {
return null;
}
// add the new streamer and return it
registerStreamer(streamer);
return streamer;
} }
public static function getStreamerByJavaName (jname :String) :Streamer public static function getStreamerByJavaName (jname :String) :Streamer
@@ -97,6 +71,9 @@ public class Streamer
} else { } else {
// otherwise see if it represents a Streamable // otherwise see if it represents a Streamable
// usually this is called from ObjectInputStream, but when it's called from
// ObjectOutputStream it's a bit annoying, because we started with a class/object.
// But: the code is smaller, so that wins
var clazz :Class = ClassUtil.getClassByName(Translations.getFromServer(jname)); var clazz :Class = ClassUtil.getClassByName(Translations.getFromServer(jname));
if (ClassUtil.isAssignableAs(Enum, clazz)) { if (ClassUtil.isAssignableAs(Enum, clazz)) {
@@ -131,14 +108,6 @@ public class Streamer
return _jname; return _jname;
} }
/**
* Return the Class identifying that which we stream, or null to not be registered.
*/
public function getClass () :Class
{
return _target;
}
public function writeObject (obj :Object, out :ObjectOutputStream) :void public function writeObject (obj :Object, out :ObjectOutputStream) :void
//throws IOError //throws IOError
{ {
@@ -161,11 +130,6 @@ public class Streamer
protected static function registerStreamer (st :Streamer) :void protected static function registerStreamer (st :Streamer) :void
{ {
_byJName[st.getJavaClassName()] = st; _byJName[st.getJavaClassName()] = st;
trace(": registered " + st.getJavaClassName());
var c :Class = st.getClass();
if (c != null) {
_byClass[c] = st;
}
} }
/** /**
@@ -179,7 +143,6 @@ public class Streamer
return; return;
} }
_byJName = new Dictionary(); _byJName = new Dictionary();
_byClass = new Dictionary();
for each (var c :Class in for each (var c :Class in
[ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer, [ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer,
FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) { FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) {
@@ -191,7 +154,6 @@ public class Streamer
protected var _jname :String; protected var _jname :String;
protected static var _byClass :Dictionary;
protected static var _byJName :Dictionary; protected static var _byJName :Dictionary;
} }
} }
+2 -1
View File
@@ -56,11 +56,12 @@ public class Translations
// initialize some standard classes // initialize some standard classes
addTranslation("Object", "java.lang.Object"); addTranslation("Object", "java.lang.Object");
addTranslation("String", "java.lang.String"); addTranslation("String", "java.lang.String");
addTranslation("flash.utils.ByteArray", "[B");
addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean"); addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean");
addTranslation("com.threerings.util.Byte", "java.lang.Byte"); addTranslation("com.threerings.util.Byte", "java.lang.Byte");
addTranslation("com.threerings.util.Integer", "java.lang.Integer"); addTranslation("com.threerings.util.Integer", "java.lang.Integer");
addTranslation("com.threerings.util.Long", "java.lang.Long"); addTranslation("com.threerings.util.Long", "java.lang.Long");
addTranslation("com.threerings.util.Float", "java.lang.Float"); addTranslation("com.threerings.util.Float", "java.lang.Float");
addTranslation("Array", "[Ljava.lang.Object;");
addTranslation("flash.utils.ByteArray", "[B");
} }
} }
@@ -66,13 +66,6 @@ public class ArrayStreamer extends Streamer
} }
} }
override public function getClass () :Class
{
// this is a little weird, but basically, we don't want to be registered for Array
// unless we're the basic Object array streamer.
return (_jname == "[Ljava.lang.Object;") ? Array : null;
}
override public function createObject (ins :ObjectInputStream) :Object override public function createObject (ins :ObjectInputStream) :Object
{ {
var ta :TypedArray = new TypedArray(_jname); var ta :TypedArray = new TypedArray(_jname);