From 2a0bb30500ce9340df36d2d3eef331a528e900a1 Mon Sep 17 00:00:00 2001 From: Oliver Tearle Date: Mon, 12 Jan 2015 14:37:38 +0000 Subject: [PATCH 1/2] Made Parser serializable --- src/main/java/com/joestelmach/natty/Parser.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/joestelmach/natty/Parser.java b/src/main/java/com/joestelmach/natty/Parser.java index 76c0ff81..cfaa63dc 100644 --- a/src/main/java/com/joestelmach/natty/Parser.java +++ b/src/main/java/com/joestelmach/natty/Parser.java @@ -2,14 +2,13 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TimeZone; -import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; import org.antlr.runtime.ANTLRInputStream; import org.antlr.runtime.CommonTokenStream; @@ -28,7 +27,10 @@ * * @author Joe Stelmach */ -public class Parser { +public class Parser implements Serializable { + + private static final long serialVersionUID = 233282586086252203L; + private TimeZone _defaultTimeZone; private static final Logger _logger = Logger.getLogger("com.joestelmach.natty"); From 37ce26221a7846a8242498d59ebef8060e76aa2e Mon Sep 17 00:00:00 2001 From: Oliver Tearle Date: Mon, 12 Jan 2015 15:16:12 +0000 Subject: [PATCH 2/2] Add unit tests for Parser serialisation. Override equals and hashCode to work properly with serialisation. --- .../java/com/joestelmach/natty/Parser.java | 25 ++++++++++ .../com/joestelmach/natty/ParserTest.java | 47 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/test/java/com/joestelmach/natty/ParserTest.java diff --git a/src/main/java/com/joestelmach/natty/Parser.java b/src/main/java/com/joestelmach/natty/Parser.java index cfaa63dc..e5097fe0 100644 --- a/src/main/java/com/joestelmach/natty/Parser.java +++ b/src/main/java/com/joestelmach/natty/Parser.java @@ -17,6 +17,8 @@ import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.CommonTreeNodeStream; import org.antlr.runtime.tree.Tree; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; import com.joestelmach.natty.generated.DateLexer; import com.joestelmach.natty.generated.DateParser; @@ -315,4 +317,27 @@ else if(skip) { } } } + + @Override + public int hashCode() { + // use two randomly chosen prime numbers + return new HashCodeBuilder(17, 31). + append(_defaultTimeZone). + toHashCode(); + } + + @Override + public boolean equals(Object obj) { + boolean isEqual = false; + + if (obj instanceof Parser) { + Parser other = (Parser) obj; + + isEqual = new EqualsBuilder(). + append(_defaultTimeZone, other._defaultTimeZone). + isEquals(); + } + + return isEqual; + } } diff --git a/src/test/java/com/joestelmach/natty/ParserTest.java b/src/test/java/com/joestelmach/natty/ParserTest.java new file mode 100644 index 00000000..f8ba61d3 --- /dev/null +++ b/src/test/java/com/joestelmach/natty/ParserTest.java @@ -0,0 +1,47 @@ +package com.joestelmach.natty; + +import static org.junit.Assert.*; + +import java.util.TimeZone; + +import org.apache.commons.lang.SerializationUtils; +import org.junit.Test; + +public class ParserTest { + + @Test + public void testParser() { + // Test serializing of a basic parser which does not have a + // user-supplied TimeZone. + Parser parser = new Parser(); + + byte[] serialized = SerializationUtils.serialize(parser); + Parser deserialized = (Parser) SerializationUtils.deserialize(serialized); + + // Check the parser + // Note: if a.equals(b), then a.hashcode() MUST equal b.hashcode() + // see http://stackoverflow.com/a/27609 for more. + assertEquals(parser, deserialized); + assertEquals(parser.hashCode(), deserialized.hashCode()); + } + + @Test + public void testParserTimeZone() { + // TODO this could be improved by mocking TimeZone since it is not part + // of the system under test. + TimeZone defaultTimeZone = TimeZone.getDefault(); + + // Test serializing of an alternate parser with a + // user-supplied TimeZone. + Parser parser = new Parser(defaultTimeZone); + + byte[] serialized = SerializationUtils.serialize(parser); + Parser deserialized = (Parser) SerializationUtils.deserialize(serialized); + + // Check the parser + // Note: if a.equals(b), then a.hashcode() MUST equal b.hashcode() + // see http://stackoverflow.com/a/27609 for more. + assertEquals(parser, deserialized); + assertEquals(parser.hashCode(), deserialized.hashCode()); + } +}