jrjackson 0.2.9 → 0.3.0
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 → .__jrubyrc} +2 -2
- data/.gitignore +5 -0
- data/Gemfile +1 -0
- data/alt_bench.rb +46 -0
- data/dependency-reduced-pom.xml +6 -5
- data/lib/jrjackson/build_info.rb +2 -2
- data/lib/jrjackson/jars/jrjackson-1.2.16.jar +0 -0
- data/lib/jrjackson/jrjackson.rb +38 -13
- data/pom.xml +11 -10
- data/run_all_individual_bench.sh +17 -15
- data/run_jruby_individual_bench.sh +20 -0
- data/run_mri_individual_bench.sh +7 -0
- data/src/main/java/com/jrjackson/IParseHandler.java +53 -0
- data/src/main/java/com/jrjackson/JavaBigDecimalValueConverter.java +17 -0
- data/src/main/java/com/jrjackson/JavaBigIntValueConverter.java +17 -0
- data/src/main/java/com/jrjackson/JavaConverter.java +10 -0
- data/src/main/java/com/jrjackson/JavaFloatValueConverter.java +16 -0
- data/src/main/java/com/jrjackson/JavaHandler.java +118 -0
- data/src/main/java/com/jrjackson/JavaLongValueConverter.java +16 -0
- data/src/main/java/com/jrjackson/JjParse.java +147 -0
- data/src/main/java/com/jrjackson/JrJacksonBase.java +159 -0
- data/src/main/java/com/jrjackson/JrJacksonJava.java +81 -0
- data/src/main/java/com/jrjackson/JrJacksonRaw.java +59 -102
- data/src/main/java/com/jrjackson/JrJacksonRuby.java +117 -0
- data/src/main/java/com/jrjackson/JrJacksonSaj.java +26 -0
- data/src/main/java/com/jrjackson/JrJacksonSch.java +25 -0
- data/src/main/java/com/jrjackson/JrJacksonService.java +15 -0
- data/src/main/java/com/jrjackson/JrParse.java +149 -0
- data/src/main/java/com/jrjackson/RubyAnySerializer.java +112 -55
- data/src/main/java/com/jrjackson/RubyBigDecimalValueConverter.java +18 -0
- data/src/main/java/com/jrjackson/RubyBigIntValueConverter.java +21 -0
- data/src/main/java/com/jrjackson/RubyConverter.java +12 -0
- data/src/main/java/com/jrjackson/RubyDateFormat.java +36 -0
- data/src/main/java/com/jrjackson/RubyFloatValueConverter.java +18 -0
- data/src/main/java/com/jrjackson/RubyHandler.java +119 -0
- data/src/main/java/com/jrjackson/RubyIntValueConverter.java +18 -0
- data/src/main/java/com/jrjackson/RubyJacksonModule.java +40 -38
- data/src/main/java/com/jrjackson/RubyNameConverter.java +9 -0
- data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +24 -33
- data/src/main/java/com/jrjackson/RubyStringConverter.java +1 -2
- data/src/main/java/com/jrjackson/{RubySymbolConverter.java → RubyStringKeyConverter.java} +3 -2
- data/src/main/java/com/jrjackson/RubyStringNameConverter.java +12 -0
- data/src/main/java/com/jrjackson/RubySymbolKeyConverter.java +15 -0
- data/src/main/java/com/jrjackson/RubySymbolNameConverter.java +12 -0
- data/src/main/java/com/jrjackson/RubyUtils.java +40 -1
- data/src/main/java/com/jrjackson/SajParse.java +169 -0
- data/src/main/java/com/jrjackson/SchParse.java +209 -0
- data/src/main/java/com/jrjackson/StreamParse.java +66 -0
- data/test/jrjackson_test.rb +271 -6
- metadata +49 -17
- data/src/test/java/com/jrjackson/jruby/AppTest.java +0 -38
@@ -0,0 +1,36 @@
|
|
1
|
+
/*
|
2
|
+
* To change this license header, choose License Headers in Project Properties.
|
3
|
+
* To change this template file, choose Tools | Templates
|
4
|
+
* and open the template in the editor.
|
5
|
+
*/
|
6
|
+
package com.jrjackson;
|
7
|
+
|
8
|
+
import java.text.DateFormatSymbols;
|
9
|
+
import java.text.FieldPosition;
|
10
|
+
import java.text.SimpleDateFormat;
|
11
|
+
import java.util.Date;
|
12
|
+
import java.util.Locale;
|
13
|
+
|
14
|
+
/**
|
15
|
+
*
|
16
|
+
* @author guy
|
17
|
+
*/
|
18
|
+
public class RubyDateFormat extends SimpleDateFormat{
|
19
|
+
|
20
|
+
public RubyDateFormat() {
|
21
|
+
}
|
22
|
+
|
23
|
+
public RubyDateFormat(String pattern) {
|
24
|
+
super(pattern);
|
25
|
+
}
|
26
|
+
|
27
|
+
public RubyDateFormat(String pattern, Locale locale) {
|
28
|
+
super(pattern, locale);
|
29
|
+
}
|
30
|
+
|
31
|
+
public RubyDateFormat(String pattern, DateFormatSymbols formatSymbols) {
|
32
|
+
|
33
|
+
super(pattern, formatSymbols);
|
34
|
+
}
|
35
|
+
|
36
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.core.JsonParser;
|
4
|
+
import java.io.IOException;
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyObject;
|
7
|
+
|
8
|
+
/**
|
9
|
+
*
|
10
|
+
* @author Guy Boertje
|
11
|
+
*/
|
12
|
+
public class RubyFloatValueConverter implements RubyConverter {
|
13
|
+
|
14
|
+
@Override
|
15
|
+
public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
|
16
|
+
return RubyUtils.rubyFloat(ruby, jp.getDoubleValue());
|
17
|
+
}
|
18
|
+
}
|
@@ -0,0 +1,119 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.core.JsonParser;
|
4
|
+
import java.io.IOException;
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyArray;
|
7
|
+
import org.jruby.RubyHash;
|
8
|
+
import org.jruby.runtime.ThreadContext;
|
9
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
10
|
+
|
11
|
+
/**
|
12
|
+
*
|
13
|
+
* @author Guy Boertje
|
14
|
+
*/
|
15
|
+
public class RubyHandler implements IParseHandler<IRubyObject, RubyArray, RubyHash> {
|
16
|
+
|
17
|
+
private final Ruby _ruby;
|
18
|
+
private final ThreadContext _ctx;
|
19
|
+
private final RubyNameConverter _keyConv;
|
20
|
+
private final RubyConverter _intConv;
|
21
|
+
private final RubyConverter _floatConv;
|
22
|
+
private final RubyConverter _strConv;
|
23
|
+
private IRubyObject _result;
|
24
|
+
|
25
|
+
public RubyHandler(ThreadContext ctx,
|
26
|
+
RubyNameConverter keyConverter,
|
27
|
+
RubyConverter intConverter,
|
28
|
+
RubyConverter floatConverter) {
|
29
|
+
|
30
|
+
_ctx = ctx;
|
31
|
+
_ruby = ctx.runtime;
|
32
|
+
_keyConv = keyConverter;
|
33
|
+
_intConv = intConverter;
|
34
|
+
_floatConv = floatConverter;
|
35
|
+
_strConv = new RubyStringConverter();
|
36
|
+
}
|
37
|
+
|
38
|
+
@Override
|
39
|
+
public void addValue(IRubyObject value) {
|
40
|
+
|
41
|
+
_result = value;
|
42
|
+
}
|
43
|
+
|
44
|
+
@Override
|
45
|
+
public IRubyObject hashStart() {
|
46
|
+
return RubyHash.newHash(_ruby);
|
47
|
+
}
|
48
|
+
|
49
|
+
@Override
|
50
|
+
public void hashEnd() {
|
51
|
+
|
52
|
+
}
|
53
|
+
|
54
|
+
@Override
|
55
|
+
public IRubyObject hashKey(String key) {
|
56
|
+
return _keyConv.convert(_ruby, key);
|
57
|
+
}
|
58
|
+
|
59
|
+
@Override
|
60
|
+
public void hashSet(RubyHash hash, IRubyObject key, IRubyObject value) {
|
61
|
+
hash.fastASet(key, value);
|
62
|
+
}
|
63
|
+
|
64
|
+
@Override
|
65
|
+
public IRubyObject arrayStart() {
|
66
|
+
return RubyArray.newArray(_ruby);
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
public void arrayEnd() {
|
71
|
+
|
72
|
+
}
|
73
|
+
|
74
|
+
@Override
|
75
|
+
public void arrayAppend(RubyArray array, IRubyObject value) {
|
76
|
+
array.append(value);
|
77
|
+
}
|
78
|
+
|
79
|
+
@Override
|
80
|
+
public IRubyObject treatNull() {
|
81
|
+
return _ctx.nil;
|
82
|
+
}
|
83
|
+
|
84
|
+
@Override
|
85
|
+
public IRubyObject treatInt(JsonParser jp) throws IOException {
|
86
|
+
return _intConv.convert(_ruby, jp);
|
87
|
+
}
|
88
|
+
|
89
|
+
@Override
|
90
|
+
public IRubyObject treatFloat(JsonParser jp) throws IOException {
|
91
|
+
return _floatConv.convert(_ruby, jp);
|
92
|
+
}
|
93
|
+
|
94
|
+
@Override
|
95
|
+
public IRubyObject treatString(JsonParser jp) throws IOException {
|
96
|
+
return _strConv.convert(_ruby, jp);
|
97
|
+
}
|
98
|
+
|
99
|
+
@Override
|
100
|
+
public IRubyObject trueValue() {
|
101
|
+
return _ruby.newBoolean(true);
|
102
|
+
}
|
103
|
+
|
104
|
+
@Override
|
105
|
+
public IRubyObject falseValue() {
|
106
|
+
return _ruby.newBoolean(false);
|
107
|
+
}
|
108
|
+
|
109
|
+
@Override
|
110
|
+
public IRubyObject getResult() {
|
111
|
+
return _result;
|
112
|
+
}
|
113
|
+
|
114
|
+
@Override
|
115
|
+
public void raiseError(String e) {
|
116
|
+
throw ParseError.newParseError(_ruby, e);
|
117
|
+
}
|
118
|
+
|
119
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.core.JsonParser;
|
4
|
+
import java.io.IOException;
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyObject;
|
7
|
+
|
8
|
+
/**
|
9
|
+
*
|
10
|
+
* @author Guy Boertje
|
11
|
+
*/
|
12
|
+
public class RubyIntValueConverter implements RubyConverter {
|
13
|
+
|
14
|
+
@Override
|
15
|
+
public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
|
16
|
+
return RubyUtils.rubyFixnum(ruby, jp.getLongValue());
|
17
|
+
}
|
18
|
+
}
|
@@ -1,20 +1,21 @@
|
|
1
1
|
package com.jrjackson;
|
2
2
|
|
3
|
-
|
4
|
-
import
|
5
|
-
|
3
|
+
import com.fasterxml.jackson.core.JsonFactory;
|
4
|
+
import com.fasterxml.jackson.core.Version;
|
6
5
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
7
6
|
import com.fasterxml.jackson.databind.module.SimpleModule;
|
8
7
|
import com.fasterxml.jackson.databind.SerializationFeature;
|
9
|
-
import com.fasterxml.jackson.
|
8
|
+
import com.fasterxml.jackson.databind.DeserializationFeature;
|
9
|
+
import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider;
|
10
10
|
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
|
11
|
-
import
|
11
|
+
import java.text.SimpleDateFormat;
|
12
|
+
|
13
|
+
import org.jruby.Ruby;
|
12
14
|
|
13
15
|
public class RubyJacksonModule extends SimpleModule {
|
14
16
|
|
15
|
-
private static final ObjectMapper static_mapper = new ObjectMapper()
|
16
|
-
|
17
|
-
);
|
17
|
+
private static final ObjectMapper static_mapper = new ObjectMapper();
|
18
|
+
public static final JsonFactory factory = new JsonFactory(static_mapper);
|
18
19
|
|
19
20
|
static {
|
20
21
|
static_mapper.registerModule(new AfterburnerModule());
|
@@ -22,44 +23,45 @@ public class RubyJacksonModule extends SimpleModule {
|
|
22
23
|
}
|
23
24
|
|
24
25
|
private RubyJacksonModule() {
|
25
|
-
super("JrJacksonStrModule",
|
26
|
+
super("JrJacksonStrModule", new Version(1, 2, 16, "0", "com.jrjackson.jruby", "jrjackson"));
|
26
27
|
}
|
27
28
|
|
28
|
-
public static ObjectMapper
|
29
|
-
|
30
|
-
return static_mapper;
|
31
|
-
}
|
29
|
+
public static ObjectMapper mapperWith(Ruby ruby, RubyKeyConverter nameConverter,
|
30
|
+
RubyConverter intConverter, RubyConverter floatConverter){
|
32
31
|
|
33
|
-
|
34
|
-
|
32
|
+
return static_mapper.copy().registerModule(
|
33
|
+
new RubyJacksonModule().addDeserializer(
|
34
|
+
Object.class,
|
35
|
+
new RubyObjectDeserializer().with(ruby, nameConverter, intConverter, floatConverter)
|
36
|
+
)
|
35
37
|
);
|
38
|
+
}
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
return mapper;
|
40
|
+
// public static ObjectMapper rawMapper() {
|
41
|
+
// return static_mapper.registerModule(
|
42
|
+
// new RubyJacksonModule().addSerializer(
|
43
|
+
// IRubyObject.class, RubyAnySerializer.instance
|
44
|
+
// )
|
45
|
+
// );
|
46
|
+
// }
|
47
|
+
|
48
|
+
public static ObjectMapper rawMapper() {
|
49
|
+
return static_mapper;
|
48
50
|
}
|
49
51
|
|
50
|
-
public static
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
public static DefaultSerializerProvider createProvider(SimpleDateFormat sdf) {
|
53
|
+
static_mapper.setDateFormat(sdf);
|
54
|
+
return ((DefaultSerializerProvider)static_mapper.getSerializerProvider()).createInstance(
|
55
|
+
static_mapper.getSerializationConfig(),
|
56
|
+
static_mapper.getSerializerFactory()
|
55
57
|
);
|
56
58
|
}
|
57
59
|
|
58
|
-
public static
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
Object.class, new RubyObjectDeserializer().withRuby(ruby).setStringStrategy()
|
63
|
-
);
|
60
|
+
public static ObjectMapper rawBigNumberMapper() {
|
61
|
+
static_mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
|
62
|
+
static_mapper.enable(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS);
|
63
|
+
return static_mapper;
|
64
64
|
}
|
65
|
-
|
65
|
+
|
66
|
+
|
67
|
+
}
|
@@ -5,7 +5,6 @@ import java.io.IOException;
|
|
5
5
|
import com.fasterxml.jackson.core.*;
|
6
6
|
|
7
7
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
8
|
-
import com.fasterxml.jackson.databind.DeserializationFeature;
|
9
8
|
import com.fasterxml.jackson.databind.util.ObjectBuffer;
|
10
9
|
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
|
11
10
|
|
@@ -13,7 +12,7 @@ import org.jruby.Ruby;
|
|
13
12
|
import org.jruby.RubyObject;
|
14
13
|
import org.jruby.RubyArray;
|
15
14
|
import org.jruby.RubyHash;
|
16
|
-
|
15
|
+
|
17
16
|
|
18
17
|
public class RubyObjectDeserializer
|
19
18
|
extends StdDeserializer<RubyObject> {
|
@@ -22,25 +21,21 @@ public class RubyObjectDeserializer
|
|
22
21
|
|
23
22
|
private Ruby _ruby;
|
24
23
|
|
25
|
-
private RubyKeyConverter
|
26
|
-
|
24
|
+
private RubyKeyConverter _key_converter;
|
25
|
+
private RubyConverter _int_converter;
|
26
|
+
private RubyConverter _float_converter;
|
27
|
+
final private RubyStringConverter _str_converter = new RubyStringConverter();
|
27
28
|
|
28
29
|
public RubyObjectDeserializer() {
|
29
30
|
super(RubyObject.class);
|
30
31
|
}
|
31
32
|
|
32
|
-
public RubyObjectDeserializer
|
33
|
+
public RubyObjectDeserializer with(Ruby ruby, RubyKeyConverter nameConv,
|
34
|
+
RubyConverter intConv, RubyConverter floatConv) {
|
33
35
|
_ruby = ruby;
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
public RubyObjectDeserializer setStringStrategy() {
|
38
|
-
key_converter = str_converter;
|
39
|
-
return this;
|
40
|
-
}
|
41
|
-
|
42
|
-
public RubyObjectDeserializer setSymbolStrategy() {
|
43
|
-
key_converter = new RubySymbolConverter();
|
36
|
+
_key_converter = nameConv;
|
37
|
+
_int_converter = intConv;
|
38
|
+
_float_converter = floatConv;
|
44
39
|
return this;
|
45
40
|
}
|
46
41
|
|
@@ -57,6 +52,7 @@ public class RubyObjectDeserializer
|
|
57
52
|
@Override
|
58
53
|
public RubyObject deserialize(JsonParser jp, DeserializationContext ctxt)
|
59
54
|
throws IOException, JsonProcessingException {
|
55
|
+
|
60
56
|
switch (jp.getCurrentToken()) {
|
61
57
|
case START_OBJECT:
|
62
58
|
return mapObject(jp, ctxt);
|
@@ -65,29 +61,22 @@ public class RubyObjectDeserializer
|
|
65
61
|
return mapArray(jp, ctxt);
|
66
62
|
|
67
63
|
case FIELD_NAME:
|
68
|
-
return
|
64
|
+
return _key_converter.convert(_ruby, jp);
|
69
65
|
|
70
66
|
case VALUE_EMBEDDED_OBJECT:
|
71
67
|
return RubyUtils.rubyObject(_ruby, jp.getEmbeddedObject());
|
72
68
|
|
73
69
|
case VALUE_STRING:
|
74
|
-
return
|
70
|
+
return _str_converter.convert(_ruby, jp);
|
75
71
|
|
76
72
|
case VALUE_NUMBER_INT:
|
77
73
|
/* [JACKSON-100]: caller may want to get all integral values
|
78
74
|
* returned as BigInteger, for consistency
|
79
75
|
*/
|
80
|
-
|
81
|
-
if (ctxt.isEnabled(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS) || numberType == JsonParser.NumberType.BIG_INTEGER) {
|
82
|
-
return RubyUtils.rubyBignum(_ruby, jp.getBigIntegerValue());
|
83
|
-
}
|
84
|
-
return RubyUtils.rubyFixnum(_ruby, jp.getLongValue());
|
76
|
+
return _int_converter.convert(_ruby, jp);
|
85
77
|
|
86
78
|
case VALUE_NUMBER_FLOAT:
|
87
|
-
|
88
|
-
return RubyUtils.rubyBigDecimal(_ruby, jp.getDecimalValue());
|
89
|
-
}
|
90
|
-
return RubyUtils.rubyFloat(_ruby, jp.getDoubleValue());
|
79
|
+
return _float_converter.convert(_ruby, jp);
|
91
80
|
|
92
81
|
case VALUE_TRUE:
|
93
82
|
return _ruby.newBoolean(Boolean.TRUE);
|
@@ -165,24 +154,26 @@ public class RubyObjectDeserializer
|
|
165
154
|
return RubyHash.newHash(_ruby);
|
166
155
|
}
|
167
156
|
|
168
|
-
RubyObject field1 =
|
157
|
+
RubyObject field1 = _key_converter.convert(_ruby, jp);
|
169
158
|
jp.nextToken();
|
170
159
|
RubyObject value1 = deserialize(jp, ctxt);
|
160
|
+
|
171
161
|
if (jp.nextToken() != JsonToken.FIELD_NAME) { // single entry; but we want modifiable
|
172
|
-
return
|
162
|
+
return RubyUtils.rubyHash(_ruby, field1, value1);
|
173
163
|
}
|
174
164
|
|
175
|
-
RubyObject field2 =
|
165
|
+
RubyObject field2 = _key_converter.convert(_ruby, jp);
|
176
166
|
jp.nextToken();
|
177
|
-
|
167
|
+
|
168
|
+
RubyHash result = RubyUtils.rubyHash(_ruby, field1, value1, field2, deserialize(jp, ctxt));
|
169
|
+
|
178
170
|
if (jp.nextToken() != JsonToken.FIELD_NAME) {
|
179
|
-
return
|
171
|
+
return result;
|
180
172
|
}
|
181
173
|
|
182
174
|
// And then the general case; default map size is 16
|
183
|
-
RubyHash result = RuntimeHelpers.constructHash(_ruby, field1, value1, field2, value2);
|
184
175
|
do {
|
185
|
-
RubyObject fieldName =
|
176
|
+
RubyObject fieldName = _key_converter.convert(_ruby, jp);
|
186
177
|
jp.nextToken();
|
187
178
|
result.fastASetCheckString(_ruby, fieldName, deserialize(jp, ctxt));
|
188
179
|
} while (jp.nextToken() != JsonToken.END_OBJECT);
|
@@ -7,11 +7,10 @@ import java.nio.CharBuffer;
|
|
7
7
|
import org.jruby.Ruby;
|
8
8
|
import org.jruby.RubyObject;
|
9
9
|
|
10
|
-
public class RubyStringConverter implements
|
10
|
+
public class RubyStringConverter implements RubyConverter {
|
11
11
|
|
12
12
|
@Override
|
13
13
|
public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
|
14
|
-
// return RubyUtils.rubyString(ruby, jp.getText());
|
15
14
|
return RubyUtils.rubyString(ruby,
|
16
15
|
CharBuffer.wrap(jp.getTextCharacters(), 0, jp.getTextLength())
|
17
16
|
);
|
@@ -6,9 +6,10 @@ import java.io.IOException;
|
|
6
6
|
import org.jruby.Ruby;
|
7
7
|
import org.jruby.RubyObject;
|
8
8
|
|
9
|
-
public class
|
9
|
+
public class RubyStringKeyConverter implements RubyKeyConverter {
|
10
10
|
|
11
|
+
@Override
|
11
12
|
public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
|
12
|
-
return RubyUtils.
|
13
|
+
return RubyUtils.rubyString(ruby, jp.getCurrentName());
|
13
14
|
}
|
14
15
|
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import org.jruby.Ruby;
|
4
|
+
import org.jruby.RubyObject;
|
5
|
+
|
6
|
+
public class RubyStringNameConverter implements RubyNameConverter {
|
7
|
+
|
8
|
+
@Override
|
9
|
+
public RubyObject convert(Ruby ruby, String name){
|
10
|
+
return RubyUtils.rubyString(ruby, name);
|
11
|
+
}
|
12
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.core.*;
|
4
|
+
|
5
|
+
import java.io.IOException;
|
6
|
+
import org.jruby.Ruby;
|
7
|
+
import org.jruby.RubyObject;
|
8
|
+
|
9
|
+
public class RubySymbolKeyConverter implements RubyKeyConverter {
|
10
|
+
|
11
|
+
@Override
|
12
|
+
public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
|
13
|
+
return RubyUtils.rubySymbol(ruby, jp.getCurrentName());
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
package com.jrjackson;
|
2
|
+
|
3
|
+
import org.jruby.Ruby;
|
4
|
+
import org.jruby.RubyObject;
|
5
|
+
|
6
|
+
public class RubySymbolNameConverter implements RubyNameConverter {
|
7
|
+
|
8
|
+
@Override
|
9
|
+
public RubyObject convert(Ruby ruby, String s) {
|
10
|
+
return RubyUtils.rubySymbol(ruby, s);
|
11
|
+
}
|
12
|
+
}
|
@@ -1,17 +1,31 @@
|
|
1
1
|
package com.jrjackson;
|
2
2
|
|
3
|
+
import com.fasterxml.jackson.core.JsonGenerator;
|
4
|
+
import java.io.IOException;
|
3
5
|
import java.util.*;
|
4
6
|
|
5
7
|
import java.math.BigDecimal;
|
6
8
|
import java.math.BigInteger;
|
9
|
+
|
7
10
|
import org.joda.time.DateTime;
|
8
11
|
import org.joda.time.DateTimeZone;
|
9
12
|
import org.joda.time.format.DateTimeFormat;
|
10
13
|
import org.joda.time.format.DateTimeFormatter;
|
14
|
+
import org.jruby.Ruby;
|
15
|
+
import org.jruby.RubyArray;
|
16
|
+
import org.jruby.RubyBignum;
|
17
|
+
import org.jruby.RubyBoolean;
|
18
|
+
import org.jruby.RubyFixnum;
|
19
|
+
import org.jruby.RubyFloat;
|
20
|
+
import org.jruby.RubyHash;
|
21
|
+
import org.jruby.RubyObject;
|
22
|
+
import org.jruby.RubyString;
|
23
|
+
import org.jruby.RubySymbol;
|
11
24
|
|
12
|
-
import org.jruby.*;
|
13
25
|
import org.jruby.javasupport.JavaUtil;
|
14
26
|
import org.jruby.ext.bigdecimal.RubyBigDecimal;
|
27
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
28
|
+
import org.jruby.util.ByteList;
|
15
29
|
import org.jruby.util.SafeDoubleParser;
|
16
30
|
|
17
31
|
public class RubyUtils {
|
@@ -80,6 +94,19 @@ public class RubyUtils {
|
|
80
94
|
return ruby.newBoolean(arg);
|
81
95
|
}
|
82
96
|
|
97
|
+
public static RubyHash rubyHash(Ruby ruby, IRubyObject key, IRubyObject value) {
|
98
|
+
RubyHash hash = RubyHash.newHash(ruby);
|
99
|
+
hash.fastASet(key, value);
|
100
|
+
return hash;
|
101
|
+
}
|
102
|
+
|
103
|
+
public static RubyHash rubyHash(Ruby ruby, IRubyObject key1, IRubyObject value1,
|
104
|
+
IRubyObject key2, IRubyObject value2) {
|
105
|
+
RubyHash hash = rubyHash(ruby, key1, value1);
|
106
|
+
hash.fastASet(key2, value2);
|
107
|
+
return hash;
|
108
|
+
}
|
109
|
+
|
83
110
|
public static String jodaTimeString(DateTime dt) {
|
84
111
|
// copied from the RubyTime to_s method
|
85
112
|
// to prevent the double handling of a String -> RubyString -> String
|
@@ -108,4 +135,16 @@ public class RubyUtils {
|
|
108
135
|
//
|
109
136
|
// return result;
|
110
137
|
}
|
138
|
+
|
139
|
+
|
140
|
+
public static void writeBytes(IRubyObject value, JsonGenerator jgen)
|
141
|
+
throws IOException {
|
142
|
+
// jgen.writeString(value.toString());
|
143
|
+
// byte[] b = s.getBytes();
|
144
|
+
// jgen.writeUTF8String(b, 0, b.length);
|
145
|
+
// jgen.writeUTF8String(s.getBytes(), 0, s.size());
|
146
|
+
RubyString s = (RubyString)value;
|
147
|
+
ByteList b = s.getByteList();
|
148
|
+
jgen.writeUTF8String(b.unsafeBytes(), 0, b.length());
|
149
|
+
}
|
111
150
|
}
|