diff --git a/logstash-core/src/main/java/org/logstash/Event.java b/logstash-core/src/main/java/org/logstash/Event.java index 31004203e..0fa290334 100644 --- a/logstash-core/src/main/java/org/logstash/Event.java +++ b/logstash-core/src/main/java/org/logstash/Event.java @@ -14,7 +14,6 @@ import org.jruby.RubySymbol; import org.logstash.ackedqueue.Queueable; import org.logstash.bivalues.BiValues; import org.logstash.bivalues.NullBiValue; -import org.logstash.bivalues.TimestampBiValue; import org.logstash.ext.JrubyTimestampExtLibrary; import static org.logstash.ObjectMappers.CBOR_MAPPER; @@ -314,8 +313,6 @@ public final class Event implements Cloneable, Queueable { return ((JrubyTimestampExtLibrary.RubyTimestamp) o).getTimestamp(); } else if (o instanceof Timestamp) { return (Timestamp) o; - } else if (o instanceof TimestampBiValue) { - return ((TimestampBiValue) o).javaValue(); } else if (o instanceof DateTime) { return new Timestamp((DateTime) o); } else if (o instanceof Date) { diff --git a/logstash-core/src/main/java/org/logstash/Javafier.java b/logstash-core/src/main/java/org/logstash/Javafier.java index 14ee0accc..81221cda3 100644 --- a/logstash-core/src/main/java/org/logstash/Javafier.java +++ b/logstash-core/src/main/java/org/logstash/Javafier.java @@ -5,6 +5,7 @@ import org.jruby.RubyFloat; import org.jruby.RubyString; import org.logstash.bivalues.BiValue; import org.logstash.bivalues.BiValues; +import org.logstash.ext.JrubyTimestampExtLibrary; public class Javafier { private static final String ERR_TEMPLATE = "Missing Ruby class handling for full class name=%s, simple name=%s"; @@ -20,12 +21,16 @@ public class Javafier { if (o instanceof RubyString) { return o.toString(); } - if (o instanceof String || o instanceof Float || o instanceof Double) { + if (o instanceof String || o instanceof Float || o instanceof Double || + o instanceof Timestamp) { return o; } if (o instanceof RubyFloat) { return ((RubyFloat) o).getDoubleValue(); } + if (o instanceof JrubyTimestampExtLibrary.RubyTimestamp) { + return ((JrubyTimestampExtLibrary.RubyTimestamp) o).getTimestamp(); + } if (o instanceof BiValue) { return ((BiValue)o).javaValue(); } else if(o instanceof ConvertedMap) { diff --git a/logstash-core/src/main/java/org/logstash/Rubyfier.java b/logstash-core/src/main/java/org/logstash/Rubyfier.java index a5f072fe1..e5c912ea0 100644 --- a/logstash-core/src/main/java/org/logstash/Rubyfier.java +++ b/logstash-core/src/main/java/org/logstash/Rubyfier.java @@ -11,6 +11,7 @@ import org.jruby.RubyString; import org.jruby.runtime.builtin.IRubyObject; import org.logstash.bivalues.BiValue; import org.logstash.bivalues.BiValues; +import org.logstash.ext.JrubyTimestampExtLibrary; public final class Rubyfier { private static final String ERR_TEMPLATE = "Missing Java class handling for full class name=%s, simple name=%s"; @@ -27,12 +28,19 @@ public final class Rubyfier { } public static IRubyObject deep(Ruby runtime, final Object input) { - if (input instanceof RubyString) return (RubyString) input; + if (input instanceof RubyString || input instanceof RubyFloat + || input instanceof JrubyTimestampExtLibrary.RubyTimestamp) { + return (IRubyObject) input; + } if (input instanceof String) return BiValues.RUBY.newString((String) input); - if (input instanceof RubyFloat) return (RubyFloat) input; if (input instanceof Double || input instanceof Float) { return BiValues.RUBY.newFloat(((Number) input).doubleValue()); } + if (input instanceof Timestamp) { + return JrubyTimestampExtLibrary.RubyTimestamp.newRubyTimestamp( + BiValues.RUBY, (Timestamp) input + ); + } if (input instanceof BiValue) return ((BiValue) input).rubyValue(runtime); if (input instanceof Map) return deepMap(runtime, (Map) input); if (input instanceof List) return deepList(runtime, (List) input); diff --git a/logstash-core/src/main/java/org/logstash/Valuefier.java b/logstash-core/src/main/java/org/logstash/Valuefier.java index fdaafb44d..32b4331b0 100644 --- a/logstash-core/src/main/java/org/logstash/Valuefier.java +++ b/logstash-core/src/main/java/org/logstash/Valuefier.java @@ -51,24 +51,33 @@ public final class Valuefier { } } - public static Object convert(Object o) { - if (o instanceof RubyString) { + public static Object convert(final Object o) { + if (o instanceof RubyString || o instanceof RubyFloat + || o instanceof JrubyTimestampExtLibrary.RubyTimestamp + || o instanceof ConvertedMap || o instanceof ConvertedList + || o instanceof BiValue) { return o; } if (o instanceof String) { return BiValues.RUBY.newString((String) o); } - if (o instanceof RubyFloat) { - return o; - } if (o instanceof Float || o instanceof Double) { return BiValues.RUBY.newFloat(((Number) o).doubleValue()); } - if (o instanceof ConvertedMap || o instanceof ConvertedList) { - return o; + if (o instanceof Timestamp) { + return JrubyTimestampExtLibrary.RubyTimestamp.newRubyTimestamp( + BiValues.RUBY, (Timestamp) o + ); } - if (o instanceof BiValue) { - return o; + if (o instanceof RubyTime) { + return JrubyTimestampExtLibrary.RubyTimestamp.newRubyTimestamp( + BiValues.RUBY, new Timestamp(((RubyTime) o).getDateTime()) + ); + } + if (o instanceof DateTime) { + return JrubyTimestampExtLibrary.RubyTimestamp.newRubyTimestamp( + BiValues.RUBY, new Timestamp((DateTime) o) + ); } if (o instanceof RubyHash) { return ConvertedMap.newFromRubyHash((RubyHash) o); @@ -88,16 +97,6 @@ public final class Valuefier { if (o instanceof ArrayJavaProxy || o instanceof ConcreteJavaProxy){ return convertJavaProxy((JavaProxy) o); } - if (o instanceof RubyTime) { - RubyTime time = (RubyTime) o; - Timestamp ts = new Timestamp(time.getDateTime()); - JrubyTimestampExtLibrary.RubyTimestamp rts = JrubyTimestampExtLibrary.RubyTimestamp.newRubyTimestamp(time.getRuntime(), ts); - return convertNonCollection(rts); - } - if (o instanceof DateTime) { - Timestamp ts = new Timestamp((DateTime) o); - return convertNonCollection(ts); - } return o == null ? BiValues.NULL_BI_VALUE : convertNonCollection(o); } } diff --git a/logstash-core/src/main/java/org/logstash/bivalues/BiValues.java b/logstash-core/src/main/java/org/logstash/bivalues/BiValues.java index a27ba1727..20e26e933 100644 --- a/logstash-core/src/main/java/org/logstash/bivalues/BiValues.java +++ b/logstash-core/src/main/java/org/logstash/bivalues/BiValues.java @@ -11,12 +11,8 @@ import org.jruby.RubySymbol; import org.jruby.ext.bigdecimal.RubyBigDecimal; import org.jruby.java.proxies.JavaProxy; import org.jruby.runtime.builtin.IRubyObject; -import org.logstash.Timestamp; -import org.logstash.ext.JrubyTimestampExtLibrary.RubyTimestamp; public enum BiValues { - ORG_LOGSTASH_EXT_JRUBYTIMESTAMPEXTLIBRARY$RUBYTIMESTAMP(BiValueType.TIMESTAMP), - ORG_LOGSTASH_TIMESTAMP(BiValueType.TIMESTAMP), JAVA_LANG_BOOLEAN(BiValueType.BOOLEAN), JAVA_LANG_INTEGER(BiValueType.INT), JAVA_LANG_LONG(BiValueType.LONG), @@ -36,8 +32,6 @@ public enum BiValues { private static HashMap initCache() { HashMap hm = new HashMap<>(); - hm.put("org.logstash.Timestamp", "ORG_LOGSTASH_TIMESTAMP"); - hm.put("org.logstash.ext.JrubyTimestampExtLibrary$RubyTimestamp", "ORG_LOGSTASH_EXT_JRUBYTIMESTAMPEXTLIBRARY$RUBYTIMESTAMP"); hm.put("java.lang.Boolean", "JAVA_LANG_BOOLEAN"); hm.put("java.lang.Integer", "JAVA_LANG_INTEGER"); hm.put("java.lang.Long", "JAVA_LANG_LONG"); @@ -136,14 +130,6 @@ public enum BiValues { return new BooleanBiValue((Boolean) value); } }, - TIMESTAMP { - BiValue build(Object value) { - if (value instanceof IRubyObject) { - return new TimestampBiValue((RubyTimestamp) value); - } - return new TimestampBiValue((Timestamp) value); - } - }, NULL { NullBiValue build(Object value) { return NULL_BI_VALUE; diff --git a/logstash-core/src/main/java/org/logstash/bivalues/TimestampBiValue.java b/logstash-core/src/main/java/org/logstash/bivalues/TimestampBiValue.java deleted file mode 100644 index 19df71e24..000000000 --- a/logstash-core/src/main/java/org/logstash/bivalues/TimestampBiValue.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.logstash.bivalues; - -import org.logstash.Timestamp; -import org.logstash.ext.JrubyTimestampExtLibrary.RubyTimestamp; -import org.jruby.Ruby; - -import java.io.ObjectStreamException; - -public class TimestampBiValue extends BiValue { - - public TimestampBiValue(RubyTimestamp rubyValue) { - this.rubyValue = rubyValue; - javaValue = null; - } - - public TimestampBiValue(Timestamp javaValue) { - this.javaValue = javaValue; - rubyValue = null; - } - - private TimestampBiValue() { - } - - protected void addRuby(Ruby runtime) { - rubyValue = RubyTimestamp.newRubyTimestamp(runtime, javaValue); - } - - protected void addJava() { - javaValue = rubyValue.getTimestamp(); - } - - // Called when object is to be serialized on a stream to allow the object to substitute a proxy for itself. - private Object writeReplace() throws ObjectStreamException { - return newProxy(this); - } -} diff --git a/logstash-core/src/test/java/org/logstash/EventTest.java b/logstash-core/src/test/java/org/logstash/EventTest.java index f056777b2..7fb594eb4 100644 --- a/logstash-core/src/test/java/org/logstash/EventTest.java +++ b/logstash-core/src/test/java/org/logstash/EventTest.java @@ -6,13 +6,24 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.junit.BeforeClass; import org.junit.Test; +import org.logstash.bivalues.BiValues; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -public class EventTest { +public final class EventTest { + + /** + * Some of these tests require a fully initialized global {@link org.jruby.Ruby} instance + * so we force the creation of the "LogStash" module here. + */ + @BeforeClass + public static void before() { + BiValues.RUBY.getOrCreateModule("LogStash"); + } @Test public void queueableInterfaceRoundTrip() throws Exception { diff --git a/logstash-core/src/test/java/org/logstash/ValuefierTest.java b/logstash-core/src/test/java/org/logstash/ValuefierTest.java index 4609c46de..bcdcf0879 100644 --- a/logstash-core/src/test/java/org/logstash/ValuefierTest.java +++ b/logstash-core/src/test/java/org/logstash/ValuefierTest.java @@ -19,7 +19,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.logstash.bivalues.BiValue; -import org.logstash.bivalues.TimestampBiValue; +import org.logstash.ext.JrubyTimestampExtLibrary; import static junit.framework.TestCase.assertEquals; @@ -63,7 +63,7 @@ public class ValuefierTest extends TestBase { public void testRubyTime() { RubyTime ro = RubyTime.newTime(ruby, DateTime.now()); Object result = Valuefier.convert(ro); - assertEquals(TimestampBiValue.class, result.getClass()); + assertEquals(JrubyTimestampExtLibrary.RubyTimestamp.class, result.getClass()); } @Test @@ -71,7 +71,7 @@ public class ValuefierTest extends TestBase { DateTime jo = DateTime.now(); Object result = Valuefier.convert(jo); - assertEquals(TimestampBiValue.class, result.getClass()); + assertEquals(JrubyTimestampExtLibrary.RubyTimestamp.class, result.getClass()); } @Rule diff --git a/logstash-core/src/test/java/org/logstash/bivalues/BiValuesTest.java b/logstash-core/src/test/java/org/logstash/bivalues/BiValuesTest.java index 13330e8c1..c341af4f1 100644 --- a/logstash-core/src/test/java/org/logstash/bivalues/BiValuesTest.java +++ b/logstash-core/src/test/java/org/logstash/bivalues/BiValuesTest.java @@ -12,8 +12,6 @@ import org.jruby.ext.bigdecimal.RubyBigDecimal; import org.jruby.javasupport.JavaUtil; import org.junit.Test; import org.logstash.TestBase; -import org.logstash.Timestamp; -import org.logstash.ext.JrubyTimestampExtLibrary.RubyTimestamp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -130,30 +128,6 @@ public class BiValuesTest extends TestBase { assertEquals(ro.getClass(), subject.rubyValue(ruby).getClass()); } - @Test - public void testBiValuesTimestampRuby() { - Timestamp jo = new Timestamp("2014-09-23T00:00:00-0800"); - RubyTimestamp ro = RubyTimestamp.newRubyTimestamp(ruby, jo); - BiValue subject = BiValues.newBiValue(ro); - - assertEquals(ro, subject.rubyValueUnconverted()); - assertEquals(ro.getClass(), subject.rubyValue(ruby).getClass()); - assertEquals(jo, subject.javaValue()); - assertEquals(Timestamp.class, subject.javaValue().getClass()); - } - - @Test - public void testBiValuesTimestampJava() { - Timestamp jo = new Timestamp("2014-09-23T00:00:00-0800"); - RubyTimestamp ro = RubyTimestamp.newRubyTimestamp(ruby, jo); - BiValue subject = BiValues.newBiValue(jo); - - assertEquals(jo, subject.javaValue()); - assertEquals(Timestamp.class, subject.javaValue().getClass()); - assertEquals(ro.toString(), subject.rubyValue(ruby).toString()); - assertEquals(ro.getClass(), subject.rubyValue(ruby).getClass()); - } - @Test public void testBiValuesNilRuby() { RubyNil ro = (RubyNil) ruby.getNil();