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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/{.jrubyrc → .__jrubyrc} +2 -2
  3. data/.gitignore +5 -0
  4. data/Gemfile +1 -0
  5. data/alt_bench.rb +46 -0
  6. data/dependency-reduced-pom.xml +6 -5
  7. data/lib/jrjackson/build_info.rb +2 -2
  8. data/lib/jrjackson/jars/jrjackson-1.2.16.jar +0 -0
  9. data/lib/jrjackson/jrjackson.rb +38 -13
  10. data/pom.xml +11 -10
  11. data/run_all_individual_bench.sh +17 -15
  12. data/run_jruby_individual_bench.sh +20 -0
  13. data/run_mri_individual_bench.sh +7 -0
  14. data/src/main/java/com/jrjackson/IParseHandler.java +53 -0
  15. data/src/main/java/com/jrjackson/JavaBigDecimalValueConverter.java +17 -0
  16. data/src/main/java/com/jrjackson/JavaBigIntValueConverter.java +17 -0
  17. data/src/main/java/com/jrjackson/JavaConverter.java +10 -0
  18. data/src/main/java/com/jrjackson/JavaFloatValueConverter.java +16 -0
  19. data/src/main/java/com/jrjackson/JavaHandler.java +118 -0
  20. data/src/main/java/com/jrjackson/JavaLongValueConverter.java +16 -0
  21. data/src/main/java/com/jrjackson/JjParse.java +147 -0
  22. data/src/main/java/com/jrjackson/JrJacksonBase.java +159 -0
  23. data/src/main/java/com/jrjackson/JrJacksonJava.java +81 -0
  24. data/src/main/java/com/jrjackson/JrJacksonRaw.java +59 -102
  25. data/src/main/java/com/jrjackson/JrJacksonRuby.java +117 -0
  26. data/src/main/java/com/jrjackson/JrJacksonSaj.java +26 -0
  27. data/src/main/java/com/jrjackson/JrJacksonSch.java +25 -0
  28. data/src/main/java/com/jrjackson/JrJacksonService.java +15 -0
  29. data/src/main/java/com/jrjackson/JrParse.java +149 -0
  30. data/src/main/java/com/jrjackson/RubyAnySerializer.java +112 -55
  31. data/src/main/java/com/jrjackson/RubyBigDecimalValueConverter.java +18 -0
  32. data/src/main/java/com/jrjackson/RubyBigIntValueConverter.java +21 -0
  33. data/src/main/java/com/jrjackson/RubyConverter.java +12 -0
  34. data/src/main/java/com/jrjackson/RubyDateFormat.java +36 -0
  35. data/src/main/java/com/jrjackson/RubyFloatValueConverter.java +18 -0
  36. data/src/main/java/com/jrjackson/RubyHandler.java +119 -0
  37. data/src/main/java/com/jrjackson/RubyIntValueConverter.java +18 -0
  38. data/src/main/java/com/jrjackson/RubyJacksonModule.java +40 -38
  39. data/src/main/java/com/jrjackson/RubyNameConverter.java +9 -0
  40. data/src/main/java/com/jrjackson/RubyObjectDeserializer.java +24 -33
  41. data/src/main/java/com/jrjackson/RubyStringConverter.java +1 -2
  42. data/src/main/java/com/jrjackson/{RubySymbolConverter.java → RubyStringKeyConverter.java} +3 -2
  43. data/src/main/java/com/jrjackson/RubyStringNameConverter.java +12 -0
  44. data/src/main/java/com/jrjackson/RubySymbolKeyConverter.java +15 -0
  45. data/src/main/java/com/jrjackson/RubySymbolNameConverter.java +12 -0
  46. data/src/main/java/com/jrjackson/RubyUtils.java +40 -1
  47. data/src/main/java/com/jrjackson/SajParse.java +169 -0
  48. data/src/main/java/com/jrjackson/SchParse.java +209 -0
  49. data/src/main/java/com/jrjackson/StreamParse.java +66 -0
  50. data/test/jrjackson_test.rb +271 -6
  51. metadata +49 -17
  52. 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 org.jruby.*;
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.core.util.VersionUtil;
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 org.jruby.runtime.builtin.IRubyObject;
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().registerModule(
16
- new RubyJacksonModule().addSerializer(IRubyObject.class, RubyAnySerializer.instance)
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", VersionUtil.versionFor(RubyJacksonModule.class));
26
+ super("JrJacksonStrModule", new Version(1, 2, 16, "0", "com.jrjackson.jruby", "jrjackson"));
26
27
  }
27
28
 
28
- public static ObjectMapper mappedAs(String key, Ruby ruby) {
29
- if ("raw".equals(key)) {
30
- return static_mapper;
31
- }
29
+ public static ObjectMapper mapperWith(Ruby ruby, RubyKeyConverter nameConverter,
30
+ RubyConverter intConverter, RubyConverter floatConverter){
32
31
 
33
- ObjectMapper mapper = new ObjectMapper().registerModule(
34
- new AfterburnerModule()
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
- if ("sym".equals(key)) {
38
- mapper.registerModule(
39
- asSym(ruby)
40
- );
41
- } else {
42
- mapper.registerModule(
43
- asStr(ruby)
44
- );
45
- }
46
- mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
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 SimpleModule asSym(Ruby ruby) {
51
- return new RubyJacksonModule().addSerializer(
52
- IRubyObject.class, RubyAnySerializer.instance
53
- ).addDeserializer(
54
- Object.class, new RubyObjectDeserializer().withRuby(ruby).setSymbolStrategy()
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 SimpleModule asStr(Ruby ruby) {
59
- return new RubyJacksonModule().addSerializer(
60
- IRubyObject.class, RubyAnySerializer.instance
61
- ).addDeserializer(
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
+ }
@@ -0,0 +1,9 @@
1
+ package com.jrjackson;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.RubyObject;
5
+
6
+ public interface RubyNameConverter {
7
+
8
+ public RubyObject convert(Ruby ruby, String name);
9
+ }
@@ -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
- import org.jruby.javasupport.util.RuntimeHelpers;
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 key_converter;
26
- final private RubyStringConverter str_converter = new RubyStringConverter();
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 withRuby(Ruby ruby) {
33
+ public RubyObjectDeserializer with(Ruby ruby, RubyKeyConverter nameConv,
34
+ RubyConverter intConv, RubyConverter floatConv) {
33
35
  _ruby = ruby;
34
- return this;
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 key_converter.convert(_ruby, jp);
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 str_converter.convert(_ruby, jp);
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
- JsonParser.NumberType numberType = jp.getNumberType();
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
- if (ctxt.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS)) {
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 = key_converter.convert(_ruby, jp);
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 RuntimeHelpers.constructHash(_ruby, field1, value1);
162
+ return RubyUtils.rubyHash(_ruby, field1, value1);
173
163
  }
174
164
 
175
- RubyObject field2 = key_converter.convert(_ruby, jp);
165
+ RubyObject field2 = _key_converter.convert(_ruby, jp);
176
166
  jp.nextToken();
177
- RubyObject value2 = deserialize(jp, ctxt);
167
+
168
+ RubyHash result = RubyUtils.rubyHash(_ruby, field1, value1, field2, deserialize(jp, ctxt));
169
+
178
170
  if (jp.nextToken() != JsonToken.FIELD_NAME) {
179
- return RuntimeHelpers.constructHash(_ruby, field1, value1, field2, value2);
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 = key_converter.convert(_ruby, jp);
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 RubyKeyConverter {
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 RubySymbolConverter implements RubyKeyConverter {
9
+ public class RubyStringKeyConverter implements RubyKeyConverter {
10
10
 
11
+ @Override
11
12
  public RubyObject convert(Ruby ruby, JsonParser jp) throws IOException {
12
- return RubyUtils.rubySymbol(ruby, jp.getText());
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
  }