src/main/java/com/jrjackson/RubyAnySerializer.java in jrjackson-0.2.6 vs src/main/java/com/jrjackson/RubyAnySerializer.java in jrjackson-0.2.7
- old
+ new
@@ -1,116 +1,123 @@
package com.jrjackson;
import java.io.IOException;
-import java.lang.reflect.Type;
import java.util.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import org.jruby.*;
import org.jruby.runtime.ThreadContext;
import org.jruby.internal.runtime.methods.DynamicMethod;
-public class RubyAnySerializer extends StdSerializer<RubyObject>
-{
- /**
- * Singleton instance to use.
- */
- public static final RubyAnySerializer instance = new RubyAnySerializer();
- private static HashMap<Class, Class> class_maps = new HashMap<Class, Class>();
+public class RubyAnySerializer extends StdSerializer<RubyObject> {
- static {
- class_maps.put(RubyBoolean.class, Boolean.class);
- }
+ /**
+ * Singleton instance to use.
+ */
+ public static final RubyAnySerializer instance = new RubyAnySerializer();
+ private static final HashMap<Class, Class> class_maps = new HashMap<Class, Class>();
- public RubyAnySerializer() { super(RubyObject.class); }
-
- private Class<?> rubyJavaClassLookup(Class target)
- {
- Class<?> val = class_maps.get(target);
- if (val == null) {
- return Object.class;
+ static {
+ class_maps.put(RubyBoolean.class, Boolean.class);
}
- return val;
- }
- private void serializeUnknownRubyObject(RubyObject rubyObject, JsonGenerator jgen, SerializerProvider provider)
- throws IOException, JsonGenerationException
- {
- ThreadContext ctx = rubyObject.getRuntime().getCurrentContext();
- RubyClass meta = rubyObject.getMetaClass();
- DynamicMethod method = meta.searchMethod("to_h");
- if (!method.isUndefined()) {
- RubyObject obj = (RubyObject)method.call(ctx, rubyObject, meta, "to_h");
- provider.findTypedValueSerializer(Map.class, true, null).serialize(obj, jgen, provider);
- return;
+ public RubyAnySerializer() {
+ super(RubyObject.class);
}
- method = meta.searchMethod("to_hash");
- if (!method.isUndefined()) {
- RubyObject obj = (RubyObject)method.call(ctx, rubyObject, meta, "to_hash");
- provider.findTypedValueSerializer(Map.class, true, null).serialize(obj, jgen, provider);
- return;
+ private Class<?> rubyJavaClassLookup(Class target) {
+ Class<?> val = class_maps.get(target);
+ if (val == null) {
+ return Object.class;
+ }
+ return val;
}
- method = meta.searchMethod("to_a");
- if (!method.isUndefined()) {
- RubyObject obj = (RubyObject)method.call(ctx, rubyObject, meta, "to_a");
- provider.findTypedValueSerializer(List.class, true, null).serialize(obj, jgen, provider);
- return;
- }
+ private void serializeUnknownRubyObject(RubyObject rubyObject, JsonGenerator jgen, SerializerProvider provider)
+ throws IOException, JsonGenerationException {
+ ThreadContext ctx = rubyObject.getRuntime().getCurrentContext();
+ RubyClass meta = rubyObject.getMetaClass();
- method = meta.searchMethod("to_json");
- if (!method.isUndefined()) {
- RubyObject obj = (RubyObject)method.call(ctx, rubyObject, meta, "to_json");
- if (obj instanceof RubyString) {
- jgen.writeRawValue(obj.toString());
- } else {
- provider.defaultSerializeValue(obj, jgen);
- }
- return;
+ DynamicMethod method = meta.searchMethod("to_time");
+ if (!method.isUndefined()) {
+ RubyObject obj = (RubyObject) method.call(ctx, rubyObject, meta, "to_time");
+ provider.defaultSerializeValue(obj, jgen);
+ return;
+ }
+
+ method = meta.searchMethod("to_h");
+ if (!method.isUndefined()) {
+ RubyObject obj = (RubyObject) method.call(ctx, rubyObject, meta, "to_h");
+ provider.findTypedValueSerializer(Map.class, true, null).serialize(obj, jgen, provider);
+ return;
+ }
+
+ method = meta.searchMethod("to_hash");
+ if (!method.isUndefined()) {
+ RubyObject obj = (RubyObject) method.call(ctx, rubyObject, meta, "to_hash");
+ provider.findTypedValueSerializer(Map.class, true, null).serialize(obj, jgen, provider);
+ return;
+ }
+
+ method = meta.searchMethod("to_a");
+ if (!method.isUndefined()) {
+ RubyObject obj = (RubyObject) method.call(ctx, rubyObject, meta, "to_a");
+ provider.findTypedValueSerializer(List.class, true, null).serialize(obj, jgen, provider);
+ return;
+ }
+
+ method = meta.searchMethod("to_json");
+ if (!method.isUndefined()) {
+ RubyObject obj = (RubyObject) method.call(ctx, rubyObject, meta, "to_json");
+ if (obj instanceof RubyString) {
+ jgen.writeRawValue(obj.toString());
+ } else {
+ provider.defaultSerializeValue(obj, jgen);
+ }
+ return;
+ }
+ throw new JsonGenerationException("Cannot find Serializer for class: " + rubyObject.getClass().getName());
}
- throw new JsonGenerationException("Cannot find Serializer for class: " + rubyObject.getClass().getName());
- }
- @Override
- public void serialize(RubyObject value, JsonGenerator jgen, SerializerProvider provider)
- throws IOException, JsonGenerationException
- {
- if (value instanceof RubySymbol || value instanceof RubyString) {
- jgen.writeString(value.toString());
- } else if (value instanceof RubyHash) {
- provider.findTypedValueSerializer(Map.class, true, null).serialize(value, jgen, provider);
- } else if (value instanceof RubyArray) {
- provider.findTypedValueSerializer(List.class, true, null).serialize(value, jgen, provider);
- } else {
- Object val = value.toJava(rubyJavaClassLookup(value.getClass()));
- if ( val instanceof RubyObject) {
- serializeUnknownRubyObject((RubyObject)val, jgen, provider);
- } else {
- provider.defaultSerializeValue(val, jgen);
- }
+ @Override
+ public void serialize(RubyObject value, JsonGenerator jgen, SerializerProvider provider)
+ throws IOException, JsonGenerationException {
+ if (value instanceof RubySymbol || value instanceof RubyString) {
+ jgen.writeString(value.toString());
+ } else if (value instanceof RubyHash) {
+ provider.findTypedValueSerializer(Map.class, true, null).serialize(value, jgen, provider);
+ } else if (value instanceof RubyArray) {
+ provider.findTypedValueSerializer(List.class, true, null).serialize(value, jgen, provider);
+ } else {
+ Object val = value.toJava(rubyJavaClassLookup(value.getClass()));
+ if (val instanceof RubyObject) {
+ serializeUnknownRubyObject((RubyObject) val, jgen, provider);
+ } else {
+ provider.defaultSerializeValue(val, jgen);
+ }
+ }
}
- }
- /**
- * Default implementation will write type prefix, call regular serialization
- * method (since assumption is that value itself does not need JSON
- * Array or Object start/end markers), and then write type suffix.
- * This should work for most cases; some sub-classes may want to
- * change this behavior.
- */
- @Override
- public void serializeWithType(RubyObject value, JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer)
- throws IOException, JsonGenerationException
- {
- typeSer.writeTypePrefixForScalar(value, jgen);
- serialize(value, jgen, provider);
- typeSer.writeTypeSuffixForScalar(value, jgen);
- }
+ /**
+ * Default implementation will write type prefix, call regular serialization method (since assumption is that value itself does not need JSON Array or Object start/end markers), and then write type suffix. This should work for most cases; some sub-classes may want to change this behavior.
+ *
+ * @param value
+ * @param jgen
+ * @param provider
+ * @param typeSer
+ * @throws java.io.IOException
+ * @throws com.fasterxml.jackson.core.JsonGenerationException
+ */
+ @Override
+ public void serializeWithType(RubyObject value, JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer)
+ throws IOException, JsonGenerationException {
+ typeSer.writeTypePrefixForScalar(value, jgen);
+ serialize(value, jgen, provider);
+ typeSer.writeTypeSuffixForScalar(value, jgen);
+ }
}