jrjackson 0.2.8 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.jrubyrc +1 -1
- data/dependency-reduced-pom.xml +1 -1
- data/jrjackson.gemspec +1 -1
- data/lib/jrjackson/build_info.rb +5 -1
- data/lib/jrjackson/jars/{jrjackson-1.2.11.jar → jrjackson-1.2.12.jar} +0 -0
- data/lib/jrjackson/jrjackson.rb +2 -2
- data/pom.xml +1 -1
- data/src/main/java/com/jrjackson/JrJacksonRaw.java +2 -3
- data/src/main/java/com/jrjackson/RubyAnySerializer.java +70 -21
- data/src/main/java/com/jrjackson/RubyJacksonModule.java +4 -4
- data/src/main/java/com/jrjackson/RubyUtils.java +37 -2
- data/test/jrjackson_test.rb +10 -0
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0da8217b380c2b90375f404bd62e1bd1fd9cfac
|
4
|
+
data.tar.gz: bef6c6e1bd90a0c8eb5159b3499774f46b08923d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 393220a4be40ca38b4147fb62d5e618c423b99ca859895b3da08e671482224dc9f4b9946f58d6ddc2c26699b681398e3c082950c37c8d0391996c8e3c3da3735
|
7
|
+
data.tar.gz: d0020e8cfe4fa216c2bf4015f607123ff119d07df45d44057e362a66c57a158818a07a262c90820e3dbde4de0d8d8a52d868b1434b4bb547a4850368ba9b28e2
|
data/.jrubyrc
CHANGED
@@ -87,7 +87,7 @@ invokedynamic.invocation=true
|
|
87
87
|
|
88
88
|
# Use SwitchPoint for class modification guards on invocations.
|
89
89
|
# Options: [true, false], Default: true.
|
90
|
-
invokedynamic.invocation.switchpoint=true
|
90
|
+
# invokedynamic.invocation.switchpoint=true
|
91
91
|
|
92
92
|
# Also bind indirect method invokers to invokedynamic.
|
93
93
|
# Options: [true, false], Default: true.
|
data/dependency-reduced-pom.xml
CHANGED
data/jrjackson.gemspec
CHANGED
@@ -7,7 +7,7 @@ require 'jrjackson/build_info'
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = 'jrjackson'
|
9
9
|
s.version = JrJackson::BuildInfo.version
|
10
|
-
s.date =
|
10
|
+
s.date = JrJackson::BuildInfo.release_date
|
11
11
|
s.platform = Gem::Platform::RUBY
|
12
12
|
s.authors = ['Guy Boertje']
|
13
13
|
s.email = ['guyboertje@gmail.com']
|
data/lib/jrjackson/build_info.rb
CHANGED
Binary file
|
data/lib/jrjackson/jrjackson.rb
CHANGED
@@ -3,8 +3,8 @@ unless RUBY_PLATFORM =~ /java/
|
|
3
3
|
exit 255
|
4
4
|
end
|
5
5
|
|
6
|
-
require_relative "jars/jrjackson-1.2.
|
7
|
-
# require_relative "linked/jrjackson-1.2.
|
6
|
+
require_relative "jars/jrjackson-1.2.12.jar"
|
7
|
+
# require_relative "linked/jrjackson-1.2.12.jar"
|
8
8
|
|
9
9
|
require 'com/jrjackson/jr_jackson'
|
10
10
|
|
data/pom.xml
CHANGED
@@ -126,11 +126,11 @@ public class JrJacksonRaw extends RubyObject {
|
|
126
126
|
Object obj = args[0].toJava(Object.class);
|
127
127
|
RubyHash options = (args.length <= 1) ? RubyHash.newHash(_ruby) : args[1].convertToHash();
|
128
128
|
String format = (String) options.get(RubyUtils.rubySymbol(_ruby, "date_format"));
|
129
|
-
|
129
|
+
|
130
130
|
ObjectMapper mapper = RubyJacksonModule.mappedAs("raw", _ruby);
|
131
131
|
// same format as Ruby Time #to_s
|
132
132
|
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
|
133
|
-
|
133
|
+
|
134
134
|
if (format != null) {
|
135
135
|
simpleFormat = new SimpleDateFormat(format);
|
136
136
|
String timezone = (String) options.get(RubyUtils.rubySymbol(_ruby, "timezone"));
|
@@ -139,7 +139,6 @@ public class JrJacksonRaw extends RubyObject {
|
|
139
139
|
}
|
140
140
|
}
|
141
141
|
mapper.setDateFormat(simpleFormat);
|
142
|
-
|
143
142
|
try {
|
144
143
|
String s = mapper.writeValueAsString(obj);
|
145
144
|
return RubyUtils.rubyString(_ruby, s);
|
@@ -9,12 +9,16 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer;
|
|
9
9
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
10
10
|
|
11
11
|
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
|
12
|
+
import java.math.BigDecimal;
|
13
|
+
import java.math.BigInteger;
|
12
14
|
|
13
15
|
import org.jruby.*;
|
16
|
+
import org.jruby.ext.bigdecimal.RubyBigDecimal;
|
14
17
|
import org.jruby.runtime.ThreadContext;
|
15
18
|
import org.jruby.internal.runtime.methods.DynamicMethod;
|
19
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
16
20
|
|
17
|
-
public class RubyAnySerializer extends StdSerializer<
|
21
|
+
public class RubyAnySerializer extends StdSerializer<IRubyObject> {
|
18
22
|
|
19
23
|
/**
|
20
24
|
* Singleton instance to use.
|
@@ -23,29 +27,31 @@ public class RubyAnySerializer extends StdSerializer<RubyObject> {
|
|
23
27
|
private static final HashMap<Class, Class> class_maps = new HashMap<Class, Class>();
|
24
28
|
|
25
29
|
static {
|
30
|
+
// not need now - clean up required
|
26
31
|
class_maps.put(RubyBoolean.class, Boolean.class);
|
32
|
+
class_maps.put(RubyFloat.class, Double.class);
|
33
|
+
class_maps.put(RubyFixnum.class, Long.class);
|
34
|
+
class_maps.put(RubyBignum.class, BigInteger.class);
|
35
|
+
class_maps.put(RubyBigDecimal.class, BigDecimal.class);
|
27
36
|
}
|
28
37
|
|
29
38
|
public RubyAnySerializer() {
|
30
|
-
super(
|
39
|
+
super(IRubyObject.class);
|
31
40
|
}
|
32
41
|
|
33
42
|
private Class<?> rubyJavaClassLookup(Class target) {
|
34
|
-
|
35
|
-
if (val == null) {
|
36
|
-
return Object.class;
|
37
|
-
}
|
38
|
-
return val;
|
43
|
+
return class_maps.get(target);
|
39
44
|
}
|
40
45
|
|
41
|
-
private void serializeUnknownRubyObject(ThreadContext ctx,
|
46
|
+
private void serializeUnknownRubyObject(ThreadContext ctx, IRubyObject rubyObject, JsonGenerator jgen, SerializerProvider provider)
|
42
47
|
throws IOException, JsonGenerationException {
|
43
48
|
RubyClass meta = rubyObject.getMetaClass();
|
44
49
|
|
45
50
|
DynamicMethod method = meta.searchMethod("to_time");
|
46
51
|
if (!method.isUndefined()) {
|
47
|
-
|
48
|
-
|
52
|
+
RubyTime dt = (RubyTime) method.call(ctx, rubyObject, meta, "to_time");
|
53
|
+
String time = RubyUtils.jodaTimeString(dt.getDateTime());
|
54
|
+
jgen.writeString(time);
|
49
55
|
return;
|
50
56
|
}
|
51
57
|
|
@@ -84,25 +90,68 @@ public class RubyAnySerializer extends StdSerializer<RubyObject> {
|
|
84
90
|
}
|
85
91
|
|
86
92
|
@Override
|
87
|
-
public void serialize(
|
93
|
+
public void serialize(IRubyObject value, JsonGenerator jgen, SerializerProvider provider)
|
88
94
|
throws IOException, JsonGenerationException {
|
89
95
|
ThreadContext ctx = value.getRuntime().getCurrentContext();
|
90
|
-
if (value
|
96
|
+
if (value.isNil()) {
|
97
|
+
|
98
|
+
jgen.writeNull(); // for RubyNil and NullObjects
|
99
|
+
|
100
|
+
} else if (value instanceof RubyString) {
|
101
|
+
|
102
|
+
jgen.writeString(value.toString());
|
103
|
+
|
104
|
+
} else if (value instanceof RubySymbol) {
|
105
|
+
|
91
106
|
jgen.writeString(value.toString());
|
107
|
+
|
108
|
+
} else if (value instanceof RubyBoolean) {
|
109
|
+
|
110
|
+
jgen.writeBoolean(value.isTrue());
|
111
|
+
|
112
|
+
} else if (value instanceof RubyFloat) {
|
113
|
+
|
114
|
+
jgen.writeNumber(RubyNumeric.num2dbl(value));
|
115
|
+
|
116
|
+
} else if (value instanceof RubyFixnum) {
|
117
|
+
|
118
|
+
jgen.writeNumber(RubyNumeric.num2long(value));
|
119
|
+
|
120
|
+
} else if (value instanceof RubyBignum) {
|
121
|
+
|
122
|
+
jgen.writeNumber(((RubyBignum) value).getBigIntegerValue());
|
123
|
+
|
124
|
+
} else if (value instanceof RubyBigDecimal) {
|
125
|
+
|
126
|
+
jgen.writeNumber(((RubyBigDecimal) value).getBigDecimalValue());
|
127
|
+
|
92
128
|
} else if (value instanceof RubyHash) {
|
93
|
-
|
129
|
+
|
130
|
+
provider.findTypedValueSerializer(value.getJavaClass(), true, null).serialize(value, jgen, provider);
|
131
|
+
|
94
132
|
} else if (value instanceof RubyArray) {
|
95
|
-
|
133
|
+
|
134
|
+
provider.findTypedValueSerializer(value.getJavaClass(), true, null).serialize(value, jgen, provider);
|
135
|
+
|
96
136
|
} else if (value instanceof RubyStruct) {
|
97
|
-
|
98
|
-
|
137
|
+
|
138
|
+
IRubyObject obj = value.callMethod(ctx, "to_a");
|
139
|
+
provider.findTypedValueSerializer(obj.getJavaClass(), true, null).serialize(obj, jgen, provider);
|
140
|
+
|
99
141
|
} else {
|
100
|
-
|
101
|
-
|
102
|
-
|
142
|
+
|
143
|
+
Class<?> cls = rubyJavaClassLookup(value.getClass());
|
144
|
+
if (cls != null) {
|
145
|
+
Object val = value.toJava(cls);
|
146
|
+
if (val != null) {
|
147
|
+
provider.defaultSerializeValue(val, jgen);
|
148
|
+
} else {
|
149
|
+
serializeUnknownRubyObject(ctx, value, jgen, provider);
|
150
|
+
}
|
103
151
|
} else {
|
104
|
-
|
152
|
+
serializeUnknownRubyObject(ctx, value, jgen, provider);
|
105
153
|
}
|
154
|
+
|
106
155
|
}
|
107
156
|
}
|
108
157
|
|
@@ -117,7 +166,7 @@ public class RubyAnySerializer extends StdSerializer<RubyObject> {
|
|
117
166
|
* @throws com.fasterxml.jackson.core.JsonGenerationException
|
118
167
|
*/
|
119
168
|
@Override
|
120
|
-
public void serializeWithType(
|
169
|
+
public void serializeWithType(IRubyObject value, JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer)
|
121
170
|
throws IOException, JsonGenerationException {
|
122
171
|
typeSer.writeTypePrefixForScalar(value, jgen);
|
123
172
|
serialize(value, jgen, provider);
|
@@ -1,6 +1,5 @@
|
|
1
1
|
package com.jrjackson;
|
2
2
|
|
3
|
-
import java.text.SimpleDateFormat;
|
4
3
|
|
5
4
|
import org.jruby.*;
|
6
5
|
|
@@ -9,11 +8,12 @@ import com.fasterxml.jackson.databind.module.SimpleModule;
|
|
9
8
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
10
9
|
import com.fasterxml.jackson.core.util.VersionUtil;
|
11
10
|
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
|
11
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
12
12
|
|
13
13
|
public class RubyJacksonModule extends SimpleModule {
|
14
14
|
|
15
15
|
private static final ObjectMapper static_mapper = new ObjectMapper().registerModule(
|
16
|
-
new RubyJacksonModule().addSerializer(
|
16
|
+
new RubyJacksonModule().addSerializer(IRubyObject.class, RubyAnySerializer.instance)
|
17
17
|
);
|
18
18
|
|
19
19
|
static {
|
@@ -49,7 +49,7 @@ public class RubyJacksonModule extends SimpleModule {
|
|
49
49
|
|
50
50
|
public static SimpleModule asSym(Ruby ruby) {
|
51
51
|
return new RubyJacksonModule().addSerializer(
|
52
|
-
|
52
|
+
IRubyObject.class, RubyAnySerializer.instance
|
53
53
|
).addDeserializer(
|
54
54
|
Object.class, new RubyObjectDeserializer().withRuby(ruby).setSymbolStrategy()
|
55
55
|
);
|
@@ -57,7 +57,7 @@ public class RubyJacksonModule extends SimpleModule {
|
|
57
57
|
|
58
58
|
public static SimpleModule asStr(Ruby ruby) {
|
59
59
|
return new RubyJacksonModule().addSerializer(
|
60
|
-
|
60
|
+
IRubyObject.class, RubyAnySerializer.instance
|
61
61
|
).addDeserializer(
|
62
62
|
Object.class, new RubyObjectDeserializer().withRuby(ruby).setStringStrategy()
|
63
63
|
);
|
@@ -4,7 +4,10 @@ import java.util.*;
|
|
4
4
|
|
5
5
|
import java.math.BigDecimal;
|
6
6
|
import java.math.BigInteger;
|
7
|
-
import
|
7
|
+
import org.joda.time.DateTime;
|
8
|
+
import org.joda.time.DateTimeZone;
|
9
|
+
import org.joda.time.format.DateTimeFormat;
|
10
|
+
import org.joda.time.format.DateTimeFormatter;
|
8
11
|
|
9
12
|
import org.jruby.*;
|
10
13
|
import org.jruby.javasupport.JavaUtil;
|
@@ -13,6 +16,9 @@ import org.jruby.util.SafeDoubleParser;
|
|
13
16
|
|
14
17
|
public class RubyUtils {
|
15
18
|
|
19
|
+
private final static DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z").withLocale(Locale.ENGLISH);
|
20
|
+
private final static DateTimeFormatter UTC_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss 'UTC'").withLocale(Locale.ENGLISH);
|
21
|
+
|
16
22
|
public static RubyObject rubyObject(Ruby ruby, Object node) {
|
17
23
|
return (RubyObject) JavaUtil.convertJavaToRuby(ruby, node);
|
18
24
|
}
|
@@ -32,7 +38,7 @@ public class RubyUtils {
|
|
32
38
|
public static RubySymbol rubySymbol(Ruby ruby, String node) {
|
33
39
|
return RubySymbol.newSymbol(ruby, node);
|
34
40
|
}
|
35
|
-
|
41
|
+
|
36
42
|
public static RubyArray rubyArray(Ruby ruby, Object[] arg) {
|
37
43
|
return (RubyArray) JavaUtil.convertJavaToRuby(ruby, arg);
|
38
44
|
}
|
@@ -73,4 +79,33 @@ public class RubyUtils {
|
|
73
79
|
public static RubyBoolean rubyBoolean(Ruby ruby, Boolean arg) {
|
74
80
|
return ruby.newBoolean(arg);
|
75
81
|
}
|
82
|
+
|
83
|
+
public static String jodaTimeString(DateTime dt) {
|
84
|
+
// copied from the RubyTime to_s method
|
85
|
+
// to prevent the double handling of a String -> RubyString -> String
|
86
|
+
DateTimeFormatter simpleDateFormat;
|
87
|
+
if (dt.getZone() == DateTimeZone.UTC) {
|
88
|
+
simpleDateFormat = UTC_FORMATTER;
|
89
|
+
} else {
|
90
|
+
simpleDateFormat = FORMATTER;
|
91
|
+
}
|
92
|
+
|
93
|
+
return simpleDateFormat.print(dt);
|
94
|
+
|
95
|
+
// JrJackson: no access to private boolean isTzRelative
|
96
|
+
|
97
|
+
// String result = simpleDateFormat.print(dt);
|
98
|
+
//
|
99
|
+
// if (isTzRelative) {
|
100
|
+
// // display format needs to invert the UTC offset if this object was
|
101
|
+
// // created with a specific offset in the 7-arg form of #new
|
102
|
+
// DateTimeZone dtz = dt.getZone();
|
103
|
+
// int offset = dtz.toTimeZone().getOffset(dt.getMillis());
|
104
|
+
// DateTimeZone invertedDTZ = DateTimeZone.forOffsetMillis(offset);
|
105
|
+
// DateTime invertedDT = dt.withZone(invertedDTZ);
|
106
|
+
// result = simpleDateFormat.print(invertedDT);
|
107
|
+
// }
|
108
|
+
//
|
109
|
+
// return result;
|
110
|
+
}
|
76
111
|
}
|
data/test/jrjackson_test.rb
CHANGED
@@ -204,6 +204,16 @@ class JrJacksonTest < Test::Unit::TestCase
|
|
204
204
|
assert_bigdecimal_similar expected, actual
|
205
205
|
end
|
206
206
|
|
207
|
+
def test_cannot_serialize_object
|
208
|
+
err = assert_raises(JrJackson::ParseError) { JrJackson::Json.dump({"foo" => Object.new}) }
|
209
|
+
assert_match /Cannot find Serializer for class: org.jruby.RubyObject/, err.message
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_cannot_serialize_basic_object
|
213
|
+
err = assert_raises(JrJackson::ParseError) { JrJackson::Json.dump({"foo" => BasicObject.new}) }
|
214
|
+
assert_match /Cannot find Serializer for class: org.jruby.RubyBasicObject/, err.message
|
215
|
+
end
|
216
|
+
|
207
217
|
def assert_bigdecimal_equal(expected, actual)
|
208
218
|
assert_equal expected, actual
|
209
219
|
assert_equal expected.class, actual.class
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jrjackson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guy Boertje
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -41,7 +41,7 @@ files:
|
|
41
41
|
- jrjackson.gemspec
|
42
42
|
- lib/jrjackson.rb
|
43
43
|
- lib/jrjackson/build_info.rb
|
44
|
-
- lib/jrjackson/jars/jrjackson-1.2.
|
44
|
+
- lib/jrjackson/jars/jrjackson-1.2.12.jar
|
45
45
|
- lib/jrjackson/jrjackson.rb
|
46
46
|
- lib/require_relative_patch.rb
|
47
47
|
- pom.xml
|
@@ -79,9 +79,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
version: '0'
|
80
80
|
requirements: []
|
81
81
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.
|
82
|
+
rubygems_version: 2.4.5
|
83
83
|
signing_key:
|
84
84
|
specification_version: 4
|
85
85
|
summary: A JRuby wrapper for the java jackson json processor jar
|
86
86
|
test_files: []
|
87
|
-
has_rdoc:
|